@xdevops/issue-auto-finish 1.0.88 → 1.0.90

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 (139) hide show
  1. package/dist/{AIRunnerRegistry-II3WWSFN.js → AIRunnerRegistry-CFDNWSXC.js} +6 -3
  2. package/dist/{LockNote-Z2CLDZNN.js → LockNote-W2JNVMW7.js} +3 -3
  3. package/dist/PtyRunner-NYASBTRP.js +33 -0
  4. package/dist/SdkRunner-U2OTOMZU.js +9 -0
  5. package/dist/ai-runner/AIRunner.d.ts +19 -1
  6. package/dist/ai-runner/AIRunner.d.ts.map +1 -1
  7. package/dist/ai-runner/AIRunnerRegistry.d.ts +8 -0
  8. package/dist/ai-runner/AIRunnerRegistry.d.ts.map +1 -1
  9. package/dist/ai-runner/PlanFileResolver.d.ts +53 -0
  10. package/dist/ai-runner/PlanFileResolver.d.ts.map +1 -0
  11. package/dist/ai-runner/PtyRunner.d.ts +45 -4
  12. package/dist/ai-runner/PtyRunner.d.ts.map +1 -1
  13. package/dist/ai-runner/SdkRunner.d.ts +22 -0
  14. package/dist/ai-runner/SdkRunner.d.ts.map +1 -0
  15. package/dist/ai-runner/index.d.ts +5 -2
  16. package/dist/ai-runner/index.d.ts.map +1 -1
  17. package/dist/ai-runner/sdk/ClaudeCodeSDK.d.ts +37 -0
  18. package/dist/ai-runner/sdk/ClaudeCodeSDK.d.ts.map +1 -0
  19. package/dist/ai-runner/sdk/Stream.d.ts +22 -0
  20. package/dist/ai-runner/sdk/Stream.d.ts.map +1 -0
  21. package/dist/ai-runner/sdk/types.d.ts +146 -0
  22. package/dist/ai-runner/sdk/types.d.ts.map +1 -0
  23. package/dist/{ai-runner-HLA44WI6.js → ai-runner-TOHVJJ76.js} +14 -5
  24. package/dist/{analyze-ZIXNC5GN.js → analyze-DBH4K3J7.js} +8 -6
  25. package/dist/{analyze-ZIXNC5GN.js.map → analyze-DBH4K3J7.js.map} +1 -1
  26. package/dist/{braindump-56WAY2RD.js → braindump-RYI4BGMG.js} +11 -9
  27. package/dist/{braindump-56WAY2RD.js.map → braindump-RYI4BGMG.js.map} +1 -1
  28. package/dist/{chunk-AVGZH64A.js → chunk-2RWGZPNF.js} +4 -1
  29. package/dist/chunk-2RWGZPNF.js.map +1 -0
  30. package/dist/chunk-4XMYOXGZ.js +1153 -0
  31. package/dist/chunk-4XMYOXGZ.js.map +1 -0
  32. package/dist/{chunk-M5C2WILQ.js → chunk-5M5SB6ZA.js} +7 -5
  33. package/dist/{chunk-M5C2WILQ.js.map → chunk-5M5SB6ZA.js.map} +1 -1
  34. package/dist/{chunk-D47Q5745.js → chunk-ENF24C44.js} +7 -7
  35. package/dist/{chunk-GXFG4JU6.js → chunk-EU4XFZ2T.js} +2 -2
  36. package/dist/{chunk-NZHKAPU6.js → chunk-FJTZKAJA.js} +9 -3
  37. package/dist/chunk-FJTZKAJA.js.map +1 -0
  38. package/dist/chunk-G7QI5WDI.js +14 -0
  39. package/dist/chunk-G7QI5WDI.js.map +1 -0
  40. package/dist/{chunk-2YQHKXLL.js → chunk-GPZX4DSY.js} +22 -6
  41. package/dist/chunk-GPZX4DSY.js.map +1 -0
  42. package/dist/{chunk-IP3QTP5A.js → chunk-IWSMQXBL.js} +189 -48
  43. package/dist/chunk-IWSMQXBL.js.map +1 -0
  44. package/dist/chunk-MSL7ROVK.js +1 -0
  45. package/dist/{chunk-YCYVNRLF.js → chunk-OBGEEGQ3.js} +61 -19
  46. package/dist/chunk-OBGEEGQ3.js.map +1 -0
  47. package/dist/chunk-R32Q3RGK.js +666 -0
  48. package/dist/chunk-R32Q3RGK.js.map +1 -0
  49. package/dist/{chunk-LNFMARKQ.js → chunk-SEO57UYI.js} +25 -8
  50. package/dist/chunk-SEO57UYI.js.map +1 -0
  51. package/dist/{chunk-2GJ2KA4Z.js → chunk-TDKTI363.js} +3 -3
  52. package/dist/{chunk-SAMTXC4A.js → chunk-TFEPHOVE.js} +12 -17
  53. package/dist/chunk-TFEPHOVE.js.map +1 -0
  54. package/dist/{chunk-C4MFVASL.js → chunk-Y62E72TA.js} +63 -20
  55. package/dist/chunk-Y62E72TA.js.map +1 -0
  56. package/dist/{chunk-HDFNMVRQ.js → chunk-Z3OBKODV.js} +12 -11
  57. package/dist/chunk-Z3OBKODV.js.map +1 -0
  58. package/dist/cli/setup/ConfigGenerator.d.ts +2 -0
  59. package/dist/cli/setup/ConfigGenerator.d.ts.map +1 -1
  60. package/dist/cli/setup/DependencyChecker.d.ts +1 -1
  61. package/dist/cli/setup/DependencyChecker.d.ts.map +1 -1
  62. package/dist/cli/setup/PreflightChecker.d.ts.map +1 -1
  63. package/dist/cli/setup/env-metadata.d.ts.map +1 -1
  64. package/dist/cli.js +10 -9
  65. package/dist/cli.js.map +1 -1
  66. package/dist/{config-WTRSZLOC.js → config-23TBYFP5.js} +5 -4
  67. package/dist/config-schema.d.ts +6 -0
  68. package/dist/config-schema.d.ts.map +1 -1
  69. package/dist/config.d.ts +6 -0
  70. package/dist/config.d.ts.map +1 -1
  71. package/dist/{doctor-37JNBGDN.js → doctor-LLETZLW2.js} +3 -3
  72. package/dist/errors/AIExecutionError.d.ts +3 -0
  73. package/dist/errors/AIExecutionError.d.ts.map +1 -1
  74. package/dist/{errors-S3BWYA4I.js → errors-J3ZRP66W.js} +2 -2
  75. package/dist/events/EventBus.d.ts +1 -1
  76. package/dist/events/EventBus.d.ts.map +1 -1
  77. package/dist/i18n/locales/en.d.ts.map +1 -1
  78. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +16 -14
  81. package/dist/{init-4THZTNXY.js → init-UKTP7LXS.js} +9 -8
  82. package/dist/{init-4THZTNXY.js.map → init-UKTP7LXS.js.map} +1 -1
  83. package/dist/lib.js +10 -8
  84. package/dist/lib.js.map +1 -1
  85. package/dist/orchestrator/PendingDialogStore.d.ts +12 -0
  86. package/dist/orchestrator/PendingDialogStore.d.ts.map +1 -0
  87. package/dist/orchestrator/steps/FailureHandler.d.ts.map +1 -1
  88. package/dist/orchestrator/steps/PhaseLoopStep.d.ts.map +1 -1
  89. package/dist/persistence/PlanPersistence.d.ts +5 -0
  90. package/dist/persistence/PlanPersistence.d.ts.map +1 -1
  91. package/dist/persistence/TodolistExtractor.d.ts +31 -0
  92. package/dist/persistence/TodolistExtractor.d.ts.map +1 -0
  93. package/dist/phases/BasePhase.d.ts.map +1 -1
  94. package/dist/phases/PhaseOutcome.d.ts +2 -0
  95. package/dist/phases/PhaseOutcome.d.ts.map +1 -1
  96. package/dist/phases/PlanPhase.d.ts.map +1 -1
  97. package/dist/prompts/templates.d.ts +2 -2
  98. package/dist/prompts/templates.d.ts.map +1 -1
  99. package/dist/{restart-VEDIKB6M.js → restart-2BCP6AMK.js} +9 -8
  100. package/dist/{restart-VEDIKB6M.js.map → restart-2BCP6AMK.js.map} +1 -1
  101. package/dist/run.js +16 -14
  102. package/dist/run.js.map +1 -1
  103. package/dist/start-ECUOKGM2.js +16 -0
  104. package/dist/start-ECUOKGM2.js.map +1 -0
  105. package/dist/tracker/IssueTracker.d.ts +6 -0
  106. package/dist/tracker/IssueTracker.d.ts.map +1 -1
  107. package/dist/web/routes/api.d.ts.map +1 -1
  108. package/package.json +5 -1
  109. package/src/web/frontend/dist/assets/index-DWOHf3bd.css +1 -0
  110. package/src/web/frontend/dist/assets/index-Dby4j-V_.js +151 -0
  111. package/src/web/frontend/dist/index.html +2 -2
  112. package/dist/PtyRunner-6UGI5STW.js +0 -22
  113. package/dist/chunk-2YQHKXLL.js.map +0 -1
  114. package/dist/chunk-AVGZH64A.js.map +0 -1
  115. package/dist/chunk-C4MFVASL.js.map +0 -1
  116. package/dist/chunk-HDFNMVRQ.js.map +0 -1
  117. package/dist/chunk-IP3QTP5A.js.map +0 -1
  118. package/dist/chunk-LNFMARKQ.js.map +0 -1
  119. package/dist/chunk-NZHKAPU6.js.map +0 -1
  120. package/dist/chunk-SAMTXC4A.js.map +0 -1
  121. package/dist/chunk-U237JSLB.js +0 -1
  122. package/dist/chunk-U6GWFTKA.js +0 -657
  123. package/dist/chunk-U6GWFTKA.js.map +0 -1
  124. package/dist/chunk-YCYVNRLF.js.map +0 -1
  125. package/dist/start-5N6DIWM2.js +0 -15
  126. package/src/web/frontend/dist/assets/index-COYziOhv.css +0 -1
  127. package/src/web/frontend/dist/assets/index-D_oTMuJU.js +0 -151
  128. /package/dist/{AIRunnerRegistry-II3WWSFN.js.map → AIRunnerRegistry-CFDNWSXC.js.map} +0 -0
  129. /package/dist/{LockNote-Z2CLDZNN.js.map → LockNote-W2JNVMW7.js.map} +0 -0
  130. /package/dist/{PtyRunner-6UGI5STW.js.map → PtyRunner-NYASBTRP.js.map} +0 -0
  131. /package/dist/{ai-runner-HLA44WI6.js.map → SdkRunner-U2OTOMZU.js.map} +0 -0
  132. /package/dist/{chunk-U237JSLB.js.map → ai-runner-TOHVJJ76.js.map} +0 -0
  133. /package/dist/{chunk-D47Q5745.js.map → chunk-ENF24C44.js.map} +0 -0
  134. /package/dist/{chunk-GXFG4JU6.js.map → chunk-EU4XFZ2T.js.map} +0 -0
  135. /package/dist/{config-WTRSZLOC.js.map → chunk-MSL7ROVK.js.map} +0 -0
  136. /package/dist/{chunk-2GJ2KA4Z.js.map → chunk-TDKTI363.js.map} +0 -0
  137. /package/dist/{errors-S3BWYA4I.js.map → config-23TBYFP5.js.map} +0 -0
  138. /package/dist/{doctor-37JNBGDN.js.map → doctor-LLETZLW2.js.map} +0 -0
  139. /package/dist/{start-5N6DIWM2.js.map → errors-J3ZRP66W.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ai-runner/SdkRunner.ts","../src/ai-runner/sdk/ClaudeCodeSDK.ts","../src/ai-runner/sdk/Stream.ts","../src/ai-runner/sdk/types.ts"],"sourcesContent":["/**\n * SdkRunner — AIRunner implementation that drives Claude Code via its\n * structured JSON SDK protocol (--output-format stream-json).\n *\n * Unlike PtyRunner (which parses ANSI terminal output heuristically),\n * SdkRunner relies on deterministic JSON messages for completion detection\n * and uses the canCallTool callback for native plan mode support.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport type { ChildProcess } from 'node:child_process';\nimport type {\n AIRunner,\n RunOptions,\n RunResult,\n StreamEvent,\n} from './AIRunner.js';\nimport { query } from './sdk/ClaudeCodeSDK.js';\nimport type {\n SDKMessage,\n SDKResultMessage,\n SDKAssistantMessage,\n PermissionResult,\n QueryOptions,\n} from './sdk/types.js';\nimport { AbortError } from './sdk/types.js';\nimport { isShuttingDown } from '../shutdown/ShutdownSignal.js';\nimport { logger as rootLogger } from '../logger.js';\n\nconst logger = rootLogger.child('SdkRunner');\n\nconst SIGKILL_GRACE_MS = 10_000;\nconst IDLE_CHECK_INTERVAL_MS = 5_000;\n\ninterface ActiveProcess {\n child: ChildProcess;\n workDir: string;\n abort: AbortController;\n}\n\nexport class SdkRunner implements AIRunner {\n private activeProcesses = new Map<ChildProcess, ActiveProcess>();\n\n constructor(\n private readonly binary: string,\n private readonly nvmNodeVersion: string,\n private readonly model?: string,\n ) {}\n\n // -- AIRunner interface ----------------------------------------------------\n\n async run(options: RunOptions): Promise<RunResult> {\n if (isShuttingDown()) {\n logger.warn('SdkRunner skipped — service is shutting down');\n return { success: false, output: 'Service shutting down', exitCode: null };\n }\n\n const {\n prompt,\n workDir,\n timeoutMs,\n idleTimeoutMs,\n onStreamEvent,\n mode,\n artifactPaths,\n } = options;\n\n logger.info('SdkRunner.run()', {\n workDir,\n timeoutMs,\n mode,\n phaseName: options.phaseName,\n });\n\n const abortController = new AbortController();\n\n // -- Build query options --\n const isPlanMode = mode === 'plan';\n let planContent: string | undefined;\n\n const queryOptions: QueryOptions = {\n cwd: workDir,\n model: this.model,\n abort: abortController.signal,\n };\n\n if (isPlanMode) {\n queryOptions.permissionMode = 'plan';\n queryOptions.allowedTools = ['Read', 'Grep', 'Glob', 'WebSearch'];\n queryOptions.canCallTool = async (\n toolName: string,\n input: unknown,\n _opts: { signal: AbortSignal },\n ): Promise<PermissionResult> => {\n if (\n toolName === 'ExitPlanMode' ||\n toolName === 'exit_plan_mode'\n ) {\n const planInput = input as Record<string, unknown> | null;\n planContent = typeof planInput?.plan === 'string'\n ? planInput.plan\n : undefined;\n\n logger.info('ExitPlanMode intercepted', {\n hasPlan: !!planContent,\n planLength: planContent?.length,\n });\n\n if (planContent && artifactPaths && artifactPaths.length > 0) {\n for (const targetPath of artifactPaths) {\n const targetDir = path.dirname(targetPath);\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n }\n fs.writeFileSync(targetPath, planContent, 'utf-8');\n logger.info('Plan written to artifact path', { target: targetPath });\n }\n }\n\n return { behavior: 'deny', message: 'Plan captured by SdkRunner' };\n }\n\n return {\n behavior: 'allow',\n updatedInput: (input && typeof input === 'object')\n ? input as Record<string, unknown>\n : {},\n };\n };\n } else {\n queryOptions.permissionMode = 'bypassPermissions';\n }\n\n if (options.continueSession && options.sessionId) {\n queryOptions.resume = options.sessionId;\n }\n\n // -- Spawn Claude Code process --\n const q = query({\n prompt,\n binary: this.binary,\n options: queryOptions,\n });\n\n const entry: ActiveProcess = {\n child: q.child,\n workDir,\n abort: abortController,\n };\n this.activeProcesses.set(q.child, entry);\n\n // -- Collect output and detect completion --\n const outputParts: string[] = [];\n const stderrParts: string[] = [];\n let sessionId: string | undefined;\n let resultMessage: SDKResultMessage | undefined;\n let caughtError: Error | undefined;\n let lastActivityTime = Date.now();\n let timedOut = false;\n let timeoutType: 'wall-clock' | 'idle' | undefined;\n let wasActiveAtTimeout = false;\n\n q.child.stderr.on('data', (data: Buffer) => {\n stderrParts.push(data.toString());\n });\n\n // Wall-clock timeout with progressive extension\n const graceWindowMs = options.timeoutGraceMs ?? 60_000;\n const extensionMs = options.timeoutExtensionMs ?? 600_000;\n const maxExtensions = options.timeoutMaxExtensions ?? 3;\n let extensions = 0;\n\n const scheduleWallTimer = (delayMs: number): ReturnType<typeof setTimeout> => {\n return setTimeout(() => {\n const recentMs = Date.now() - lastActivityTime;\n const isActive = recentMs < graceWindowMs;\n if (isActive && extensions < maxExtensions) {\n extensions++;\n logger.info('Wall-clock timeout extended (agent still active)', {\n extensions,\n maxExtensions,\n lastOutputAgoMs: recentMs,\n });\n wallTimer = scheduleWallTimer(extensionMs);\n return;\n }\n timedOut = true;\n timeoutType = 'wall-clock';\n wasActiveAtTimeout = isActive;\n abortController.abort();\n }, delayMs);\n };\n let wallTimer = scheduleWallTimer(timeoutMs);\n\n // Idle timeout\n const effectiveIdleMs = idleTimeoutMs ?? 600_000;\n const idleCheck = setInterval(() => {\n const idleMs = Date.now() - lastActivityTime;\n if (idleMs >= effectiveIdleMs) {\n timedOut = true;\n timeoutType = 'idle';\n wasActiveAtTimeout = false;\n abortController.abort();\n }\n }, IDLE_CHECK_INTERVAL_MS);\n\n try {\n for await (const message of q) {\n lastActivityTime = Date.now();\n this.processMessage(\n message,\n outputParts,\n onStreamEvent,\n (sid) => { sessionId = sid; },\n (result) => { resultMessage = result; },\n );\n }\n } catch (error) {\n caughtError = error as Error;\n if (error instanceof AbortError) {\n logger.info('Claude Code process aborted', { timedOut, timeoutType });\n } else {\n logger.error('Unexpected error during SDK message iteration', {\n error: (error as Error).message,\n });\n }\n } finally {\n clearTimeout(wallTimer);\n clearInterval(idleCheck);\n this.activeProcesses.delete(q.child);\n }\n\n // -- Build RunResult --\n const output = outputParts.join('');\n const success = !timedOut && resultMessage != null && !resultMessage.is_error;\n\n let errorMessage: string | undefined;\n if (!success) {\n const parts: string[] = [];\n if (timedOut) {\n parts.push(\n timeoutType === 'idle'\n ? 'AI 长时间无响应,已超时终止'\n : '执行超时',\n );\n }\n if (resultMessage?.is_error && resultMessage.result) {\n parts.push(resultMessage.result);\n }\n if (!resultMessage && caughtError && !(caughtError instanceof AbortError)) {\n parts.push(caughtError.message);\n }\n const stderr = stderrParts.join('').trim();\n if (stderr && parts.length === 0) {\n parts.push(stderr.slice(0, 500));\n }\n errorMessage = parts.join(' | ') || 'Claude Code 进程异常退出(无输出)';\n }\n\n logger.info('SdkRunner completed', {\n workDir,\n success,\n timedOut,\n timeoutType,\n outputLength: output.length,\n sessionId,\n resultSubtype: resultMessage?.subtype,\n });\n\n return {\n success,\n output: resultMessage?.result ?? output,\n errorMessage,\n sessionId: sessionId ?? resultMessage?.session_id,\n exitCode: success ? 0 : (timedOut ? null : 1),\n timeoutType,\n wasActiveAtTimeout,\n };\n }\n\n killAll(): void {\n for (const [child, entry] of this.activeProcesses) {\n entry.abort.abort();\n this.forceKill(child);\n }\n logger.info('SdkRunner: all active processes killed', {\n count: this.activeProcesses.size,\n });\n this.activeProcesses.clear();\n }\n\n killByWorkDir(targetWorkDir: string): number {\n let killed = 0;\n for (const [child, entry] of this.activeProcesses) {\n if (entry.workDir === targetWorkDir) {\n entry.abort.abort();\n this.forceKill(child);\n this.activeProcesses.delete(child);\n killed++;\n }\n }\n if (killed > 0) {\n logger.info('SdkRunner: killed processes by workDir', {\n workDir: targetWorkDir,\n killed,\n });\n }\n return killed;\n }\n\n // -- Internal helpers ------------------------------------------------------\n\n private processMessage(\n message: SDKMessage,\n outputParts: string[],\n onStreamEvent: ((event: StreamEvent) => void) | undefined,\n onSessionId: (sid: string) => void,\n onResult: (result: SDKResultMessage) => void,\n ): void {\n switch (message.type) {\n case 'system': {\n const sys = message as { session_id?: string; model?: string };\n if (sys.session_id) onSessionId(sys.session_id);\n if (onStreamEvent) {\n onStreamEvent({\n type: 'system',\n content: message,\n timestamp: new Date().toISOString(),\n });\n }\n break;\n }\n\n case 'assistant': {\n const assistant = message as SDKAssistantMessage;\n if (assistant.message?.content) {\n for (const block of assistant.message.content) {\n if (block.type === 'text' && block.text) {\n outputParts.push(block.text);\n }\n }\n }\n if (onStreamEvent) {\n onStreamEvent({\n type: 'assistant',\n content: message,\n timestamp: new Date().toISOString(),\n });\n }\n break;\n }\n\n case 'result': {\n const result = message as SDKResultMessage;\n onResult(result);\n if (result.session_id) onSessionId(result.session_id);\n if (onStreamEvent) {\n onStreamEvent({\n type: 'result',\n content: message,\n timestamp: new Date().toISOString(),\n });\n }\n break;\n }\n\n case 'user': {\n if (onStreamEvent) {\n onStreamEvent({\n type: 'user',\n content: message,\n timestamp: new Date().toISOString(),\n });\n }\n break;\n }\n\n case 'log': {\n const log = message as { log?: { level?: string; message?: string } };\n if (log.log) {\n logger.debug(`Claude log [${log.log.level}]: ${log.log.message}`);\n }\n break;\n }\n\n default: {\n if (onStreamEvent) {\n onStreamEvent({\n type: message.type || 'raw',\n content: message,\n timestamp: new Date().toISOString(),\n });\n }\n break;\n }\n }\n }\n\n private forceKill(child: ChildProcess): void {\n try {\n if (child.exitCode === null) {\n child.kill('SIGTERM');\n setTimeout(() => {\n if (child.exitCode === null) {\n child.kill('SIGKILL');\n }\n }, SIGKILL_GRACE_MS);\n }\n } catch {\n // process may have already exited\n }\n }\n}\n","/**\n * Claude Code SDK — spawns Claude Code CLI with --output-format stream-json\n * and provides a structured async iterable of SDK messages.\n *\n * Adapted from happy project (packages/happy-cli/src/claude/sdk/query.ts).\n */\n\nimport { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process';\nimport { createInterface } from 'node:readline';\nimport type { Writable } from 'node:stream';\nimport { Stream } from './Stream.js';\nimport {\n type QueryOptions,\n type QueryPrompt,\n type SDKMessage,\n type SDKControlResponse,\n type CanUseToolControlRequest,\n type CanUseToolControlResponse,\n type ControlCancelRequest,\n type PermissionResult,\n type CanCallToolCallback,\n AbortError,\n} from './types.js';\nimport { logger as rootLogger } from '../../logger.js';\n\nconst logger = rootLogger.child('ClaudeCodeSDK');\n\n// ---------------------------------------------------------------------------\n// Query class — manages a single Claude Code process interaction\n// ---------------------------------------------------------------------------\n\ntype ControlResponseHandler = (response: SDKControlResponse['response']) => void;\n\nexport class Query implements AsyncIterableIterator<SDKMessage> {\n private pendingControlResponses = new Map<string, ControlResponseHandler>();\n private cancelControllers = new Map<string, AbortController>();\n private sdkMessages: AsyncIterableIterator<SDKMessage>;\n private inputStream = new Stream<SDKMessage>();\n private canCallTool?: CanCallToolCallback;\n\n /** The underlying child process — exposed for kill/abort by SdkRunner. */\n readonly child: ChildProcessWithoutNullStreams;\n\n constructor(\n child: ChildProcessWithoutNullStreams,\n private childStdin: Writable | null,\n processExitPromise: Promise<void>,\n canCallTool?: CanCallToolCallback,\n ) {\n this.child = child;\n this.canCallTool = canCallTool;\n this.readMessages(processExitPromise);\n this.sdkMessages = this.readSdkMessages();\n }\n\n setError(error: Error): void {\n this.inputStream.error(error);\n }\n\n // -- AsyncIterableIterator -------------------------------------------------\n\n next(): Promise<IteratorResult<SDKMessage>> {\n return this.sdkMessages.next();\n }\n\n return(value?: unknown): Promise<IteratorResult<SDKMessage>> {\n if (this.sdkMessages.return) {\n return this.sdkMessages.return(value as undefined);\n }\n return Promise.resolve({ done: true, value: undefined });\n }\n\n throw(e?: unknown): Promise<IteratorResult<SDKMessage>> {\n if (this.sdkMessages.throw) {\n return this.sdkMessages.throw(e);\n }\n return Promise.reject(e);\n }\n\n [Symbol.asyncIterator](): AsyncIterableIterator<SDKMessage> {\n return this.sdkMessages;\n }\n\n // -- Internal: read stdout JSON lines --------------------------------------\n\n private async readMessages(processExitPromise: Promise<void>): Promise<void> {\n const rl = createInterface({ input: this.child.stdout });\n\n try {\n for await (const line of rl) {\n if (!line.trim()) continue;\n try {\n const message = JSON.parse(line) as SDKMessage | SDKControlResponse;\n\n if (message.type === 'control_response') {\n const controlResponse = message as SDKControlResponse;\n const handler = this.pendingControlResponses.get(\n controlResponse.response.request_id,\n );\n if (handler) {\n handler(controlResponse.response);\n }\n continue;\n }\n\n if (message.type === 'control_request') {\n await this.handleControlRequest(\n message as unknown as CanUseToolControlRequest,\n );\n continue;\n }\n\n if (message.type === 'control_cancel_request') {\n this.handleControlCancelRequest(\n message as unknown as ControlCancelRequest,\n );\n continue;\n }\n\n this.inputStream.enqueue(message);\n } catch {\n logger.debug('Non-JSON line from Claude stdout: ' + line.slice(0, 200));\n }\n }\n await processExitPromise;\n } catch (error) {\n this.inputStream.error(error as Error);\n } finally {\n this.inputStream.done();\n this.cleanupControllers();\n rl.close();\n }\n }\n\n private async *readSdkMessages(): AsyncIterableIterator<SDKMessage> {\n for await (const message of this.inputStream) {\n yield message;\n }\n }\n\n // -- Control request handling (tool permissions) ---------------------------\n\n private async handleControlRequest(\n request: CanUseToolControlRequest,\n ): Promise<void> {\n if (!this.childStdin) {\n logger.debug('Cannot handle control request — no stdin available');\n return;\n }\n\n const controller = new AbortController();\n this.cancelControllers.set(request.request_id, controller);\n\n try {\n const response = await this.processControlRequest(\n request,\n controller.signal,\n );\n const controlResponse: CanUseToolControlResponse = {\n type: 'control_response',\n response: {\n subtype: 'success',\n request_id: request.request_id,\n response,\n },\n };\n this.childStdin.write(JSON.stringify(controlResponse) + '\\n');\n } catch (error) {\n const controlErrorResponse: CanUseToolControlResponse = {\n type: 'control_response',\n response: {\n subtype: 'error',\n request_id: request.request_id,\n error: error instanceof Error ? error.message : String(error),\n },\n };\n this.childStdin.write(JSON.stringify(controlErrorResponse) + '\\n');\n } finally {\n this.cancelControllers.delete(request.request_id);\n }\n }\n\n private handleControlCancelRequest(request: ControlCancelRequest): void {\n const controller = this.cancelControllers.get(request.request_id);\n if (controller) {\n controller.abort();\n this.cancelControllers.delete(request.request_id);\n }\n }\n\n private async processControlRequest(\n request: CanUseToolControlRequest,\n signal: AbortSignal,\n ): Promise<PermissionResult> {\n if (request.request.subtype === 'can_use_tool') {\n if (!this.canCallTool) {\n throw new Error('canCallTool callback is not provided.');\n }\n return this.canCallTool(\n request.request.tool_name,\n request.request.input,\n { signal },\n );\n }\n throw new Error(\n 'Unsupported control request subtype: ' + request.request.subtype,\n );\n }\n\n private cleanupControllers(): void {\n for (const [, controller] of this.cancelControllers) {\n controller.abort();\n }\n this.cancelControllers.clear();\n }\n}\n\n// ---------------------------------------------------------------------------\n// query() factory — spawns Claude Code and returns a Query\n// ---------------------------------------------------------------------------\n\nexport function query(config: {\n prompt: QueryPrompt;\n binary: string;\n options?: QueryOptions;\n}): Query {\n const {\n prompt,\n binary,\n options: {\n allowedTools = [],\n disallowedTools = [],\n cwd,\n model,\n permissionMode = 'default',\n canCallTool,\n resume,\n continueConversation,\n appendSystemPrompt,\n maxTurns,\n abort,\n } = {},\n } = config;\n\n // Build CLI arguments\n const args = ['--output-format', 'stream-json', '--verbose'];\n\n if (appendSystemPrompt) args.push('--append-system-prompt', appendSystemPrompt);\n if (maxTurns) args.push('--max-turns', maxTurns.toString());\n if (model) args.push('--model', model);\n if (continueConversation) args.push('--continue');\n if (resume) args.push('--resume', resume);\n if (allowedTools.length > 0) args.push('--allowedTools', allowedTools.join(','));\n if (disallowedTools.length > 0) args.push('--disallowedTools', disallowedTools.join(','));\n if (permissionMode) args.push('--permission-mode', permissionMode);\n\n if (canCallTool) {\n args.push('--permission-prompt-tool', 'stdio');\n args.push('--input-format', 'stream-json');\n }\n\n // --print for single-shot mode (no canCallTool), stdin stream otherwise\n if (!canCallTool) {\n args.push('--print', prompt.trim());\n }\n\n // Build clean env: remove CLAUDECODE to prevent nested session detection\n const { CLAUDECODE: _, ...cleanEnv } = process.env;\n\n logger.info('Spawning Claude Code process', {\n binary,\n argCount: args.length,\n cwd,\n hasCanCallTool: !!canCallTool,\n });\n logger.debug('Claude Code args', { args });\n\n const child = spawn(binary, args, {\n cwd,\n stdio: ['pipe', 'pipe', 'pipe'],\n signal: abort,\n env: cleanEnv,\n windowsHide: true,\n }) as ChildProcessWithoutNullStreams;\n\n // Handle stdin\n let childStdin: Writable | null = null;\n if (!canCallTool) {\n child.stdin.end();\n } else {\n childStdin = child.stdin;\n // Send the initial user message via stream-json\n const userMessage: SDKMessage = {\n type: 'user',\n message: {\n role: 'user',\n content: prompt.trim(),\n },\n };\n childStdin.write(JSON.stringify(userMessage) + '\\n');\n }\n\n // Pipe stderr to logger\n child.stderr.on('data', (data: Buffer) => {\n logger.debug('Claude Code stderr: ' + data.toString().trimEnd());\n });\n\n // Process lifecycle\n const cleanup = () => {\n if (!child.killed) {\n child.kill('SIGTERM');\n }\n };\n\n abort?.addEventListener('abort', cleanup);\n process.on('exit', cleanup);\n\n const processExitPromise = new Promise<void>((resolve, reject) => {\n child.on('close', (code) => {\n if (abort?.aborted) {\n reject(new AbortError('Claude Code process aborted'));\n } else if (code !== 0) {\n reject(new Error(`Claude Code process exited with code ${code}`));\n } else {\n resolve();\n }\n });\n });\n\n const q = new Query(child, childStdin, processExitPromise, canCallTool);\n\n child.on('error', (error) => {\n if (abort?.aborted) {\n q.setError(new AbortError('Claude Code process aborted'));\n } else {\n q.setError(\n new Error(`Failed to spawn Claude Code process: ${error.message}`),\n );\n }\n });\n\n processExitPromise.catch(() => { /* handled in readMessages */ }).finally(() => {\n cleanup();\n abort?.removeEventListener('abort', cleanup);\n });\n\n return q;\n}\n","/**\n * Async stream implementation for handling SDK message streams.\n * Provides an AsyncIterableIterator interface with queuing, error propagation,\n * and proper cleanup.\n *\n * Adapted from happy project (packages/happy-cli/src/claude/sdk/stream.ts).\n */\n\nexport class Stream<T> implements AsyncIterableIterator<T> {\n private queue: T[] = [];\n private readResolve?: (value: IteratorResult<T>) => void;\n private readReject?: (error: Error) => void;\n private isDone = false;\n private hasError?: Error;\n private started = false;\n\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n if (this.started) {\n throw new Error('Stream can only be iterated once');\n }\n this.started = true;\n return this;\n }\n\n async next(): Promise<IteratorResult<T>> {\n if (this.queue.length > 0) {\n return { done: false, value: this.queue.shift()! };\n }\n\n if (this.isDone) {\n return { done: true, value: undefined };\n }\n\n if (this.hasError) {\n throw this.hasError;\n }\n\n return new Promise((resolve, reject) => {\n this.readResolve = resolve;\n this.readReject = reject;\n });\n }\n\n enqueue(value: T): void {\n if (this.readResolve) {\n const resolve = this.readResolve;\n this.readResolve = undefined;\n this.readReject = undefined;\n resolve({ done: false, value });\n } else {\n this.queue.push(value);\n }\n }\n\n done(): void {\n this.isDone = true;\n if (this.readResolve) {\n const resolve = this.readResolve;\n this.readResolve = undefined;\n this.readReject = undefined;\n resolve({ done: true, value: undefined });\n }\n }\n\n error(error: Error): void {\n this.hasError = error;\n if (this.readReject) {\n const reject = this.readReject;\n this.readResolve = undefined;\n this.readReject = undefined;\n reject(error);\n }\n }\n\n async return(): Promise<IteratorResult<T>> {\n this.isDone = true;\n return { done: true, value: undefined };\n }\n}\n","/**\n * Type definitions for Claude Code SDK integration.\n * Provides type-safe interfaces for all SDK communication via\n * --output-format stream-json.\n *\n * Adapted from happy project (packages/happy-cli/src/claude/sdk/types.ts).\n */\n\n// ---------------------------------------------------------------------------\n// SDK Message types (stdout JSON lines)\n// ---------------------------------------------------------------------------\n\nexport interface SDKMessage {\n type: string;\n [key: string]: unknown;\n}\n\nexport interface SDKUserMessage extends SDKMessage {\n type: 'user';\n parent_tool_use_id?: string;\n message: {\n role: 'user';\n content: string | Array<{\n type: string;\n text?: string;\n tool_use_id?: string;\n content?: unknown;\n [key: string]: unknown;\n }>;\n };\n}\n\nexport interface SDKAssistantMessage extends SDKMessage {\n type: 'assistant';\n parent_tool_use_id?: string;\n message: {\n role: 'assistant';\n content: Array<{\n type: string;\n text?: string;\n id?: string;\n name?: string;\n input?: unknown;\n [key: string]: unknown;\n }>;\n };\n}\n\nexport interface SDKSystemMessage extends SDKMessage {\n type: 'system';\n subtype: string;\n session_id?: string;\n model?: string;\n cwd?: string;\n tools?: string[];\n}\n\nexport interface SDKResultMessage extends SDKMessage {\n type: 'result';\n subtype: 'success' | 'error_max_turns' | 'error_during_execution';\n result?: string;\n num_turns: number;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n total_cost_usd: number;\n duration_ms: number;\n duration_api_ms: number;\n is_error: boolean;\n session_id: string;\n}\n\nexport interface SDKLogMessage extends SDKMessage {\n type: 'log';\n log: {\n level: 'debug' | 'info' | 'warn' | 'error';\n message: string;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Control protocol (stdin/stdout JSON for tool permissions)\n// ---------------------------------------------------------------------------\n\nexport interface SDKControlRequest {\n request_id: string;\n type: 'control_request';\n request: ControlRequest;\n}\n\nexport interface ControlRequest {\n subtype: string;\n}\n\nexport interface CanUseToolRequest extends ControlRequest {\n subtype: 'can_use_tool';\n tool_name: string;\n input: unknown;\n}\n\nexport interface CanUseToolControlRequest {\n type: 'control_request';\n request_id: string;\n request: CanUseToolRequest;\n}\n\nexport interface CanUseToolControlResponse {\n type: 'control_response';\n response: {\n subtype: 'success' | 'error';\n request_id: string;\n response?: PermissionResult;\n error?: string;\n };\n}\n\nexport interface SDKControlResponse extends SDKMessage {\n type: 'control_response';\n response: {\n request_id: string;\n subtype: 'success' | 'error';\n error?: string;\n };\n}\n\nexport interface ControlCancelRequest {\n type: 'control_cancel_request';\n request_id: string;\n}\n\n// ---------------------------------------------------------------------------\n// Permission result (canCallTool callback return type)\n// ---------------------------------------------------------------------------\n\nexport type PermissionResult = {\n behavior: 'allow';\n updatedInput: Record<string, unknown>;\n} | {\n behavior: 'deny';\n message: string;\n};\n\nexport interface CanCallToolCallback {\n (toolName: string, input: unknown, options: { signal: AbortSignal }): Promise<PermissionResult>;\n}\n\n// ---------------------------------------------------------------------------\n// Query options\n// ---------------------------------------------------------------------------\n\nexport type SdkPermissionMode = 'default' | 'acceptEdits' | 'bypassPermissions' | 'plan';\n\nexport interface QueryOptions {\n abort?: AbortSignal;\n allowedTools?: string[];\n cwd?: string;\n disallowedTools?: string[];\n model?: string;\n permissionMode?: SdkPermissionMode;\n canCallTool?: CanCallToolCallback;\n /** Resume a previous session by its ID */\n resume?: string;\n /** Continue the most recent conversation */\n continueConversation?: boolean;\n /** Append to the system prompt */\n appendSystemPrompt?: string;\n /** Max turns before auto-stopping */\n maxTurns?: number;\n}\n\nexport type QueryPrompt = string;\n\n// ---------------------------------------------------------------------------\n// Errors\n// ---------------------------------------------------------------------------\n\nexport class AbortError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'AbortError';\n }\n}\n"],"mappings":"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","names":["logger","logger"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  envSchema
3
- } from "./chunk-NZHKAPU6.js";
3
+ } from "./chunk-FJTZKAJA.js";
4
4
  import {
5
5
  getLocalIP
6
6
  } from "./chunk-AKXDQH25.js";
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunk-TN2SYADO.js";
11
11
  import {
12
12
  getDefaultBinary
13
- } from "./chunk-SAMTXC4A.js";
13
+ } from "./chunk-TFEPHOVE.js";
14
14
 
