@xdevops/issue-auto-finish 1.0.87 → 1.0.89
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AIRunnerRegistry-II3WWSFN.js → AIRunnerRegistry-CFDNWSXC.js} +6 -3
- package/dist/{LockNote-Z2CLDZNN.js → LockNote-W2JNVMW7.js} +3 -3
- package/dist/PtyRunner-NYASBTRP.js +33 -0
- package/dist/SdkRunner-U2OTOMZU.js +9 -0
- package/dist/ai-runner/AIRunner.d.ts +19 -1
- package/dist/ai-runner/AIRunner.d.ts.map +1 -1
- package/dist/ai-runner/AIRunnerRegistry.d.ts +8 -0
- package/dist/ai-runner/AIRunnerRegistry.d.ts.map +1 -1
- package/dist/ai-runner/PlanFileResolver.d.ts +53 -0
- package/dist/ai-runner/PlanFileResolver.d.ts.map +1 -0
- package/dist/ai-runner/PtyRunner.d.ts +45 -4
- package/dist/ai-runner/PtyRunner.d.ts.map +1 -1
- package/dist/ai-runner/SdkRunner.d.ts +22 -0
- package/dist/ai-runner/SdkRunner.d.ts.map +1 -0
- package/dist/ai-runner/index.d.ts +5 -2
- package/dist/ai-runner/index.d.ts.map +1 -1
- package/dist/ai-runner/sdk/ClaudeCodeSDK.d.ts +37 -0
- package/dist/ai-runner/sdk/ClaudeCodeSDK.d.ts.map +1 -0
- package/dist/ai-runner/sdk/Stream.d.ts +22 -0
- package/dist/ai-runner/sdk/Stream.d.ts.map +1 -0
- package/dist/ai-runner/sdk/types.d.ts +146 -0
- package/dist/ai-runner/sdk/types.d.ts.map +1 -0
- package/dist/{ai-runner-HLA44WI6.js → ai-runner-TOHVJJ76.js} +14 -5
- package/dist/{analyze-ZIXNC5GN.js → analyze-DBH4K3J7.js} +8 -6
- package/dist/{analyze-ZIXNC5GN.js.map → analyze-DBH4K3J7.js.map} +1 -1
- package/dist/{braindump-56WAY2RD.js → braindump-RYI4BGMG.js} +11 -9
- package/dist/{braindump-56WAY2RD.js.map → braindump-RYI4BGMG.js.map} +1 -1
- package/dist/{chunk-AVGZH64A.js → chunk-2RWGZPNF.js} +4 -1
- package/dist/chunk-2RWGZPNF.js.map +1 -0
- package/dist/chunk-4XMYOXGZ.js +1153 -0
- package/dist/chunk-4XMYOXGZ.js.map +1 -0
- package/dist/{chunk-UBQLXQ7I.js → chunk-5JBADEKR.js} +7 -7
- package/dist/{chunk-M5C2WILQ.js → chunk-5M5SB6ZA.js} +7 -5
- package/dist/{chunk-M5C2WILQ.js.map → chunk-5M5SB6ZA.js.map} +1 -1
- package/dist/{chunk-HDFNMVRQ.js → chunk-DVNAH2GV.js} +2 -2
- package/dist/{chunk-GXFG4JU6.js → chunk-EU4XFZ2T.js} +2 -2
- package/dist/{chunk-NZHKAPU6.js → chunk-FJTZKAJA.js} +9 -3
- package/dist/chunk-FJTZKAJA.js.map +1 -0
- package/dist/chunk-G7QI5WDI.js +14 -0
- package/dist/chunk-G7QI5WDI.js.map +1 -0
- package/dist/{chunk-2YQHKXLL.js → chunk-GPZX4DSY.js} +22 -6
- package/dist/chunk-GPZX4DSY.js.map +1 -0
- package/dist/{chunk-IP3QTP5A.js → chunk-IWSMQXBL.js} +189 -48
- package/dist/chunk-IWSMQXBL.js.map +1 -0
- package/dist/{chunk-O3WEV5W3.js → chunk-JMACM7AJ.js} +47 -9
- package/dist/chunk-JMACM7AJ.js.map +1 -0
- package/dist/chunk-MSL7ROVK.js +1 -0
- package/dist/{chunk-YCYVNRLF.js → chunk-OBGEEGQ3.js} +61 -19
- package/dist/chunk-OBGEEGQ3.js.map +1 -0
- package/dist/chunk-R32Q3RGK.js +666 -0
- package/dist/chunk-R32Q3RGK.js.map +1 -0
- package/dist/{chunk-SAMTXC4A.js → chunk-TFEPHOVE.js} +12 -17
- package/dist/chunk-TFEPHOVE.js.map +1 -0
- package/dist/{chunk-QZZGIZWC.js → chunk-XSX3PGQW.js} +63 -20
- package/dist/chunk-XSX3PGQW.js.map +1 -0
- package/dist/{chunk-2MESXJEZ.js → chunk-YNRKPQLS.js} +3 -3
- package/dist/cli/setup/PreflightChecker.d.ts +1 -0
- package/dist/cli/setup/PreflightChecker.d.ts.map +1 -1
- package/dist/cli/setup/env-metadata.d.ts.map +1 -1
- package/dist/cli.js +10 -9
- package/dist/cli.js.map +1 -1
- package/dist/{config-WTRSZLOC.js → config-23TBYFP5.js} +5 -4
- package/dist/config-schema.d.ts +6 -0
- package/dist/config-schema.d.ts.map +1 -1
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/{doctor-37JNBGDN.js → doctor-ZG3DO7J5.js} +3 -3
- package/dist/errors/AIExecutionError.d.ts +3 -0
- package/dist/errors/AIExecutionError.d.ts.map +1 -1
- package/dist/{errors-S3BWYA4I.js → errors-J3ZRP66W.js} +2 -2
- package/dist/events/EventBus.d.ts +1 -1
- package/dist/events/EventBus.d.ts.map +1 -1
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -14
- package/dist/{init-QQDXGTPB.js → init-37DLQ5AJ.js} +9 -8
- package/dist/{init-QQDXGTPB.js.map → init-37DLQ5AJ.js.map} +1 -1
- package/dist/lib.js +10 -8
- package/dist/lib.js.map +1 -1
- package/dist/orchestrator/PendingDialogStore.d.ts +12 -0
- package/dist/orchestrator/PendingDialogStore.d.ts.map +1 -0
- package/dist/orchestrator/steps/FailureHandler.d.ts.map +1 -1
- package/dist/orchestrator/steps/PhaseLoopStep.d.ts.map +1 -1
- package/dist/persistence/PlanPersistence.d.ts +5 -0
- package/dist/persistence/PlanPersistence.d.ts.map +1 -1
- package/dist/persistence/TodolistExtractor.d.ts +31 -0
- package/dist/persistence/TodolistExtractor.d.ts.map +1 -0
- package/dist/phases/BasePhase.d.ts.map +1 -1
- package/dist/phases/PhaseOutcome.d.ts +2 -0
- package/dist/phases/PhaseOutcome.d.ts.map +1 -1
- package/dist/phases/PlanPhase.d.ts.map +1 -1
- package/dist/prompts/templates.d.ts +2 -2
- package/dist/prompts/templates.d.ts.map +1 -1
- package/dist/{restart-BMILTP5X.js → restart-C7QBXT44.js} +9 -8
- package/dist/{restart-BMILTP5X.js.map → restart-C7QBXT44.js.map} +1 -1
- package/dist/run.js +16 -14
- package/dist/run.js.map +1 -1
- package/dist/start-66JO56AW.js +16 -0
- package/dist/start-66JO56AW.js.map +1 -0
- package/dist/tracker/IssueTracker.d.ts +6 -0
- package/dist/tracker/IssueTracker.d.ts.map +1 -1
- package/dist/web/routes/api.d.ts.map +1 -1
- package/package.json +5 -1
- package/src/web/frontend/dist/assets/index-DJzC2saL.css +1 -0
- package/src/web/frontend/dist/assets/{index-D_oTMuJU.js → index-Mnu8M3ww.js} +57 -57
- package/src/web/frontend/dist/index.html +2 -2
- package/dist/PtyRunner-6UGI5STW.js +0 -22
- package/dist/chunk-2YQHKXLL.js.map +0 -1
- package/dist/chunk-AVGZH64A.js.map +0 -1
- package/dist/chunk-IP3QTP5A.js.map +0 -1
- package/dist/chunk-NZHKAPU6.js.map +0 -1
- package/dist/chunk-O3WEV5W3.js.map +0 -1
- package/dist/chunk-QZZGIZWC.js.map +0 -1
- package/dist/chunk-SAMTXC4A.js.map +0 -1
- package/dist/chunk-U237JSLB.js +0 -1
- package/dist/chunk-U6GWFTKA.js +0 -657
- package/dist/chunk-U6GWFTKA.js.map +0 -1
- package/dist/chunk-YCYVNRLF.js.map +0 -1
- package/dist/start-6QRW6IJI.js +0 -15
- package/src/web/frontend/dist/assets/index-COYziOhv.css +0 -1
- /package/dist/{AIRunnerRegistry-II3WWSFN.js.map → AIRunnerRegistry-CFDNWSXC.js.map} +0 -0
- /package/dist/{LockNote-Z2CLDZNN.js.map → LockNote-W2JNVMW7.js.map} +0 -0
- /package/dist/{PtyRunner-6UGI5STW.js.map → PtyRunner-NYASBTRP.js.map} +0 -0
- /package/dist/{ai-runner-HLA44WI6.js.map → SdkRunner-U2OTOMZU.js.map} +0 -0
- /package/dist/{chunk-U237JSLB.js.map → ai-runner-TOHVJJ76.js.map} +0 -0
- /package/dist/{chunk-UBQLXQ7I.js.map → chunk-5JBADEKR.js.map} +0 -0
- /package/dist/{chunk-HDFNMVRQ.js.map → chunk-DVNAH2GV.js.map} +0 -0
- /package/dist/{chunk-GXFG4JU6.js.map → chunk-EU4XFZ2T.js.map} +0 -0
- /package/dist/{config-WTRSZLOC.js.map → chunk-MSL7ROVK.js.map} +0 -0
- /package/dist/{chunk-2MESXJEZ.js.map → chunk-YNRKPQLS.js.map} +0 -0
- /package/dist/{errors-S3BWYA4I.js.map → config-23TBYFP5.js.map} +0 -0
- /package/dist/{doctor-37JNBGDN.js.map → doctor-ZG3DO7J5.js.map} +0 -0
- /package/dist/{start-6QRW6IJI.js.map → errors-J3ZRP66W.js.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
envSchema
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-FJTZKAJA.js";
|
|
4
4
|
import {
|
|
5
5
|
getLocalIP
|
|
6
6
|
} from "./chunk-AKXDQH25.js";
|
|
@@ -8,6 +8,9 @@ import {
|
|
|
8
8
|
getGlobalDir,
|
|
9
9
|
resolveDataDir
|
|
10
10
|
} from "./chunk-TN2SYADO.js";
|
|
11
|
+
import {
|
|
12
|
+
getDefaultBinary
|
|
13
|
+
} from "./chunk-TFEPHOVE.js";
|
|
11
14
|
|
|
12
15
|
// src/cli/setup/PreflightChecker.ts
|
|
13
16
|
import fs from "fs";
|
|
@@ -181,18 +184,18 @@ var PreflightChecker = class {
|
|
|
181
184
|
}
|
|
182
185
|
async checkAIRunnerBinary() {
|
|
183
186
|
const mode = this.config.ai.mode;
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
};
|
|
189
|
-
const binary = binaryMap[mode] ?? mode;
|
|
187
|
+
if (mode === "pty") {
|
|
188
|
+
return this.checkPtyAgentBinaries();
|
|
189
|
+
}
|
|
190
|
+
const binary = getDefaultBinary(mode);
|
|
190
191
|
const { code } = await run("which", [binary]);
|
|
191
192
|
if (code !== 0) {
|
|
192
193
|
const installHints = {
|
|
193
194
|
"claude-internal": "npm install -g claude-code-internal",
|
|
194
195
|
"cursor-agent": "curl -fsSL https://www.cursor.com/install-agent | bash",
|
|
195
|
-
"codebuddy": "npm install -g codebuddy-code"
|
|
196
|
+
"codebuddy": "npm install -g codebuddy-code",
|
|
197
|
+
"codebuddy-acp": "npm install -g codebuddy-code",
|
|
198
|
+
"sdk": "npm install -g @anthropic-ai/claude-code"
|
|
196
199
|
};
|
|
197
200
|
return {
|
|
198
201
|
name: "ai-runner",
|
|
@@ -204,6 +207,38 @@ var PreflightChecker = class {
|
|
|
204
207
|
}
|
|
205
208
|
return { name: "ai-runner", passed: true, severity: "error", message: `AI Runner \u53EF\u7528: ${binary}` };
|
|
206
209
|
}
|
|
210
|
+
async checkPtyAgentBinaries() {
|
|
211
|
+
const defaultAgent = process.env.PTY_DEFAULT_AGENT || "claude-internal";
|
|
212
|
+
const phaseAgentsStr = process.env.PTY_PHASE_AGENTS || "";
|
|
213
|
+
const agents = /* @__PURE__ */ new Set([defaultAgent]);
|
|
214
|
+
if (phaseAgentsStr) {
|
|
215
|
+
for (const pair of phaseAgentsStr.split(",")) {
|
|
216
|
+
const [, agent] = pair.split(":").map((s) => s.trim());
|
|
217
|
+
if (agent) agents.add(agent);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
const missing = [];
|
|
221
|
+
for (const agent of agents) {
|
|
222
|
+
const binary = getDefaultBinary(agent);
|
|
223
|
+
const { code } = await run("which", [binary]);
|
|
224
|
+
if (code !== 0) missing.push(`${agent} (${binary})`);
|
|
225
|
+
}
|
|
226
|
+
if (missing.length > 0) {
|
|
227
|
+
return {
|
|
228
|
+
name: "ai-runner",
|
|
229
|
+
passed: false,
|
|
230
|
+
severity: "error",
|
|
231
|
+
message: `PTY \u6A21\u5F0F\u9700\u8981\u7684 Agent \u4E8C\u8FDB\u5236\u672A\u627E\u5230: ${missing.join(", ")}`,
|
|
232
|
+
fix: "\u8BF7\u5B89\u88C5\u7F3A\u5931\u7684 AI Agent CLI \u5E76\u786E\u4FDD\u5728 PATH \u4E2D"
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
name: "ai-runner",
|
|
237
|
+
passed: true,
|
|
238
|
+
severity: "error",
|
|
239
|
+
message: `PTY \u6A21\u5F0F Agent \u53EF\u7528: ${[...agents].join(", ")}`
|
|
240
|
+
};
|
|
241
|
+
}
|
|
207
242
|
async checkGongfengToken() {
|
|
208
243
|
const { apiUrl, privateToken } = this.config.gongfeng;
|
|
209
244
|
if (!apiUrl || !privateToken) {
|
|
@@ -364,6 +399,9 @@ var ENV_VAR_META = {
|
|
|
364
399
|
CODEBUDDY_BINARY: { group: "ai", description: "CodeBuddy CLI \u4E8C\u8FDB\u5236\u8DEF\u5F84 (\u8986\u76D6\u9ED8\u8BA4)" },
|
|
365
400
|
CODEBUDDY_ACP_AUTO_APPROVE: { group: "ai", description: "CodeBuddy ACP \u81EA\u52A8\u6279\u51C6" },
|
|
366
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)" },
|
|
367
405
|
AI_IDLE_TIMEOUT_MS: { group: "ai", description: "AI \u7A7A\u95F2\u8D85\u65F6 (\u6BEB\u79D2, 0 \u7981\u7528)" },
|
|
368
406
|
NVM_NODE_VERSION: { group: "ai", description: "AI Runner \u4F7F\u7528\u7684 Node.js \u7248\u672C" },
|
|
369
407
|
// --- 流水线 ---
|
|
@@ -871,4 +909,4 @@ export {
|
|
|
871
909
|
PreflightChecker,
|
|
872
910
|
ConfigGenerator
|
|
873
911
|
};
|
|
874
|
-
//# sourceMappingURL=chunk-
|
|
912
|
+
//# sourceMappingURL=chunk-JMACM7AJ.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 };\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 || 'claude-internal';\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 },\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 set('AI_RUNNER_MODE', config.ai.mode);\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 // 必填项始终写入\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 entries.set('AI_RUNNER_MODE', config.ai.mode);\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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=chunk-MSL7ROVK.js.map
|
|
@@ -317,6 +317,14 @@ var zhCN = {
|
|
|
317
317
|
- IID: #{iid}
|
|
318
318
|
- \u6807\u9898: {title}
|
|
319
319
|
|
|
320
|
+
## \u5E42\u7B49\u6027\u68C0\u67E5\uFF08\u6700\u5148\u6267\u884C\uFF09
|
|
321
|
+
\u5728\u6267\u884C\u4EFB\u4F55\u64CD\u4F5C\u4E4B\u524D\uFF0C\u5148\u68C0\u67E5\u662F\u5426\u5DF2\u5B58\u5728\u9A8C\u8BC1\u62A5\u544A\uFF1A
|
|
322
|
+
1. \u8BFB\u53D6 {planDir}/02-verify-report.md\uFF08\u5982\u679C\u5B58\u5728\uFF09
|
|
323
|
+
2. \u5982\u679C\u62A5\u544A\u5B58\u5728\u4E14"\u603B\u7ED3"\u90E8\u5206\u5305\u542B"\u9A8C\u8BC1\u901A\u8FC7"\uFF0C\u5219**\u76F4\u63A5\u7ED3\u675F**\uFF0C\u4E0D\u8981\u91CD\u590D\u6267\u884C\u4EFB\u4F55\u9A8C\u8BC1\u6B65\u9AA4
|
|
324
|
+
3. \u5982\u679C\u62A5\u544A\u4E0D\u5B58\u5728\u6216\u603B\u7ED3\u4E3A"\u9A8C\u8BC1\u5931\u8D25"\uFF0C\u7EE7\u7EED\u6267\u884C\u4E0B\u9762\u7684\u9A8C\u8BC1\u6B65\u9AA4
|
|
325
|
+
|
|
326
|
+
**\u91CD\u8981**\uFF1A\u6B64\u68C0\u67E5\u7684\u76EE\u7684\u662F\u9632\u6B62\u91CD\u590D\u6267\u884C\u5BFC\u81F4\u7834\u574F\u6027\u64CD\u4F5C\uFF08\u5982\u5220\u9664\u5DF2\u901A\u8FC7\u7684\u6D4B\u8BD5\u6587\u4EF6\uFF09\u3002
|
|
327
|
+
|
|
320
328
|
## \u524D\u7F6E\u68C0\u67E5
|
|
321
329
|
\u5728\u6267\u884C\u9A8C\u8BC1\u524D\uFF0C\u5148\u786E\u8BA4\u4F9D\u8D56\u73AF\u5883:
|
|
322
330
|
1. \u68C0\u67E5 {dependencyCheckPath} \u662F\u5426\u5B58\u5728
|
|
@@ -361,7 +369,7 @@ var zhCN = {
|
|
|
361
369
|
## \u8F93\u51FA\u8981\u6C42
|
|
362
370
|
\u8BF7\u5148\u9605\u8BFB\u9879\u76EE\u6839\u76EE\u5F55\u7684 CLAUDE.md \u4E86\u89E3\u9879\u76EE\u67B6\u6784\uFF0C\u518D\u8FDB\u884C\u5206\u6790\u548C\u8BBE\u8BA1\u3002
|
|
363
371
|
|
|
364
|
-
|
|
372
|
+
{outputInstruction}
|
|
365
373
|
|
|
366
374
|
### \u7B2C\u4E00\u90E8\u5206\uFF1A\u9700\u6C42\u5206\u6790
|
|
367
375
|
1. **\u9700\u6C42\u6982\u8FF0** \u2014 \u7528\u7B80\u6D01\u7684\u8BED\u8A00\u603B\u7ED3\u9700\u6C42\u76EE\u6807
|
|
@@ -383,7 +391,7 @@ var zhCN = {
|
|
|
383
391
|
...
|
|
384
392
|
|
|
385
393
|
\u8BF7\u786E\u4FDD Todolist \u8DB3\u591F\u8BE6\u7EC6\uFF0C\u6BCF\u4E2A\u6B65\u9AA4\u53EF\u72EC\u7ACB\u6267\u884C\u548C\u9A8C\u8BC1\u3002
|
|
386
|
-
|
|
394
|
+
{outputConstraint}`,
|
|
387
395
|
"prompt.build": `\u4F60\u662F\u5F00\u53D1\u5DE5\u7A0B\u5E08\u3002\u8BF7\u6309\u7167\u5B9E\u65BD\u8BA1\u5212\u5B8C\u6210\u4EE3\u7801\u53D8\u66F4\u3002
|
|
388
396
|
|
|
389
397
|
## Issue \u4FE1\u606F
|
|
@@ -411,15 +419,12 @@ var zhCN = {
|
|
|
411
419
|
## \u5BA1\u6838\u53CD\u9988\u5386\u53F2\uFF08\u5171 {historyCount} \u8F6E\uFF09
|
|
412
420
|
{feedbackLines}
|
|
413
421
|
|
|
414
|
-
|
|
415
|
-
- {planDir}/01-plan.md (\u5F53\u524D\u5B9E\u65BD\u8BA1\u5212)
|
|
416
|
-
- {planDir}/review-feedback.md (\u5BA1\u6838\u53CD\u9988\u5B8C\u6574\u5386\u53F2)
|
|
417
|
-
- CLAUDE.md (\u9879\u76EE\u67B6\u6784)
|
|
422
|
+
{rePlanReadInstruction}
|
|
418
423
|
|
|
419
424
|
## \u8F93\u51FA\u8981\u6C42
|
|
420
|
-
|
|
425
|
+
{rePlanOutputInstruction}
|
|
421
426
|
\u91CD\u70B9\u5173\u6CE8\u6700\u65B0\u4E00\u8F6E\u7684\u53CD\u9988\uFF0C\u540C\u65F6\u786E\u4FDD\u4E4B\u524D\u8F6E\u6B21\u63D0\u51FA\u7684\u95EE\u9898\u4E5F\u5DF2\u5F97\u5230\u89E3\u51B3\u3002
|
|
422
|
-
|
|
427
|
+
{outputConstraint}`,
|
|
423
428
|
"prompt.rePlanRound": "### \u7B2C {round} \u8F6E ({timestamp})\n{feedback}",
|
|
424
429
|
"prompt.e2eSuffix.title": "## E2E UI \u9A8C\u8BC1\uFF08\u5DF2\u542F\u7528\uFF09",
|
|
425
430
|
"prompt.e2eSuffix.intro": "\u672C\u6B21\u53D8\u66F4\u5DF2\u5F00\u542F E2E UI \u81EA\u52A8\u9A8C\u6536\uFF0C\u8BF7\u989D\u5916\u6267\u884C\u4EE5\u4E0B\u6B65\u9AA4\uFF1A",
|
|
@@ -505,7 +510,23 @@ var zhCN = {
|
|
|
505
510
|
{rawReport}
|
|
506
511
|
\`\`\`
|
|
507
512
|
`,
|
|
508
|
-
// Plan mode
|
|
513
|
+
// Plan mode preamble — deterministic copy variant (agent is in read-only plan mode;
|
|
514
|
+
// plan file is copied from CLI-native storage automatically)
|
|
515
|
+
"prompt.planModeNative": `\u{1F3D7}\uFE0F **\u4F60\u73B0\u5728\u662F\u6280\u672F\u67B6\u6784\u5E08\uFF0C\u6B63\u5728\u8FDB\u884C\u65B9\u6848\u89C4\u5212\u3002**
|
|
516
|
+
|
|
517
|
+
\u4F60\u7684\u76EE\u6807\u662F\u4EA7\u51FA\u4E00\u4EFD\u6DF1\u601D\u719F\u8651\u7684\u5B9E\u65BD\u8BA1\u5212\uFF0C\u800C\u975E\u76F4\u63A5\u7F16\u7801\u3002\u8BF7\u50CF\u8D44\u6DF1\u67B6\u6784\u5E08\u8BC4\u5BA1\u9700\u6C42\u90A3\u6837\u601D\u8003\uFF1A
|
|
518
|
+
|
|
519
|
+
## \u4F60\u7684\u5DE5\u4F5C\u65B9\u5F0F
|
|
520
|
+
1. **\u5145\u5206\u8C03\u7814** \u2014 \u9605\u8BFB\u9879\u76EE\u4EE3\u7801\u3001CLAUDE.md\u3001\u76F8\u5173\u6A21\u5757\uFF0C\u7406\u89E3\u73B0\u6709\u67B6\u6784\u548C\u7EA6\u675F
|
|
521
|
+
2. **\u7CFB\u7EDF\u5206\u6790** \u2014 \u68B3\u7406\u529F\u80FD\u70B9\u3001\u5F71\u54CD\u8303\u56F4\u3001\u6A21\u5757\u95F4\u4F9D\u8D56\u5173\u7CFB
|
|
522
|
+
3. **\u65B9\u6848\u8BBE\u8BA1** \u2014 \u63D0\u51FA\u6E05\u6670\u7684\u6280\u672F\u65B9\u6848\uFF0C\u8BF4\u660E"\u4E3A\u4EC0\u4E48\u8FD9\u6837\u505A"\u800C\u4E0D\u53EA\u662F"\u505A\u4EC0\u4E48"
|
|
523
|
+
4. **\u98CE\u9669\u9884\u5224** \u2014 \u8BC6\u522B\u6F5C\u5728\u95EE\u9898\u3001\u8FB9\u754C\u60C5\u51B5\u3001\u4E0E\u73B0\u6709\u4EE3\u7801\u7684\u517C\u5BB9\u6027
|
|
524
|
+
5. **\u4EA7\u51FA\u8BA1\u5212** \u2014 \u5F62\u6210\u7ED3\u6784\u5316\u7684\u5B9E\u65BD\u8BA1\u5212
|
|
525
|
+
|
|
526
|
+
## \u7EA6\u675F
|
|
527
|
+
\u672C\u9636\u6BB5\u4EC5\u505A\u5206\u6790\u548C\u89C4\u5212\u3002\u4E0D\u8981\u4FEE\u6539\u9879\u76EE\u4EE3\u7801\u6587\u4EF6\uFF0C\u4E0D\u8981\u6267\u884C\u6784\u5EFA\u3001\u6D4B\u8BD5\u6216\u90E8\u7F72\u547D\u4EE4\u3002\u540E\u7EED\u7684\u5B9E\u65BD\u9636\u6BB5\u4F1A\u6839\u636E\u4F60\u7684\u8BA1\u5212\u6267\u884C\u3002`,
|
|
528
|
+
// Plan mode fallback — file-writing variant (for runners without native plan mode
|
|
529
|
+
// that run as subprocess, not in interactive PTY plan mode)
|
|
509
530
|
"prompt.planModeFallback": `\u{1F3D7}\uFE0F **\u4F60\u73B0\u5728\u662F\u6280\u672F\u67B6\u6784\u5E08\uFF0C\u6B63\u5728\u8FDB\u884C\u65B9\u6848\u89C4\u5212\u3002**
|
|
510
531
|
|
|
511
532
|
\u4F60\u7684\u76EE\u6807\u662F\u4EA7\u51FA\u4E00\u4EFD\u6DF1\u601D\u719F\u8651\u7684\u5B9E\u65BD\u8BA1\u5212\uFF0C\u800C\u975E\u76F4\u63A5\u7F16\u7801\u3002\u8BF7\u50CF\u8D44\u6DF1\u67B6\u6784\u5E08\u8BC4\u5BA1\u9700\u6C42\u90A3\u6837\u601D\u8003\uFF1A
|
|
@@ -843,6 +864,14 @@ Write verification results to {planDir}/04-verify-report.md, including:
|
|
|
843
864
|
- IID: #{iid}
|
|
844
865
|
- Title: {title}
|
|
845
866
|
|
|
867
|
+
## Idempotency Check (execute FIRST)
|
|
868
|
+
Before performing any action, check if a verification report already exists:
|
|
869
|
+
1. Read {planDir}/02-verify-report.md (if it exists)
|
|
870
|
+
2. If the report exists and its "Summary" section contains "Verification Passed", **stop immediately** \u2014 do NOT re-run any verification steps
|
|
871
|
+
3. If the report does not exist or the summary says "Verification Failed", proceed with the verification steps below
|
|
872
|
+
|
|
873
|
+
**Important**: This check prevents destructive re-execution (e.g. deleting test files that already passed).
|
|
874
|
+
|
|
846
875
|
## Pre-checks
|
|
847
876
|
Before running verification, confirm the dependency environment:
|
|
848
877
|
1. Check if {dependencyCheckPath} exists
|
|
@@ -887,7 +916,7 @@ Write verification results to {planDir}/02-verify-report.md, **must** include th
|
|
|
887
916
|
## Output Requirements
|
|
888
917
|
Please read the project's CLAUDE.md first to understand the architecture, then proceed with analysis and design.
|
|
889
918
|
|
|
890
|
-
|
|
919
|
+
{outputInstruction}
|
|
891
920
|
|
|
892
921
|
### Part 1: Requirements Analysis
|
|
893
922
|
1. **Requirements Overview** \u2014 Summarize the requirements goal concisely
|
|
@@ -909,7 +938,7 @@ Please write the complete implementation plan to {planDir}/01-plan.md, including
|
|
|
909
938
|
...
|
|
910
939
|
|
|
911
940
|
Ensure the Todolist is detailed enough that each step can be independently executed and verified.
|
|
912
|
-
|
|
941
|
+
{outputConstraint}`,
|
|
913
942
|
"prompt.build": `You are a software engineer. Please complete code changes according to the implementation plan.
|
|
914
943
|
|
|
915
944
|
## Issue Information
|
|
@@ -937,15 +966,12 @@ Please read first:
|
|
|
937
966
|
## Review Feedback History ({historyCount} rounds)
|
|
938
967
|
{feedbackLines}
|
|
939
968
|
|
|
940
|
-
|
|
941
|
-
- {planDir}/01-plan.md (Current implementation plan)
|
|
942
|
-
- {planDir}/review-feedback.md (Complete review feedback history)
|
|
943
|
-
- CLAUDE.md (Project Architecture)
|
|
969
|
+
{rePlanReadInstruction}
|
|
944
970
|
|
|
945
971
|
## Output Requirements
|
|
946
|
-
|
|
972
|
+
{rePlanOutputInstruction}
|
|
947
973
|
Focus on the latest round of feedback while ensuring issues raised in previous rounds are also resolved.
|
|
948
|
-
|
|
974
|
+
{outputConstraint}`,
|
|
949
975
|
"prompt.rePlanRound": "### Round {round} ({timestamp})\n{feedback}",
|
|
950
976
|
"prompt.e2eSuffix.title": "## E2E UI Verification (Enabled)",
|
|
951
977
|
"prompt.e2eSuffix.intro": "E2E UI auto-verification is enabled for this change. Please perform the following additional steps:",
|
|
@@ -1031,7 +1057,23 @@ Please resolve the conflicts in each file listed above:
|
|
|
1031
1057
|
{rawReport}
|
|
1032
1058
|
\`\`\`
|
|
1033
1059
|
`,
|
|
1034
|
-
// Plan mode
|
|
1060
|
+
// Plan mode preamble — deterministic copy variant (agent is in read-only plan mode;
|
|
1061
|
+
// plan file is copied from CLI-native storage automatically)
|
|
1062
|
+
"prompt.planModeNative": `\u{1F3D7}\uFE0F **You are a technical architect conducting solution planning.**
|
|
1063
|
+
|
|
1064
|
+
Your goal is to produce a well-considered implementation plan, not to write code directly. Think like a senior architect reviewing requirements:
|
|
1065
|
+
|
|
1066
|
+
## Your Approach
|
|
1067
|
+
1. **Research thoroughly** \u2014 Read project code, CLAUDE.md, and related modules to understand the existing architecture and constraints
|
|
1068
|
+
2. **Analyze systematically** \u2014 Map out features, impact scope, and inter-module dependencies
|
|
1069
|
+
3. **Design with rationale** \u2014 Propose a clear technical approach, explaining "why" not just "what"
|
|
1070
|
+
4. **Anticipate risks** \u2014 Identify edge cases, potential issues, and compatibility with existing code
|
|
1071
|
+
5. **Produce your plan** \u2014 Create a structured implementation plan
|
|
1072
|
+
|
|
1073
|
+
## Constraint
|
|
1074
|
+
This phase is analysis and planning only. Do not modify project code files, and do not run build, test, or deploy commands. A separate implementation phase will execute your plan.`,
|
|
1075
|
+
// Plan mode fallback — file-writing variant (for runners without native plan mode
|
|
1076
|
+
// that run as subprocess, not in interactive PTY plan mode)
|
|
1035
1077
|
"prompt.planModeFallback": `\u{1F3D7}\uFE0F **You are a technical architect conducting solution planning.**
|
|
1036
1078
|
|
|
1037
1079
|
Your goal is to produce a well-considered implementation plan, not to write code directly. Think like a senior architect reviewing requirements:
|
|
@@ -1081,4 +1123,4 @@ export {
|
|
|
1081
1123
|
setLocale,
|
|
1082
1124
|
t
|
|
1083
1125
|
};
|
|
1084
|
-
//# sourceMappingURL=chunk-
|
|
1126
|
+
//# sourceMappingURL=chunk-OBGEEGQ3.js.map
|