@morodomi/ait3
Version:
AIT³ Development Platform - AI + Ticket + Test + Tool driven development methodology
61 lines (59 loc) • 1.93 kB
JavaScript
import { GitHubTicketService } from '../../services/implementations/GitHubTicketService.js';
/**
* Normalize ticket ID by removing # prefix
*/
function normalizeTicketId(ticketId) {
return ticketId.replace('#', '');
}
/**
* Create slug from ticket title
*/
function createSlugTitle(title) {
return title
.toLowerCase()
.replace(/[^a-z0-9]+/g, '-')
.replace(/^-+|-+$/g, '');
}
/**
* Generate local ticket file path
*/
function generateLocalTicketPath(ticket) {
if (ticket.location?.path) {
return ticket.location.path;
}
const slugTitle = createSlugTitle(ticket.title);
return `.tickets/${ticket.status}/${ticket.id}-${slugTitle}.md`;
}
/**
* Check if service is GitHubTicketService
*/
export function isGitHubTicketService(service) {
return service instanceof GitHubTicketService ||
(typeof service.getConfig === 'function');
}
/**
* Format ticket location display based on service type
*/
export function formatTicketLocation(ticket, service) {
if (isGitHubTicketService(service)) {
const config = service.getConfig();
const issueNumber = normalizeTicketId(ticket.id);
return `https://github.com/${config.owner}/${config.repo}/issues/${issueNumber}`;
}
return generateLocalTicketPath(ticket);
}
/**
* Format ticket display for flow commands (enhanced version with description)
*/
export function formatTicketDisplay(ticket, service) {
if (isGitHubTicketService(service)) {
const issueNumber = normalizeTicketId(ticket.id);
const description = ticket.description || '(No description provided)';
return `GitHub Issue #${issueNumber} (use: gh issue view ${issueNumber})
Description:
${description}
[操作: gh issue view ${issueNumber} | gh issue edit ${issueNumber}]`;
}
// Local backend - reuse the same logic as formatTicketLocation
return generateLocalTicketPath(ticket);
}