15
15
  // src/cli/setup/PreflightChecker.ts
16
16
  import fs from "fs";
@@ -194,7 +194,8 @@ var PreflightChecker = class {
194
194
  "claude-internal": "npm install -g claude-code-internal",
195
195
  "cursor-agent": "curl -fsSL https://www.cursor.com/install-agent | bash",
196
196
  "codebuddy": "npm install -g codebuddy-code",
197
- "codebuddy-acp": "npm install -g codebuddy-code"
197
+ "codebuddy-acp": "npm install -g codebuddy-code",
198
+ "sdk": "npm install -g @anthropic-ai/claude-code"
198
199
  };
199
200
  return {
200
201
  name: "ai-runner",
@@ -398,6 +399,9 @@ var ENV_VAR_META = {
398
399
  CODEBUDDY_BINARY: { group: "ai", description: "CodeBuddy CLI \u4E8C\u8FDB\u5236\u8DEF\u5F84 (\u8986\u76D6\u9ED8\u8BA4)" },
399
400
  CODEBUDDY_ACP_AUTO_APPROVE: { group: "ai", description: "CodeBuddy ACP \u81EA\u52A8\u6279\u51C6" },
400
401
  CLAUDE_PHASE_TIMEOUT_MS: { group: "ai", description: "AI \u9636\u6BB5\u6267\u884C\u8D85\u65F6 (\u6BEB\u79D2)" },
402
+ PHASE_TIMEOUT_GRACE_MS: { group: "ai", description: "\u9636\u6BB5\u8D85\u65F6\u5BBD\u9650\u671F (\u6BEB\u79D2, \u9ED8\u8BA4 60000)" },
403
+ PHASE_TIMEOUT_EXTENSION_MS: { group: "ai", description: "\u9636\u6BB5\u8D85\u65F6\u5EF6\u957F\u65F6\u95F4 (\u6BEB\u79D2, \u9ED8\u8BA4 600000)" },
404
+ PHASE_TIMEOUT_MAX_EXTENSIONS: { group: "ai", description: "\u9636\u6BB5\u8D85\u65F6\u6700\u5927\u5EF6\u957F\u6B21\u6570 (\u9ED8\u8BA4 3)" },
401
405
  AI_IDLE_TIMEOUT_MS: { group: "ai", description: "AI \u7A7A\u95F2\u8D85\u65F6 (\u6BEB\u79D2, 0 \u7981\u7528)" },
402
406
  NVM_NODE_VERSION: { group: "ai", description: "AI Runner \u4F7F\u7528\u7684 Node.js \u7248\u672C" },
403
407
  // --- 流水线 ---
@@ -588,7 +592,7 @@ var ConfigGenerator = class _ConfigGenerator {
588
592
  }
589
593
  static readCurrent() {
590
594
  const env = process.env;
591
- const aiMode = env.AI_RUNNER_MODE || "claude-internal";
595
+ const aiMode = env.AI_RUNNER_MODE || "cursor-agent";
592
596
  return {
593
597
  gongfeng: {
594
598
  apiUrl: env.GONGFENG_API_URL || "",
@@ -606,7 +610,9 @@ var ConfigGenerator = class _ConfigGenerator {
606
610
  ai: {
607
611
  mode: aiMode,
608
612
  model: env.AI_MODEL || void 0,
609
- phaseTimeoutMs: env.CLAUDE_PHASE_TIMEOUT_MS ? parseInt(env.CLAUDE_PHASE_TIMEOUT_MS, 10) : void 0
613
+ phaseTimeoutMs: env.CLAUDE_PHASE_TIMEOUT_MS ? parseInt(env.CLAUDE_PHASE_TIMEOUT_MS, 10) : void 0,
614
+ usePty: aiMode === "pty",
615
+ ptyDefaultAgent: env.PTY_DEFAULT_AGENT || void 0
610
616
  },
611
617
  poll: {
612
618
  discoveryIntervalMs: env.POLL_DISCOVERY_INTERVAL_MS ? parseInt(env.POLL_DISCOVERY_INTERVAL_MS, 10) : void 0,
@@ -778,7 +784,12 @@ var ConfigGenerator = class _ConfigGenerator {
778
784
  set("BRANCH_PREFIX", config.project.branchPrefix);
779
785
  set("WORKTREE_BASE_DIR", config.project.worktreeBaseDir);
780
786
  set("PROJECT_SUBDIR", config.project.projectSubDir);
781
- set("AI_RUNNER_MODE", config.ai.mode);
787
+ if (config.ai.usePty) {
788
+ set("AI_RUNNER_MODE", "pty");
789
+ set("PTY_DEFAULT_AGENT", config.ai.ptyDefaultAgent || "claude-internal");
790
+ } else {
791
+ set("AI_RUNNER_MODE", config.ai.mode);
792
+ }
782
793
  set("AI_MODEL", config.ai.model);
783
794
  set("CLAUDE_PHASE_TIMEOUT_MS", config.ai.phaseTimeoutMs);
784
795
  set("POLL_DISCOVERY_INTERVAL_MS", config.poll?.discoveryIntervalMs);
@@ -825,7 +836,13 @@ var ConfigGenerator = class _ConfigGenerator {
825
836
  entries.set("GONGFENG_PRIVATE_TOKEN", config.gongfeng.privateToken);
826
837
  entries.set("GONGFENG_PROJECT_PATH", config.gongfeng.projectPath);
827
838
  entries.set("PROJECT_WORK_DIR", config.project.workDir);
828
- entries.set("AI_RUNNER_MODE", config.ai.mode);
839
+ if (config.ai.usePty) {
840
+ entries.set("AI_RUNNER_MODE", "pty");
841
+ entries.set("PTY_DEFAULT_AGENT", config.ai.ptyDefaultAgent || "claude-internal");
842
+ } else {
843
+ entries.set("AI_RUNNER_MODE", config.ai.mode);
844
+ entries.set("PTY_DEFAULT_AGENT", null);
845
+ }
829
846
  const optionals = [
830
847
  ["GIT_ROOT_DIR", config.project.gitRootDir, ""],
831
848
  ["BASE_BRANCH", config.project.baseBranch, "master"],
@@ -905,4 +922,4 @@ export {
905
922
  PreflightChecker,
906
923
  ConfigGenerator
907
924
  };
908
- //# sourceMappingURL=chunk-LNFMARKQ.js.map
925
+ //# sourceMappingURL=chunk-SEO57UYI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/setup/PreflightChecker.ts","../src/cli/setup/ConfigGenerator.ts","../src/cli/setup/env-metadata.ts"],"sourcesContent":["/**\n * Preflight checker — validates environment before first `start`.\n *\n * Runs a battery of checks (git repo, branches, AI auth, Gongfeng creds,\n * port availability) and returns structured results so the init wizard and\n * CLI `start` command can surface actionable errors.\n */\n\nimport fs from 'node:fs';\nimport net from 'node:net';\nimport { spawn } from 'node:child_process';\nimport type { SetupConfig } from './ConfigGenerator.js';\nimport { getDefaultBinary } from '../../ai-runner/AIRunnerRegistry.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type CheckSeverity = 'error' | 'warn';\n\nexport interface PreflightResult {\n name: string;\n passed: boolean;\n severity: CheckSeverity;\n message: string;\n fix?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction run(cmd: string, args: string[], opts?: { cwd?: string; timeoutMs?: number }): Promise<{ code: number; stdout: string; stderr: string }> {\n return new Promise((resolve) => {\n const proc = spawn(cmd, args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n cwd: opts?.cwd,\n });\n\n let stdout = '';\n let stderr = '';\n proc.stdout.on('data', (d: Buffer) => { stdout += d.toString(); });\n proc.stderr.on('data', (d: Buffer) => { stderr += d.toString(); });\n\n const timer = setTimeout(() => {\n proc.kill('SIGTERM');\n }, opts?.timeoutMs ?? 15_000);\n\n proc.on('close', (code) => {\n clearTimeout(timer);\n resolve({ code: code ?? 1, stdout: stdout.trim(), stderr: stderr.trim() });\n });\n proc.on('error', () => {\n clearTimeout(timer);\n resolve({ code: 1, stdout: '', stderr: 'spawn error' });\n });\n });\n}\n\nfunction checkPortAvailable(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const server = net.createServer();\n server.once('error', () => resolve(false));\n server.once('listening', () => {\n server.close(() => resolve(true));\n });\n server.listen(port, '0.0.0.0');\n });\n}\n\n// ---------------------------------------------------------------------------\n// PreflightChecker\n// ---------------------------------------------------------------------------\n\nexport class PreflightChecker {\n constructor(private config: SetupConfig) {}\n\n async runAll(): Promise<PreflightResult[]> {\n const checks = await Promise.all([\n this.checkGitRepo(),\n this.checkOriginRemote(),\n this.checkBaseBranch(),\n this.checkWorktreeDir(),\n this.checkAIRunnerBinary(),\n this.checkGongfengToken(),\n this.checkGongfengProject(),\n this.checkWebPort(),\n ]);\n return checks;\n }\n\n hasErrors(results: PreflightResult[]): boolean {\n return results.some(r => !r.passed && r.severity === 'error');\n }\n\n // -------------------------------------------------------------------------\n // Individual checks\n // -------------------------------------------------------------------------\n\n async checkGitRepo(): Promise<PreflightResult> {\n const workDir = this.config.project.workDir;\n const gitDir = this.config.project.gitRootDir || workDir;\n\n if (!gitDir) {\n return { name: 'git-repo', passed: false, severity: 'error', message: 'PROJECT_WORK_DIR 未设置' };\n }\n\n if (!fs.existsSync(gitDir)) {\n return {\n name: 'git-repo', passed: false, severity: 'error',\n message: `目录不存在: ${gitDir}`,\n fix: `请创建目录或检查 PROJECT_WORK_DIR / GIT_ROOT_DIR 配置`,\n };\n }\n\n const { code } = await run('git', ['-C', gitDir, 'rev-parse', '--git-dir']);\n if (code !== 0) {\n return {\n name: 'git-repo', passed: false, severity: 'error',\n message: `${gitDir} 不是有效的 Git 仓库`,\n fix: `cd ${gitDir} && git init 或检查路径配置`,\n };\n }\n\n return { name: 'git-repo', passed: true, severity: 'error', message: 'Git 仓库有效' };\n }\n\n async checkOriginRemote(): Promise<PreflightResult> {\n const gitDir = this.config.project.gitRootDir || this.config.project.workDir;\n if (!gitDir || !fs.existsSync(gitDir)) {\n return { name: 'git-origin', passed: false, severity: 'error', message: '跳过 (Git 目录无效)' };\n }\n\n const { code, stdout } = await run('git', ['-C', gitDir, 'remote', 'get-url', 'origin']);\n if (code !== 0) {\n return {\n name: 'git-origin', passed: false, severity: 'error',\n message: '未找到 origin remote',\n fix: `git -C ${gitDir} remote add origin <仓库URL>`,\n };\n }\n\n return { name: 'git-origin', passed: true, severity: 'error', message: `origin: ${stdout.split('\\n')[0]}` };\n }\n\n async checkBaseBranch(): Promise<PreflightResult> {\n const gitDir = this.config.project.gitRootDir || this.config.project.workDir;\n const branch = this.config.project.baseBranch || 'master';\n\n if (!gitDir || !fs.existsSync(gitDir)) {\n return { name: 'base-branch', passed: false, severity: 'error', message: '跳过 (Git 目录无效)' };\n }\n\n // Check local branch first\n const { code: localCode } = await run('git', ['-C', gitDir, 'rev-parse', '--verify', branch]);\n if (localCode === 0) {\n return { name: 'base-branch', passed: true, severity: 'error', message: `分支 ${branch} 存在` };\n }\n\n // Check remote\n const { code: remoteCode } = await run('git', [\n '-C', gitDir, 'ls-remote', '--exit-code', '--heads', 'origin', branch,\n ]);\n if (remoteCode === 0) {\n return { name: 'base-branch', passed: true, severity: 'error', message: `远程分支 origin/${branch} 存在` };\n }\n\n return {\n name: 'base-branch', passed: false, severity: 'error',\n message: `分支 ${branch} 不存在 (本地和远程均未找到)`,\n fix: `请检查 BASE_BRANCH 配置,或执行 git fetch origin`,\n };\n }\n\n async checkWorktreeDir(): Promise<PreflightResult> {\n const dir = this.config.project.worktreeBaseDir;\n if (!dir) {\n return { name: 'worktree-dir', passed: true, severity: 'error', message: '使用默认 worktree 目录' };\n }\n\n if (!fs.existsSync(dir)) {\n // Try to create\n try {\n fs.mkdirSync(dir, { recursive: true });\n return { name: 'worktree-dir', passed: true, severity: 'error', message: `已创建 worktree 目录: ${dir}` };\n } catch {\n return {\n name: 'worktree-dir', passed: false, severity: 'error',\n message: `无法创建 worktree 目录: ${dir}`,\n fix: `请手动创建目录或检查权限`,\n };\n }\n }\n\n try {\n fs.accessSync(dir, fs.constants.W_OK);\n } catch {\n return {\n name: 'worktree-dir', passed: false, severity: 'error',\n message: `worktree 目录无写入权限: ${dir}`,\n fix: `chmod u+w ${dir}`,\n };\n }\n\n return { name: 'worktree-dir', passed: true, severity: 'error', message: `worktree 目录可写: ${dir}` };\n }\n\n async checkAIRunnerBinary(): Promise<PreflightResult> {\n const mode = this.config.ai.mode;\n\n if (mode === 'pty') {\n return this.checkPtyAgentBinaries();\n }\n\n const binary = getDefaultBinary(mode);\n\n const { code } = await run('which', [binary]);\n if (code !== 0) {\n const installHints: Record<string, string> = {\n 'claude-internal': 'npm install -g claude-code-internal',\n 'cursor-agent': 'curl -fsSL https://www.cursor.com/install-agent | bash',\n 'codebuddy': 'npm install -g codebuddy-code',\n 'codebuddy-acp': 'npm install -g codebuddy-code',\n 'sdk': 'npm install -g @anthropic-ai/claude-code',\n };\n return {\n name: 'ai-runner', passed: false, severity: 'error',\n message: `AI Runner 二进制未找到: ${binary}`,\n fix: installHints[mode] ?? `请安装 ${binary} 并确保在 PATH 中`,\n };\n }\n\n return { name: 'ai-runner', passed: true, severity: 'error', message: `AI Runner 可用: ${binary}` };\n }\n\n private async checkPtyAgentBinaries(): Promise<PreflightResult> {\n const defaultAgent = process.env.PTY_DEFAULT_AGENT || 'claude-internal';\n const phaseAgentsStr = process.env.PTY_PHASE_AGENTS || '';\n\n const agents = new Set([defaultAgent]);\n if (phaseAgentsStr) {\n for (const pair of phaseAgentsStr.split(',')) {\n const [, agent] = pair.split(':').map(s => s.trim());\n if (agent) agents.add(agent);\n }\n }\n\n const missing: string[] = [];\n for (const agent of agents) {\n const binary = getDefaultBinary(agent);\n const { code } = await run('which', [binary]);\n if (code !== 0) missing.push(`${agent} (${binary})`);\n }\n\n if (missing.length > 0) {\n return {\n name: 'ai-runner', passed: false, severity: 'error',\n message: `PTY 模式需要的 Agent 二进制未找到: ${missing.join(', ')}`,\n fix: '请安装缺失的 AI Agent CLI 并确保在 PATH 中',\n };\n }\n\n return {\n name: 'ai-runner', passed: true, severity: 'error',\n message: `PTY 模式 Agent 可用: ${[...agents].join(', ')}`,\n };\n }\n\n async checkGongfengToken(): Promise<PreflightResult> {\n const { apiUrl, privateToken } = this.config.gongfeng;\n if (!apiUrl || !privateToken) {\n return {\n name: 'gongfeng-token', passed: false, severity: 'error',\n message: '工蜂 API URL 或 Token 未配置',\n fix: '请在配置中填写 GONGFENG_API_URL 和 GONGFENG_PRIVATE_TOKEN',\n };\n }\n\n try {\n const url = `${apiUrl.replace(/\\/$/, '')}/api/v3/user`;\n const response = await fetch(url, {\n headers: { 'PRIVATE-TOKEN': privateToken },\n signal: AbortSignal.timeout(10_000),\n });\n\n if (!response.ok) {\n return {\n name: 'gongfeng-token', passed: false, severity: 'error',\n message: `工蜂 Token 验证失败 (HTTP ${response.status})`,\n fix: '请检查 GONGFENG_PRIVATE_TOKEN 是否有效 (需 api scope)',\n };\n }\n\n const user = await response.json() as { username?: string };\n return {\n name: 'gongfeng-token', passed: true, severity: 'error',\n message: `工蜂认证成功 (用户: ${user.username ?? 'unknown'})`,\n };\n } catch (err) {\n return {\n name: 'gongfeng-token', passed: false, severity: 'error',\n message: `工蜂 API 连接失败: ${(err as Error).message}`,\n fix: '请检查 GONGFENG_API_URL 是否可达,以及网络连接',\n };\n }\n }\n\n async checkGongfengProject(): Promise<PreflightResult> {\n const { apiUrl, privateToken, projectPath } = this.config.gongfeng;\n if (!apiUrl || !privateToken || !projectPath) {\n return {\n name: 'gongfeng-project', passed: false, severity: 'error',\n message: '工蜂项目路径未配置',\n fix: '请填写 GONGFENG_PROJECT_PATH (如 team/project)',\n };\n }\n\n try {\n const encoded = encodeURIComponent(projectPath);\n const url = `${apiUrl.replace(/\\/$/, '')}/api/v3/projects/${encoded}`;\n const response = await fetch(url, {\n headers: { 'PRIVATE-TOKEN': privateToken },\n signal: AbortSignal.timeout(10_000),\n });\n\n if (!response.ok) {\n return {\n name: 'gongfeng-project', passed: false, severity: 'error',\n message: `无法访问项目 ${projectPath} (HTTP ${response.status})`,\n fix: '请检查 GONGFENG_PROJECT_PATH,确保 Token 有权限访问该项目',\n };\n }\n\n return {\n name: 'gongfeng-project', passed: true, severity: 'error',\n message: `项目 ${projectPath} 可访问`,\n };\n } catch (err) {\n return {\n name: 'gongfeng-project', passed: false, severity: 'error',\n message: `项目验证请求失败: ${(err as Error).message}`,\n fix: '请检查网络连接和 GONGFENG_API_URL',\n };\n }\n }\n\n async checkWebPort(): Promise<PreflightResult> {\n const port = this.config.web?.port ?? 3000;\n const available = await checkPortAvailable(port);\n if (!available) {\n return {\n name: 'web-port', passed: false, severity: 'warn',\n message: `Web 端口 ${port} 被占用`,\n fix: `修改 WEB_PORT 或释放端口: lsof -i :${port}`,\n };\n }\n return { name: 'web-port', passed: true, severity: 'warn', message: `Web 端口 ${port} 可用` };\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { getLocalIP } from '../../utils/network.js';\nimport { getGlobalDir, resolveDataDir } from '../../paths.js';\nimport type { WorkspaceConfig } from '../../workspace/WorkspaceConfig.js';\nimport { envSchema } from '../../config-schema.js';\nimport { ENV_GROUPS, ENV_VAR_META } from './env-metadata.js';\n\nexport { getLocalIP };\n\nexport interface SetupConfig {\n gongfeng: {\n apiUrl: string;\n privateToken: string;\n projectPath: string;\n };\n project: {\n workDir: string;\n gitRootDir?: string;\n baseBranch?: string;\n branchPrefix?: string;\n worktreeBaseDir?: string;\n projectSubDir?: string;\n };\n ai: {\n mode: string;\n model?: string;\n phaseTimeoutMs?: number;\n usePty?: boolean;\n ptyDefaultAgent?: string;\n };\n poll?: {\n discoveryIntervalMs?: number;\n driveIntervalMs?: number;\n maxRetries?: number;\n maxConcurrent?: number;\n };\n web?: {\n port?: number;\n };\n pipeline?: {\n mode?: string;\n };\n review?: {\n enabled?: boolean;\n };\n e2e?: {\n uatVendorDir?: string;\n uatConfigFile?: string;\n pythonBin?: string;\n };\n release?: {\n enabled?: boolean;\n };\n}\n\nexport class ConfigGenerator {\n /** @deprecated Use `getLocalIP()` from `../../utils/network.js` instead */\n static getLocalIP(): string {\n return getLocalIP();\n }\n\n static getGlobalConfigDir(): string {\n return getGlobalDir();\n }\n\n static getGlobalConfigPath(): string {\n return path.join(ConfigGenerator.getGlobalConfigDir(), '.env');\n }\n\n static isInitialized(configPath?: string): boolean {\n const envPath = configPath ?? ConfigGenerator.getGlobalConfigPath();\n return fs.existsSync(envPath);\n }\n\n /** @deprecated Use `generateFull()` for new files. Kept for backward compat in mergeWrite(). */\n static generate(config: SetupConfig): string {\n const lines: string[] = [];\n\n const addSection = (title: string) => {\n if (lines.length > 0) lines.push('');\n lines.push('# ' + title);\n };\n\n const addVar = (\n key: string,\n value: string | number | boolean | undefined,\n ) => {\n if (value === undefined) return;\n lines.push(key + '=' + String(value));\n };\n\n const addNonDefault = (\n key: string,\n value: string | number | boolean | undefined,\n defaultValue: string | number | boolean,\n ) => {\n if (value === undefined || value === '' || value === defaultValue) return;\n lines.push(key + '=' + String(value));\n };\n\n addSection('Gongfeng');\n addVar('GONGFENG_API_URL', config.gongfeng.apiUrl);\n addVar('GONGFENG_PRIVATE_TOKEN', config.gongfeng.privateToken);\n addVar('GONGFENG_PROJECT_PATH', config.gongfeng.projectPath);\n\n addSection('Project');\n addVar('PROJECT_WORK_DIR', config.project.workDir);\n addNonDefault('GIT_ROOT_DIR', config.project.gitRootDir, '');\n addNonDefault('BASE_BRANCH', config.project.baseBranch, 'master');\n addNonDefault('BRANCH_PREFIX', config.project.branchPrefix, 'feat/issue');\n addNonDefault('WORKTREE_BASE_DIR', config.project.worktreeBaseDir, '');\n addNonDefault('PROJECT_SUBDIR', config.project.projectSubDir, '');\n\n addSection('AI');\n addVar('AI_RUNNER_MODE', config.ai.mode);\n addNonDefault('AI_MODEL', config.ai.model, 'Claude-4.6-Opus');\n\n addNonDefault('CLAUDE_PHASE_TIMEOUT_MS', config.ai.phaseTimeoutMs, 1800000);\n addNonDefault('POLL_DISCOVERY_INTERVAL_MS', config.poll?.discoveryIntervalMs, 60000);\n addNonDefault('POLL_DRIVE_INTERVAL_MS', config.poll?.driveIntervalMs, 15000);\n addNonDefault('MAX_RETRIES', config.poll?.maxRetries, 3);\n addNonDefault('MAX_CONCURRENT_ISSUES', config.poll?.maxConcurrent, 3);\n addNonDefault('PIPELINE_MODE', config.pipeline?.mode, 'auto');\n addNonDefault('REVIEW_ENABLED', config.review?.enabled, true);\n addNonDefault('RELEASE_ENABLED', config.release?.enabled, false);\n\n const port = config.web?.port ?? 3000;\n if (port !== 3000) {\n addNonDefault('WEB_PORT', port, 3000);\n }\n\n addNonDefault('E2E_UAT_VENDOR_DIR', config.e2e?.uatVendorDir, '');\n addNonDefault('E2E_UAT_CONFIG_FILE', config.e2e?.uatConfigFile, '');\n addNonDefault('E2E_PYTHON_BIN', config.e2e?.pythonBin, 'python3');\n\n addSection('Workspace');\n addVar('WORKSPACE_CONFIG_PATH', ConfigGenerator.getWorkspaceConfigPath());\n\n return lines.join('\\n') + '\\n';\n }\n\n static readCurrent(): SetupConfig {\n const env = process.env;\n const aiMode = env.AI_RUNNER_MODE || 'cursor-agent';\n return {\n gongfeng: {\n apiUrl: env.GONGFENG_API_URL || '',\n privateToken: env.GONGFENG_PRIVATE_TOKEN || '',\n projectPath: env.GONGFENG_PROJECT_PATH || '',\n },\n project: {\n workDir: env.PROJECT_WORK_DIR || '',\n gitRootDir: env.GIT_ROOT_DIR || undefined,\n baseBranch: env.BASE_BRANCH || undefined,\n branchPrefix: env.BRANCH_PREFIX || undefined,\n worktreeBaseDir: env.WORKTREE_BASE_DIR || undefined,\n projectSubDir: env.PROJECT_SUBDIR || undefined,\n },\n ai: {\n mode: aiMode,\n model: env.AI_MODEL || undefined,\n phaseTimeoutMs: env.CLAUDE_PHASE_TIMEOUT_MS\n ? parseInt(env.CLAUDE_PHASE_TIMEOUT_MS, 10)\n : undefined,\n usePty: aiMode === 'pty',\n ptyDefaultAgent: env.PTY_DEFAULT_AGENT || undefined,\n },\n poll: {\n discoveryIntervalMs: env.POLL_DISCOVERY_INTERVAL_MS\n ? parseInt(env.POLL_DISCOVERY_INTERVAL_MS, 10)\n : undefined,\n driveIntervalMs: env.POLL_DRIVE_INTERVAL_MS\n ? parseInt(env.POLL_DRIVE_INTERVAL_MS, 10)\n : undefined,\n maxRetries: env.MAX_RETRIES\n ? parseInt(env.MAX_RETRIES, 10)\n : undefined,\n maxConcurrent: env.MAX_CONCURRENT_ISSUES\n ? parseInt(env.MAX_CONCURRENT_ISSUES, 10)\n : undefined,\n },\n web: {\n port: env.WEB_PORT ? parseInt(env.WEB_PORT, 10) : undefined,\n },\n pipeline: {\n mode: env.PIPELINE_MODE || undefined,\n },\n review: {\n enabled: env.REVIEW_ENABLED !== undefined\n ? env.REVIEW_ENABLED === 'true'\n : undefined,\n },\n release: {\n enabled: env.RELEASE_ENABLED !== undefined\n ? env.RELEASE_ENABLED === 'true'\n : undefined,\n },\n e2e: {\n uatVendorDir: env.E2E_UAT_VENDOR_DIR || undefined,\n uatConfigFile: env.E2E_UAT_CONFIG_FILE || undefined,\n pythonBin: env.E2E_PYTHON_BIN || undefined,\n },\n };\n }\n\n static getWorkspaceConfigPath(): string {\n return path.join(resolveDataDir(), 'workspace.json');\n }\n\n static buildWorkspaceConfig(config: SetupConfig): WorkspaceConfig {\n return {\n primary: {\n name: 'primary',\n projectPath: config.gongfeng.projectPath,\n localGitRoot: config.project.gitRootDir ?? config.project.workDir,\n projectSubDir: config.project.projectSubDir ?? '',\n baseBranch: config.project.baseBranch,\n branchPrefix: config.project.branchPrefix,\n role: '',\n },\n associates: [],\n };\n }\n\n static writeWorkspaceConfig(config: SetupConfig): string {\n const wsPath = ConfigGenerator.getWorkspaceConfigPath();\n const dir = path.dirname(wsPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n const wsConfig = ConfigGenerator.buildWorkspaceConfig(config);\n fs.writeFileSync(wsPath, JSON.stringify(wsConfig, null, 2) + '\\n', 'utf-8');\n return wsPath;\n }\n\n static write(config: SetupConfig, outputPath?: string): string {\n const targetPath = outputPath ?? ConfigGenerator.getGlobalConfigPath();\n const dir = path.dirname(targetPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n const userValues = ConfigGenerator.setupConfigToEnvMap(config);\n const content = ConfigGenerator.generateFull(userValues);\n fs.writeFileSync(targetPath, content, 'utf-8');\n ConfigGenerator.writeWorkspaceConfig(config);\n return targetPath;\n }\n\n // ---------------------------------------------------------------------------\n // Full .env generation (complete, self-documenting)\n // ---------------------------------------------------------------------------\n\n /**\n * Extract the raw default value from a Zod v4 schema field.\n *\n * Handles three patterns used in `envSchema`:\n * - `def.type === 'default'` → `def.defaultValue` (string/number/enum defaults)\n * - `def.type === 'pipe'` → `def.in._zod.def.defaultValue` (envBoolean: .default().transform())\n * - anything else (optional / required without default) → `undefined`\n */\n static extractDefault(field: unknown): string | undefined {\n const def = (field as { _zod?: { def?: { type?: string; defaultValue?: unknown; in?: unknown } } })?._zod?.def;\n if (!def) return undefined;\n\n if (def.type === 'default' && def.defaultValue !== undefined) {\n return String(def.defaultValue);\n }\n\n // envBoolean pattern: pipe wraps a default schema\n if (def.type === 'pipe' && def.in) {\n const innerDef = (def.in as { _zod?: { def?: { type?: string; defaultValue?: unknown } } })?._zod?.def;\n if (innerDef?.type === 'default' && innerDef.defaultValue !== undefined) {\n return String(innerDef.defaultValue);\n }\n }\n\n return undefined;\n }\n\n /**\n * Generate a complete, self-documenting `.env` file containing ALL\n * variables from `envSchema`, grouped and commented in Chinese.\n *\n * Priority: `userValues[key]` > schema default > commented-out placeholder.\n *\n * @param userValues — key/value pairs from the setup wizard (flat env keys)\n */\n static generateFull(userValues?: Record<string, string>): string {\n const shape = envSchema.shape as Record<string, unknown>;\n const allKeys = Object.keys(shape);\n const user = userValues ?? {};\n\n // Build set of keys that belong to a known group\n const groupedKeys = new Set<string>();\n\n const lines: string[] = [\n '# ============================================================',\n '# Issue Auto-Finish 配置文件',\n '# 由 issue-auto-finish init 自动生成',\n '# ============================================================',\n ];\n\n for (const group of ENV_GROUPS) {\n // Collect keys in this group\n const keysInGroup = allKeys.filter(k => ENV_VAR_META[k]?.group === group.key);\n if (keysInGroup.length === 0) continue;\n\n lines.push('');\n lines.push(`# -----------------------------------------------------------`);\n lines.push(`# ${group.title}`);\n lines.push(`# -----------------------------------------------------------`);\n\n for (const key of keysInGroup) {\n groupedKeys.add(key);\n const meta = ENV_VAR_META[key];\n const desc = meta?.description ?? key;\n const isRequired = meta?.required === true;\n const schemaDefault = ConfigGenerator.extractDefault(shape[key]);\n const userVal = user[key];\n\n lines.push(`# ${desc}`);\n\n if (userVal !== undefined && userVal !== '') {\n // User provided a value\n lines.push(`${key}=${userVal}`);\n } else if (isRequired) {\n // Required, no value — placeholder\n lines.push(`${key}=<请填写>`);\n } else if (schemaDefault !== undefined) {\n // Has default — write it\n lines.push(`${key}=${schemaDefault}`);\n } else {\n // Optional, no default — comment out\n lines.push(`# ${key}=`);\n }\n }\n }\n\n // Safety net: any envSchema keys NOT in ENV_VAR_META (shouldn't happen,\n // but the sync test will catch it)\n const ungrouped = allKeys.filter(k => !groupedKeys.has(k));\n if (ungrouped.length > 0) {\n lines.push('');\n lines.push('# --- 其他 / Other ---');\n for (const key of ungrouped) {\n const schemaDefault = ConfigGenerator.extractDefault(shape[key]);\n const userVal = user[key];\n if (userVal !== undefined && userVal !== '') {\n lines.push(`${key}=${userVal}`);\n } else if (schemaDefault !== undefined) {\n lines.push(`${key}=${schemaDefault}`);\n } else {\n lines.push(`# ${key}=`);\n }\n }\n }\n\n return lines.join('\\n') + '\\n';\n }\n\n /**\n * Convert a `SetupConfig` (wizard output) to a flat `Record<string, string>`\n * suitable for `generateFull()`.\n */\n static setupConfigToEnvMap(config: SetupConfig): Record<string, string> {\n const m: Record<string, string> = {};\n\n const set = (key: string, val: string | number | boolean | undefined) => {\n if (val !== undefined && val !== '') m[key] = String(val);\n };\n\n set('GONGFENG_API_URL', config.gongfeng.apiUrl);\n set('GONGFENG_PRIVATE_TOKEN', config.gongfeng.privateToken);\n set('GONGFENG_PROJECT_PATH', config.gongfeng.projectPath);\n set('PROJECT_WORK_DIR', config.project.workDir);\n set('GIT_ROOT_DIR', config.project.gitRootDir);\n set('BASE_BRANCH', config.project.baseBranch);\n set('BRANCH_PREFIX', config.project.branchPrefix);\n set('WORKTREE_BASE_DIR', config.project.worktreeBaseDir);\n set('PROJECT_SUBDIR', config.project.projectSubDir);\n if (config.ai.usePty) {\n set('AI_RUNNER_MODE', 'pty');\n set('PTY_DEFAULT_AGENT', config.ai.ptyDefaultAgent || 'claude-internal');\n } else {\n set('AI_RUNNER_MODE', config.ai.mode);\n }\n set('AI_MODEL', config.ai.model);\n set('CLAUDE_PHASE_TIMEOUT_MS', config.ai.phaseTimeoutMs);\n set('POLL_DISCOVERY_INTERVAL_MS', config.poll?.discoveryIntervalMs);\n set('POLL_DRIVE_INTERVAL_MS', config.poll?.driveIntervalMs);\n set('MAX_RETRIES', config.poll?.maxRetries);\n set('MAX_CONCURRENT_ISSUES', config.poll?.maxConcurrent);\n set('PIPELINE_MODE', config.pipeline?.mode);\n set('REVIEW_ENABLED', config.review?.enabled);\n set('RELEASE_ENABLED', config.release?.enabled);\n set('WEB_PORT', config.web?.port);\n set('E2E_UAT_VENDOR_DIR', config.e2e?.uatVendorDir);\n set('E2E_UAT_CONFIG_FILE', config.e2e?.uatConfigFile);\n set('E2E_PYTHON_BIN', config.e2e?.pythonBin);\n set('WORKSPACE_CONFIG_PATH', ConfigGenerator.getWorkspaceConfigPath());\n\n return m;\n }\n\n /**\n * 增量更新 .env 文件:只更新 SetupConfig 涉及的 key,保留其余内容。\n * 如果文件不存在,退化为全量写入。\n */\n static mergeWrite(config: SetupConfig, outputPath?: string): string {\n const targetPath = outputPath ?? ConfigGenerator.getGlobalConfigPath();\n\n if (!fs.existsSync(targetPath)) {\n return ConfigGenerator.write(config, targetPath);\n }\n\n const existing = fs.readFileSync(targetPath, 'utf-8');\n const updates = ConfigGenerator.toEnvEntries(config);\n const merged = ConfigGenerator.mergeEnvContent(existing, updates);\n\n const dir = path.dirname(targetPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(targetPath, merged, 'utf-8');\n ConfigGenerator.writeWorkspaceConfig(config);\n return targetPath;\n }\n\n /**\n * 将 SetupConfig 转换为 env key-value 对。\n * null 值表示该 key 应从文件中删除(用户恢复为默认值时)。\n */\n static toEnvEntries(config: SetupConfig): Map<string, string | null> {\n const entries = new Map<string, string | null>();\n\n entries.set('GONGFENG_API_URL', config.gongfeng.apiUrl);\n entries.set('GONGFENG_PRIVATE_TOKEN', config.gongfeng.privateToken);\n entries.set('GONGFENG_PROJECT_PATH', config.gongfeng.projectPath);\n entries.set('PROJECT_WORK_DIR', config.project.workDir);\n if (config.ai.usePty) {\n entries.set('AI_RUNNER_MODE', 'pty');\n entries.set('PTY_DEFAULT_AGENT', config.ai.ptyDefaultAgent || 'claude-internal');\n } else {\n entries.set('AI_RUNNER_MODE', config.ai.mode);\n entries.set('PTY_DEFAULT_AGENT', null);\n }\n\n // 可选项:有值写入,值为默认值或空时标记删除\n const optionals: Array<[string, string | number | boolean | undefined, string | number | boolean]> = [\n ['GIT_ROOT_DIR', config.project.gitRootDir, ''],\n ['BASE_BRANCH', config.project.baseBranch, 'master'],\n ['BRANCH_PREFIX', config.project.branchPrefix, 'feat/issue'],\n ['WORKTREE_BASE_DIR', config.project.worktreeBaseDir, ''],\n ['PROJECT_SUBDIR', config.project.projectSubDir, ''],\n ['AI_MODEL', config.ai.model, 'Claude-4.6-Opus'],\n ['CLAUDE_PHASE_TIMEOUT_MS', config.ai.phaseTimeoutMs, 1800000],\n ['POLL_DISCOVERY_INTERVAL_MS', config.poll?.discoveryIntervalMs, 60000],\n ['POLL_DRIVE_INTERVAL_MS', config.poll?.driveIntervalMs, 15000],\n ['MAX_RETRIES', config.poll?.maxRetries, 3],\n ['MAX_CONCURRENT_ISSUES', config.poll?.maxConcurrent, 3],\n ['PIPELINE_MODE', config.pipeline?.mode, 'auto'],\n ['REVIEW_ENABLED', config.review?.enabled, true],\n ['RELEASE_ENABLED', config.release?.enabled, false],\n ['WEB_PORT', config.web?.port, 3000],\n ['E2E_UAT_VENDOR_DIR', config.e2e?.uatVendorDir, ''],\n ['E2E_UAT_CONFIG_FILE', config.e2e?.uatConfigFile, ''],\n ['E2E_PYTHON_BIN', config.e2e?.pythonBin, 'python3'],\n ['WORKSPACE_CONFIG_PATH', ConfigGenerator.getWorkspaceConfigPath(), ''],\n ];\n\n for (const [key, value, defaultValue] of optionals) {\n if (value === undefined || value === '' || value === defaultValue) {\n entries.set(key, null);\n } else {\n entries.set(key, String(value));\n }\n }\n\n return entries;\n }\n\n /**\n * 将 updates 合并到现有 .env 内容中。\n * - 已有的 key:原地更新值或删除行\n * - 新增的 key:追加到文件末尾\n * - 注释和空行:原样保留\n */\n static mergeEnvContent(\n existing: string,\n updates: Map<string, string | null>,\n ): string {\n const remaining = new Map(updates);\n const lines = existing.split('\\n');\n const result: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n // 空行或注释:保留\n if (trimmed === '' || trimmed.startsWith('#')) {\n result.push(line);\n continue;\n }\n // 解析 KEY=VALUE\n const eqIdx = trimmed.indexOf('=');\n if (eqIdx === -1) {\n result.push(line);\n continue;\n }\n const key = trimmed.substring(0, eqIdx).trim();\n if (remaining.has(key)) {\n const newValue = remaining.get(key);\n remaining.delete(key);\n if (newValue !== null) {\n result.push(`${key}=${newValue}`);\n }\n // newValue === null → 删除该行\n } else {\n // 不在 updates 范围内:原样保留\n result.push(line);\n }\n }\n\n // 追加新增的 key(原文件中不存在的)\n const newEntries = [...remaining.entries()].filter(([, v]) => v !== null);\n if (newEntries.length > 0) {\n if (result.length > 0 && result[result.length - 1]?.trim() !== '') {\n result.push('');\n }\n for (const [key, value] of newEntries) {\n result.push(`${key}=${value}`);\n }\n }\n\n return result.join('\\n');\n }\n}\n","/**\n * Environment variable metadata registry.\n *\n * Provides grouping and Chinese descriptions for every key in `envSchema`.\n * Used by `ConfigGenerator.generateFull()` to produce a complete, self-documenting\n * `.env` file. A CI test (`env-metadata-sync.test.ts`) ensures this registry\n * stays in sync with the schema.\n */\n\nexport interface EnvVarMeta {\n /** Group key — must reference an entry in ENV_GROUPS. */\n group: string;\n /** Chinese description shown as a comment above the variable. */\n description: string;\n /** Mark as required (no default, must be user-provided). */\n required?: boolean;\n}\n\n/**\n * Ordered group definitions. The array order determines the section order\n * in the generated `.env` file.\n */\nexport const ENV_GROUPS: Array<{ key: string; title: string }> = [\n { key: 'required', title: '必填项 / Required' },\n { key: 'paths', title: '路径覆盖 / Path Overrides' },\n { key: 'project', title: '项目 / Project' },\n { key: 'ai', title: 'AI 运行器 / AI Runner' },\n { key: 'pipeline', title: '流水线 / Pipeline' },\n { key: 'poll', title: '轮询与并发 / Polling & Concurrency' },\n { key: 'review', title: '审核 / Review Gate' },\n { key: 'web', title: 'Web 面板 / Dashboard' },\n { key: 'issueNoteSync', title: 'Issue 评论同步 / Note Sync' },\n { key: 'webhook', title: 'Webhook' },\n { key: 'e2e', title: 'E2E 测试 / E2E Testing' },\n { key: 'preview', title: '预览环境 / Preview' },\n { key: 'brainstorm', title: '头脑风暴 / Brainstorm' },\n { key: 'chat', title: '智能助手 / Chat Agent' },\n { key: 'braindump', title: '批量任务 / Braindump' },\n { key: 'autoUpdate', title: '自动更新 / Auto Update' },\n { key: 'iwiki', title: 'iWiki' },\n { key: 'locale', title: '语言 / Locale' },\n { key: 'knowledge', title: '知识管理 / Knowledge' },\n { key: 'distill', title: '知识蒸馏 / Distill' },\n { key: 'sync', title: '文件同步 / Sync' },\n { key: 'release', title: '发布 / Release' },\n { key: 'verifyFixLoop', title: '验证修复循环 / Verify-Fix Loop' },\n { key: 'terminal', title: '交互式终端 / Terminal' },\n { key: 'analytics', title: '运营分析 / Analytics' },\n { key: 'coordination', title: '多节点 / Multi-Node' },\n { key: 'workspace', title: '工作区 / Workspace' },\n { key: 'tenants', title: '多租户 / Multi-Tenant' },\n];\n\n/**\n * Per-variable metadata. Keys must match `envSchema.shape` exactly.\n */\nexport const ENV_VAR_META: Record<string, EnvVarMeta> = {\n // --- 必填 ---\n GONGFENG_API_URL: { group: 'required', description: '工蜂 GitLab API 地址', required: true },\n GONGFENG_PRIVATE_TOKEN: { group: 'required', description: '工蜂 API 访问令牌 (需 api scope)', required: true },\n GONGFENG_PROJECT_PATH: { group: 'required', description: '工蜂项目路径 (如 team/project)', required: true },\n PROJECT_WORK_DIR: { group: 'required', description: '项目本地工作目录 (绝对路径)', required: true },\n\n // --- 路径覆盖 ---\n DATA_DIR: { group: 'paths', description: '数据目录 (覆盖自动检测)' },\n LOGS_DIR: { group: 'paths', description: '日志目录 (覆盖自动检测)' },\n\n // --- 项目 ---\n GIT_ROOT_DIR: { group: 'project', description: 'Git 仓库根目录 (默认同 PROJECT_WORK_DIR)' },\n BASE_BRANCH: { group: 'project', description: '基础分支' },\n BRANCH_PREFIX: { group: 'project', description: '特性分支名前缀' },\n WORKTREE_BASE_DIR:{ group: 'project', description: 'Worktree 存放目录 (为空则使用默认位置)' },\n PROJECT_SUBDIR: { group: 'project', description: 'Monorepo 中项目子目录' },\n\n // --- AI ---\n AI_RUNNER_MODE: { group: 'ai', description: 'AI 运行模式 (claude-internal / cursor-agent / codebuddy)' },\n AI_MODEL: { group: 'ai', description: 'AI 模型' },\n CLAUDE_BINARY: { group: 'ai', description: 'Claude CLI 二进制路径 (覆盖默认)' },\n CURSOR_BINARY: { group: 'ai', description: 'Cursor Agent CLI 二进制路径 (覆盖默认)' },\n CODEBUDDY_BINARY: { group: 'ai', description: 'CodeBuddy CLI 二进制路径 (覆盖默认)' },\n CODEBUDDY_ACP_AUTO_APPROVE: { group: 'ai', description: 'CodeBuddy ACP 自动批准' },\n CLAUDE_PHASE_TIMEOUT_MS: { group: 'ai', description: 'AI 阶段执行超时 (毫秒)' },\n PHASE_TIMEOUT_GRACE_MS: { group: 'ai', description: '阶段超时宽限期 (毫秒, 默认 60000)' },\n PHASE_TIMEOUT_EXTENSION_MS: { group: 'ai', description: '阶段超时延长时间 (毫秒, 默认 600000)' },\n PHASE_TIMEOUT_MAX_EXTENSIONS: { group: 'ai', description: '阶段超时最大延长次数 (默认 3)' },\n AI_IDLE_TIMEOUT_MS: { group: 'ai', description: 'AI 空闲超时 (毫秒, 0 禁用)' },\n NVM_NODE_VERSION: { group: 'ai', description: 'AI Runner 使用的 Node.js 版本' },\n\n // --- 流水线 ---\n PIPELINE_MODE: { group: 'pipeline', description: '流水线模式 (auto 始终解析为 plan-mode)' },\n\n // --- 轮询 ---\n POLL_DISCOVERY_INTERVAL_MS: { group: 'poll', description: '新 Issue 发现间隔 (毫秒)' },\n POLL_DRIVE_INTERVAL_MS: { group: 'poll', description: '任务驱动间隔 (毫秒)' },\n MAX_RETRIES: { group: 'poll', description: '最大重试次数' },\n MAX_CONCURRENT_ISSUES: { group: 'poll', description: '最大并行 Issue 数' },\n\n // --- 审核 ---\n REVIEW_ENABLED: { group: 'review', description: '启用方案审核门禁' },\n REVIEW_AUTO_APPROVE_LABELS:{ group: 'review', description: '自动批准的标签 (逗号分隔)' },\n\n // --- Web ---\n WEB_ENABLED: { group: 'web', description: '启用 Web 监控面板' },\n WEB_HOST: { group: 'web', description: 'Web 监听地址' },\n WEB_PORT: { group: 'web', description: 'Web 面板端口' },\n FRONTEND_DIST_DIR: { group: 'web', description: '前端构建产物目录 (覆盖默认)' },\n\n // --- Issue 评论同步 ---\n ISSUE_NOTE_SYNC_ENABLED: { group: 'issueNoteSync', description: '启用 Issue 评论同步' },\n WEB_BASE_URL: { group: 'issueNoteSync', description: 'Web 面板外部访问地址 (默认自动检测)' },\n\n // --- Webhook ---\n WEBHOOK_ENABLED: { group: 'webhook', description: '启用 Webhook 接收工蜂推送事件' },\n WEBHOOK_HOST: { group: 'webhook', description: 'Webhook 监听地址' },\n WEBHOOK_PORT: { group: 'webhook', description: 'Webhook 端口 (需满足工蜂要求: 80/443/8080/8081)' },\n WEBHOOK_SECRET: { group: 'webhook', description: 'Webhook 密钥' },\n WEBHOOK_LLM_FALLBACK: { group: 'webhook', description: '正则匹配失败时用 LLM 解析自然语言意图' },\n WEBHOOK_LLM_BINARY: { group: 'webhook', description: '意图识别使用的 AI CLI (独立于 AI_RUNNER_MODE)' },\n\n // --- E2E ---\n E2E_UI_ENABLED: { group: 'e2e', description: '启用 E2E 测试功能' },\n E2E_BASE_URL: { group: 'e2e', description: 'E2E 测试目标 URL' },\n E2E_BACKEND_URL: { group: 'e2e', description: 'E2E 后端 URL' },\n E2E_AUTH_COOKIES: { group: 'e2e', description: 'E2E 认证 Cookies (JSON 数组)' },\n E2E_BACKEND_PORT_BASE: { group: 'e2e', description: 'E2E 后端端口基数' },\n E2E_FRONTEND_PORT_BASE: { group: 'e2e', description: 'E2E 前端端口基数' },\n E2E_UAT_VENDOR_DIR: { group: 'e2e', description: 'UAT 测试框架目录' },\n E2E_UAT_CONFIG_FILE: { group: 'e2e', description: 'UAT 配置文件路径' },\n E2E_PYTHON_BIN: { group: 'e2e', description: 'Python 可执行文件路径' },\n E2E_AI_RUNNER_MODE: { group: 'e2e', description: 'E2E 阶段使用的 AI Runner 模式' },\n E2E_AI_MODEL: { group: 'e2e', description: 'E2E 阶段使用的 AI 模型(默认复用 AI_MODEL)' },\n\n // --- 预览环境 ---\n PREVIEW_ENABLED: { group: 'preview', description: '启用预览环境' },\n PREVIEW_HOST: { group: 'preview', description: '预览环境主机名' },\n PREVIEW_TTL_MS: { group: 'preview', description: '预览环境存活时间 (毫秒)' },\n PREVIEW_KEEP_AFTER_COMPLETE:{ group: 'preview', description: 'Issue 完成后保留预览环境' },\n PREVIEW_REAP_INTERVAL_MS: { group: 'preview', description: '预览环境清理检查间隔 (毫秒)' },\n\n // --- 头脑风暴 ---\n BRAINSTORM_ENABLED: { group: 'brainstorm', description: '启用头脑风暴功能' },\n BRAINSTORM_MAX_ROUNDS: { group: 'brainstorm', description: '最大精炼轮数' },\n BRAINSTORM_TIMEOUT_MS: { group: 'brainstorm', description: '头脑风暴超时 (毫秒)' },\n BRAINSTORM_GENERATOR_MODE: { group: 'brainstorm', description: '生成器 AI Runner 模式 (默认跟随全局)' },\n BRAINSTORM_GENERATOR_BINARY: { group: 'brainstorm', description: '生成器 AI 二进制路径' },\n BRAINSTORM_GENERATOR_MODEL: { group: 'brainstorm', description: '生成器 AI 模型' },\n BRAINSTORM_REVIEWER_MODE: { group: 'brainstorm', description: '审核器 AI Runner 模式 (默认跟随全局)' },\n BRAINSTORM_REVIEWER_BINARY: { group: 'brainstorm', description: '审核器 AI 二进制路径' },\n BRAINSTORM_REVIEWER_MODEL: { group: 'brainstorm', description: '审核器 AI 模型' },\n\n // --- 智能助手 ---\n CHAT_ENABLED: { group: 'chat', description: '启用智能助手 (Chat Agent)' },\n CHAT_TIMEOUT_MS: { group: 'chat', description: '对话超时 (毫秒)' },\n CHAT_MAX_SESSION_MESSAGES: { group: 'chat', description: '单会话最大消息数' },\n CHAT_AGENT_MODE: { group: 'chat', description: 'Chat AI Runner 模式 (默认 claude-internal)' },\n CHAT_AGENT_BINARY: { group: 'chat', description: 'Chat AI 二进制路径' },\n CHAT_AGENT_MODEL: { group: 'chat', description: 'Chat AI 模型' },\n\n // --- 批量任务 ---\n BRAINDUMP_ENABLED: { group: 'braindump', description: '启用批量任务拆分 (Braindump)' },\n BRAINDUMP_MAX_CONCURRENT: { group: 'braindump', description: '批量任务最大并发 (默认跟随 MAX_CONCURRENT_ISSUES)' },\n BRAINDUMP_SPLIT_TIMEOUT_MS: { group: 'braindump', description: '任务拆分超时 (毫秒)' },\n BRAINDUMP_TASK_TIMEOUT_MS: { group: 'braindump', description: '单任务超时 (默认跟随 CLAUDE_PHASE_TIMEOUT_MS)' },\n BRAINDUMP_MAX_CONFLICT_ATTEMPTS:{ group: 'braindump', description: '合并冲突最大重试次数' },\n BRAINDUMP_CREATE_MR: { group: 'braindump', description: '任务完成后自动创建合并请求' },\n\n // --- 自动更新 ---\n AUTO_UPDATE_ENABLED: { group: 'autoUpdate', description: '启用自动检查 npm 新版本并升级' },\n AUTO_UPDATE_INTERVAL_MS: { group: 'autoUpdate', description: '检查更新间隔 (毫秒)' },\n AUTO_UPDATE_REGISTRY: { group: 'autoUpdate', description: 'npm 仓库地址' },\n AUTO_UPDATE_DRAIN_TIMEOUT_MS:{ group: 'autoUpdate', description: '更新前等待活跃任务完成的超时 (毫秒)' },\n\n // --- iWiki ---\n IWIKI_AUTH_COOKIE: { group: 'iwiki', description: 'iWiki 认证 Cookie' },\n IWIKI_AUTH_TOKEN: { group: 'iwiki', description: 'iWiki 认证 Token' },\n IWIKI_BASE_URL: { group: 'iwiki', description: 'iWiki 基础 URL' },\n\n // --- 语言 ---\n LOCALE: { group: 'locale', description: '界面语言 (zh-CN / en)' },\n\n // --- 知识管理 ---\n KNOWLEDGE_ENABLED: { group: 'knowledge', description: '启用知识管理' },\n KNOWLEDGE_PATH: { group: 'knowledge', description: '知识库路径 (覆盖默认)' },\n KNOWLEDGE_ORPHAN_BRANCH: { group: 'knowledge', description: '知识 Git 同步分支名' },\n KNOWLEDGE_SYNC_VECTORS: { group: 'knowledge', description: '同步时包含向量文件 (大文件)' },\n KNOWLEDGE_AUTO_RESTORE: { group: 'knowledge', description: '启动时自动从 orphan branch 恢复知识' },\n\n // --- 知识蒸馏 ---\n DISTILL_ENABLED: { group: 'distill', description: '启用知识蒸馏' },\n DISTILL_INTERVAL_MS: { group: 'distill', description: '蒸馏调度间隔 (毫秒)' },\n DISTILL_DIARY_SUMMARIZE: { group: 'distill', description: '蒸馏时总结日记' },\n DISTILL_MIN_DIARIES_FOR_DISTILL: { group: 'distill', description: '触发蒸馏所需最少日记数' },\n DISTILL_MEMORY_CONFIDENCE_THRESHOLD:{ group: 'distill', description: '记忆置信度阈值 (0-1)' },\n DISTILL_VECTOR_ENABLED: { group: 'distill', description: '启用向量存储' },\n\n // --- 文件同步 ---\n SYNC_KNOWLEDGE_TO_PROJECT: { group: 'sync', description: '将知识文件同步到目标项目' },\n SYNC_RULES_TO_PROJECT: { group: 'sync', description: '将规则文件同步到目标项目' },\n\n // --- 发布 ---\n RELEASE_ENABLED: { group: 'release', description: '启用发布功能' },\n RELEASE_DETECT_CACHE_TTL_MS:{ group: 'release', description: '发布检测缓存有效期 (毫秒)' },\n\n // --- 验证修复循环 ---\n VERIFY_FIX_LOOP_ENABLED: { group: 'verifyFixLoop', description: '启用验证失败后自动修复循环' },\n VERIFY_FIX_MAX_ITERATIONS: { group: 'verifyFixLoop', description: '最大修复迭代次数' },\n VERIFY_TODOLIST_CHECK_ENABLED: { group: 'verifyFixLoop', description: '启用 Todolist 完成度检查' },\n\n // --- 交互式终端 ---\n TERMINAL_ENABLED: { group: 'terminal', description: '启用交互式终端功能 (PTY 会话)' },\n TERMINAL_IDLE_TIMEOUT_MS: { group: 'terminal', description: '终端会话空闲超时 (毫秒)' },\n TERMINAL_MAX_SESSIONS: { group: 'terminal', description: '最大并发 PTY 会话数' },\n PTY_IDLE_DETECT_MS: { group: 'terminal', description: 'PTY 空闲检测间隔 (毫秒)' },\n PTY_DEFAULT_AGENT: { group: 'terminal', description: 'PTY 模式的默认代理' },\n PTY_PHASE_AGENTS: { group: 'terminal', description: '阶段专用代理映射 (格式: plan:agent,build:agent)' },\n\n // --- 运营分析 ---\n ANALYTICS_ENABLED: { group: 'analytics', description: '启用运营分析' },\n ANALYTICS_TARGET_API_URL: { group: 'analytics', description: '分析数据上报 API 地址' },\n ANALYTICS_TARGET_API_TOKEN: { group: 'analytics', description: '分析数据上报 API Token' },\n ANALYTICS_CACHE_TTL_MS: { group: 'analytics', description: '分析数据缓存有效期 (毫秒)' },\n ANALYTICS_SKILL_AUTO_DISCOVER:{ group: 'analytics', description: '自动发现 Skill 文件' },\n\n // --- 多节点 ---\n NODE_ID: { group: 'coordination', description: '节点标识 (多节点部署时区分实例)' },\n\n // --- 工作区 ---\n WORKSPACE_CONFIG_PATH: { group: 'workspace', description: '多仓库工作区配置文件路径' },\n\n // --- 多租户 ---\n TENANTS_CONFIG_PATH: { group: 'tenants', description: '多租户配置文件路径' },\n};\n"],"mappings":"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","names":["fs","fs"]}
@@ -6,10 +6,10 @@ import {
6
6
  import {
7
7
  ConfigGenerator,
8
8
  PreflightChecker
9
- } from "./chunk-LNFMARKQ.js";
9
+ } from "./chunk-SEO57UYI.js";
10
10
  import {
11
11
  resolveConfigFilePath
12
- } from "./chunk-NZHKAPU6.js";
12
+ } from "./chunk-FJTZKAJA.js";
13
13
  import {
14
14
  ensureDir,
15
15
  resolveLogsDir
@@ -110,4 +110,4 @@ async function startDaemon(configPath) {
110
110
  export {
111
111
  startCommand
112
112
  };
113
- //# sourceMappingURL=chunk-2GJ2KA4Z.js.map
113
+ //# sourceMappingURL=chunk-TDKTI363.js.map
@@ -1,6 +1,9 @@
1
+ import {
2
+ isShuttingDown
3
+ } from "./chunk-G7QI5WDI.js";
1
4
  import {
2
5
  RunnerNotRegisteredError
3
- } from "./chunk-AVGZH64A.js";
6
+ } from "./chunk-2RWGZPNF.js";
4
7
  import {
5
8
  logger
6
9
  } from "./chunk-GF2RRYHB.js";
@@ -65,17 +68,6 @@ function resolveModelForRunner(runnerMode, model) {
65
68
 
66
69
  // src/ai-runner/BaseAIRunner.ts
67
70
  import { spawn } from "child_process";
68
-
69
- // src/shutdown/ShutdownSignal.ts
70
- var _shuttingDown = false;
71
- function isShuttingDown() {
72
- return _shuttingDown;
73
- }
74
- function setShuttingDown() {
75
- _shuttingDown = true;
76
- }
77
-
78
- // src/ai-runner/BaseAIRunner.ts
79
71
  var logger3 = logger.child("AIRunner");
80
72
  var SIGKILL_GRACE_MS = 1e4;
81
73
  var IDLE_CHECK_INTERVAL_MS = 5e3;
@@ -1004,6 +996,11 @@ function getRunnerCapabilities(mode) {
1004
996
  function getPtyProfile(agentMode) {
1005
997
  return AI_RUNNER_REGISTRY[agentMode]?.ptyProfile;
1006
998
  }
999
+ function usesDeterministicPlanCopy(agentMode) {
1000
+ const caps = AI_RUNNER_REGISTRY[agentMode]?.capabilities;
1001
+ const profile = AI_RUNNER_REGISTRY[agentMode]?.ptyProfile;
1002
+ return !caps?.nativePlanMode && !!profile?.modeCycleKey && !!profile?.planModeName;
1003
+ }
1007
1004
  function getRegistryEntry(mode) {
1008
1005
  return AI_RUNNER_REGISTRY[mode];
1009
1006
  }
@@ -1068,8 +1065,7 @@ registerAIRunner("claude-internal", {
1068
1065
  // unreachable and preventing the commit-to-file step.
1069
1066
  buildPtyArgs: ({ model }) => [
1070
1067
  "--dangerously-skip-permissions",
1071
- "--effort",
1072
- "max",
1068
+ // '--effort', 'max',
1073
1069
  ...model ? ["--model", model] : []
1074
1070
  ],
1075
1071
  modeCycleKey: SHIFT_TAB,
@@ -1128,8 +1124,6 @@ registerAIRunner("codebuddy-acp", {
1128
1124
 
1129
1125
  export {
1130
1126
  resolveModelForRunner,
1131
- isShuttingDown,
1132
- setShuttingDown,
1133
1127
  BaseAIRunner,
1134
1128
  ClaudeInternalRunner,
1135
1129
  CursorAgentRunner,
@@ -1143,9 +1137,10 @@ export {
1143
1137
  getBinaryEnvKey,
1144
1138
  getRunnerCapabilities,
1145
1139
  getPtyProfile,
1140
+ usesDeterministicPlanCopy,
1146
1141
  getRegistryEntry,
1147
1142
  createAIRunner,
1148
1143
  validateRunnerRegistry,
1149
1144
  isBinaryAvailable
1150
1145
  };
1151
- //# sourceMappingURL=chunk-SAMTXC4A.js.map
1146
+ //# sourceMappingURL=chunk-TFEPHOVE.js.map