@happyvertical/github-actions 0.74.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENT.md +33 -0
- package/LICENSE +7 -0
- package/README.md +147 -0
- package/dist/cli/claude-context.d.ts +3 -0
- package/dist/cli/claude-context.d.ts.map +1 -0
- package/dist/cli/claude-context.js +21 -0
- package/dist/cli/claude-context.js.map +1 -0
- package/dist/cli.d.ts +18 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +325 -0
- package/dist/cli.js.map +1 -0
- package/dist/index-v2-CqFKwTm8.js +687 -0
- package/dist/index-v2-CqFKwTm8.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +637 -0
- package/dist/index.js.map +1 -0
- package/dist/labels-cli.d.ts +20 -0
- package/dist/labels-cli.d.ts.map +1 -0
- package/dist/planning/analyze.d.ts +13 -0
- package/dist/planning/analyze.d.ts.map +1 -0
- package/dist/planning/comment.d.ts +15 -0
- package/dist/planning/comment.d.ts.map +1 -0
- package/dist/planning/definition-of-ready.d.ts +15 -0
- package/dist/planning/definition-of-ready.d.ts.map +1 -0
- package/dist/planning/index.d.ts +14 -0
- package/dist/planning/index.d.ts.map +1 -0
- package/dist/planning/types.d.ts +71 -0
- package/dist/planning/types.d.ts.map +1 -0
- package/dist/shared/adapters.d.ts +11 -0
- package/dist/shared/adapters.d.ts.map +1 -0
- package/dist/shared/ai.d.ts +43 -0
- package/dist/shared/ai.d.ts.map +1 -0
- package/dist/shared/github.d.ts +52 -0
- package/dist/shared/github.d.ts.map +1 -0
- package/dist/shared/index.d.ts +9 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/labels.d.ts +35 -0
- package/dist/shared/labels.d.ts.map +1 -0
- package/dist/shared/projects.d.ts +34 -0
- package/dist/shared/projects.d.ts.map +1 -0
- package/dist/triage/analyze.d.ts +12 -0
- package/dist/triage/analyze.d.ts.map +1 -0
- package/dist/triage/comment.d.ts +17 -0
- package/dist/triage/comment.d.ts.map +1 -0
- package/dist/triage/duplicates.d.ts +12 -0
- package/dist/triage/duplicates.d.ts.map +1 -0
- package/dist/triage/github.d.ts +5 -0
- package/dist/triage/github.d.ts.map +1 -0
- package/dist/triage/index-v2.d.ts +19 -0
- package/dist/triage/index-v2.d.ts.map +1 -0
- package/dist/triage/index.d.ts +13 -0
- package/dist/triage/index.d.ts.map +1 -0
- package/dist/triage/label-v2.d.ts +20 -0
- package/dist/triage/label-v2.d.ts.map +1 -0
- package/dist/triage/label.d.ts +16 -0
- package/dist/triage/label.d.ts.map +1 -0
- package/dist/triage/project-v2.d.ts +12 -0
- package/dist/triage/project-v2.d.ts.map +1 -0
- package/dist/triage/project.d.ts +7 -0
- package/dist/triage/project.d.ts.map +1 -0
- package/dist/triage/types.d.ts +64 -0
- package/dist/triage/types.d.ts.map +1 -0
- package/metadata.json +30 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/planning/analyze.ts","../src/planning/definition-of-ready.ts","../src/planning/comment.ts","../src/planning/index.ts","../src/shared/github.ts","../src/shared/projects.ts","../src/triage/label.ts","../src/triage/project.ts","../src/triage/index.ts","../src/index.ts"],"sourcesContent":["/**\n * AI-powered planning analysis\n */\n\nimport type { ImplementationPlan, PlanningContext } from './types.js';\n\n/**\n * Generate an AI-powered implementation plan for a GitHub issue.\n *\n * Builds a prompt from the issue context and repository description, then\n * calls the AI service to produce a structured plan with tasks, complexity,\n * and technical considerations.\n *\n * @param context - Planning context with issue details and repository config\n * @returns Structured implementation plan\n */\nexport async function analyzePlanning(\n context: PlanningContext,\n): Promise<ImplementationPlan> {\n const systemPrompt = `You are a software development planning assistant for the ${context.owner}/${context.repo} repository.\n\nRepository: ${context.config.repoDescription}\n${context.config.packagePattern ? `Package pattern: ${context.config.packagePattern}` : ''}\n${context.config.packageExamples ? `Example packages: ${context.config.packageExamples.join(', ')}` : ''}\n\nYour task is to create a detailed implementation plan for issues. Analyze the requirements and provide:\n1. A clear summary of what needs to be done\n2. A step-by-step task breakdown\n3. Complexity assessment (simple, moderate, complex)\n4. Technical considerations\n5. Files likely to be affected\n6. Dependencies or blockers`;\n\n const userPrompt = `Issue #${context.issueNumber}: ${context.issueTitle}\n\n${context.issueBody || 'No description provided'}\n\nPlease create a detailed implementation plan following this JSON structure:\n{\n \"summary\": \"Brief summary of the implementation\",\n \"tasks\": [\"Step 1\", \"Step 2\", \"Step 3\"],\n \"complexity\": \"simple|moderate|complex\",\n \"considerations\": [\"Technical consideration 1\", \"Technical consideration 2\"],\n \"affected_files\": [\"file1.ts\", \"file2.ts\"],\n \"dependencies\": [\"Optional blocker or dependency\"]\n}`;\n\n // TODO: Integrate with AI service\n // For now, return a placeholder\n console.log('AI Planning Analysis would be called here');\n console.log('System:', systemPrompt);\n console.log('User:', userPrompt);\n\n // Placeholder response\n return {\n summary: `Implementation plan for: ${context.issueTitle}`,\n tasks: [\n 'Analyze requirements and design approach',\n 'Implement core functionality',\n 'Add tests',\n 'Update documentation',\n ],\n complexity: 'moderate',\n considerations: [\n 'Ensure backward compatibility',\n 'Follow existing code patterns',\n 'Add comprehensive error handling',\n ],\n affected_files: [],\n dependencies: [],\n };\n}\n","/**\n * Definition of Ready validation\n */\n\nimport type { Issue } from '@happyvertical/repos';\nimport type { DefinitionOfReady } from './types.js';\n\n/**\n * Check if an issue meets the Definition of Ready criteria\n */\nexport function validateDefinitionOfReady(\n issue: Issue,\n hasPlanComment: boolean,\n): DefinitionOfReady {\n const labels = issue.labels.map((l) => (typeof l === 'string' ? l : l.name));\n\n return {\n hasClearDescription: !!issue.body && issue.body.trim().length > 50,\n hasTypeLabel: labels.some((l) => l.startsWith('type:')),\n hasPriorityLabel: labels.some((l) => l.startsWith('priority:')),\n hasSizeLabel: labels.some((l) => l.startsWith('size:')),\n hasPlan: hasPlanComment,\n noBlockers: !labels.some((l) => l === 'status: blocked'),\n };\n}\n\n/**\n * Check if issue is ready (all criteria met)\n */\nexport function isReady(dor: DefinitionOfReady): boolean {\n return (\n dor.hasClearDescription &&\n dor.hasTypeLabel &&\n dor.hasPriorityLabel &&\n dor.hasSizeLabel &&\n dor.hasPlan &&\n dor.noBlockers\n );\n}\n\n/**\n * Format Definition of Ready as markdown checklist\n */\nexport function formatDefinitionOfReady(dor: DefinitionOfReady): string {\n const checkbox = (checked: boolean) => (checked ? '[x]' : '[ ]');\n\n return `## Definition of Ready\n\n${checkbox(dor.hasClearDescription)} Clear, actionable description\n${checkbox(dor.hasTypeLabel)} Type label applied\n${checkbox(dor.hasPriorityLabel)} Priority label applied\n${checkbox(dor.hasSizeLabel)} Size label applied\n${checkbox(dor.hasPlan)} Implementation plan documented\n${checkbox(dor.noBlockers)} No blocking dependencies\n\n${isReady(dor) ? '✅ **This issue is ready for implementation!**' : \"⚠️ **This issue needs more work before it's ready.**\"}`;\n}\n","/**\n * Planning workflow comments\n */\n\nimport type { IRepository } from '@happyvertical/repos';\nimport { formatDefinitionOfReady } from './definition-of-ready.js';\nimport type { DefinitionOfReady, ImplementationPlan } from './types.js';\n\n/**\n * Post implementation plan comment\n */\nexport async function postPlanComment(\n repo: IRepository,\n issueNumber: number,\n plan: ImplementationPlan,\n): Promise<void> {\n const comment = `## 🤖 Implementation Plan\n\n### Summary\n${plan.summary}\n\n### Tasks\n${plan.tasks.map((task, i) => `${i + 1}. ${task}`).join('\\n')}\n\n### Complexity\n**${plan.complexity.charAt(0).toUpperCase() + plan.complexity.slice(1)}**\n\n### Technical Considerations\n${plan.considerations.map((c) => `- ${c}`).join('\\n')}\n\n${plan.affected_files && plan.affected_files.length > 0 ? `### Affected Files\\n${plan.affected_files.map((f) => `- \\`${f}\\``).join('\\n')}` : ''}\n\n${plan.dependencies && plan.dependencies.length > 0 ? `### Dependencies\\n${plan.dependencies.map((d) => `- ${d}`).join('\\n')}` : ''}\n\n---\n*This plan was generated by AI. Please review and provide feedback in the comments.*`;\n\n await repo.addComment(issueNumber, comment);\n}\n\n/**\n * Post Definition of Ready status comment\n */\nexport async function postReadyCheckComment(\n repo: IRepository,\n issueNumber: number,\n dor: DefinitionOfReady,\n): Promise<void> {\n const comment = formatDefinitionOfReady(dor);\n await repo.addComment(issueNumber, comment);\n}\n\n/**\n * Post planning error comment\n */\nexport async function postPlanningErrorComment(\n repo: IRepository,\n issueNumber: number,\n error: Error,\n): Promise<void> {\n const comment = `## ⚠️ Planning Failed\n\nAn error occurred while creating the implementation plan:\n\n\\`\\`\\`\n${error.message}\n\\`\\`\\`\n\nPlease try again or create a manual implementation plan in the comments.`;\n\n await repo.addComment(issueNumber, comment);\n}\n","/**\n * Planning Workflow Orchestration\n */\n\nimport { createProject, createRepository } from '../shared/adapters.js';\nimport { analyzePlanning } from './analyze.js';\nimport {\n postPlanComment,\n postPlanningErrorComment,\n postReadyCheckComment,\n} from './comment.js';\nimport { isReady, validateDefinitionOfReady } from './definition-of-ready.js';\nimport type { PlanningContext, PlanningResult } from './types.js';\n\nexport * from './analyze.js';\nexport * from './comment.js';\nexport * from './definition-of-ready.js';\nexport * from './types.js';\n\n/**\n * Start planning workflow for an issue\n */\nexport async function startPlanning(\n context: PlanningContext,\n): Promise<PlanningResult> {\n console.log(\n `Starting planning for issue #${context.issueNumber}: ${context.issueTitle}`,\n );\n\n try {\n const repo = await createRepository(\n context.token,\n context.owner,\n context.repo,\n );\n\n // Add agent: planning label\n await repo.addLabels(context.issueNumber, ['agent: planning']);\n\n // Generate implementation plan\n console.log('Generating implementation plan...');\n const plan = await analyzePlanning(context);\n\n // Post plan comment\n await postPlanComment(repo, context.issueNumber, plan);\n\n console.log('✅ Planning started successfully');\n\n return {\n success: true,\n plan,\n };\n } catch (error) {\n console.error('❌ Planning failed:', (error as Error).message);\n\n try {\n const repo = await createRepository(\n context.token,\n context.owner,\n context.repo,\n );\n await postPlanningErrorComment(repo, context.issueNumber, error as Error);\n } catch {\n // Ignore error posting error comment\n }\n\n return {\n success: false,\n error: (error as Error).message,\n };\n }\n}\n\n/**\n * Complete planning workflow and move to Ready\n */\nexport async function completePlanning(\n context: PlanningContext,\n): Promise<PlanningResult> {\n console.log(\n `Completing planning for issue #${context.issueNumber}: ${context.issueTitle}`,\n );\n\n try {\n const repo = await createRepository(\n context.token,\n context.owner,\n context.repo,\n );\n\n // Get issue details\n const issue = await repo.getIssue(context.issueNumber);\n\n // Check for plan comment (look for \"Implementation Plan\" in comments)\n const comments = await repo.listComments(context.issueNumber);\n const hasPlanComment = comments.some((c) =>\n c.body?.includes('Implementation Plan'),\n );\n\n // Validate Definition of Ready\n const dor = validateDefinitionOfReady(issue, hasPlanComment);\n\n // Post Definition of Ready check\n await postReadyCheckComment(repo, context.issueNumber, dor);\n\n if (!isReady(dor)) {\n console.log('⚠️ Issue does not meet Definition of Ready criteria');\n return {\n success: false,\n error: 'Issue does not meet Definition of Ready criteria',\n };\n }\n\n // Remove agent: planning label\n await repo.removeLabel(context.issueNumber, 'agent: planning');\n\n // Move to Ready status\n if (\n context.config.projectId &&\n context.config.statusFieldId &&\n context.config.statusOptions\n ) {\n const project = await createProject(\n context.token,\n context.config.projectId,\n context.config.statusFieldId,\n context.config.statusOptions,\n );\n\n // Get project item\n const items = await project.listItems();\n const itemId = items.find(\n (item: { contentId: string; id: string }) =>\n item.contentId === issue.id,\n )?.id;\n\n if (itemId) {\n await project.updateItemStatus(itemId, 'Ready');\n }\n }\n\n console.log('✅ Planning completed, moved to Ready');\n\n return {\n success: true,\n };\n } catch (error) {\n console.error('❌ Complete planning failed:', (error as Error).message);\n\n return {\n success: false,\n error: (error as Error).message,\n };\n }\n}\n","/**\n * Shared GitHub API Utilities\n */\n\nexport interface GitHubContext {\n token: string;\n owner: string;\n repo: string;\n}\n\n/**\n * Make a GitHub REST API request\n */\nexport async function githubRequest(\n context: GitHubContext,\n method: string,\n path: string,\n body?: unknown,\n): Promise<unknown> {\n const url = `https://api.github.com${path}`;\n const headers = {\n Authorization: `Bearer ${context.token}`,\n Accept: 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n 'Content-Type': 'application/json',\n };\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(\n `GitHub API error: ${response.status} ${response.statusText}\\n${error}`,\n );\n }\n\n return response.json();\n}\n\n/**\n * Make a GitHub GraphQL API request\n */\nexport async function githubGraphQL(\n token: string,\n query: string,\n variables?: Record<string, unknown>,\n): Promise<unknown> {\n const response = await fetch('https://api.github.com/graphql', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ query, variables }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(\n `GitHub GraphQL error: ${response.status} ${response.statusText}\\n${error}`,\n );\n }\n\n const result = (await response.json()) as {\n data?: unknown;\n errors?: { message: string }[];\n };\n\n if (result.errors) {\n throw new Error(\n `GitHub GraphQL errors: ${result.errors.map((e) => e.message).join(', ')}`,\n );\n }\n\n return result.data;\n}\n\n/**\n * Add labels to an issue\n */\nexport async function addLabels(\n context: GitHubContext,\n issueNumber: number,\n labels: string[],\n): Promise<void> {\n await githubRequest(\n context,\n 'POST',\n `/repos/${context.owner}/${context.repo}/issues/${issueNumber}/labels`,\n { labels },\n );\n}\n\n/**\n * Remove a label from an issue\n */\nexport async function removeLabel(\n context: GitHubContext,\n issueNumber: number,\n label: string,\n): Promise<void> {\n const encodedLabel = encodeURIComponent(label);\n await githubRequest(\n context,\n 'DELETE',\n `/repos/${context.owner}/${context.repo}/issues/${issueNumber}/labels/${encodedLabel}`,\n );\n}\n\n/**\n * Post a comment on an issue\n */\nexport async function postComment(\n context: GitHubContext,\n issueNumber: number,\n body: string,\n): Promise<void> {\n await githubRequest(\n context,\n 'POST',\n `/repos/${context.owner}/${context.repo}/issues/${issueNumber}/comments`,\n { body },\n );\n}\n\n/**\n * Assign users to an issue\n */\nexport async function assignIssue(\n context: GitHubContext,\n issueNumber: number,\n assignees: string[],\n): Promise<void> {\n await githubRequest(\n context,\n 'POST',\n `/repos/${context.owner}/${context.repo}/issues/${issueNumber}/assignees`,\n { assignees },\n );\n}\n\n/**\n * Create or update a repository label\n */\nexport async function createOrUpdateLabel(\n context: GitHubContext,\n name: string,\n color: string,\n description: string,\n): Promise<void> {\n try {\n // Try to update existing label\n await githubRequest(\n context,\n 'PATCH',\n `/repos/${context.owner}/${context.repo}/labels/${encodeURIComponent(name)}`,\n { color, description },\n );\n } catch (error) {\n // If label doesn't exist, create it\n if ((error as Error).message.includes('404')) {\n await githubRequest(\n context,\n 'POST',\n `/repos/${context.owner}/${context.repo}/labels`,\n { name, color, description },\n );\n } else {\n throw error;\n }\n }\n}\n\n/**\n * Get issue details\n */\nexport async function getIssue(\n context: GitHubContext,\n issueNumber: number,\n): Promise<{\n number: number;\n title: string;\n body: string;\n state: string;\n labels: { name: string }[];\n assignees: { login: string }[];\n}> {\n return (await githubRequest(\n context,\n 'GET',\n `/repos/${context.owner}/${context.repo}/issues/${issueNumber}`,\n )) as {\n number: number;\n title: string;\n body: string;\n state: string;\n labels: { name: string }[];\n assignees: { login: string }[];\n };\n}\n","/**\n * GitHub Projects V2 API Utilities\n *\n * Handles interaction with GitHub Projects V2 via GraphQL API.\n */\n\nimport { githubGraphQL } from './github.js';\n\nexport interface ProjectConfig {\n /** GitHub Project V2 ID (e.g., \"PVT_kwDOB9Y8ns4A8-TY\") */\n projectId: string;\n /** Status field ID (e.g., \"PVTSSF_lADOB9Y8ns4A8-TYzgw0GaY\") */\n statusFieldId: string;\n /** Map of status names to option IDs */\n statusOptions: Record<string, string>;\n}\n\n/**\n * Add an issue to a project\n */\nexport async function addIssueToProject(\n token: string,\n projectId: string,\n issueId: string,\n): Promise<string> {\n const mutation = `\n mutation($projectId: ID!, $contentId: ID!) {\n addProjectV2ItemById(input: {\n projectId: $projectId\n contentId: $contentId\n }) {\n item {\n id\n }\n }\n }\n `;\n\n const result = (await githubGraphQL(token, mutation, {\n projectId,\n contentId: issueId,\n })) as {\n addProjectV2ItemById: {\n item: {\n id: string;\n };\n };\n };\n\n return result.addProjectV2ItemById.item.id;\n}\n\n/**\n * Update project item status\n */\nexport async function updateProjectItemStatus(\n token: string,\n projectId: string,\n itemId: string,\n statusFieldId: string,\n statusOptionId: string,\n): Promise<void> {\n const mutation = `\n mutation($projectId: ID!, $itemId: ID!, $fieldId: ID!, $value: ProjectV2FieldValue!) {\n updateProjectV2ItemFieldValue(input: {\n projectId: $projectId\n itemId: $itemId\n fieldId: $fieldId\n value: $value\n }) {\n projectV2Item {\n id\n }\n }\n }\n `;\n\n await githubGraphQL(token, mutation, {\n projectId,\n itemId,\n fieldId: statusFieldId,\n value: {\n singleSelectOptionId: statusOptionId,\n },\n });\n}\n\n/**\n * Get issue's node ID (required for adding to project)\n */\nexport async function getIssueNodeId(\n token: string,\n owner: string,\n repo: string,\n issueNumber: number,\n): Promise<string> {\n const query = `\n query($owner: String!, $repo: String!, $issueNumber: Int!) {\n repository(owner: $owner, name: $repo) {\n issue(number: $issueNumber) {\n id\n }\n }\n }\n `;\n\n const result = (await githubGraphQL(token, query, {\n owner,\n repo,\n issueNumber,\n })) as {\n repository: {\n issue: {\n id: string;\n };\n };\n };\n\n return result.repository.issue.id;\n}\n\n/**\n * Get project item ID for an issue (if it exists in the project)\n */\nexport async function getProjectItemId(\n token: string,\n projectId: string,\n issueId: string,\n): Promise<string | null> {\n const query = `\n query($projectId: ID!) {\n node(id: $projectId) {\n ... on ProjectV2 {\n items(first: 100) {\n nodes {\n id\n content {\n ... on Issue {\n id\n }\n }\n }\n }\n }\n }\n }\n `;\n\n const result = (await githubGraphQL(token, query, {\n projectId,\n })) as {\n node: {\n items: {\n nodes: {\n id: string;\n content: {\n id: string;\n };\n }[];\n };\n };\n };\n\n const item = result.node.items.nodes.find(\n (node) => node.content.id === issueId,\n );\n return item ? item.id : null;\n}\n\n/**\n * Move issue to a specific status in the project\n */\nexport async function moveIssueToStatus(\n token: string,\n owner: string,\n repo: string,\n issueNumber: number,\n config: ProjectConfig,\n statusName: string,\n): Promise<void> {\n const statusOptionId = config.statusOptions[statusName];\n if (!statusOptionId) {\n throw new Error(\n `Status \"${statusName}\" not found in project configuration. Available: ${Object.keys(config.statusOptions).join(', ')}`,\n );\n }\n\n console.log(`Moving issue #${issueNumber} to status \"${statusName}\"...`);\n\n // Get issue node ID\n const issueId = await getIssueNodeId(token, owner, repo, issueNumber);\n\n // Check if issue is already in project\n let itemId = await getProjectItemId(token, config.projectId, issueId);\n\n // Add to project if not already there\n if (!itemId) {\n console.log('Issue not in project, adding...');\n itemId = await addIssueToProject(token, config.projectId, issueId);\n }\n\n // Update status\n console.log(`Updating status to \"${statusName}\"...`);\n await updateProjectItemStatus(\n token,\n config.projectId,\n itemId,\n config.statusFieldId,\n statusOptionId,\n );\n\n console.log(`✅ Issue moved to \"${statusName}\"`);\n}\n","/**\n * Issue Labeling\n */\n\nimport { addLabels, removeLabel } from '../shared/github.js';\nimport type { TriageContext } from './types.js';\n\n/**\n * Apply labels to an issue using the raw GitHub API.\n * @deprecated Use the v2 export which uses `@happyvertical/repos`.\n */\nexport async function applyLabels(\n context: TriageContext,\n labels: string[],\n): Promise<void> {\n if (labels.length === 0) {\n console.log('No labels to apply');\n return;\n }\n\n try {\n await addLabels(context, context.issueNumber, labels);\n console.log(`Applied labels: ${labels.join(', ')}`);\n } catch (error) {\n console.error('Error applying labels:', (error as Error).message);\n throw error;\n }\n}\n\n/**\n * Remove an `agent: <type>` label from an issue. Silently ignores 404 errors.\n * @deprecated Use the v2 export which uses `@happyvertical/repos`.\n */\nexport async function removeAgentLabel(\n context: TriageContext,\n agentType: string,\n): Promise<void> {\n const label = `agent: ${agentType}`;\n try {\n await removeLabel(context, context.issueNumber, label);\n console.log(`Removed label: ${label}`);\n } catch (error) {\n // Ignore if label doesn't exist\n if (!(error as Error).message.includes('404')) {\n console.error('Error removing label:', (error as Error).message);\n }\n }\n}\n\nexport function getTypeLabel(type: string): string {\n return `type: ${type}`;\n}\n\nexport function getPriorityLabel(priority: string): string {\n return `priority: ${priority}`;\n}\n\nexport function getSizeLabel(size: string): string {\n return `size: ${size}`;\n}\n\nexport function getAgentLabel(agentType: string): string {\n return `agent: ${agentType}`;\n}\n","/**\n * GitHub Project Board Management\n */\n\nimport { githubAPI } from './github.js';\nimport type { TriageContext } from './types.js';\n\n/**\n * Update an issue's status on the GitHub Projects V2 board via raw GraphQL.\n * @deprecated Use the v2 export which uses `@happyvertical/projects`.\n */\nexport async function updateProjectStatus(\n context: TriageContext,\n statusName: string,\n): Promise<void> {\n if (!context.config.projectEnabled) {\n console.log('Project board integration disabled');\n return;\n }\n\n if (!context.config.projectId || !context.config.statusFieldId) {\n console.log('Project configuration missing');\n return;\n }\n\n if (\n !context.config.statusOptions ||\n !context.config.statusOptions[statusName]\n ) {\n console.log(`Status \"${statusName}\" not configured`);\n return;\n }\n\n const query = `\n query($owner: String!, $repo: String!, $number: Int!) {\n repository(owner: $owner, name: $repo) {\n issue(number: $number) {\n projectItems(first: 10) {\n nodes {\n id\n }\n }\n }\n }\n }\n `;\n\n try {\n // Get project item ID\n const variables = {\n owner: context.owner,\n repo: context.repo,\n number: context.issueNumber,\n };\n\n const result = (await githubAPI(context.token, 'POST', '/graphql', {\n query,\n variables,\n })) as {\n data: {\n repository: {\n issue: {\n projectItems: {\n nodes: Array<{ id: string }>;\n };\n };\n };\n };\n };\n\n const itemId = result.data.repository.issue.projectItems.nodes[0]?.id;\n\n if (!itemId) {\n console.log('Issue not in project board, skipping status update');\n return;\n }\n\n // Update status\n const updateQuery = `\n mutation($projectId: ID!, $itemId: ID!, $fieldId: ID!, $optionId: String!) {\n updateProjectV2ItemFieldValue(\n input: {\n projectId: $projectId\n itemId: $itemId\n fieldId: $fieldId\n value: { singleSelectOptionId: $optionId }\n }\n ) {\n projectV2Item {\n id\n }\n }\n }\n `;\n\n const updateVars = {\n projectId: context.config.projectId,\n itemId,\n fieldId: context.config.statusFieldId,\n optionId: context.config.statusOptions[statusName],\n };\n\n await githubAPI(context.token, 'POST', '/graphql', {\n query: updateQuery,\n variables: updateVars,\n });\n\n console.log(`Updated project status to: ${statusName}`);\n } catch (error) {\n console.error('Error updating project status:', (error as Error).message);\n }\n}\n","/**\n * Issue Triage Orchestration\n */\n\nimport { analyzeIssue } from './analyze.js';\nimport { postErrorComment, postTriageComment } from './comment.js';\nimport { searchDuplicates } from './duplicates.js';\nimport {\n applyLabels,\n getAgentLabel,\n getPriorityLabel,\n getSizeLabel,\n getTypeLabel,\n removeAgentLabel,\n} from './label.js';\nimport { updateProjectStatus } from './project.js';\nimport type { TriageContext, TriageResult } from './types.js';\n\nexport { analyzeIssue } from './analyze.js';\nexport { postErrorComment, postTriageComment } from './comment.js';\nexport { searchDuplicates } from './duplicates.js';\nexport {\n applyLabels,\n getAgentLabel,\n getPriorityLabel,\n getSizeLabel,\n getTypeLabel,\n removeAgentLabel,\n} from './label.js';\nexport { updateProjectStatus } from './project.js';\nexport * from './types.js';\n\n/**\n * @deprecated Use the default export from `@happyvertical/github-actions` instead.\n * Legacy triage orchestrator using raw GitHub API calls.\n */\nexport async function triageIssue(\n context: TriageContext,\n): Promise<TriageResult> {\n console.log(`Triaging issue #${context.issueNumber}: ${context.issueTitle}`);\n\n try {\n // Apply agent: triage label\n await applyLabels(context, [getAgentLabel('triage')]);\n\n // Get AI analysis\n console.log('Calling AI for analysis...');\n const analysis = await analyzeIssue(context);\n console.log('AI Analysis:', JSON.stringify(analysis, null, 2));\n\n // Search for duplicates\n console.log('Searching for potential duplicates...');\n const duplicates = await searchDuplicates(context);\n console.log(`Found ${duplicates.length} potential duplicates`);\n\n // Apply type, priority, and size labels\n const labels: string[] = [\n getTypeLabel(analysis.type),\n getPriorityLabel(analysis.priority),\n getSizeLabel(analysis.size),\n ];\n\n await applyLabels(context, labels);\n\n // Post triage comment\n await postTriageComment(context, analysis, duplicates);\n\n // Remove agent: triage label\n await removeAgentLabel(context, 'triage');\n\n // Move to Backlog status\n if (context.config.projectEnabled) {\n console.log('Moving issue to Backlog...');\n await updateProjectStatus(context, 'Backlog');\n }\n\n console.log('✅ Triage complete!');\n\n return {\n success: true,\n analysis,\n duplicates,\n };\n } catch (error) {\n console.error('❌ Triage failed:', (error as Error).message);\n console.error((error as Error).stack);\n\n // Post error comment\n await postErrorComment(context, error as Error);\n\n return {\n success: false,\n error: (error as Error).message,\n };\n }\n}\n","/**\n * @happyvertical/github-actions - Reusable GitHub Actions Utilities\n *\n * Provides modular, testable utilities for GitHub Actions workflows including:\n * - Issue triage with AI analysis\n * - Duplicate detection\n * - Auto-labeling\n * - Project board management\n * - Planning workflow automation\n * - Testing and review automation\n */\n\n// Planning module\nexport * from './planning/index.js';\nexport * from './shared/adapters.js';\nexport * from './shared/index.js';\n// Keep legacy exports for backward compatibility\nexport * as legacy from './triage/index.js';\n// Triage module (v2 uses @happyvertical/repos and @happyvertical/projects)\nexport * from './triage/index-v2.js';\n\n/** @internal */\nexport const PACKAGE_VERSION_INITIALIZED = true;\n"],"names":["l","i","f","e"],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Label Management CLI
|
|
4
|
+
*
|
|
5
|
+
* Apply standard labels across repositories
|
|
6
|
+
*/
|
|
7
|
+
interface CliOptions {
|
|
8
|
+
token: string;
|
|
9
|
+
owner: string;
|
|
10
|
+
repo: string;
|
|
11
|
+
dryRun?: boolean;
|
|
12
|
+
includeArea?: boolean;
|
|
13
|
+
areaLabels?: string[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Apply standard labels to a repository
|
|
17
|
+
*/
|
|
18
|
+
export declare function applyStandardLabels(options: CliOptions): Promise<void>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=labels-cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels-cli.d.ts","sourceRoot":"","sources":["../src/labels-cli.ts"],"names":[],"mappings":";AACA;;;;GAIG;AASH,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA6G5E"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ImplementationPlan, PlanningContext } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate an AI-powered implementation plan for a GitHub issue.
|
|
4
|
+
*
|
|
5
|
+
* Builds a prompt from the issue context and repository description, then
|
|
6
|
+
* calls the AI service to produce a structured plan with tasks, complexity,
|
|
7
|
+
* and technical considerations.
|
|
8
|
+
*
|
|
9
|
+
* @param context - Planning context with issue details and repository config
|
|
10
|
+
* @returns Structured implementation plan
|
|
11
|
+
*/
|
|
12
|
+
export declare function analyzePlanning(context: PlanningContext): Promise<ImplementationPlan>;
|
|
13
|
+
//# sourceMappingURL=analyze.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/planning/analyze.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEtE;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAqD7B"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { IRepository } from '@happyvertical/repos';
|
|
2
|
+
import { DefinitionOfReady, ImplementationPlan } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Post implementation plan comment
|
|
5
|
+
*/
|
|
6
|
+
export declare function postPlanComment(repo: IRepository, issueNumber: number, plan: ImplementationPlan): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Post Definition of Ready status comment
|
|
9
|
+
*/
|
|
10
|
+
export declare function postReadyCheckComment(repo: IRepository, issueNumber: number, dor: DefinitionOfReady): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Post planning error comment
|
|
13
|
+
*/
|
|
14
|
+
export declare function postPlanningErrorComment(repo: IRepository, issueNumber: number, error: Error): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=comment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment.d.ts","sourceRoot":"","sources":["../../src/planning/comment.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAExE;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,WAAW,EACjB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,WAAW,EACjB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,WAAW,EACjB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,IAAI,CAAC,CAYf"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Issue } from '@happyvertical/repos';
|
|
2
|
+
import { DefinitionOfReady } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Check if an issue meets the Definition of Ready criteria
|
|
5
|
+
*/
|
|
6
|
+
export declare function validateDefinitionOfReady(issue: Issue, hasPlanComment: boolean): DefinitionOfReady;
|
|
7
|
+
/**
|
|
8
|
+
* Check if issue is ready (all criteria met)
|
|
9
|
+
*/
|
|
10
|
+
export declare function isReady(dor: DefinitionOfReady): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Format Definition of Ready as markdown checklist
|
|
13
|
+
*/
|
|
14
|
+
export declare function formatDefinitionOfReady(dor: DefinitionOfReady): string;
|
|
15
|
+
//# sourceMappingURL=definition-of-ready.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition-of-ready.d.ts","sourceRoot":"","sources":["../../src/planning/definition-of-ready.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,KAAK,EACZ,cAAc,EAAE,OAAO,GACtB,iBAAiB,CAWnB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CASvD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,iBAAiB,GAAG,MAAM,CAatE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PlanningContext, PlanningResult } from './types.js';
|
|
2
|
+
export * from './analyze.js';
|
|
3
|
+
export * from './comment.js';
|
|
4
|
+
export * from './definition-of-ready.js';
|
|
5
|
+
export * from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Start planning workflow for an issue
|
|
8
|
+
*/
|
|
9
|
+
export declare function startPlanning(context: PlanningContext): Promise<PlanningResult>;
|
|
10
|
+
/**
|
|
11
|
+
* Complete planning workflow and move to Ready
|
|
12
|
+
*/
|
|
13
|
+
export declare function completePlanning(context: PlanningContext): Promise<PlanningResult>;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/planning/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAElE,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,0BAA0B,CAAC;AACzC,cAAc,YAAY,CAAC;AAE3B;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,CAAC,CA+CzB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,CAAC,CA4EzB"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Planning Workflow Types
|
|
3
|
+
*/
|
|
4
|
+
export interface PlanningConfig {
|
|
5
|
+
/** Repository description for AI context */
|
|
6
|
+
repoDescription: string;
|
|
7
|
+
/** Package pattern (e.g., "@happyvertical/*", "@smrt/*") */
|
|
8
|
+
packagePattern?: string;
|
|
9
|
+
/** Example package names for AI context */
|
|
10
|
+
packageExamples?: string[];
|
|
11
|
+
/** GitHub Project configuration */
|
|
12
|
+
projectId?: string;
|
|
13
|
+
/** Status field ID */
|
|
14
|
+
statusFieldId?: string;
|
|
15
|
+
/** Status option IDs */
|
|
16
|
+
statusOptions?: {
|
|
17
|
+
[statusName: string]: string;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export interface PlanningContext {
|
|
21
|
+
/** GitHub token */
|
|
22
|
+
token: string;
|
|
23
|
+
/** Repository owner */
|
|
24
|
+
owner: string;
|
|
25
|
+
/** Repository name */
|
|
26
|
+
repo: string;
|
|
27
|
+
/** Issue number */
|
|
28
|
+
issueNumber: number;
|
|
29
|
+
/** Issue title */
|
|
30
|
+
issueTitle: string;
|
|
31
|
+
/** Issue body */
|
|
32
|
+
issueBody?: string;
|
|
33
|
+
/** Issue author */
|
|
34
|
+
issueAuthor: string;
|
|
35
|
+
/** Configuration */
|
|
36
|
+
config: PlanningConfig;
|
|
37
|
+
}
|
|
38
|
+
export interface ImplementationPlan {
|
|
39
|
+
/** Summary of the plan */
|
|
40
|
+
summary: string;
|
|
41
|
+
/** List of tasks to complete */
|
|
42
|
+
tasks: string[];
|
|
43
|
+
/** Estimated effort/complexity */
|
|
44
|
+
complexity: 'simple' | 'moderate' | 'complex';
|
|
45
|
+
/** Technical considerations */
|
|
46
|
+
considerations: string[];
|
|
47
|
+
/** Files likely to be affected */
|
|
48
|
+
affected_files?: string[];
|
|
49
|
+
/** Dependencies or blockers */
|
|
50
|
+
dependencies?: string[];
|
|
51
|
+
}
|
|
52
|
+
export interface PlanningResult {
|
|
53
|
+
success: boolean;
|
|
54
|
+
plan?: ImplementationPlan;
|
|
55
|
+
error?: string;
|
|
56
|
+
}
|
|
57
|
+
export interface DefinitionOfReady {
|
|
58
|
+
/** Issue has clear, actionable description */
|
|
59
|
+
hasClearDescription: boolean;
|
|
60
|
+
/** Issue has type label */
|
|
61
|
+
hasTypeLabel: boolean;
|
|
62
|
+
/** Issue has priority label */
|
|
63
|
+
hasPriorityLabel: boolean;
|
|
64
|
+
/** Issue has size label */
|
|
65
|
+
hasSizeLabel: boolean;
|
|
66
|
+
/** Implementation plan is documented */
|
|
67
|
+
hasPlan: boolean;
|
|
68
|
+
/** No blocking dependencies */
|
|
69
|
+
noBlockers: boolean;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/planning/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,eAAe,EAAE,MAAM,CAAC;IACxB,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2CAA2C;IAC3C,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,aAAa,CAAC,EAAE;QACd,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;KAC9B,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB;IACpB,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,kCAAkC;IAClC,UAAU,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IAC9C,+BAA+B;IAC/B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,kCAAkC;IAClC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,+BAA+B;IAC/B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,mBAAmB,EAAE,OAAO,CAAC;IAC7B,2BAA2B;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,+BAA+B;IAC/B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,2BAA2B;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,UAAU,EAAE,OAAO,CAAC;CACrB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { IProject } from '@happyvertical/projects';
|
|
2
|
+
import { IRepository } from '@happyvertical/repos';
|
|
3
|
+
/**
|
|
4
|
+
* Create a repository client from GitHub context
|
|
5
|
+
*/
|
|
6
|
+
export declare function createRepository(token: string, owner: string, repo: string): Promise<IRepository>;
|
|
7
|
+
/**
|
|
8
|
+
* Create a project client from configuration
|
|
9
|
+
*/
|
|
10
|
+
export declare function createProject(token: string, projectId: string, statusFieldId: string, statusOptions: Record<string, string>): Promise<IProject>;
|
|
11
|
+
//# sourceMappingURL=adapters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/shared/adapters.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,WAAW,CAAC,CAOtB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,OAAO,CAAC,QAAQ,CAAC,CAQnB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Client Wrapper
|
|
3
|
+
*
|
|
4
|
+
* Provides a unified interface for AI API calls.
|
|
5
|
+
* Supports GitHub Models API (default) and other providers.
|
|
6
|
+
*/
|
|
7
|
+
export interface AIMessage {
|
|
8
|
+
role: 'system' | 'user' | 'assistant';
|
|
9
|
+
content: string;
|
|
10
|
+
}
|
|
11
|
+
export interface AICompletionOptions {
|
|
12
|
+
model?: string;
|
|
13
|
+
temperature?: number;
|
|
14
|
+
maxTokens?: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Call GitHub Models API (available to all GitHub users)
|
|
18
|
+
*/
|
|
19
|
+
export declare function callGitHubModels(token: string, messages: AIMessage[], options?: AICompletionOptions): Promise<string>;
|
|
20
|
+
/**
|
|
21
|
+
* Call OpenAI API directly
|
|
22
|
+
*/
|
|
23
|
+
export declare function callOpenAI(apiKey: string, messages: AIMessage[], options?: AICompletionOptions): Promise<string>;
|
|
24
|
+
/**
|
|
25
|
+
* Call Anthropic Claude API
|
|
26
|
+
*/
|
|
27
|
+
export declare function callAnthropic(apiKey: string, messages: AIMessage[], options?: AICompletionOptions): Promise<string>;
|
|
28
|
+
/**
|
|
29
|
+
* Unified AI completion function
|
|
30
|
+
*
|
|
31
|
+
* Automatically selects provider based on available environment variables:
|
|
32
|
+
* - GITHUB_TOKEN → GitHub Models (default)
|
|
33
|
+
* - OPENAI_API_KEY → OpenAI
|
|
34
|
+
* - ANTHROPIC_API_KEY → Anthropic
|
|
35
|
+
*/
|
|
36
|
+
export declare function getAICompletion(messages: AIMessage[], options?: AICompletionOptions): Promise<string>;
|
|
37
|
+
/**
|
|
38
|
+
* Parse JSON from AI response
|
|
39
|
+
*
|
|
40
|
+
* Handles markdown code blocks and extracts JSON
|
|
41
|
+
*/
|
|
42
|
+
export declare function parseAIJson<T>(response: string): T;
|
|
43
|
+
//# sourceMappingURL=ai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/shared/ai.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,SAAS,EAAE,EACrB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,CAkCjB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,SAAS,EAAE,EACrB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,CA+BjB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,SAAS,EAAE,EACrB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,CAqCjB;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,SAAS,EAAE,EACrB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CAoBlD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared GitHub API Utilities
|
|
3
|
+
*/
|
|
4
|
+
export interface GitHubContext {
|
|
5
|
+
token: string;
|
|
6
|
+
owner: string;
|
|
7
|
+
repo: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Make a GitHub REST API request
|
|
11
|
+
*/
|
|
12
|
+
export declare function githubRequest(context: GitHubContext, method: string, path: string, body?: unknown): Promise<unknown>;
|
|
13
|
+
/**
|
|
14
|
+
* Make a GitHub GraphQL API request
|
|
15
|
+
*/
|
|
16
|
+
export declare function githubGraphQL(token: string, query: string, variables?: Record<string, unknown>): Promise<unknown>;
|
|
17
|
+
/**
|
|
18
|
+
* Add labels to an issue
|
|
19
|
+
*/
|
|
20
|
+
export declare function addLabels(context: GitHubContext, issueNumber: number, labels: string[]): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Remove a label from an issue
|
|
23
|
+
*/
|
|
24
|
+
export declare function removeLabel(context: GitHubContext, issueNumber: number, label: string): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Post a comment on an issue
|
|
27
|
+
*/
|
|
28
|
+
export declare function postComment(context: GitHubContext, issueNumber: number, body: string): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Assign users to an issue
|
|
31
|
+
*/
|
|
32
|
+
export declare function assignIssue(context: GitHubContext, issueNumber: number, assignees: string[]): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Create or update a repository label
|
|
35
|
+
*/
|
|
36
|
+
export declare function createOrUpdateLabel(context: GitHubContext, name: string, color: string, description: string): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Get issue details
|
|
39
|
+
*/
|
|
40
|
+
export declare function getIssue(context: GitHubContext, issueNumber: number): Promise<{
|
|
41
|
+
number: number;
|
|
42
|
+
title: string;
|
|
43
|
+
body: string;
|
|
44
|
+
state: string;
|
|
45
|
+
labels: {
|
|
46
|
+
name: string;
|
|
47
|
+
}[];
|
|
48
|
+
assignees: {
|
|
49
|
+
login: string;
|
|
50
|
+
}[];
|
|
51
|
+
}>;
|
|
52
|
+
//# sourceMappingURL=github.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/shared/github.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,OAAO,CAAC,CAuBlB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,OAAO,CAAC,CA6BlB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3B,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAChC,CAAC,CAaD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standard Label Definitions and Management
|
|
3
|
+
*
|
|
4
|
+
* Defines the organization-wide standard label set for kanban workflow.
|
|
5
|
+
*/
|
|
6
|
+
export interface LabelDefinition {
|
|
7
|
+
name: string;
|
|
8
|
+
color: string;
|
|
9
|
+
description: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Standard label set organized by category
|
|
13
|
+
*/
|
|
14
|
+
export declare const STANDARD_LABELS: Record<string, LabelDefinition[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Area labels are repository-specific, so we provide a template
|
|
17
|
+
*/
|
|
18
|
+
export declare const AREA_LABEL_TEMPLATE: LabelDefinition[];
|
|
19
|
+
/**
|
|
20
|
+
* Get all standard labels as a flat array
|
|
21
|
+
*/
|
|
22
|
+
export declare function getAllStandardLabels(): LabelDefinition[];
|
|
23
|
+
/**
|
|
24
|
+
* Get labels by category
|
|
25
|
+
*/
|
|
26
|
+
export declare function getLabelsByCategory(category: string): LabelDefinition[];
|
|
27
|
+
/**
|
|
28
|
+
* Map old label names to new standard names
|
|
29
|
+
*/
|
|
30
|
+
export declare const LABEL_MIGRATIONS: Record<string, string>;
|
|
31
|
+
/**
|
|
32
|
+
* Migrate old label to new standard label
|
|
33
|
+
*/
|
|
34
|
+
export declare function migrateLabel(oldLabel: string): string;
|
|
35
|
+
//# sourceMappingURL=labels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../../src/shared/labels.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,CAwG7D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,eAAe,EAoChD,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,eAAe,EAAE,CAExD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE,CAEvE;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQnD,CAAC;AAEF;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Projects V2 API Utilities
|
|
3
|
+
*
|
|
4
|
+
* Handles interaction with GitHub Projects V2 via GraphQL API.
|
|
5
|
+
*/
|
|
6
|
+
export interface ProjectConfig {
|
|
7
|
+
/** GitHub Project V2 ID (e.g., "PVT_kwDOB9Y8ns4A8-TY") */
|
|
8
|
+
projectId: string;
|
|
9
|
+
/** Status field ID (e.g., "PVTSSF_lADOB9Y8ns4A8-TYzgw0GaY") */
|
|
10
|
+
statusFieldId: string;
|
|
11
|
+
/** Map of status names to option IDs */
|
|
12
|
+
statusOptions: Record<string, string>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Add an issue to a project
|
|
16
|
+
*/
|
|
17
|
+
export declare function addIssueToProject(token: string, projectId: string, issueId: string): Promise<string>;
|
|
18
|
+
/**
|
|
19
|
+
* Update project item status
|
|
20
|
+
*/
|
|
21
|
+
export declare function updateProjectItemStatus(token: string, projectId: string, itemId: string, statusFieldId: string, statusOptionId: string): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Get issue's node ID (required for adding to project)
|
|
24
|
+
*/
|
|
25
|
+
export declare function getIssueNodeId(token: string, owner: string, repo: string, issueNumber: number): Promise<string>;
|
|
26
|
+
/**
|
|
27
|
+
* Get project item ID for an issue (if it exists in the project)
|
|
28
|
+
*/
|
|
29
|
+
export declare function getProjectItemId(token: string, projectId: string, issueId: string): Promise<string | null>;
|
|
30
|
+
/**
|
|
31
|
+
* Move issue to a specific status in the project
|
|
32
|
+
*/
|
|
33
|
+
export declare function moveIssueToStatus(token: string, owner: string, repo: string, issueNumber: number, config: ProjectConfig, statusName: string): Promise<void>;
|
|
34
|
+
//# sourceMappingURL=projects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/shared/projects.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,aAAa;IAC5B,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,aAAa,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAwBjB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuCxB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAiCf"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AIAnalysis, TriageContext } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Analyze a GitHub issue using AI to determine type, priority, size, and affected packages.
|
|
4
|
+
*
|
|
5
|
+
* Sends the issue details to the configured AI provider and validates the structured response.
|
|
6
|
+
*
|
|
7
|
+
* @param context - Triage context with issue details and repository config
|
|
8
|
+
* @returns Validated AI analysis with type, priority, size, and reasoning
|
|
9
|
+
* @throws If the AI response cannot be parsed or fails validation
|
|
10
|
+
*/
|
|
11
|
+
export declare function analyzeIssue(context: TriageContext): Promise<AIAnalysis>;
|
|
12
|
+
//# sourceMappingURL=analyze.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/triage/analyze.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAyE5D;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,UAAU,CAAC,CAiBrB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { AIAnalysis, DuplicateIssue, TriageContext } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Post a structured triage comment on the issue with AI analysis results and duplicate links.
|
|
4
|
+
*
|
|
5
|
+
* @param context - Triage context with repo info and issue number
|
|
6
|
+
* @param analysis - AI analysis results (type, priority, size, reasoning)
|
|
7
|
+
* @param duplicates - Array of potential duplicate issues to include in the comment
|
|
8
|
+
*/
|
|
9
|
+
export declare function postTriageComment(context: TriageContext, analysis: AIAnalysis, duplicates: DuplicateIssue[]): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Post a comment indicating that automated triage failed, prompting manual triage.
|
|
12
|
+
*
|
|
13
|
+
* @param context - Triage context with repo info and issue number
|
|
14
|
+
* @param error - The error that caused triage to fail
|
|
15
|
+
*/
|
|
16
|
+
export declare function postErrorComment(context: TriageContext, error: Error): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=comment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment.d.ts","sourceRoot":"","sources":["../../src/triage/comment.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5E;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,UAAU,EACpB,UAAU,EAAE,cAAc,EAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,IAAI,CAAC,CASf"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { DuplicateIssue, TriageContext } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Search for potential duplicate issues using GitHub Search API.
|
|
4
|
+
*
|
|
5
|
+
* Extracts keywords from the issue title and searches the repository for similar issues.
|
|
6
|
+
* The current issue is excluded from results.
|
|
7
|
+
*
|
|
8
|
+
* @param context - Triage context with issue details and repo info
|
|
9
|
+
* @returns Array of potentially duplicate issues (up to 4)
|
|
10
|
+
*/
|
|
11
|
+
export declare function searchDuplicates(context: TriageContext): Promise<DuplicateIssue[]>;
|
|
12
|
+
//# sourceMappingURL=duplicates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplicates.d.ts","sourceRoot":"","sources":["../../src/triage/duplicates.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhE;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,cAAc,EAAE,CAAC,CAgB3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/triage/github.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,OAAc,GACnB,OAAO,CAAC,OAAO,CAAC,CAqClB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { TriageContext, TriageResult } from './types.js';
|
|
2
|
+
export { analyzeIssue } from './analyze.js';
|
|
3
|
+
export { postErrorComment, postTriageComment } from './comment.js';
|
|
4
|
+
export { searchDuplicates } from './duplicates.js';
|
|
5
|
+
export { applyLabels, getAgentLabel, getPriorityLabel, getSizeLabel, getTypeLabel, removeAgentLabel, } from './label-v2.js';
|
|
6
|
+
export { updateProjectStatus } from './project-v2.js';
|
|
7
|
+
export * from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Run the full issue triage workflow using `@happyvertical/repos`.
|
|
10
|
+
*
|
|
11
|
+
* Applies an agent label, runs AI analysis, searches for duplicates,
|
|
12
|
+
* applies type/priority/size labels, posts a triage comment, and
|
|
13
|
+
* optionally updates the project board status.
|
|
14
|
+
*
|
|
15
|
+
* @param context - Triage context including token, repo info, issue details, and config
|
|
16
|
+
* @returns Result indicating success/failure with analysis and duplicate data
|
|
17
|
+
*/
|
|
18
|
+
export declare function triageIssue(context: TriageContext): Promise<TriageResult>;
|
|
19
|
+
//# sourceMappingURL=index-v2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-v2.d.ts","sourceRoot":"","sources":["../../src/triage/index-v2.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACL,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,cAAc,YAAY,CAAC;AAE3B;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CAyDvB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { TriageContext, TriageResult } from './types.js';
|
|
2
|
+
export { analyzeIssue } from './analyze.js';
|
|
3
|
+
export { postErrorComment, postTriageComment } from './comment.js';
|
|
4
|
+
export { searchDuplicates } from './duplicates.js';
|
|
5
|
+
export { applyLabels, getAgentLabel, getPriorityLabel, getSizeLabel, getTypeLabel, removeAgentLabel, } from './label.js';
|
|
6
|
+
export { updateProjectStatus } from './project.js';
|
|
7
|
+
export * from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* @deprecated Use the default export from `@happyvertical/github-actions` instead.
|
|
10
|
+
* Legacy triage orchestrator using raw GitHub API calls.
|
|
11
|
+
*/
|
|
12
|
+
export declare function triageIssue(context: TriageContext): Promise<TriageResult>;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/triage/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACL,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,cAAc,YAAY,CAAC;AAE3B;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CAyDvB"}
|