@jiraacp/cli 2026.405.4

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.
Files changed (113) hide show
  1. package/README.md +283 -0
  2. package/dist/abort-GQE4OI5S.js +103 -0
  3. package/dist/abort-GQE4OI5S.js.map +1 -0
  4. package/dist/abort-VMRQOADY.js +96 -0
  5. package/dist/abort-VMRQOADY.js.map +1 -0
  6. package/dist/bot-WOTETAJY.js +13 -0
  7. package/dist/bot-WOTETAJY.js.map +1 -0
  8. package/dist/cancel-clarification-4G5S2HJZ.js +64 -0
  9. package/dist/cancel-clarification-4G5S2HJZ.js.map +1 -0
  10. package/dist/chunk-3U373M37.js +67 -0
  11. package/dist/chunk-3U373M37.js.map +1 -0
  12. package/dist/chunk-3YHD4SIN.js +97 -0
  13. package/dist/chunk-3YHD4SIN.js.map +1 -0
  14. package/dist/chunk-6IY6CRUJ.js +690 -0
  15. package/dist/chunk-6IY6CRUJ.js.map +1 -0
  16. package/dist/chunk-B6OA3XJK.js +1167 -0
  17. package/dist/chunk-B6OA3XJK.js.map +1 -0
  18. package/dist/chunk-BM4R6NST.js +191 -0
  19. package/dist/chunk-BM4R6NST.js.map +1 -0
  20. package/dist/chunk-FLPIU2QO.js +77 -0
  21. package/dist/chunk-FLPIU2QO.js.map +1 -0
  22. package/dist/chunk-H7YXX4UA.js +86 -0
  23. package/dist/chunk-H7YXX4UA.js.map +1 -0
  24. package/dist/chunk-IT74N3UH.js +19 -0
  25. package/dist/chunk-IT74N3UH.js.map +1 -0
  26. package/dist/chunk-JOT4UVSO.js +186 -0
  27. package/dist/chunk-JOT4UVSO.js.map +1 -0
  28. package/dist/chunk-KSJKCLEJ.js +222 -0
  29. package/dist/chunk-KSJKCLEJ.js.map +1 -0
  30. package/dist/chunk-LIEW4ULF.js +139 -0
  31. package/dist/chunk-LIEW4ULF.js.map +1 -0
  32. package/dist/chunk-M4V3YOCY.js +82 -0
  33. package/dist/chunk-M4V3YOCY.js.map +1 -0
  34. package/dist/chunk-MMWQHH25.js +207 -0
  35. package/dist/chunk-MMWQHH25.js.map +1 -0
  36. package/dist/chunk-OJ4CNF73.js +78 -0
  37. package/dist/chunk-OJ4CNF73.js.map +1 -0
  38. package/dist/chunk-PFJAC3RO.js +137 -0
  39. package/dist/chunk-PFJAC3RO.js.map +1 -0
  40. package/dist/chunk-PVKVCUNR.js +159 -0
  41. package/dist/chunk-PVKVCUNR.js.map +1 -0
  42. package/dist/chunk-RXT4WSIY.js +35 -0
  43. package/dist/chunk-RXT4WSIY.js.map +1 -0
  44. package/dist/chunk-RZK74PDF.js +34 -0
  45. package/dist/chunk-RZK74PDF.js.map +1 -0
  46. package/dist/chunk-UDTWVKRX.js +68 -0
  47. package/dist/chunk-UDTWVKRX.js.map +1 -0
  48. package/dist/chunk-VCEONSWJ.js +307 -0
  49. package/dist/chunk-VCEONSWJ.js.map +1 -0
  50. package/dist/chunk-VWBCDZWQ.js +119 -0
  51. package/dist/chunk-VWBCDZWQ.js.map +1 -0
  52. package/dist/chunk-WEJCTFQB.js +228 -0
  53. package/dist/chunk-WEJCTFQB.js.map +1 -0
  54. package/dist/chunk-YJK7IRPI.js +223 -0
  55. package/dist/chunk-YJK7IRPI.js.map +1 -0
  56. package/dist/claude-md-HQ6L4CRP.js +8 -0
  57. package/dist/claude-md-HQ6L4CRP.js.map +1 -0
  58. package/dist/cli.js +276 -0
  59. package/dist/cli.js.map +1 -0
  60. package/dist/commands-RG45VBTZ.js +407 -0
  61. package/dist/commands-RG45VBTZ.js.map +1 -0
  62. package/dist/commands-WYVRVE5Z.js +400 -0
  63. package/dist/commands-WYVRVE5Z.js.map +1 -0
  64. package/dist/config-edit-G7O56HXO.js +50 -0
  65. package/dist/config-edit-G7O56HXO.js.map +1 -0
  66. package/dist/config-set-QN3JRNZL.js +63 -0
  67. package/dist/config-set-QN3JRNZL.js.map +1 -0
  68. package/dist/daemon-CGBV55JK.js +104 -0
  69. package/dist/daemon-CGBV55JK.js.map +1 -0
  70. package/dist/dashboard-YVFJ5DXR.js +143 -0
  71. package/dist/dashboard-YVFJ5DXR.js.map +1 -0
  72. package/dist/doctor-BPTLVLTD.js +98 -0
  73. package/dist/doctor-BPTLVLTD.js.map +1 -0
  74. package/dist/human-loop-RBTA2TYK.js +16 -0
  75. package/dist/human-loop-RBTA2TYK.js.map +1 -0
  76. package/dist/human-loop-XGWXUNCS.js +18 -0
  77. package/dist/human-loop-XGWXUNCS.js.map +1 -0
  78. package/dist/index.d.ts +583 -0
  79. package/dist/index.js +28 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/loader-DGW7HCJ5.js +21 -0
  82. package/dist/loader-DGW7HCJ5.js.map +1 -0
  83. package/dist/logs-JUVQWN6C.js +93 -0
  84. package/dist/logs-JUVQWN6C.js.map +1 -0
  85. package/dist/mcp.js +132 -0
  86. package/dist/mcp.js.map +1 -0
  87. package/dist/orchestrator-3MGXX3QW.js +22 -0
  88. package/dist/orchestrator-3MGXX3QW.js.map +1 -0
  89. package/dist/orchestrator-BVUKN5N3.js +13 -0
  90. package/dist/orchestrator-BVUKN5N3.js.map +1 -0
  91. package/dist/pause-FLDZ3OD6.js +62 -0
  92. package/dist/pause-FLDZ3OD6.js.map +1 -0
  93. package/dist/projects-QMIGNW7U.js +129 -0
  94. package/dist/projects-QMIGNW7U.js.map +1 -0
  95. package/dist/replay-M4JEG4Z4.js +151 -0
  96. package/dist/replay-M4JEG4Z4.js.map +1 -0
  97. package/dist/schedule-CDHD77VZ.js +17 -0
  98. package/dist/schedule-CDHD77VZ.js.map +1 -0
  99. package/dist/serve-XI7JTIPZ.js +231 -0
  100. package/dist/serve-XI7JTIPZ.js.map +1 -0
  101. package/dist/sprint-KZZWVNK6.js +200 -0
  102. package/dist/sprint-KZZWVNK6.js.map +1 -0
  103. package/dist/status-I6GU2LWE.js +48 -0
  104. package/dist/status-I6GU2LWE.js.map +1 -0
  105. package/dist/topic-manager-4AMEPMFI.js +12 -0
  106. package/dist/topic-manager-4AMEPMFI.js.map +1 -0
  107. package/dist/triage-WNHGPVZQ.js +251 -0
  108. package/dist/triage-WNHGPVZQ.js.map +1 -0
  109. package/dist/usage-AWWBI37F.js +155 -0
  110. package/dist/usage-AWWBI37F.js.map +1 -0
  111. package/dist/wizard-CYEJJLNF.js +190 -0
  112. package/dist/wizard-CYEJJLNF.js.map +1 -0
  113. package/package.json +56 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pipeline/cost-guard.ts","../src/pipeline/stages/3-clarify.ts","../src/pipeline/stages/4-code.ts","../src/pipeline/stages/5-git.ts","../src/pipeline/stages/6-review.ts","../src/pipeline/stages/7-deploy.ts","../src/pipeline/stages/8-test.ts","../src/pipeline/stages/9-notify.ts","../src/pipeline/hooks.ts","../src/pipeline/orchestrator.ts"],"sourcesContent":["import type { TelegramNotifier } from \"../integrations/telegram/notifier.js\";\nimport { getEvents } from \"./state.js\";\nimport { estimateCostUsd, extractTokenUsage } from \"../utils/pricing.js\";\n\nexport async function checkCostLimit(opts: {\n runDir: string;\n maxCostUsd: number;\n telegram: TelegramNotifier;\n ticketKey: string;\n}): Promise<\"continue\" | \"abort\"> {\n const events = getEvents(opts.runDir);\n\n let totalCost = 0;\n\n for (const event of events) {\n if (event.type !== \"STAGE_COMPLETED\") continue;\n const tu = extractTokenUsage(event.output);\n if (!tu) continue;\n totalCost += estimateCostUsd(tu.inputTokens, tu.outputTokens, tu.model);\n }\n\n if (totalCost >= opts.maxCostUsd) {\n await opts.telegram.send(\n `⛔ <b>${opts.ticketKey}</b> — Cost limit reached ($${totalCost.toFixed(4)} / $${opts.maxCostUsd}). Aborting pipeline.`,\n );\n return \"abort\";\n }\n\n if (totalCost >= 0.8 * opts.maxCostUsd) {\n await opts.telegram.send(\n `⚠️ <b>${opts.ticketKey}</b> — Cost at 80% of limit ($${totalCost.toFixed(4)} / $${opts.maxCostUsd}).`,\n );\n }\n\n return \"continue\";\n}\n","import type { Stage, PipelineContext, StageOutput } from \"./types.js\";\nimport { requestClarification } from \"../../integrations/telegram/human-loop.js\";\nimport { appendClarifications } from \"../../memory/context-builder.js\";\nimport path from \"node:path\";\n\nexport const clarifyStage: Stage = {\n id: \"clarify\",\n name: \"Clarify\",\n model: \"haiku\",\n\n async shouldSkip(ctx: PipelineContext): Promise<boolean> {\n const lastAnalyze = ctx.state.current.completedStages.includes(\"analyze\");\n if (!lastAnalyze) return true;\n // Read analysis output from event log\n const events = (\n ctx.state as unknown as {\n events: Array<{ type: string; stage?: string; output?: unknown }>;\n }\n ).events;\n const analyzeEvent = events.findLast(\n (e) => e.type === \"STAGE_COMPLETED\" && e.stage === \"analyze\",\n );\n const output = analyzeEvent?.output as\n | { needsClarification?: boolean }\n | undefined;\n return !output?.needsClarification;\n },\n\n async run(ctx: PipelineContext): Promise<StageOutput> {\n const { config, ticketKey, memoryDir } = ctx;\n const storeDir = path.join(config.workspace.rootDir, \".jira-acp\");\n\n // Get questions from analyze stage output\n const events = (\n ctx.state as unknown as {\n events: Array<{ type: string; stage?: string; output?: unknown }>;\n }\n ).events;\n const analyzeEvent = events.findLast(\n (e) => e.type === \"STAGE_COMPLETED\" && e.stage === \"analyze\",\n );\n const questions = (analyzeEvent?.output as { questions?: string[] })\n ?.questions ?? [\"Please clarify the ticket requirements.\"];\n\n ctx.logger.info(\n { ticketKey, questions },\n \"Requesting clarification via Telegram\",\n );\n\n const hil = config.telegram.humanInTheLoop;\n const answers = await requestClarification(\n config.telegram.botToken,\n config.telegram.chatId,\n ticketKey,\n questions,\n storeDir,\n {\n timeoutMs: hil?.clarificationTimeoutMs ?? 3_600_000,\n onTimeout: hil?.clarificationTimeoutAction ?? \"skip\",\n },\n );\n\n appendClarifications(memoryDir, answers);\n ctx.logger.info({ ticketKey }, \"Clarifications received and saved\");\n\n return { clarified: true, answers };\n },\n};\n","import type { Stage, PipelineContext, StageOutput } from \"./types.js\";\nimport { runAgent, detectComplexity } from \"../runner.js\";\nimport {\n getContextFilesForStage,\n readTicketContext,\n} from \"../../memory/context-builder.js\";\n\nexport const codeStage: Stage = {\n id: \"code\",\n name: \"Code\",\n model: \"sonnet\",\n\n async run(ctx: PipelineContext): Promise<StageOutput> {\n const { config, ticketKey, memoryDir, projectDir } = ctx;\n\n const ticketCtx = readTicketContext(memoryDir);\n const contextFiles = getContextFilesForStage(projectDir, memoryDir, \"code\");\n\n const model = detectComplexity(ticketCtx);\n ctx.logger.info({ ticketKey, model }, \"Starting code agent\");\n\n const branchName = buildBranchName(\n config.github.branchPattern ?? \"feature/{ticketKey}-{slug}\",\n ticketKey,\n ticketCtx,\n );\n\n const prompt = `\nImplement the following Jira ticket: ${ticketKey}\n\nRead the ticket context from the provided context files.\n\nRequirements:\n1. Create branch: ${branchName}\n2. Implement all acceptance criteria\n3. Write tests for new functionality\n4. Commit with message: \"${ticketKey}: <short description>\"\n5. Do NOT push — pipeline will handle git operations\n\nBranch naming: ${branchName}\nWorkspace: ${config.workspace.rootDir}\n${config.workspace.buildCommand ? `Build command: ${config.workspace.buildCommand}` : \"\"}\n`.trim();\n\n if (!ctx.dryRun) {\n await runAgent({\n prompt,\n workdir: config.workspace.rootDir,\n model,\n contextFiles,\n timeoutMs: config.pipeline?.stageTimeouts?.code ?? 1_800_000,\n stallTimeoutMs: config.pipeline?.agentStallTimeoutMs ?? 300_000,\n });\n }\n\n ctx.logger.info({ ticketKey, branchName }, \"Code agent completed\");\n return { branchName };\n },\n};\n\nfunction buildBranchName(\n pattern: string,\n ticketKey: string,\n ticketCtx: string,\n): string {\n const summaryLine = ticketCtx\n .split(\"\\n\")\n .find((l) => l.startsWith(\"## Summary\"));\n const nextLine = summaryLine\n ? (ticketCtx.split(\"\\n\")[ticketCtx.split(\"\\n\").indexOf(summaryLine) + 1] ??\n \"\")\n : \"\";\n const slug = nextLine\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .trim()\n .replace(/\\s+/g, \"-\")\n .slice(0, 40);\n\n return pattern\n .replace(\"{ticketKey}\", ticketKey)\n .replace(\"{prefix}\", \"feature\")\n .replace(\"{slug}\", slug || \"implementation\");\n}\n","import type { Stage, PipelineContext, StageOutput } from \"./types.js\";\nimport { spawnSafe } from \"../../utils/process.js\";\nimport { readTicketContext } from \"../../memory/context-builder.js\";\n\nexport const gitStage: Stage = {\n id: \"git\",\n name: \"Git & PR\",\n model: \"haiku\",\n\n async run(ctx: PipelineContext): Promise<StageOutput> {\n const { config, ticketKey, state } = ctx;\n const branchName = state.current.branchName;\n if (!branchName)\n throw new Error(\"No branch name in state — code stage must run first\");\n\n const workdir = config.workspace.rootDir;\n const ticketCtx = readTicketContext(ctx.memoryDir);\n const summaryLine = ticketCtx\n .split(\"\\n\")\n .find((l) => l.startsWith(\"## Summary\"));\n const summary =\n ticketCtx.split(\"\\n\")[\n ticketCtx.split(\"\\n\").indexOf(summaryLine ?? \"\") + 1\n ] ?? ticketKey;\n\n ctx.logger.info(\n { ticketKey, branchName },\n \"Pushing branch and creating PR\",\n );\n\n if (!ctx.dryRun) {\n // Push branch\n await spawnSafe(\"git\", [\"push\", \"origin\", branchName], { cwd: workdir });\n\n // Create PR via GitHub client\n const prNumber = await ctx.github.createPR({\n title: `[${ticketKey}] ${summary.trim()}`,\n body: buildPrBody(ticketKey, ticketCtx),\n head: branchName,\n base: config.github.defaultBranch ?? \"main\",\n draft: config.github.prDraftByDefault ?? false,\n });\n\n if (config.github.reviewers?.length) {\n await ctx.github.addReviewers(prNumber, config.github.reviewers);\n }\n\n ctx.logger.info({ ticketKey, prNumber }, \"PR created\");\n return { branchName, prNumber };\n }\n\n return { branchName, prNumber: null };\n },\n};\n\nfunction buildPrBody(ticketKey: string, ticketCtx: string): string {\n return `## ${ticketKey}\n\n${ticketCtx}\n\n---\n*Generated by jiraACP automated pipeline*`;\n}\n","import type { Stage, PipelineContext, StageOutput } from \"./types.js\";\nimport { runAgentsParallel } from \"../runner.js\";\nimport {\n getContextFilesForStage,\n writeReviewFeedback,\n} from \"../../memory/context-builder.js\";\nimport { requestApproval } from \"../../integrations/telegram/human-loop.js\";\n\nexport const reviewStage: Stage = {\n id: \"review\",\n name: \"Review\",\n model: \"sonnet\",\n\n async run(ctx: PipelineContext): Promise<StageOutput> {\n const { config, ticketKey, state, memoryDir, projectDir } = ctx;\n const prNumber = state.current.prNumber;\n if (!prNumber)\n throw new Error(\"No PR number in state — git stage must run first\");\n\n const contextFiles = getContextFilesForStage(\n projectDir,\n memoryDir,\n \"review\",\n );\n ctx.logger.info({ ticketKey, prNumber }, \"Running parallel review agents\");\n\n const logicPrompt = `Review PR #${prNumber} for ticket ${ticketKey}.\nFocus on: Does the implementation correctly satisfy the acceptance criteria?\nList issues as JSON: { \"issues\": [{ \"severity\": \"minor\"|\"major\", \"message\": \"...\" }] }`;\n\n const qualityPrompt = `Review PR #${prNumber} for ticket ${ticketKey}.\nFocus on: Missing tests, security issues, type safety, performance red flags.\nList issues as JSON: { \"issues\": [{ \"severity\": \"minor\"|\"major\", \"message\": \"...\" }] }`;\n\n const agentOpts = {\n workdir: config.workspace.rootDir,\n model: \"sonnet\" as const,\n contextFiles,\n timeoutMs: (config.pipeline?.stageTimeouts?.review ?? 600_000) / 2,\n stallTimeoutMs: 120_000,\n };\n\n const [logicRaw, qualityRaw] = ctx.dryRun\n ? ['{\"issues\":[]}', '{\"issues\":[]}']\n : await runAgentsParallel(\n { ...agentOpts, prompt: logicPrompt },\n { ...agentOpts, prompt: qualityPrompt },\n );\n\n const issues = [...parseIssues(logicRaw), ...parseIssues(qualityRaw)];\n\n const majorCount = issues.filter((i) => i.severity === \"major\").length;\n const threshold = config.github.majorIssueThreshold ?? 1;\n const needsHumanApproval = majorCount >= threshold;\n\n writeReviewFeedback(memoryDir, {\n prNumber,\n issues,\n autoResolved: !needsHumanApproval,\n });\n\n if (needsHumanApproval) {\n ctx.logger.warn(\n { ticketKey, majorCount },\n \"Major issues found — requesting human approval via Telegram\",\n );\n\n ctx.state.emit({\n type: \"HUMAN_APPROVAL_REQUESTED\",\n context: { prNumber, majorCount },\n });\n\n const hil = config.telegram.humanInTheLoop;\n const approved = ctx.dryRun\n ? true\n : await requestApproval(\n config.telegram.botToken,\n config.telegram.chatId,\n ticketKey,\n issues,\n {\n timeoutMs: hil?.reviewApprovalTimeoutMs ?? 86_400_000,\n onTimeout: hil?.reviewApprovalTimeoutAction ?? \"abort\",\n topicId: config.telegram.topicId,\n },\n );\n\n if (approved) {\n ctx.state.emit({ type: \"HUMAN_APPROVED\" });\n ctx.logger.info(\n { ticketKey, prNumber },\n \"Human approved — proceeding to merge\",\n );\n } else {\n ctx.state.emit({\n type: \"HUMAN_REJECTED\",\n reason: \"Reviewer rejected PR\",\n });\n throw new Error(`REVIEW_REJECTED:PR #${prNumber} rejected by reviewer`);\n }\n }\n\n // Auto-merge (or post-approval merge)\n if (!ctx.dryRun) {\n await ctx.github.mergePR(\n prNumber,\n config.github.autoMergeStrategy ?? \"squash\",\n );\n ctx.logger.info({ ticketKey, prNumber }, \"PR merged\");\n }\n\n return { prNumber, issues, merged: true };\n },\n};\n\nfunction parseIssues(\n raw: string,\n): Array<{ severity: \"minor\" | \"major\"; message: string }> {\n try {\n const match = raw.match(/\\{[\\s\\S]*\\}/);\n if (!match) return [];\n const parsed = JSON.parse(match[0]) as {\n issues?: Array<{ severity: string; message: string }>;\n };\n return (parsed.issues ?? []).map((i) => ({\n severity: i.severity === \"major\" ? \"major\" : \"minor\",\n message: i.message,\n }));\n } catch {\n return [];\n }\n}\n","import type { Stage, PipelineContext, StageOutput } from \"./types.js\";\nimport { spawnSafe, buildMinimalEnv } from \"../../utils/process.js\";\n\nexport const deployStage: Stage = {\n id: \"deploy\",\n name: \"Deploy\",\n model: \"haiku\",\n\n async shouldSkip(ctx: PipelineContext): Promise<boolean> {\n return !ctx.config.deploy?.enabled;\n },\n\n async run(ctx: PipelineContext): Promise<StageOutput> {\n const { config, ticketKey } = ctx;\n const deploy = config.deploy;\n\n if (!deploy?.command) throw new Error(\"deploy.command not configured\");\n\n ctx.logger.info({ ticketKey }, \"Deploying to dev server\");\n\n if (ctx.dryRun) return { deployed: false, dryRun: true };\n\n const result = await spawnSafe(deploy.command, [], {\n cwd: config.workspace.rootDir,\n env: buildMinimalEnv(deploy.env ?? {}),\n timeoutMs: deploy.timeoutMs ?? 1_200_000,\n });\n\n if (result.exitCode !== 0) {\n throw new Error(\n `Deploy failed (exit ${result.exitCode}):\\n${result.stderr}`,\n );\n }\n\n // Health check\n if (deploy.healthCheckUrl) {\n await healthCheck(\n deploy.healthCheckUrl,\n deploy.healthCheckTimeoutMs ?? 30_000,\n );\n }\n\n ctx.logger.info({ ticketKey }, \"Deploy successful\");\n return { deployed: true, deployUrl: deploy.healthCheckUrl };\n },\n};\n\nasync function healthCheck(url: string, timeoutMs: number): Promise<void> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n try {\n const res = await fetch(url, { signal: AbortSignal.timeout(5_000) });\n if (res.ok) return;\n } catch {\n /* keep retrying */\n }\n await sleep(2_000);\n }\n throw new Error(`Health check timed out after ${timeoutMs}ms: ${url}`);\n}\n\nconst sleep = (ms: number): Promise<void> =>\n new Promise((r) => setTimeout(r, ms));\n","import type { Stage, PipelineContext, StageOutput } from \"./types.js\";\nimport { runAgent } from \"../runner.js\";\nimport { getContextFilesForStage } from \"../../memory/context-builder.js\";\n\nconst sleep = (ms: number): Promise<void> =>\n new Promise((r) => setTimeout(r, ms));\n\nexport const testStage: Stage = {\n id: \"test\",\n name: \"UI Test\",\n model: \"sonnet\",\n\n async shouldSkip(ctx: PipelineContext): Promise<boolean> {\n return !ctx.config.test?.enabled;\n },\n\n async run(ctx: PipelineContext): Promise<StageOutput> {\n const { config, ticketKey, memoryDir, projectDir } = ctx;\n const testConfig = config.test;\n\n if (!testConfig?.baseUrl) throw new Error(\"test.baseUrl not configured\");\n\n // Wait before testing (let deploy settle)\n const waitMs = testConfig.waitBeforeTestMs ?? 5_000;\n ctx.logger.info({ ticketKey, waitMs }, \"Waiting before UI tests\");\n await sleep(waitMs);\n\n const contextFiles = getContextFilesForStage(projectDir, memoryDir, \"test\");\n const retries = testConfig.retries ?? 2;\n\n const prompt = `\nRun Playwright UI tests for ticket ${ticketKey} on ${testConfig.baseUrl}.\n\nTest the acceptance criteria from the ticket context.\nSpec pattern: ${testConfig.specPattern ?? \"e2e/**/*.spec.ts\"}\n\nReport results as JSON: { \"passed\": boolean, \"summary\": \"...\", \"failures\": [\"...\"] }\n`.trim();\n\n let lastError: Error | undefined;\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n ctx.logger.info(\n { ticketKey, attempt: attempt + 1 },\n \"Running UI tests\",\n );\n\n const raw = ctx.dryRun\n ? '{\"passed\":true,\"summary\":\"dry-run\",\"failures\":[]}'\n : await runAgent({\n prompt,\n workdir: config.workspace.rootDir,\n model: \"sonnet\",\n contextFiles,\n timeoutMs: testConfig.timeoutMs ?? 300_000,\n stallTimeoutMs: 60_000,\n });\n\n const match = raw.match(/\\{[\\s\\S]*\\}/);\n if (!match) throw new Error(\"Could not parse test results JSON\");\n\n const result = JSON.parse(match[0]) as {\n passed: boolean;\n summary: string;\n failures: string[];\n };\n\n if (result.passed) {\n ctx.logger.info({ ticketKey }, \"UI tests passed\");\n return { passed: true, summary: result.summary };\n }\n\n lastError = new Error(`Tests failed: ${result.failures.join(\", \")}`);\n ctx.logger.warn(\n { ticketKey, attempt: attempt + 1, failures: result.failures },\n \"Tests failed, retrying\",\n );\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n }\n }\n\n const failOnTest = config.pipeline?.failOnTestFailure ?? false;\n if (failOnTest)\n throw lastError ?? new Error(\"Tests failed after all retries\");\n\n await ctx.telegram.send(\n `⚠️ <b>${ticketKey}</b> UI tests failed after ${retries + 1} attempts. Continuing pipeline.\\n${lastError?.message}`,\n );\n return { passed: false, summary: lastError?.message ?? \"Tests failed\" };\n },\n};\n","import type { Stage, PipelineContext, StageOutput } from \"./types.js\";\nimport {\n transitionTicket,\n addComment,\n reassign,\n} from \"../../integrations/jira/tools.js\";\n\nexport const notifyStage: Stage = {\n id: \"notify\",\n name: \"Notify\",\n model: \"haiku\",\n\n async run(ctx: PipelineContext): Promise<StageOutput> {\n const { config, ticketKey, state } = ctx;\n const current = state.current;\n\n ctx.logger.info({ ticketKey }, \"Notifying: Jira + Telegram\");\n\n if (!ctx.dryRun) {\n // Transition to Done\n await transitionTicket({\n instance: config.jira.instance,\n ticket_key: ticketKey,\n transition_name: config.jira.doneTransition ?? \"Done\",\n });\n\n // Add completion comment\n const prInfo = current.prNumber ? `\\nPR: #${current.prNumber}` : \"\";\n const branchInfo = current.branchName\n ? `\\nBranch: ${current.branchName}`\n : \"\";\n await addComment({\n instance: config.jira.instance,\n ticket_key: ticketKey,\n comment: `✅ Implemented via jiraACP automated pipeline.${prInfo}${branchInfo}\\n\\nAll stages completed: fetch → analyze → code → review → deploy → test`,\n });\n\n // Reassign if configured\n if (config.jira.reassignTo) {\n await reassign({\n instance: config.jira.instance,\n ticket_key: ticketKey,\n account_id: config.jira.reassignTo,\n });\n }\n\n // Telegram notification\n await ctx.telegram.sendDone(ticketKey, {\n summary: \"Pipeline completed successfully\",\n prNumber: current.prNumber ?? undefined,\n });\n }\n\n ctx.logger.info({ ticketKey }, \"Notifications sent\");\n return { notified: true };\n },\n};\n","import type { Logger } from \"pino\";\nimport { spawnSafe, buildMinimalEnv } from \"../utils/process.js\";\n\nexport type HookName =\n | \"beforePipeline\"\n | \"beforeCode\"\n | \"afterCode\"\n | \"afterDeploy\"\n | \"afterPipeline\";\n\nexport class HookError extends Error {\n constructor(\n public readonly hookName: HookName,\n public readonly exitCode: number,\n ) {\n super(`Hook '${hookName}' failed with exit code ${exitCode}`);\n this.name = \"HookError\";\n }\n}\n\nexport async function runHook(\n name: HookName,\n command: string | undefined,\n ctx: { ticketKey: string; logger: Logger },\n): Promise<void> {\n if (!command?.trim()) return;\n\n // Simple whitespace split — quoted args (e.g. \"my script.sh\") are not supported.\n // Hook commands should avoid spaces in path; use a wrapper script if needed.\n const [bin, ...args] = command.trim().split(/\\s+/);\n const { logger } = ctx;\n\n logger.info({ hookName: name, command }, \"Running hook\");\n\n const result = await spawnSafe(bin, args, {\n env: buildMinimalEnv({ JIRA_ACP_TICKET: ctx.ticketKey }),\n });\n\n if (result.exitCode !== 0) {\n logger.error(\n { hookName: name, exitCode: result.exitCode, stderr: result.stderr },\n \"Hook failed\",\n );\n throw new HookError(name, result.exitCode);\n }\n\n logger.info({ hookName: name }, \"Hook completed\");\n}\n","import type { ProjectConfig, StageId } from \"../config/schema.js\";\nimport type { PipelineContext } from \"./stages/types.js\";\nimport type { JiraClient } from \"../integrations/jira/client.js\";\nimport { StateManager, getRunDir, getLockPath, getMemoryDir } from \"./state.js\";\nimport { acquireLock } from \"../utils/lock.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { getClient as getJiraClient } from \"../integrations/jira/client.js\";\nimport { createGitHubClient } from \"../integrations/github/client.js\";\nimport { createTelegramNotifier } from \"../integrations/telegram/notifier.js\";\nimport { checkCostLimit } from \"./cost-guard.js\";\nimport { fetchStage } from \"./stages/1-fetch.js\";\nimport { analyzeStage } from \"./stages/2-analyze.js\";\nimport { clarifyStage } from \"./stages/3-clarify.js\";\nimport { codeStage } from \"./stages/4-code.js\";\nimport { gitStage } from \"./stages/5-git.js\";\nimport { reviewStage } from \"./stages/6-review.js\";\nimport { deployStage } from \"./stages/7-deploy.js\";\nimport { testStage } from \"./stages/8-test.js\";\nimport { notifyStage } from \"./stages/9-notify.js\";\nimport type { Stage } from \"./stages/types.js\";\nimport { runHook, HookError } from \"./hooks.js\";\nimport { initBot } from \"../integrations/telegram/bot.js\";\n\nconst ALL_STAGES: Stage[] = [\n fetchStage,\n analyzeStage,\n clarifyStage,\n codeStage,\n gitStage,\n reviewStage,\n deployStage,\n testStage,\n notifyStage,\n];\n\nexport interface RunOptions {\n fromStage?: StageId;\n toStage?: StageId;\n dryRun?: boolean;\n}\n\nexport async function runPipeline(\n ticketKey: string,\n config: ProjectConfig,\n opts: RunOptions = {},\n): Promise<void> {\n const projectDir = config.workspace.rootDir;\n const runDir = getRunDir(config.name, ticketKey);\n const lockPath = getLockPath(config.name, ticketKey);\n const memoryDir = getMemoryDir(config.name, ticketKey);\n const logger = createLogger(`pipeline:${ticketKey}`);\n const state = new StateManager(runDir);\n\n // Ensure bot is polling so human-in-the-loop handlers work\n if (config.telegram?.botToken) {\n await initBot(config.telegram.botToken);\n }\n\n const lock = await acquireLock(lockPath);\n\n const ctx: PipelineContext = {\n config,\n ticketKey,\n projectDir,\n state,\n memoryDir,\n dryRun: opts.dryRun ?? false,\n logger,\n jira: getJiraClient(config.jira.instance) as JiraClient,\n github: createGitHubClient(\n config.github.token,\n config.github.owner,\n config.github.repo,\n ),\n telegram: createTelegramNotifier(\n config.telegram.botToken,\n config.telegram.chatId,\n ticketKey,\n config.name,\n config.telegram.topicId,\n ),\n };\n\n state.emit({ type: \"STARTED\", ticketKey });\n\n const stages = filterStages(ALL_STAGES, opts.fromStage, opts.toStage);\n const hooksConfig = config.pipeline?.hooks;\n\n try {\n await runHook(\"beforePipeline\", hooksConfig?.beforePipeline, {\n ticketKey,\n logger,\n });\n\n for (const stage of stages) {\n if (await stage.shouldSkip?.(ctx)) {\n state.emit({\n type: \"STAGE_SKIPPED\",\n stage: stage.id,\n reason: \"shouldSkip returned true\",\n });\n logger.info({ stage: stage.id }, \"Stage skipped\");\n await ctx.telegram.notifyStageSkipped(stage.id).catch(() => undefined);\n continue;\n }\n\n if (stage.id === \"code\") {\n await runHook(\"beforeCode\", hooksConfig?.beforeCode, {\n ticketKey,\n logger,\n });\n }\n\n state.emit({ type: \"STAGE_STARTED\", stage: stage.id });\n logger.info({ stage: stage.id }, `▶ ${stage.name}`);\n await ctx.telegram.notifyStageStarted(stage.id).catch(() => undefined);\n\n try {\n const timeout = config.pipeline?.stageTimeouts?.[stage.id];\n const output = timeout\n ? await withTimeout(stage.run(ctx), timeout)\n : await stage.run(ctx);\n\n state.emit({ type: \"STAGE_COMPLETED\", stage: stage.id, output });\n logger.info({ stage: stage.id }, `✓ ${stage.name}`);\n await ctx.telegram\n .notifyStageCompleted(stage.id)\n .catch(() => undefined);\n\n if (config.pipeline?.maxCostUsdPerRun) {\n const decision = await checkCostLimit({\n runDir,\n maxCostUsd: config.pipeline.maxCostUsdPerRun,\n telegram: ctx.telegram,\n ticketKey,\n });\n if (decision === \"abort\") {\n state.emit({\n type: \"PIPELINE_ABORTED\",\n reason: \"Cost limit exceeded\",\n });\n throw new Error(\"Cost limit exceeded\");\n }\n }\n\n if (stage.id === \"code\") {\n await runHook(\"afterCode\", hooksConfig?.afterCode, {\n ticketKey,\n logger,\n });\n }\n\n if (stage.id === \"deploy\") {\n await runHook(\"afterDeploy\", hooksConfig?.afterDeploy, {\n ticketKey,\n logger,\n });\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n\n // SKIP signal from clarify stage\n if (message.startsWith(\"SKIP:\")) {\n state.emit({\n type: \"STAGE_SKIPPED\",\n stage: stage.id,\n reason: message,\n });\n logger.warn({ stage: stage.id }, `Skipped: ${message}`);\n return;\n }\n\n if (err instanceof HookError) {\n state.emit({ type: \"PIPELINE_ABORTED\", reason: message });\n throw err;\n }\n\n state.emit({ type: \"STAGE_FAILED\", stage: stage.id, error: message });\n await ctx.telegram\n .notifyStageFailed(stage.id, message)\n .catch(() => undefined);\n throw err;\n }\n }\n\n state.emit({ type: \"PIPELINE_COMPLETED\" });\n logger.info({ ticketKey }, \"Pipeline completed\");\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n if (!(err instanceof HookError)) {\n state.emit({ type: \"PIPELINE_ABORTED\", reason });\n }\n await ctx.telegram.sendError(ticketKey, err);\n logger.error({ ticketKey, reason }, \"Pipeline aborted\");\n process.exitCode = 1;\n } finally {\n await runHook(\"afterPipeline\", hooksConfig?.afterPipeline, {\n ticketKey,\n logger,\n });\n lock.release();\n }\n}\n\nexport async function resumePipeline(\n ticketKey: string,\n config: ProjectConfig,\n): Promise<void> {\n const logger = createLogger(`pipeline:${ticketKey}`);\n const state = new StateManager(getRunDir(config.name, ticketKey));\n const current = state.current;\n\n if (current.isCompleted) {\n logger.info({ ticketKey }, \"Pipeline already completed\");\n process.stdout.write(`Pipeline for ${ticketKey} already completed.\\n`);\n return;\n }\n\n const fromStage = current.currentStage ?? current.failedStage ?? \"fetch\";\n logger.info({ ticketKey, fromStage }, \"Resuming pipeline\");\n\n await runPipeline(ticketKey, config, { fromStage: fromStage as StageId });\n}\n\nfunction filterStages(stages: Stage[], from?: StageId, to?: StageId): Stage[] {\n const fromIdx = from ? stages.findIndex((s) => s.id === from) : 0;\n const toIdx = to ? stages.findIndex((s) => s.id === to) : stages.length - 1;\n return stages.slice(\n fromIdx < 0 ? 0 : fromIdx,\n toIdx < 0 ? stages.length : toIdx + 1,\n );\n}\n\nasync function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n const signal = AbortSignal.timeout(ms);\n const aborted = new Promise<never>((_, reject) => {\n signal.addEventListener(\"abort\", () => {\n reject(new Error(`Stage timed out after ${ms}ms`));\n });\n });\n return Promise.race([promise, aborted]);\n}\n"],"mappings":"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","names":["sleep"]}