@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/integrations/telegram/human-loop.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { getBot } from \"./bot.js\";\n\nexport type TimeoutAction = \"skip\" | \"abort\" | \"proceed-with-warning\";\n\ninterface PendingClarification {\n ticketKey: string;\n messageId: number;\n questions: string[];\n createdAt: string;\n expiresAt: string;\n}\n\ninterface PendingEntry extends PendingClarification {\n resolve: (answer: string) => void;\n reject: (reason: Error) => void;\n}\n\nconst pending = new Map<string, PendingEntry>();\n\nexport function loadPendingStore(storeDir: string): void {\n const storePath = path.join(storeDir, \"pending-clarifications.json\");\n if (!fs.existsSync(storePath)) return;\n\n const items = JSON.parse(\n fs.readFileSync(storePath, \"utf8\"),\n ) as PendingClarification[];\n for (const item of items) {\n if (new Date(item.expiresAt) > new Date()) {\n // Re-register as expired-on-start (will be resolved via /answer or timeout)\n pending.set(item.ticketKey, {\n ...item,\n resolve: () => {\n /* will be overwritten when pipeline resumes */\n },\n reject: () => {\n /* will be overwritten when pipeline resumes */\n },\n });\n }\n }\n}\n\nfunction savePendingStore(storeDir: string): void {\n const storePath = path.join(storeDir, \"pending-clarifications.json\");\n const items: PendingClarification[] = Array.from(pending.values()).map(\n ({ resolve: _r, reject: _j, ...rest }) => rest,\n );\n fs.writeFileSync(storePath, JSON.stringify(items, null, 2));\n}\n\nexport async function requestClarification(\n token: string,\n chatId: number | string,\n ticketKey: string,\n questions: string[],\n storeDir: string,\n opts: { timeoutMs: number; onTimeout: TimeoutAction; topicId?: number },\n): Promise<string> {\n const bot = getBot(token);\n const threadOpts = opts.topicId ? { message_thread_id: opts.topicId } : {};\n\n const formatted = [\n `⚠️ <b>${ticketKey}</b> — Cần clarify trước khi code`,\n \"\",\n ...questions.map((q, i) => `${i + 1}. ${q}`),\n \"\",\n \"Reply với:\",\n `<code>/answer ${ticketKey}</code>`,\n ...questions.map((_, i) => `${i + 1}. (your answer)`),\n ].join(\"\\n\");\n\n const msg = await bot.api.sendMessage(chatId, formatted, {\n parse_mode: \"HTML\",\n ...threadOpts,\n });\n\n const expiresAt = new Date(Date.now() + opts.timeoutMs).toISOString();\n\n return new Promise((resolve, reject) => {\n pending.set(ticketKey, {\n ticketKey,\n messageId: msg.message_id,\n questions,\n createdAt: new Date().toISOString(),\n expiresAt,\n resolve,\n reject,\n });\n savePendingStore(storeDir);\n\n // Reminders at 50% and 80% of timeout\n setTimeout(async () => {\n if (pending.has(ticketKey)) {\n await bot.api.sendMessage(\n chatId,\n `⏰ <b>${ticketKey}</b> — Nhắc lại: cần clarify (còn ${Math.round((opts.timeoutMs * 0.5) / 60000)}min)`,\n { parse_mode: \"HTML\", ...threadOpts },\n );\n }\n }, opts.timeoutMs * 0.5);\n\n setTimeout(async () => {\n if (!pending.has(ticketKey)) return;\n pending.delete(ticketKey);\n savePendingStore(storeDir);\n\n if (opts.onTimeout === \"abort\") {\n reject(new Error(`Clarification timeout for ${ticketKey}`));\n } else if (opts.onTimeout === \"skip\") {\n reject(new Error(`SKIP:Clarification timeout — ticket skipped`));\n } else {\n resolve(\n \"(No clarification received — proceeding with original description)\",\n );\n }\n }, opts.timeoutMs);\n });\n}\n\nexport function registerAnswerHandler(token: string, storeDir: string): void {\n const bot = getBot(token);\n\n bot.command(\"answer\", async (ctx) => {\n const text = ctx.message?.text ?? \"\";\n const lines = text.replace(/^\\/answer(?:@\\S+)?\\s*/, \"\").split(\"\\n\");\n const ticketKey = lines[0]?.trim();\n const answers = lines.slice(1).join(\"\\n\").trim();\n\n if (!ticketKey) return;\n\n const entry = pending.get(ticketKey);\n if (entry) {\n pending.delete(ticketKey);\n savePendingStore(storeDir);\n entry.resolve(answers);\n await ctx.reply(\n `✅ Answers received for ${ticketKey}. Pipeline continues.`,\n );\n } else {\n await ctx.reply(`No pending clarification found for ${ticketKey}.`);\n }\n });\n}\n\n// ── Review approval flow ──────────────────────────────────────────────────\n\nexport type ApprovalTimeoutAction = \"abort\" | \"merge-anyway\";\n\ninterface PendingApproval {\n ticketKey: string;\n messageId: number;\n createdAt: string;\n expiresAt: string;\n}\n\ninterface PendingApprovalEntry extends PendingApproval {\n resolve: (approved: boolean) => void;\n reject: (reason: Error) => void;\n}\n\nconst pendingApprovals = new Map<string, PendingApprovalEntry>();\n\nexport async function requestApproval(\n token: string,\n chatId: number | string,\n ticketKey: string,\n issues: Array<{ severity: string; message: string }>,\n opts: {\n timeoutMs: number;\n onTimeout: ApprovalTimeoutAction;\n topicId?: number;\n },\n): Promise<boolean> {\n const bot = getBot(token);\n const threadOpts = opts.topicId ? { message_thread_id: opts.topicId } : {};\n\n const issueLines = issues\n .filter((i) => i.severity === \"major\")\n .map((i) => `• ${i.message}`)\n .join(\"\\n\");\n\n const text = [\n `⚠️ <b>${ticketKey}</b> — Review found major issues`,\n \"\",\n issueLines,\n \"\",\n \"Approve to merge or reject to abort pipeline.\",\n `Use /approve ${ticketKey} or /reject ${ticketKey}`,\n ].join(\"\\n\");\n\n const msg = await bot.api.sendMessage(chatId, text, {\n parse_mode: \"HTML\",\n reply_markup: {\n inline_keyboard: [\n [\n { text: \"✅ Approve & Merge\", callback_data: `approve:${ticketKey}` },\n { text: \"❌ Reject\", callback_data: `reject:${ticketKey}` },\n ],\n ],\n },\n ...threadOpts,\n });\n\n const expiresAt = new Date(Date.now() + opts.timeoutMs).toISOString();\n\n return new Promise((resolve, reject) => {\n pendingApprovals.set(ticketKey, {\n ticketKey,\n messageId: msg.message_id,\n createdAt: new Date().toISOString(),\n expiresAt,\n resolve,\n reject,\n });\n\n setTimeout(() => {\n if (!pendingApprovals.has(ticketKey)) return;\n pendingApprovals.delete(ticketKey);\n\n if (opts.onTimeout === \"merge-anyway\") {\n resolve(true);\n } else {\n reject(new Error(`REVIEW_APPROVAL_TIMEOUT:${ticketKey}`));\n }\n }, opts.timeoutMs);\n });\n}\n\nexport function registerApprovalHandlers(token: string): void {\n const bot = getBot(token);\n\n // Inline keyboard callback handler\n bot.on(\"callback_query:data\", async (ctx) => {\n const data = ctx.callbackQuery.data;\n if (!data) return;\n\n if (data.startsWith(\"approve:\")) {\n const ticketKey = data.slice(\"approve:\".length);\n const entry = pendingApprovals.get(ticketKey);\n if (entry) {\n pendingApprovals.delete(ticketKey);\n entry.resolve(true);\n await ctx.answerCallbackQuery({ text: `✅ Approved ${ticketKey}` });\n await ctx.editMessageReplyMarkup({\n reply_markup: { inline_keyboard: [] },\n });\n } else {\n await ctx.answerCallbackQuery({ text: \"No pending approval found.\" });\n }\n return;\n }\n\n if (data.startsWith(\"reject:\")) {\n const ticketKey = data.slice(\"reject:\".length);\n const entry = pendingApprovals.get(ticketKey);\n if (entry) {\n pendingApprovals.delete(ticketKey);\n entry.resolve(false);\n await ctx.answerCallbackQuery({ text: `❌ Rejected ${ticketKey}` });\n await ctx.editMessageReplyMarkup({\n reply_markup: { inline_keyboard: [] },\n });\n } else {\n await ctx.answerCallbackQuery({ text: \"No pending approval found.\" });\n }\n }\n });\n\n // Text command fallback\n bot.command(\"approve\", async (ctx) => {\n const ticketKey = ctx.message?.text\n ?.replace(/^\\/approve(?:@\\S+)?\\s*/, \"\")\n .trim();\n if (!ticketKey) return;\n const entry = pendingApprovals.get(ticketKey);\n if (entry) {\n pendingApprovals.delete(ticketKey);\n entry.resolve(true);\n await ctx.reply(`✅ ${ticketKey} approved — proceeding to merge.`);\n } else {\n await ctx.reply(`No pending approval for ${ticketKey}.`);\n }\n });\n\n bot.command(\"reject\", async (ctx) => {\n const ticketKey = ctx.message?.text\n ?.replace(/^\\/reject(?:@\\S+)?\\s*/, \"\")\n .trim();\n if (!ticketKey) return;\n const entry = pendingApprovals.get(ticketKey);\n if (entry) {\n pendingApprovals.delete(ticketKey);\n entry.resolve(false);\n await ctx.reply(`❌ ${ticketKey} rejected — pipeline will abort.`);\n } else {\n await ctx.reply(`No pending approval for ${ticketKey}.`);\n }\n });\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ generateClaudeMd
4
+ } from "./chunk-H7YXX4UA.js";
5
+ export {
6
+ generateClaudeMd
7
+ };
8
+ //# sourceMappingURL=claude-md-HQ6L4CRP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/cli.js ADDED
@@ -0,0 +1,276 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/cli.ts
4
+ import { Command } from "commander";
5
+ import { readFileSync } from "fs";
6
+ import { fileURLToPath } from "url";
7
+ import path from "path";
8
+ var __dirname = path.dirname(fileURLToPath(import.meta.url));
9
+ var pkg = JSON.parse(
10
+ readFileSync(path.join(__dirname, "..", "package.json"), "utf8")
11
+ );
12
+ var daemonIdx = process.argv.indexOf("--daemon-child");
13
+ if (daemonIdx !== -1) {
14
+ const port = parseInt(process.argv[daemonIdx + 1] ?? "3100", 10);
15
+ const { startServe } = await import("./serve-XI7JTIPZ.js");
16
+ await startServe(port);
17
+ process.exit(0);
18
+ }
19
+ async function resolveProject(name) {
20
+ if (name) return name;
21
+ const { detectProjectName } = await import("./loader-DGW7HCJ5.js");
22
+ return detectProjectName(process.cwd());
23
+ }
24
+ var program = new Command();
25
+ program.name("jiraACP").description(
26
+ "AI-powered Jira pipeline: Ticket \u2192 Code \u2192 GitHub \u2192 Deploy \u2192 Notify"
27
+ ).version(pkg.version);
28
+ program.command("init").description(
29
+ "Interactive setup wizard \u2014 configure Jira, GitHub, Telegram, workspace"
30
+ ).option("--name <name>", "Project name (default: auto-detect from git)").option("--dir <path>", "Workspace root directory", process.cwd()).action(async (opts) => {
31
+ const { runWizard } = await import("./wizard-CYEJJLNF.js");
32
+ const { detectProjectName } = await import("./loader-DGW7HCJ5.js");
33
+ const projectName = opts.name ?? detectProjectName(opts.dir);
34
+ await runWizard(projectName, opts.dir);
35
+ });
36
+ program.command("doctor").description("Health-check all integrations").option("--project <name>", "Project name (default: auto-detect)").option("--fix", "Attempt auto-remediation").action(async (opts) => {
37
+ const { runDoctor } = await import("./doctor-BPTLVLTD.js");
38
+ const projectName = await resolveProject(opts.project);
39
+ await runDoctor(projectName, opts.fix);
40
+ });
41
+ program.command("update-context").description("Regenerate CLAUDE.md from codebase scan").option("--project <name>", "Project name (default: auto-detect)").option("--dir <path>", "Workspace root directory", process.cwd()).action(async (opts) => {
42
+ const { loadConfig } = await import("./loader-DGW7HCJ5.js");
43
+ const { generateClaudeMd } = await import("./claude-md-HQ6L4CRP.js");
44
+ const projectName = await resolveProject(opts.project);
45
+ const config = loadConfig(projectName);
46
+ await generateClaudeMd(opts.dir, config);
47
+ console.log("CLAUDE.md updated");
48
+ });
49
+ program.command("run <ticketKey>").description("Run the full pipeline for a single ticket").option("--project <name>", "Project name (default: auto-detect)").option("--from <stage>", "Start from stage").option("--to <stage>", "End at stage").option("--dry-run", "Simulate without side effects").option("--no-confirm", "Non-interactive mode").action(
50
+ async (ticketKey, opts) => {
51
+ const { runPipeline } = await import("./orchestrator-3MGXX3QW.js");
52
+ const { loadConfig } = await import("./loader-DGW7HCJ5.js");
53
+ const projectName = await resolveProject(opts.project);
54
+ const config = loadConfig(projectName);
55
+ await runPipeline(ticketKey, config, {
56
+ fromStage: opts.from,
57
+ toStage: opts.to,
58
+ dryRun: opts.dryRun
59
+ });
60
+ }
61
+ );
62
+ program.command("sprint").description("Run pipelines for all assigned sprint tickets").option("--project <name>", "Project name (default: auto-detect)").option("--sprint <name>", "Sprint name or ID").option("--parallel <n>", "Max concurrent pipelines", "2").option("--filter <jql>", "Additional JQL filter").option("--dry-run", "Simulate without side effects").action(
63
+ async (opts) => {
64
+ const { runSprint } = await import("./sprint-KZZWVNK6.js");
65
+ const projectName = await resolveProject(opts.project);
66
+ await runSprint({
67
+ projectName,
68
+ sprint: opts.sprint,
69
+ parallel: Number(opts.parallel),
70
+ filter: opts.filter,
71
+ dryRun: opts.dryRun
72
+ });
73
+ }
74
+ );
75
+ program.command("triage").description("Clarity analysis only \u2014 no code changes").option("--project <name>", "Project name (default: auto-detect)").option("--sprint <name>", "Sprint name or ID").option("--dry-run", "Simulate without side effects").action(
76
+ async (opts) => {
77
+ const { runTriage } = await import("./triage-WNHGPVZQ.js");
78
+ const projectName = await resolveProject(opts.project);
79
+ await runTriage({
80
+ projectName,
81
+ sprint: opts.sprint,
82
+ dryRun: opts.dryRun
83
+ });
84
+ }
85
+ );
86
+ program.command("status [ticketKey]").description(
87
+ "Show daemon status (no args) or pipeline state for a ticket key"
88
+ ).option("--project <name>", "Project name (default: auto-detect, or all)").action(async (ticketKey, opts) => {
89
+ if (!ticketKey) {
90
+ const { getStatus } = await import("./daemon-CGBV55JK.js");
91
+ const s = getStatus();
92
+ if (s.running) {
93
+ process.stdout.write(`jiraACP is running (PID ${s.pid})
94
+ `);
95
+ } else {
96
+ process.stdout.write("jiraACP is not running\n");
97
+ }
98
+ return;
99
+ }
100
+ const { showStatus } = await import("./status-I6GU2LWE.js");
101
+ const projectName = opts.project ?? await resolveProject();
102
+ await showStatus(projectName, ticketKey);
103
+ });
104
+ program.command("logs [ticketKey]").description("Show pipeline logs for a ticket, or daemon logs if no ticket").option("--project <name>", "Project name (default: auto-detect)").option("--stage <stage>", "Show logs for specific stage only").option("-f, --follow", "Tail logs for active run / daemon log").option("-n <lines>", "Last N lines (daemon log only)", "50").action(
105
+ async (ticketKey, opts) => {
106
+ if (!ticketKey) {
107
+ const { getLogFile } = await import("./daemon-CGBV55JK.js");
108
+ const logFile = getLogFile();
109
+ const { spawn } = await import("child_process");
110
+ const args = opts.follow ? ["-n", opts.n, "-f", logFile] : ["-n", opts.n, logFile];
111
+ const tail = spawn("tail", args, { stdio: "inherit" });
112
+ tail.on("exit", (code) => {
113
+ process.exitCode = code ?? 0;
114
+ });
115
+ return;
116
+ }
117
+ const { showLogs } = await import("./logs-JUVQWN6C.js");
118
+ const projectName = await resolveProject(opts.project);
119
+ await showLogs(projectName, ticketKey, opts.stage, opts.follow);
120
+ }
121
+ );
122
+ program.command("dashboard").description("Terminal UI of all active runs").option("--watch", "Auto-refresh every 5s").action(async (opts) => {
123
+ const { runDashboard } = await import("./dashboard-YVFJ5DXR.js");
124
+ runDashboard(opts.watch ?? false);
125
+ });
126
+ program.command("replay <ticketKey>").description("Pretty-print the event log for a completed run").option("--project <name>", "Project name (default: auto-detect)").action(async (ticketKey, opts) => {
127
+ const { replayRun } = await import("./replay-M4JEG4Z4.js");
128
+ const projectName = await resolveProject(opts.project);
129
+ await replayRun(ticketKey, projectName);
130
+ });
131
+ program.command("usage").description("Token cost report per project/month").option("--month <YYYY-MM>", "Filter by month").option("--project <name>", "Filter by project").option("--verbose", "Show per-stage breakdown").action(
132
+ async (opts) => {
133
+ const { showUsage } = await import("./usage-AWWBI37F.js");
134
+ await showUsage(opts);
135
+ }
136
+ );
137
+ program.command("resume <ticketKey>").description("Resume a paused or crashed pipeline").option("--project <name>", "Project name (default: auto-detect)").action(async (ticketKey, opts) => {
138
+ const { resumePipeline } = await import("./orchestrator-3MGXX3QW.js");
139
+ const { loadConfig } = await import("./loader-DGW7HCJ5.js");
140
+ const projectName = await resolveProject(opts.project);
141
+ const config = loadConfig(projectName);
142
+ await resumePipeline(ticketKey, config);
143
+ });
144
+ program.command("abort <ticketKey>").description("Abort a running pipeline").option("--project <name>", "Project name (default: auto-detect)").option("--reason <text>", "Abort reason").action(
145
+ async (ticketKey, opts) => {
146
+ const { abortPipeline } = await import("./abort-GQE4OI5S.js");
147
+ const projectName = await resolveProject(opts.project);
148
+ await abortPipeline(ticketKey, projectName, opts.reason);
149
+ }
150
+ );
151
+ program.command("pause <ticketKey>").description("Suspend a running pipeline (SIGSTOP)").option("--project <name>", "Project name (default: auto-detect)").action(async (ticketKey, opts) => {
152
+ const { pausePipeline } = await import("./pause-FLDZ3OD6.js");
153
+ const projectName = await resolveProject(opts.project);
154
+ await pausePipeline(ticketKey, projectName);
155
+ });
156
+ program.command("cancel-clarification <ticketKey>").description("Cancel a pending Telegram clarification").option("--project <name>", "Project name (default: auto-detect)").action(async (ticketKey, opts) => {
157
+ const { cancelClarification } = await import("./cancel-clarification-4G5S2HJZ.js");
158
+ const projectName = await resolveProject(opts.project);
159
+ await cancelClarification(ticketKey, projectName);
160
+ });
161
+ program.command("config").description("Manage project config").addCommand(
162
+ new Command("get").argument("[key]", "Config key (dot-path)").option("--project <name>", "Project name (default: auto-detect)").action(async (key, opts) => {
163
+ const { loadConfig } = await import("./loader-DGW7HCJ5.js");
164
+ const projectName = await resolveProject(opts.project);
165
+ const config = loadConfig(projectName);
166
+ if (key) {
167
+ const val = key.split(".").reduce(
168
+ (o, k) => o?.[k],
169
+ config
170
+ );
171
+ console.log(JSON.stringify(val, null, 2));
172
+ } else {
173
+ console.log(JSON.stringify(config, null, 2));
174
+ }
175
+ })
176
+ ).addCommand(
177
+ new Command("list").description("List all configured projects").action(async () => {
178
+ const { listProjects } = await import("./loader-DGW7HCJ5.js");
179
+ const projects = listProjects();
180
+ if (projects.length === 0) {
181
+ console.log("No projects configured. Run: jiraACP init");
182
+ } else {
183
+ console.log("Configured projects:");
184
+ for (const p of projects) console.log(` \u2022 ${p}`);
185
+ }
186
+ })
187
+ ).addCommand(
188
+ new Command("set").description("Set a config key (dot-path) to a value").argument("<key>", "Config key (dot-path)").argument("<value>", "New value (JSON or string)").option("--project <name>", "Project name (default: auto-detect)").action(
189
+ async (key, value, opts) => {
190
+ const { configSet } = await import("./config-set-QN3JRNZL.js");
191
+ const projectName = await resolveProject(opts.project);
192
+ configSet(projectName, key, value);
193
+ }
194
+ )
195
+ ).addCommand(
196
+ new Command("edit").description("Open config in $EDITOR").option("--project <name>", "Project name (default: auto-detect)").action(async (opts) => {
197
+ const { configEdit } = await import("./config-edit-G7O56HXO.js");
198
+ const projectName = await resolveProject(opts.project);
199
+ await configEdit(projectName);
200
+ })
201
+ );
202
+ var projectsCmd = program.command("projects").description("Manage configured projects");
203
+ projectsCmd.command("list").description("List all configured projects").action(async () => {
204
+ const { projectsList } = await import("./projects-QMIGNW7U.js");
205
+ projectsList();
206
+ });
207
+ projectsCmd.command("add <name>").description("Create a new project config skeleton").action(async (name) => {
208
+ const { projectsAdd } = await import("./projects-QMIGNW7U.js");
209
+ await projectsAdd(name);
210
+ });
211
+ projectsCmd.command("remove <name>").description("Remove a project config").action(async (name) => {
212
+ const { projectsRemove } = await import("./projects-QMIGNW7U.js");
213
+ await projectsRemove(name);
214
+ });
215
+ var scheduleCmd = program.command("schedule").description("Manage scheduled pipeline runs");
216
+ scheduleCmd.command("add").description('Add a scheduled run (e.g. --cron "0 9 * * 1-5")').requiredOption("--cron <expr>", "Cron expression (5 fields)").requiredOption("--project <name>", "Project name").action(async (opts) => {
217
+ const { scheduleAdd } = await import("./schedule-CDHD77VZ.js");
218
+ scheduleAdd(opts.project, opts.cron);
219
+ });
220
+ scheduleCmd.command("list").description("List all scheduled runs").action(async () => {
221
+ const { scheduleList } = await import("./schedule-CDHD77VZ.js");
222
+ scheduleList();
223
+ });
224
+ scheduleCmd.command("remove <id>").description("Remove a schedule by ID (or ID prefix)").action(async (id) => {
225
+ const { scheduleRemove } = await import("./schedule-CDHD77VZ.js");
226
+ scheduleRemove(id);
227
+ });
228
+ program.command("serve").description("Start webhook server in foreground (for dev/docker)").option("--port <n>", "Port number", "3100").action(async (opts) => {
229
+ const { startServe } = await import("./serve-XI7JTIPZ.js");
230
+ await startServe(Number(opts.port));
231
+ });
232
+ program.command("start").description("Start jiraACP server as background daemon").option("--port <n>", "Port number", "3100").action(async (opts) => {
233
+ const { startDaemon, getLogFile } = await import("./daemon-CGBV55JK.js");
234
+ const result = startDaemon(Number(opts.port));
235
+ if ("error" in result) {
236
+ process.stderr.write(`${result.error}
237
+ `);
238
+ process.exitCode = 1;
239
+ } else {
240
+ process.stdout.write(
241
+ `jiraACP started (PID ${result.pid})
242
+ Logs: ${getLogFile()}
243
+ `
244
+ );
245
+ }
246
+ });
247
+ program.command("stop").description("Stop the background daemon").action(async () => {
248
+ const { stopDaemon } = await import("./daemon-CGBV55JK.js");
249
+ const result = await stopDaemon();
250
+ if (result.stopped) {
251
+ process.stdout.write(`jiraACP stopped (PID ${result.pid})
252
+ `);
253
+ } else {
254
+ process.stderr.write(`${result.error ?? "Failed to stop"}
255
+ `);
256
+ process.exitCode = 1;
257
+ }
258
+ });
259
+ program.command("restart").description("Restart the background daemon").option("--port <n>", "Port number", "3100").action(async (opts) => {
260
+ const { stopDaemon, startDaemon, getLogFile } = await import("./daemon-CGBV55JK.js");
261
+ await stopDaemon();
262
+ const result = startDaemon(Number(opts.port));
263
+ if ("error" in result) {
264
+ process.stderr.write(`${result.error}
265
+ `);
266
+ process.exitCode = 1;
267
+ } else {
268
+ process.stdout.write(
269
+ `jiraACP restarted (PID ${result.pid})
270
+ Logs: ${getLogFile()}
271
+ `
272
+ );
273
+ }
274
+ });
275
+ program.parse();
276
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport path from \"node:path\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(\n readFileSync(path.join(__dirname, \"..\", \"package.json\"), \"utf8\"),\n) as { version: string };\n\n// ── Daemon child mode ──────────────────────────────────────────────────────\n// When spawned by startDaemon(), skip CLI parsing and go straight to serve.\nconst daemonIdx = process.argv.indexOf(\"--daemon-child\");\nif (daemonIdx !== -1) {\n const port = parseInt(process.argv[daemonIdx + 1] ?? \"3100\", 10);\n const { startServe } = await import(\"./commands/serve.js\");\n await startServe(port);\n process.exit(0);\n}\n\n/** Resolve project name: explicit flag > auto-detect from git remote > cwd basename */\nasync function resolveProject(name?: string): Promise<string> {\n if (name) return name;\n const { detectProjectName } = await import(\"./config/loader.js\");\n return detectProjectName(process.cwd());\n}\n\nconst program = new Command();\n\nprogram\n .name(\"jiraACP\")\n .description(\n \"AI-powered Jira pipeline: Ticket → Code → GitHub → Deploy → Notify\",\n )\n .version(pkg.version);\n\n// ── Setup ──────────────────────────────────────────────────────────────────\n\nprogram\n .command(\"init\")\n .description(\n \"Interactive setup wizard — configure Jira, GitHub, Telegram, workspace\",\n )\n .option(\"--name <name>\", \"Project name (default: auto-detect from git)\")\n .option(\"--dir <path>\", \"Workspace root directory\", process.cwd())\n .action(async (opts: { name?: string; dir: string }) => {\n const { runWizard } = await import(\"./config/wizard.js\");\n const { detectProjectName } = await import(\"./config/loader.js\");\n const projectName = opts.name ?? detectProjectName(opts.dir);\n await runWizard(projectName, opts.dir);\n });\n\nprogram\n .command(\"doctor\")\n .description(\"Health-check all integrations\")\n .option(\"--project <name>\", \"Project name (default: auto-detect)\")\n .option(\"--fix\", \"Attempt auto-remediation\")\n .action(async (opts: { project?: string; fix: boolean }) => {\n const { runDoctor } = await import(\"./commands/doctor.js\");\n const projectName = await resolveProject(opts.project);\n await runDoctor(projectName, opts.fix);\n });\n\nprogram\n .command(\"update-context\")\n .description(\"Regenerate CLAUDE.md from codebase scan\")\n .option(\"--project <name>\", \"Project name (default: auto-detect)\")\n .option(\"--dir <path>\", \"Workspace root directory\", process.cwd())\n .action(async (opts: { project?: string; dir: string }) => {\n const { loadConfig } = await import(\"./config/loader.js\");\n const { generateClaudeMd } = await import(\"./memory/claude-md.js\");\n const projectName = await resolveProject(opts.project);\n const config = loadConfig(projectName);\n await generateClaudeMd(opts.dir, config);\n console.log(\"CLAUDE.md updated\");\n });\n\n// ── Pipeline ───────────────────────────────────────────────────────────────\n\nprogram\n .command(\"run <ticketKey>\")\n .description(\"Run the full pipeline for a single ticket\")\n .option(\"--project <name>\", \"Project name (default: auto-detect)\")\n .option(\"--from <stage>\", \"Start from stage\")\n .option(\"--to <stage>\", \"End at stage\")\n .option(\"--dry-run\", \"Simulate without side effects\")\n .option(\"--no-confirm\", \"Non-interactive mode\")\n .action(\n async (\n ticketKey: string,\n opts: { project?: string; from?: string; to?: string; dryRun?: boolean },\n ) => {\n const { runPipeline } = await import(\"./pipeline/orchestrator.js\");\n const { loadConfig } = await import(\"./config/loader.js\");\n const projectName = await resolveProject(opts.project);\n const config = loadConfig(projectName);\n await runPipeline(ticketKey, config, {\n fromStage: opts.from as never,\n toStage: opts.to as never,\n dryRun: opts.dryRun,\n });\n },\n );\n\nprogram\n .command(\"sprint\")\n .description(\"Run pipelines for all assigned sprint tickets\")\n .option(\"--project <name>\", \"Project name (default: auto-detect)\")\n .option(\"--sprint <name>\", \"Sprint name or ID\")\n .option(\"--parallel <n>\", \"Max concurrent pipelines\", \"2\")\n .option(\"--filter <jql>\", \"Additional JQL filter\")\n .option(\"--dry-run\", \"Simulate without side effects\")\n .action(\n async (opts: {\n project?: string;\n sprint?: string;\n parallel: string;\n filter?: string;\n dryRun?: boolean;\n }) => {\n const { runSprint } = await import(\"./commands/sprint.js\");\n const projectName = await resolveProject(opts.project);\n await runSprint({\n projectName,\n sprint: opts.sprint,\n parallel: Number(opts.parallel),\n filter: opts.filter,\n dryRun: opts.dryRun,\n });\n },\n );\n\nprogram\n .command(\"triage\")\n .description(\"Clarity analysis only — no code changes\")\n .option(\"--project <name>\", \"Project name (default: auto-detect)\")\n .option(\"--sprint <name>\", \"Sprint name or ID\")\n .option(\"--dry-run\", \"Simulate without side effects\")\n .action(\n async (opts: { project?: string; sprint?: string; dryRun?: boolean }) => {\n const { runTriage } = await import(\"./commands/triage.js\");\n const projectName = await resolveProject(opts.project);\n await runTriage({\n projectName,\n sprint: opts.sprint,\n dryRun: opts.dryRun,\n });\n },\n );\n\n// ── Monitoring ─────────────────────────────────────────────────────────────\n\nprogram\n .command(\"status [ticketKey]\")\n .description(\n \"Show daemon status (no args) or pipeline state for a ticket key\",\n )\n .option(\"--project <name>\", \"Project name (default: auto-detect, or all)\")\n .action(async (ticketKey: string | undefined, opts: { project?: string }) => {\n if (!ticketKey) {\n // No arg → daemon status\n const { getStatus } = await import(\"./utils/daemon.js\");\n const s = getStatus();\n if (s.running) {\n process.stdout.write(`jiraACP is running (PID ${s.pid})\\n`);\n } else {\n process.stdout.write(\"jiraACP is not running\\n\");\n }\n return;\n }\n const { showStatus } = await import(\"./commands/status.js\");\n const projectName = opts.project ?? (await resolveProject());\n await showStatus(projectName, ticketKey);\n });\n\nprogram\n .command(\"logs [ticketKey]\")\n .description(\"Show pipeline logs for a ticket, or daemon logs if no ticket\")\n .option(\"--project <name>\", \"Project name (default: auto-detect)\")\n .option(\"--stage <stage>\", \"Show logs for specific stage only\")\n .option(\"-f, --follow\", \"Tail logs for active run / daemon log\")\n .option(\"-n <lines>\", \"Last N lines (daemon log only)\", \"50\")\n .action(\n async (\n ticketKey: string | undefined,\n opts: { project?: string; stage?: string; follow?: boolean; n: string },\n ) => {\n if (!ticketKey) {\n // No ticket → tail daemon log\n const { getLogFile } = await import(\"./utils/daemon.js\");\n const logFile = getLogFile();\n const { spawn } = await import(\"node:child_process\");\n const args = opts.follow\n ? [\"-n\", opts.n, \"-f\", logFile]\n : [\"-n\", opts.n, logFile];\n const tail = spawn(\"tail\", args, { stdio: \"inherit\" });\n tail.on(\"exit\", (code) => {\n process.exitCode = code ?? 0;\n });\n return;\n }\n const { showLogs } = await import(\"./commands/logs.js\");\n const projectName = await resolveProject(opts.project);\n await showLogs(projectName, ticketKey, opts.stage, opts.follow);\n },\n );\n\nprogram\n .command(\"dashboard\")\n .description(\"Terminal UI of all active runs\")\n .option(\"--watch\", \"Auto-refresh every 5s\")\n .action(async (opts: { watch?: boolean }) => {\n const { runDashboard } = await import(\"./commands/dashboard.js\");\n runDashboard(opts.watch ?? false);\n });\n\nprogram\n .command(\"replay <ticketKey>\")\n .description(\"Pretty-print the event log for a completed run\")\n .option(\"--project <name>\", \"Project name (default: auto-detect)\")\n .action(async (ticketKey: string, opts: { project?: string }) => {\n const { replayRun } = await import(\"./commands/replay.js\");\n const projectName = await resolveProject(opts.project);\n await replayRun(ticketKey, projectName);\n });\n\nprogram\n .command(\"usage\")\n .description(\"Token cost report per project/month\")\n .option(\"--month <YYYY-MM>\", \"Filter by month\")\n .option(\"--project <name>\", \"Filter by project\")\n .option(\"--verbose\", \"Show per-stage breakdown\")\n .action(\n async (opts: { month?: string; project?: string; verbose?: boolean }) => {\n const { showUsage } = await import(\"./commands/usage.js\");\n await showUsage(opts);\n },\n );\n\n// ── Control ────────────────────────────────────────────────────────────────\n\nprogram\n .command(\"resume <ticketKey>\")\n .description(\"Resume a paused or crashed pipeline\")\n .option(\"--project <name>\", \"Project name (default: auto-detect)\")\n .action(async (ticketKey: string, opts: { project?: string }) => {\n const { resumePipeline } = await import(\"./pipeline/orchestrator.js\");\n const { loadConfig } = await import(\"./config/loader.js\");\n const projectName = await resolveProject(opts.project);\n const config = loadConfig(projectName);\n await resumePipeline(ticketKey, config);\n });\n\nprogram\n .command(\"abort <ticketKey>\")\n .description(\"Abort a running pipeline\")\n .option(\"--project <name>\", \"Project name (default: auto-detect)\")\n .option(\"--reason <text>\", \"Abort reason\")\n .action(\n async (ticketKey: string, opts: { project?: string; reason?: string }) => {\n const { abortPipeline } = await import(\"./commands/abort.js\");\n const projectName = await resolveProject(opts.project);\n await abortPipeline(ticketKey, projectName, opts.reason);\n },\n );\n\nprogram\n .command(\"pause <ticketKey>\")\n .description(\"Suspend a running pipeline (SIGSTOP)\")\n .option(\"--project <name>\", \"Project name (default: auto-detect)\")\n .action(async (ticketKey: string, opts: { project?: string }) => {\n const { pausePipeline } = await import(\"./commands/pause.js\");\n const projectName = await resolveProject(opts.project);\n await pausePipeline(ticketKey, projectName);\n });\n\nprogram\n .command(\"cancel-clarification <ticketKey>\")\n .description(\"Cancel a pending Telegram clarification\")\n .option(\"--project <name>\", \"Project name (default: auto-detect)\")\n .action(async (ticketKey: string, opts: { project?: string }) => {\n const { cancelClarification } =\n await import(\"./commands/cancel-clarification.js\");\n const projectName = await resolveProject(opts.project);\n await cancelClarification(ticketKey, projectName);\n });\n\n// ── Config ─────────────────────────────────────────────────────────────────\n\nprogram\n .command(\"config\")\n .description(\"Manage project config\")\n .addCommand(\n new Command(\"get\")\n .argument(\"[key]\", \"Config key (dot-path)\")\n .option(\"--project <name>\", \"Project name (default: auto-detect)\")\n .action(async (key: string | undefined, opts: { project?: string }) => {\n const { loadConfig } = await import(\"./config/loader.js\");\n const projectName = await resolveProject(opts.project);\n const config = loadConfig(projectName);\n if (key) {\n const val = key\n .split(\".\")\n .reduce(\n (o: unknown, k) => (o as Record<string, unknown>)?.[k],\n config as unknown,\n );\n console.log(JSON.stringify(val, null, 2));\n } else {\n console.log(JSON.stringify(config, null, 2));\n }\n }),\n )\n .addCommand(\n new Command(\"list\")\n .description(\"List all configured projects\")\n .action(async () => {\n const { listProjects } = await import(\"./config/loader.js\");\n const projects = listProjects();\n if (projects.length === 0) {\n console.log(\"No projects configured. Run: jiraACP init\");\n } else {\n console.log(\"Configured projects:\");\n for (const p of projects) console.log(` • ${p}`);\n }\n }),\n )\n .addCommand(\n new Command(\"set\")\n .description(\"Set a config key (dot-path) to a value\")\n .argument(\"<key>\", \"Config key (dot-path)\")\n .argument(\"<value>\", \"New value (JSON or string)\")\n .option(\"--project <name>\", \"Project name (default: auto-detect)\")\n .action(\n async (key: string, value: string, opts: { project?: string }) => {\n const { configSet } = await import(\"./commands/config-set.js\");\n const projectName = await resolveProject(opts.project);\n configSet(projectName, key, value);\n },\n ),\n )\n .addCommand(\n new Command(\"edit\")\n .description(\"Open config in $EDITOR\")\n .option(\"--project <name>\", \"Project name (default: auto-detect)\")\n .action(async (opts: { project?: string }) => {\n const { configEdit } = await import(\"./commands/config-edit.js\");\n const projectName = await resolveProject(opts.project);\n await configEdit(projectName);\n }),\n );\n\n// ── Projects ───────────────────────────────────────────────────────────────\n\nconst projectsCmd = program\n .command(\"projects\")\n .description(\"Manage configured projects\");\n\nprojectsCmd\n .command(\"list\")\n .description(\"List all configured projects\")\n .action(async () => {\n const { projectsList } = await import(\"./commands/projects.js\");\n projectsList();\n });\n\nprojectsCmd\n .command(\"add <name>\")\n .description(\"Create a new project config skeleton\")\n .action(async (name: string) => {\n const { projectsAdd } = await import(\"./commands/projects.js\");\n await projectsAdd(name);\n });\n\nprojectsCmd\n .command(\"remove <name>\")\n .description(\"Remove a project config\")\n .action(async (name: string) => {\n const { projectsRemove } = await import(\"./commands/projects.js\");\n await projectsRemove(name);\n });\n\n// ── Schedule ───────────────────────────────────────────────────────────────\n\nconst scheduleCmd = program\n .command(\"schedule\")\n .description(\"Manage scheduled pipeline runs\");\n\nscheduleCmd\n .command(\"add\")\n .description('Add a scheduled run (e.g. --cron \"0 9 * * 1-5\")')\n .requiredOption(\"--cron <expr>\", \"Cron expression (5 fields)\")\n .requiredOption(\"--project <name>\", \"Project name\")\n .action(async (opts: { cron: string; project: string }) => {\n const { scheduleAdd } = await import(\"./commands/schedule.js\");\n scheduleAdd(opts.project, opts.cron);\n });\n\nscheduleCmd\n .command(\"list\")\n .description(\"List all scheduled runs\")\n .action(async () => {\n const { scheduleList } = await import(\"./commands/schedule.js\");\n scheduleList();\n });\n\nscheduleCmd\n .command(\"remove <id>\")\n .description(\"Remove a schedule by ID (or ID prefix)\")\n .action(async (id: string) => {\n const { scheduleRemove } = await import(\"./commands/schedule.js\");\n scheduleRemove(id);\n });\n\n// ── Utility ────────────────────────────────────────────────────────────────\n\nprogram\n .command(\"serve\")\n .description(\"Start webhook server in foreground (for dev/docker)\")\n .option(\"--port <n>\", \"Port number\", \"3100\")\n .action(async (opts: { port: string }) => {\n const { startServe } = await import(\"./commands/serve.js\");\n await startServe(Number(opts.port));\n });\n\n// ── Daemon ─────────────────────────────────────────────────────────────────\n\nprogram\n .command(\"start\")\n .description(\"Start jiraACP server as background daemon\")\n .option(\"--port <n>\", \"Port number\", \"3100\")\n .action(async (opts: { port: string }) => {\n const { startDaemon, getLogFile } = await import(\"./utils/daemon.js\");\n const result = startDaemon(Number(opts.port));\n if (\"error\" in result) {\n process.stderr.write(`${result.error}\\n`);\n process.exitCode = 1;\n } else {\n process.stdout.write(\n `jiraACP started (PID ${result.pid})\\nLogs: ${getLogFile()}\\n`,\n );\n }\n });\n\nprogram\n .command(\"stop\")\n .description(\"Stop the background daemon\")\n .action(async () => {\n const { stopDaemon } = await import(\"./utils/daemon.js\");\n const result = await stopDaemon();\n if (result.stopped) {\n process.stdout.write(`jiraACP stopped (PID ${result.pid})\\n`);\n } else {\n process.stderr.write(`${result.error ?? \"Failed to stop\"}\\n`);\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"restart\")\n .description(\"Restart the background daemon\")\n .option(\"--port <n>\", \"Port number\", \"3100\")\n .action(async (opts: { port: string }) => {\n const { stopDaemon, startDaemon, getLogFile } =\n await import(\"./utils/daemon.js\");\n await stopDaemon();\n const result = startDaemon(Number(opts.port));\n if (\"error\" in result) {\n process.stderr.write(`${result.error}\\n`);\n process.exitCode = 1;\n } else {\n process.stdout.write(\n `jiraACP restarted (PID ${result.pid})\\nLogs: ${getLogFile()}\\n`,\n );\n }\n });\n\nprogram.parse();\n"],"mappings":"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","names":[]}