@xdevops/issue-auto-finish 1.0.85 → 1.0.87
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 +31 -0
- package/dist/PtyRunner-6UGI5STW.js +22 -0
- package/dist/TerminalManager-RT2N7N5R.js +8 -0
- package/dist/ai-runner/AIRunner.d.ts +9 -1
- package/dist/ai-runner/AIRunner.d.ts.map +1 -1
- package/dist/ai-runner/AIRunnerRegistry.d.ts +37 -1
- package/dist/ai-runner/AIRunnerRegistry.d.ts.map +1 -1
- package/dist/ai-runner/PtyRunner.d.ts +114 -0
- package/dist/ai-runner/PtyRunner.d.ts.map +1 -0
- package/dist/ai-runner/index.d.ts +3 -1
- package/dist/ai-runner/index.d.ts.map +1 -1
- package/dist/{ai-runner-SVUNA3FX.js → ai-runner-HLA44WI6.js} +12 -3
- package/dist/{analyze-SXXPE5XL.js → analyze-ZIXNC5GN.js} +10 -8
- package/dist/{analyze-SXXPE5XL.js.map → analyze-ZIXNC5GN.js.map} +1 -1
- package/dist/{braindump-4E5SDMSZ.js → braindump-56WAY2RD.js} +10 -8
- package/dist/{braindump-4E5SDMSZ.js.map → braindump-56WAY2RD.js.map} +1 -1
- package/dist/{chunk-JINMYD56.js → chunk-2MESXJEZ.js} +3 -3
- package/dist/{chunk-P4O4ZXEC.js → chunk-2YQHKXLL.js} +40 -19
- package/dist/chunk-2YQHKXLL.js.map +1 -0
- package/dist/chunk-AVGZH64A.js +211 -0
- package/dist/chunk-AVGZH64A.js.map +1 -0
- package/dist/{chunk-5UPYA6KH.js → chunk-IP3QTP5A.js} +1028 -763
- package/dist/chunk-IP3QTP5A.js.map +1 -0
- package/dist/chunk-KC5S66OZ.js +177 -0
- package/dist/chunk-KC5S66OZ.js.map +1 -0
- package/dist/{chunk-4QV6D34Y.js → chunk-M5C2WILQ.js} +8 -6
- package/dist/{chunk-4QV6D34Y.js.map → chunk-M5C2WILQ.js.map} +1 -1
- package/dist/{chunk-FWEW5E3B.js → chunk-NZHKAPU6.js} +35 -5
- package/dist/chunk-NZHKAPU6.js.map +1 -0
- package/dist/{chunk-KTYPZTF4.js → chunk-O3WEV5W3.js} +10 -2
- package/dist/chunk-O3WEV5W3.js.map +1 -0
- package/dist/{chunk-K2OTLYJI.js → chunk-QZZGIZWC.js} +457 -202
- package/dist/chunk-QZZGIZWC.js.map +1 -0
- package/dist/{chunk-4LFNFRCL.js → chunk-SAMTXC4A.js} +91 -214
- package/dist/chunk-SAMTXC4A.js.map +1 -0
- package/dist/chunk-U237JSLB.js +1 -0
- package/dist/chunk-U237JSLB.js.map +1 -0
- package/dist/chunk-U6GWFTKA.js +657 -0
- package/dist/chunk-U6GWFTKA.js.map +1 -0
- package/dist/{chunk-HOFYJEJ4.js → chunk-UBQLXQ7I.js} +11 -11
- package/dist/cli/setup/env-metadata.d.ts.map +1 -1
- package/dist/cli.js +8 -7
- package/dist/cli.js.map +1 -1
- package/dist/{config-QLINHCHD.js → config-WTRSZLOC.js} +4 -3
- package/dist/config-WTRSZLOC.js.map +1 -0
- package/dist/config-schema.d.ts +17 -1
- package/dist/config-schema.d.ts.map +1 -1
- package/dist/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/errors/PhaseAbortedError.d.ts +3 -3
- package/dist/errors/PhaseAbortedError.d.ts.map +1 -1
- package/dist/errors-S3BWYA4I.js +43 -0
- package/dist/errors-S3BWYA4I.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -11
- package/dist/{init-TDKDC6YP.js → init-QQDXGTPB.js} +7 -6
- package/dist/{init-TDKDC6YP.js.map → init-QQDXGTPB.js.map} +1 -1
- package/dist/lib.js +9 -7
- package/dist/lib.js.map +1 -1
- package/dist/orchestrator/IssueProcessingContext.d.ts +39 -21
- package/dist/orchestrator/IssueProcessingContext.d.ts.map +1 -1
- package/dist/orchestrator/PipelineOrchestrator.d.ts +10 -1
- package/dist/orchestrator/PipelineOrchestrator.d.ts.map +1 -1
- package/dist/orchestrator/steps/PhaseLoopStep.d.ts +1 -1
- package/dist/orchestrator/steps/PhaseLoopStep.d.ts.map +1 -1
- package/dist/orchestrator/steps/SetupStep.d.ts.map +1 -1
- package/dist/persistence/PlanPersistence.d.ts +7 -1
- package/dist/persistence/PlanPersistence.d.ts.map +1 -1
- package/dist/phases/BasePhase.d.ts +31 -42
- package/dist/phases/BasePhase.d.ts.map +1 -1
- package/dist/phases/BuildPhase.d.ts.map +1 -1
- package/dist/phases/PhaseFactory.d.ts +2 -3
- package/dist/phases/PhaseFactory.d.ts.map +1 -1
- package/dist/phases/PhaseOutcome.d.ts +42 -0
- package/dist/phases/PhaseOutcome.d.ts.map +1 -0
- package/dist/phases/PlanPhase.d.ts +1 -1
- package/dist/phases/PlanPhase.d.ts.map +1 -1
- package/dist/phases/ReleasePhase.d.ts +8 -18
- package/dist/phases/ReleasePhase.d.ts.map +1 -1
- package/dist/phases/UatPhase.d.ts +7 -24
- package/dist/phases/UatPhase.d.ts.map +1 -1
- package/dist/phases/VerifyPhase.d.ts +4 -4
- package/dist/phases/VerifyPhase.d.ts.map +1 -1
- package/dist/poller/IssuePoller.d.ts.map +1 -1
- package/dist/prompts/release-templates.d.ts.map +1 -1
- package/dist/prompts/templates.d.ts.map +1 -1
- package/dist/{restart-RNXGTDWZ.js → restart-BMILTP5X.js} +6 -5
- package/dist/{restart-RNXGTDWZ.js.map → restart-BMILTP5X.js.map} +1 -1
- package/dist/run.js +14 -11
- package/dist/run.js.map +1 -1
- package/dist/settings/ExperimentalSettings.d.ts +1 -1
- package/dist/settings/ExperimentalSettings.d.ts.map +1 -1
- package/dist/start-6QRW6IJI.js +15 -0
- package/dist/start-6QRW6IJI.js.map +1 -0
- package/dist/terminal/TerminalManager.d.ts +62 -0
- package/dist/terminal/TerminalManager.d.ts.map +1 -0
- package/dist/terminal/TerminalWebSocket.d.ts +9 -0
- package/dist/terminal/TerminalWebSocket.d.ts.map +1 -0
- package/dist/tracker/ExecutableTask.d.ts +4 -2
- package/dist/tracker/ExecutableTask.d.ts.map +1 -1
- package/dist/tracker/IssueState.d.ts +11 -1
- package/dist/tracker/IssueState.d.ts.map +1 -1
- package/dist/tracker/IssueTracker.d.ts +19 -1
- package/dist/tracker/IssueTracker.d.ts.map +1 -1
- package/dist/web/WebServer.d.ts +4 -0
- package/dist/web/WebServer.d.ts.map +1 -1
- package/dist/web/routes/terminal.d.ts +11 -0
- package/dist/web/routes/terminal.d.ts.map +1 -0
- package/dist/webhook/CommandExecutor.d.ts.map +1 -1
- package/package.json +7 -1
- package/src/web/frontend/dist/assets/index-COYziOhv.css +1 -0
- package/src/web/frontend/dist/assets/index-D_oTMuJU.js +151 -0
- package/src/web/frontend/dist/index.html +2 -2
- package/dist/chunk-4LFNFRCL.js.map +0 -1
- package/dist/chunk-5UPYA6KH.js.map +0 -1
- package/dist/chunk-DADQSKPL.js +0 -1
- package/dist/chunk-FWEW5E3B.js.map +0 -1
- package/dist/chunk-K2OTLYJI.js.map +0 -1
- package/dist/chunk-KTYPZTF4.js.map +0 -1
- package/dist/chunk-P4O4ZXEC.js.map +0 -1
- package/dist/start-27GRO4DP.js +0 -14
- package/src/web/frontend/dist/assets/index-C4NXoH9S.js +0 -133
- package/src/web/frontend/dist/assets/index-C7lorIa0.css +0 -1
- /package/dist/{ai-runner-SVUNA3FX.js.map → AIRunnerRegistry-II3WWSFN.js.map} +0 -0
- /package/dist/{chunk-DADQSKPL.js.map → PtyRunner-6UGI5STW.js.map} +0 -0
- /package/dist/{config-QLINHCHD.js.map → TerminalManager-RT2N7N5R.js.map} +0 -0
- /package/dist/{start-27GRO4DP.js.map → ai-runner-HLA44WI6.js.map} +0 -0
- /package/dist/{chunk-JINMYD56.js.map → chunk-2MESXJEZ.js.map} +0 -0
- /package/dist/{chunk-HOFYJEJ4.js.map → chunk-UBQLXQ7I.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
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';\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 const binaryMap: Record<string, string> = {\n 'claude-internal': 'claude-internal',\n 'cursor-agent': 'cursor-agent',\n 'codebuddy': 'codebuddy',\n };\n const binary = binaryMap[mode] ?? 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 };\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 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: '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 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 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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/git/GitOperations.ts","../src/events/EventBus.ts","../src/utils/AsyncMutex.ts","../src/tracker/BaseTracker.ts","../src/tracker/IssueRecordHelper.ts","../src/tracker/ExecutableTask.ts","../src/prompts/templates.ts","../src/git/ConflictResolver.ts"],"sourcesContent":["import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { logger as rootLogger } from '../logger.js';\n\nconst execFileAsync = promisify(execFile);\nconst logger = rootLogger.child('GitOperations');\n\nexport class GitOperations {\n private workDir: string;\n\n constructor(workDir: string) {\n this.workDir = workDir;\n }\n\n private async exec(args: string[]): Promise<string> {\n logger.debug('git exec', { args });\n const { stdout } = await execFileAsync('git', args, {\n cwd: this.workDir,\n maxBuffer: 10 * 1024 * 1024,\n env: { ...process.env, HUSKY: '0' },\n });\n return stdout.trim();\n }\n\n async fetchAndPull(branch: string): Promise<void> {\n await this.exec(['fetch', 'origin']);\n await this.exec(['checkout', '-f', branch]);\n await this.exec(['pull', 'origin', branch]);\n logger.info('Fetched and pulled', { branch });\n }\n\n async fetch(): Promise<void> {\n await this.exec(['fetch', 'origin']);\n logger.info('Fetched from origin');\n }\n\n async createBranch(name: string, from: string): Promise<void> {\n // Create branch from origin/<from> without needing to checkout <from> first\n // Use -f to force checkout when untracked files conflict with the target\n await this.exec(['checkout', '-f', '-b', name, `origin/${from}`]);\n logger.info('Branch created', { name, from: `origin/${from}` });\n }\n\n async checkout(branch: string): Promise<void> {\n await this.exec(['checkout', '-f', branch]);\n logger.info('Checked out', { branch });\n }\n\n async add(files: string[]): Promise<void> {\n await this.exec(['add', ...files]);\n }\n\n async commit(message: string): Promise<void> {\n await this.exec(['commit', '--no-verify', '-m', message]);\n logger.info('Committed', { message: message.slice(0, 80) });\n }\n\n async push(branch: string): Promise<void> {\n await this.exec(['push', '--no-verify', '-u', 'origin', branch]);\n logger.info('Pushed', { branch });\n }\n\n async branchExists(name: string): Promise<boolean> {\n try {\n await this.exec(['rev-parse', '--verify', name]);\n return true;\n } catch {\n return false;\n }\n }\n\n async remoteBranchExists(name: string): Promise<boolean> {\n try {\n await this.exec(['ls-remote', '--exit-code', '--heads', 'origin', name]);\n return true;\n } catch {\n return false;\n }\n }\n\n async getCurrentBranch(): Promise<string> {\n return this.exec(['rev-parse', '--abbrev-ref', 'HEAD']);\n }\n\n async stash(): Promise<void> {\n await this.exec(['stash']);\n }\n\n async stashPop(): Promise<void> {\n await this.exec(['stash', 'pop']);\n }\n\n async hasChanges(): Promise<boolean> {\n const status = await this.exec(['status', '--porcelain']);\n return status.length > 0;\n }\n\n async addAndCommit(files: string[], message: string): Promise<void> {\n await this.add(files);\n await this.commit(message);\n }\n\n async fetchBranch(branch: string): Promise<void> {\n await this.exec(['fetch', 'origin', branch]);\n logger.info('Fetched specific branch', { branch });\n }\n\n async checkoutTrack(remoteBranch: string): Promise<void> {\n await this.fetchBranch(remoteBranch);\n await this.exec(['checkout', '-f', '-B', remoteBranch, 'FETCH_HEAD']);\n logger.info('Checked out remote branch via FETCH_HEAD', { remoteBranch });\n }\n\n async addCommitAndPush(files: string[], message: string, branch: string): Promise<void> {\n await this.add(files);\n await this.commit(message);\n await this.push(branch);\n }\n\n async deleteBranch(name: string): Promise<void> {\n await this.exec(['branch', '-D', name]);\n logger.info('Branch deleted', { name });\n }\n\n async deleteRemoteBranch(name: string): Promise<void> {\n await this.exec(['push', 'origin', '--delete', name]);\n logger.info('Remote branch deleted', { name });\n }\n\n async worktreeAdd(dir: string, newBranch: string, startPoint: string): Promise<void> {\n await this.exec(['worktree', 'add', '-b', newBranch, dir, startPoint]);\n logger.info('Worktree added (new branch)', { dir, newBranch, startPoint });\n }\n\n async worktreeAddExisting(dir: string, branch: string): Promise<void> {\n await this.exec(['worktree', 'add', dir, branch]);\n logger.info('Worktree added (existing branch)', { dir, branch });\n }\n\n async worktreeAddTracking(dir: string, remoteBranch: string): Promise<void> {\n await this.exec(['worktree', 'add', '--track', '-b', remoteBranch, dir, `origin/${remoteBranch}`]);\n logger.info('Worktree added (tracking remote)', { dir, remoteBranch });\n }\n\n async worktreeRemove(dir: string, force = false): Promise<void> {\n const args = ['worktree', 'remove', dir];\n if (force) args.push('--force');\n await this.exec(args);\n logger.info('Worktree removed', { dir, force });\n }\n\n async worktreePrune(): Promise<void> {\n await this.exec(['worktree', 'prune']);\n logger.info('Worktree pruned stale entries');\n }\n\n async worktreeList(): Promise<string[]> {\n const output = await this.exec(['worktree', 'list', '--porcelain']);\n return output\n .split('\\n')\n .filter((line) => line.startsWith('worktree '))\n .map((line) => line.replace('worktree ', ''));\n }\n\n async showFile(ref: string, filePath: string): Promise<string | null> {\n try {\n return await this.exec(['show', `${ref}:${filePath}`]);\n } catch {\n return null;\n }\n }\n\n async getConflictFiles(): Promise<string[]> {\n const output = await this.exec(['diff', '--name-only', '--diff-filter=U']);\n if (!output) return [];\n return output.split('\\n').filter(Boolean);\n }\n\n async rebase(targetRef: string): Promise<{ success: boolean; conflictFiles: string[] }> {\n try {\n await this.exec(['rebase', targetRef]);\n return { success: true, conflictFiles: [] };\n } catch (err) {\n const msg = (err as Error).message || '';\n if (msg.includes('CONFLICT') || msg.includes('could not apply')) {\n const conflictFiles = await this.getConflictFiles();\n return { success: false, conflictFiles };\n }\n throw err;\n }\n }\n\n async rebaseContinue(): Promise<{ done: boolean; conflictFiles: string[] }> {\n try {\n await this.exec(['-c', 'core.editor=true', 'rebase', '--continue']);\n return { done: true, conflictFiles: [] };\n } catch (err) {\n const msg = (err as Error).message || '';\n if (msg.includes('CONFLICT') || msg.includes('could not apply')) {\n const conflictFiles = await this.getConflictFiles();\n return { done: false, conflictFiles };\n }\n throw err;\n }\n }\n\n async rebaseAbort(): Promise<void> {\n await this.exec(['rebase', '--abort']);\n logger.info('Rebase aborted');\n }\n\n async isRebaseInProgress(): Promise<boolean> {\n const status = await this.exec(['status']);\n return status.includes('rebase in progress');\n }\n\n async forcePush(branch: string): Promise<void> {\n await this.exec(['push', '--no-verify', '--force-with-lease', '-u', 'origin', branch]);\n logger.info('Force pushed', { branch });\n }\n\n async mergeFF(branch: string): Promise<void> {\n await this.exec(['merge', '--ff-only', branch]);\n logger.info('Fast-forward merged', { branch });\n }\n\n async merge(branch: string, message: string): Promise<void> {\n await this.exec(['merge', '--no-ff', '--no-verify', '-m', message, branch]);\n logger.info('Merged', { branch, message: message.slice(0, 80) });\n }\n}\n","import { EventEmitter } from 'node:events';\n\nexport type EventType =\n | 'issue:created'\n | 'issue:stateChanged'\n | 'issue:failed'\n | 'issue:deleted'\n | 'issue:resetForRetry'\n | 'issue:restarted'\n | 'issue:retryFromPhase'\n | 'poll:tick'\n | 'heartbeat'\n | 'agent:output'\n | 'pipeline:progress'\n | 'review:requested'\n | 'review:approved'\n | 'review:rejected'\n | 'conflict:started'\n | 'conflict:resolved'\n | 'conflict:failed'\n | 'update:checking'\n | 'update:available'\n | 'update:downloading'\n | 'update:completed'\n | 'update:failed'\n // Braindump events\n | 'braindump:created'\n | 'braindump:split:done'\n | 'braindump:confirmed'\n | 'braindump:task:started'\n | 'braindump:task:completed'\n | 'braindump:task:merging'\n | 'braindump:task:merged'\n | 'braindump:task:failed'\n | 'braindump:completed'\n | 'braindump:failed'\n // Distill events\n | 'distill:diary:created'\n | 'distill:started'\n | 'distill:memory:updated'\n | 'distill:rule:generated'\n | 'distill:completed'\n | 'distill:failed'\n // Verify-fix loop events\n | 'verify:loopStarted'\n | 'verify:iterationComplete'\n | 'verify:loopExhausted'\n // Release events\n | 'release:gateRequested'\n // UAT async events\n | 'uat:gateRequested'\n | 'uat:completed'\n | 'uat:failed'\n // Phase abort/continue/redo events\n | 'issue:paused'\n | 'issue:continued'\n | 'issue:redone'\n // Preview reaper events\n | 'preview:reaped';\n\nexport interface EventPayload {\n type: EventType;\n data: unknown;\n timestamp: string;\n}\n\n/**\n * Typed event bus based on EventEmitter.\n *\n * Exported as a class so consumers can receive an instance via dependency\n * injection instead of relying on the global singleton.\n */\nexport class EventBus extends EventEmitter {\n emit(event: string | symbol, ...args: unknown[]): boolean {\n super.emit('*', event, ...args);\n return super.emit(event, ...args);\n }\n\n emitTyped(type: EventType, data: unknown): void {\n const payload: EventPayload = {\n type,\n data,\n timestamp: new Date().toISOString(),\n };\n this.emit(type, payload);\n }\n}\n\n/**\n * Global singleton — preserved for backward compatibility.\n *\n * New code should prefer receiving an `EventBus` instance via constructor\n * injection. The global singleton can be passed as the default value.\n */\nexport const eventBus = new EventBus();\n","/**\n * Promise-based async mutex for serializing access to shared resources\n * in a single Node.js process (e.g. mainGit operations, tracker file writes).\n */\nexport class AsyncMutex {\n private queue: Array<() => void> = [];\n private locked = false;\n\n async runExclusive<T>(fn: () => Promise<T>): Promise<T> {\n await this.acquire();\n try {\n return await fn();\n } finally {\n this.release();\n }\n }\n\n private acquire(): Promise<void> {\n if (!this.locked) {\n this.locked = true;\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => {\n this.queue.push(resolve);\n });\n }\n\n private release(): void {\n const next = this.queue.shift();\n if (next) {\n next();\n } else {\n this.locked = false;\n }\n }\n\n get isLocked(): boolean {\n return this.locked;\n }\n\n get queueLength(): number {\n return this.queue.length;\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { logger as rootLogger } from '../logger.js';\n\n/**\n * BaseTracker — JSON 文件持久化的泛型 Tracker 基类。\n *\n * 集中公共的 load/save/get/getAll/delete 逻辑。\n * 子类通过构造函数参数注入 collectionKey 和 trackerName。\n */\nexport abstract class BaseTracker<TRecord> {\n protected readonly filePath: string;\n protected data: Record<string, Record<string, TRecord>>;\n\n /** JSON 根字段名(如 'issues' 或 'batches')*/\n protected readonly collectionKey: string;\n /** 临时文件前缀(如 'tracker' 或 'braindump-tracker')*/\n protected readonly trackerName: string;\n\n constructor(dataDir: string, filename: string, collectionKey: string, trackerName: string) {\n this.collectionKey = collectionKey;\n this.trackerName = trackerName;\n this.filePath = path.join(dataDir, filename);\n this.data = this.load();\n }\n\n protected load(): Record<string, Record<string, TRecord>> {\n try {\n if (fs.existsSync(this.filePath)) {\n const raw = fs.readFileSync(this.filePath, 'utf-8');\n return JSON.parse(raw);\n }\n } catch (err) {\n rootLogger.child(this.trackerName).error(\n 'Failed to load tracker data',\n { error: (err as Error).message },\n );\n }\n return { [this.collectionKey]: {} };\n }\n\n protected save(): void {\n const dir = path.dirname(this.filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n const tmpPath = path.join(dir,\n `.${this.trackerName}-${process.pid}-${Date.now()}.tmp`);\n fs.writeFileSync(tmpPath, JSON.stringify(this.data, null, 2), 'utf-8');\n fs.renameSync(tmpPath, this.filePath);\n }\n\n /** 获取记录集合的引用 */\n protected get collection(): Record<string, TRecord> {\n return this.data[this.collectionKey] as Record<string, TRecord>;\n }\n\n protected getByKey(key: string): TRecord | undefined {\n return this.collection[key];\n }\n\n protected getAllRecords(): TRecord[] {\n return Object.values(this.collection);\n }\n\n protected setRecord(key: string, record: TRecord): void {\n this.collection[key] = record;\n }\n\n protected deleteByKey(key: string): boolean {\n if (!this.collection[key]) return false;\n delete this.collection[key];\n this.save();\n return true;\n }\n}\n","import type { IssueRecord } from './IssueState.js';\n\n/**\n * IssueRecord 身份字段辅助函数。\n *\n * 从 demandSpec 读取身份信息。\n */\n\n/** 获取显示 IID(工蜂 Issue IID) */\nexport function getIid(record: IssueRecord): number {\n return Number(record.demandSpec!.sourceRef.displayId);\n}\n\n/** 获取外部 ID(工蜂 Issue ID) */\nexport function getExternalId(record: IssueRecord): number {\n return Number(record.demandSpec!.sourceRef.externalId);\n}\n\n/** 获取标题 */\nexport function getTitle(record: IssueRecord): string {\n return record.demandSpec!.title;\n}\n","import type { IssueRecord } from './IssueState.js';\nimport type { BraindumpTask } from '../braindump/BraindumpState.js';\nimport type { ActionLifecycleManager } from '../lifecycle/ActionLifecycleManager.js';\nimport { getIid, getTitle } from './IssueRecordHelper.js';\n\n/**\n * UnifiedTaskStatus — 所有任务类型共享的通用状态枚举。\n *\n * 与 IssueState/BatchStatus/TaskStatus 共存,不替代它们。\n * 用于跨任务类型的通用逻辑(如统一 dashboard、统一恢复)。\n */\nexport type UnifiedTaskStatus =\n | 'idle' // 尚未开始\n | 'preparing' // 准备中(创建分支、安装依赖等)\n | 'running' // 执行中\n | 'waiting' // 等待外部输入(审核等)\n | 'merging' // 合并中\n | 'completed' // 完成\n | 'failed'; // 失败\n\n/**\n * ExecutableTask — 所有可执行任务的统一接口。\n *\n * IssueRecord 和 BraindumpTask 都可以投影为此接口,\n * 用于跨任务类型的通用操作。\n */\nexport interface ExecutableTask {\n /** 任务类型标识 */\n readonly kind: 'issue' | 'braindump-task';\n /** 唯一标识(issue: string(issueIid), braindump: taskId) */\n readonly taskId: string;\n /** 显示标题 */\n readonly title: string;\n /** 统一状态 */\n readonly status: UnifiedTaskStatus;\n /** 重试次数 */\n readonly attempts: number;\n /** 最后错误 */\n readonly lastError?: string;\n /** 创建时间 */\n readonly createdAt: string;\n /** 最后更新时间 */\n readonly updatedAt: string;\n /** 特性分支名 */\n readonly branchName?: string;\n /** 原始状态值(IssueState 或 TaskStatus) */\n readonly sourceState?: string;\n /** 过滤分类:active/completed/failed/blocked/idle/skipped */\n readonly stateCategory?: string;\n /** 预计算的状态展示标签(由后端投影时通过 ActionLifecycleManager.resolveLabel 生成) */\n readonly displayLabel?: string;\n\n /** 阶段进度快照(由后端投影时预计算)。\n * 各阶段按定义顺序排列,status 为 pending/in_progress/completed/failed。\n * 未提供时前端不渲染阶段进度列。 */\n readonly phaseProgress?: { name: string; label: string; status: 'pending' | 'in_progress' | 'completed' | 'failed' }[];\n}\n\n/**\n * ActionStatus → UnifiedTaskStatus 映射。\n *\n * 使用 ActionLifecycleManager 的 resolve() 返回的 ActionStatus 做语义映射:\n * - idle/skipped → 'idle'\n * - ready → 'preparing'\n * - running → 'running'\n * - waiting → 'waiting'\n * - done → 'completed'\n * - failed → 'failed'\n */\nexport function issueStateToUnified(actionStatus: string): UnifiedTaskStatus {\n switch (actionStatus) {\n case 'idle':\n case 'skipped':\n return 'idle';\n case 'ready':\n return 'preparing';\n case 'running':\n return 'running';\n case 'waiting':\n return 'waiting';\n case 'done':\n return 'completed';\n case 'failed':\n return 'failed';\n default:\n return 'idle';\n }\n}\n\n/**\n * TaskStatus → UnifiedTaskStatus 映射。\n */\nexport function taskStatusToUnified(status: string): UnifiedTaskStatus {\n switch (status) {\n case 'pending':\n case 'blocked':\n return 'idle';\n case 'running':\n return 'running';\n case 'done':\n return 'preparing'; // done but not yet merged\n case 'merging':\n case 'conflict_resolving':\n return 'merging';\n case 'merged':\n return 'completed';\n case 'failed':\n return 'failed';\n default:\n return 'idle';\n }\n}\n\n/** 从 UnifiedTaskStatus 派生 stateCategory(用于前端过滤) */\nexport function unifiedStatusToCategory(status: UnifiedTaskStatus): string {\n switch (status) {\n case 'running':\n case 'preparing':\n case 'merging':\n return 'active';\n case 'waiting':\n return 'blocked';\n case 'completed':\n return 'completed';\n case 'failed':\n return 'failed';\n case 'idle':\n default:\n return 'idle';\n }\n}\n\n/**\n * 为 Issue 计算 stateCategory(精确版,使用 ActionLifecycleManager)。\n * 比 unifiedStatusToCategory 更精准,能区分 skipped 等状态。\n */\nexport function issueStateCategory(record: IssueRecord, lm: ActionLifecycleManager): string {\n if (lm.isTerminal(record.state)) {\n if (record.state === 'failed') return 'failed';\n if (record.state === 'deployed') return 'deployed';\n if (record.state === 'completed') return 'completed';\n return 'skipped';\n }\n if (lm.isBlocked(record.state)) return 'blocked';\n return 'active';\n}\n\n// ── Adapters ──\n\n/** 将 IssueRecord 投影为 ExecutableTask */\nexport function issueToExecutableTask(\n record: IssueRecord,\n lm: ActionLifecycleManager,\n): ExecutableTask {\n const actionState = lm.resolve(record.state, record.currentPhase);\n\n // 预计算阶段进度快照\n const phaseStatusMap = lm.derivePhaseStatuses(record.state, record.currentPhase);\n const phaseDefs = lm.getPhaseDefs();\n const phaseProgress = phaseDefs.map(p => ({\n name: p.name,\n label: p.label,\n status: phaseStatusMap[p.name] ?? 'pending' as const,\n }));\n\n return {\n kind: 'issue',\n taskId: String(getIid(record)),\n title: getTitle(record),\n status: issueStateToUnified(actionState.status),\n attempts: record.attempts,\n lastError: record.lastError,\n createdAt: record.createdAt,\n updatedAt: record.updatedAt,\n branchName: record.branchName,\n sourceState: record.state,\n stateCategory: issueStateCategory(record, lm),\n displayLabel: lm.resolveLabel(record.state, record.currentPhase),\n phaseProgress,\n };\n}\n\n/** 将 BraindumpTask 投影为 ExecutableTask */\nexport function braindumpTaskToExecutableTask(\n task: BraindumpTask,\n batch: { createdAt: string; updatedAt: string },\n): ExecutableTask {\n const status = taskStatusToUnified(task.status);\n return {\n kind: 'braindump-task',\n taskId: task.id,\n title: task.title,\n status,\n attempts: task.attempts,\n lastError: task.lastError,\n createdAt: task.startedAt ?? batch.createdAt,\n updatedAt: task.completedAt ?? task.startedAt ?? batch.updatedAt,\n branchName: task.branchName,\n sourceState: task.status,\n stateCategory: unifiedStatusToCategory(status),\n };\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { t } from '../i18n/index.js';\nimport { getProjectKnowledge } from '../knowledge/index.js';\nimport { KNOWLEDGE_DEFAULTS } from '../knowledge/KnowledgeDefaults.js';\nimport type { ProjectKnowledge } from '../knowledge/ProjectKnowledge.js';\nimport type { DemandSpec } from '../demand/DemandSpec.js';\nimport type { RepoContext } from '../workspace/index.js';\n\nexport interface WorkspaceLayout {\n repos: RepoContext[];\n workspaceRoot: string;\n}\n\nexport interface PromptContext {\n issueTitle: string;\n issueDescription: string;\n issueIid: number;\n supplementText?: string;\n workspace?: WorkspaceLayout;\n}\n\nfunction planDir(iid: number): string {\n return `.claude-plan/issue-${iid}`;\n}\n\n/**\n * Build template variable map from knowledge config (or defaults).\n */\nexport function getKnowledgeForPrompt(): Record<string, string> {\n const k: ProjectKnowledge = getProjectKnowledge() ?? KNOWLEDGE_DEFAULTS;\n\n const codeStyleParts: string[] = [];\n if (k.codeStyle.indentStyle === 'spaces') {\n codeStyleParts.push(`${k.codeStyle.indentSize}空格缩进`);\n } else {\n codeStyleParts.push('Tab缩进');\n }\n codeStyleParts.push(`${k.codeStyle.lineWidth}字符行宽`);\n codeStyleParts.push('命名规范等');\n if (k.codeStyle.additionalRules?.length) {\n codeStyleParts.push(...k.codeStyle.additionalRules);\n }\n\n const knownIssueLines = k.knownIssues.map(issue => `- ${issue.description}${issue.advice ? `,${issue.advice}` : ''}`);\n\n return {\n dependencyCheckPath: k.toolchain.dependencyCheckPath ?? 'node_modules/.bin/eslint',\n installCommand: k.toolchain.installCommand,\n installFallbackCommand: k.toolchain.installFallbackCommand ?? `${k.toolchain.installCommand} --ignore-scripts`,\n lintCommand: k.toolchain.lintCommand ?? 'npm run lint',\n buildCommand: k.toolchain.buildCommand ?? 'npm run build',\n testCommand: k.toolchain.testCommand ?? 'npm test',\n testFilesCommand: k.toolchain.testFilesCommand\n ?? `${k.toolchain.testCommand ?? 'npm test'} -- <涉及变更的测试文件>`,\n knownIssuesSection: knownIssueLines.length > 0\n ? knownIssueLines.join('\\n')\n : '- 无已知预存问题',\n codeStyleDescription: codeStyleParts.join('、'),\n // E2E related\n e2eDir: k.structure.e2eDir ?? 'e2e',\n e2eTool: k.structure.e2eTool ?? 'E2E',\n frontendDir: k.structure.frontendDir ?? 'frontend',\n };\n}\n\n/**\n * 从 DemandSpec 构建 prompt 上下文,统一补充信息的格式化。\n */\nexport function demandToPromptContext(demand: DemandSpec): {\n title: string;\n description: string;\n displayId: string;\n supplementText: string;\n} {\n const parts: string[] = [];\n const s = demand.supplement;\n if (s?.requirements) parts.push(`### 补充需求说明\\n${s.requirements}`);\n if (s?.acceptanceCriteria) parts.push(`### 验收标准\\n${s.acceptanceCriteria}`);\n if (s?.scope) parts.push(`### 变更范围\\n${s.scope}`);\n if (s?.constraints) parts.push(`### 约束条件\\n${s.constraints}`);\n if (s?.references) parts.push(`### 参考链接\\n${s.references}`);\n if (s?.freeText) parts.push(`### 其他补充\\n${s.freeText}`);\n return {\n title: demand.title,\n description: demand.description,\n displayId: demand.sourceRef.displayId ?? demand.demandId,\n supplementText: parts.length ? `## 补充信息\\n\\n${parts.join('\\n\\n')}` : '',\n };\n}\n\n/**\n * Build a workspace layout section for multi-repo prompts.\n * Returns empty string when workspace has only one repo.\n */\nexport function buildWorkspaceSection(workspace?: WorkspaceLayout): string {\n if (!workspace || workspace.repos.length <= 1) return '';\n\n const lines: string[] = [\n '## 多仓库工作区',\n '',\n '当前工作区包含多个关联仓库,你可以跨仓库读写文件。各仓库相对于工作区根目录的布局如下:',\n '',\n '| 仓库 | 相对路径 | 角色 |',\n '|------|---------|------|',\n ];\n\n for (const repo of workspace.repos) {\n const relPath = repo.name + (repo.workDir !== repo.gitRootDir\n ? ` (项目目录: ${repo.name}/${repo.workDir.slice(repo.gitRootDir.length + 1)})`\n : '');\n const roleText = repo.role || (repo.isPrimary ? '主仓库' : '关联仓库');\n lines.push(`| ${repo.name} | \\`${relPath}\\` | ${roleText} |`);\n }\n\n lines.push('');\n lines.push('修改任一仓库的代码时,使用对应仓库的相对路径即可。请先阅读各仓库根目录下的 CLAUDE.md(如有)了解项目约定。');\n\n return lines.join('\\n');\n}\n\nexport function analysisPrompt(ctx: PromptContext): string {\n const supplementSection = ctx.supplementText ? `\\n\\n${ctx.supplementText}` : '';\n const pd = planDir(ctx.issueIid);\n return t('prompt.analysis', {\n iid: ctx.issueIid,\n title: ctx.issueTitle,\n description: ctx.issueDescription,\n supplement: supplementSection,\n planDir: pd,\n });\n}\n\nexport function designPrompt(ctx: PromptContext): string {\n const supplementSection = ctx.supplementText ? `\\n\\n${ctx.supplementText}` : '';\n const pd = planDir(ctx.issueIid);\n return t('prompt.design', {\n iid: ctx.issueIid,\n title: ctx.issueTitle,\n supplement: supplementSection,\n planDir: pd,\n });\n}\n\nexport function implementPrompt(ctx: PromptContext): string {\n const pd = planDir(ctx.issueIid);\n const kv = getKnowledgeForPrompt();\n return t('prompt.implement', {\n iid: ctx.issueIid,\n title: ctx.issueTitle,\n planDir: pd,\n ...kv,\n });\n}\n\nexport function verifyPrompt(ctx: PromptContext): string {\n const pd = planDir(ctx.issueIid);\n const kv = getKnowledgeForPrompt();\n return t('prompt.verify', {\n iid: ctx.issueIid,\n title: ctx.issueTitle,\n planDir: pd,\n ...kv,\n });\n}\n\nexport function planModeVerifyPrompt(ctx: PromptContext): string {\n const pd = planDir(ctx.issueIid);\n const kv = getKnowledgeForPrompt();\n const wsSection = buildWorkspaceSection(ctx.workspace);\n const base = t('prompt.planModeVerify', {\n iid: ctx.issueIid,\n title: ctx.issueTitle,\n planDir: pd,\n ...kv,\n });\n return wsSection ? `${base}\\n\\n${wsSection}` : base;\n}\n\nexport function planPrompt(ctx: PromptContext): string {\n const supplementSection = ctx.supplementText ? `\\n\\n${ctx.supplementText}` : '';\n const wsSection = buildWorkspaceSection(ctx.workspace);\n const pd = planDir(ctx.issueIid);\n const base = t('prompt.plan', {\n iid: ctx.issueIid,\n title: ctx.issueTitle,\n description: ctx.issueDescription,\n supplement: supplementSection,\n planDir: pd,\n });\n return wsSection ? `${base}\\n\\n${wsSection}` : base;\n}\n\nexport function buildPrompt(ctx: PromptContext): string {\n const pd = planDir(ctx.issueIid);\n const kv = getKnowledgeForPrompt();\n const wsSection = buildWorkspaceSection(ctx.workspace);\n const base = t('prompt.build', {\n iid: ctx.issueIid,\n title: ctx.issueTitle,\n planDir: pd,\n ...kv,\n });\n return wsSection ? `${base}\\n\\n${wsSection}` : base;\n}\n\nexport interface ReviewRoundForPrompt {\n round: number;\n feedback: string;\n timestamp: string;\n}\n\nexport function rePlanPrompt(ctx: PromptContext, history: ReviewRoundForPrompt[]): string {\n const supplementSection = ctx.supplementText ? `\\n\\n${ctx.supplementText}` : '';\n const wsSection = buildWorkspaceSection(ctx.workspace);\n const pd = planDir(ctx.issueIid);\n const feedbackLines = history.map(\n r => t('prompt.rePlanRound', { round: r.round, timestamp: r.timestamp, feedback: r.feedback })\n ).join('\\n\\n');\n const base = t('prompt.rePlan', {\n iid: ctx.issueIid,\n title: ctx.issueTitle,\n description: ctx.issueDescription,\n supplement: supplementSection,\n historyCount: history.length,\n feedbackLines,\n planDir: pd,\n });\n return wsSection ? `${base}\\n\\n${wsSection}` : base;\n}\n\nexport interface E2ePromptPorts {\n backendPort: number;\n frontendPort: number;\n host: string;\n}\n\nexport interface UatToolConfig {\n vendorDir: string;\n configFile: string;\n}\n\n/**\n * Load all SKILL.md files from the vendor .cursor/skills/ directory.\n * Scans every sub-directory for SKILL.md, concatenates them in sorted order.\n * Falls back to a top-level SKILL.md if .cursor/skills/ doesn't exist.\n */\nfunction loadUatSkill(vendorDir: string): string | null {\n const skillsDir = path.join(vendorDir, '.cursor/skills');\n\n if (fs.existsSync(skillsDir)) {\n try {\n const entries = fs.readdirSync(skillsDir, { withFileTypes: true })\n .filter(e => e.isDirectory())\n .sort((a, b) => a.name.localeCompare(b.name));\n\n const parts: string[] = [];\n for (const entry of entries) {\n const skillFile = path.join(skillsDir, entry.name, 'SKILL.md');\n if (fs.existsSync(skillFile)) {\n try {\n parts.push(fs.readFileSync(skillFile, 'utf-8'));\n } catch { /* skip unreadable */ }\n }\n }\n if (parts.length > 0) return parts.join('\\n\\n---\\n\\n');\n } catch { /* fall through */ }\n }\n\n const fallback = path.join(vendorDir, 'SKILL.md');\n if (fs.existsSync(fallback)) {\n try { return fs.readFileSync(fallback, 'utf-8'); } catch { /* skip */ }\n }\n return null;\n}\n\nexport function e2eVerifyPromptSuffix(\n ctx: PromptContext,\n ports?: E2ePromptPorts,\n uatTool?: UatToolConfig,\n): string {\n if (uatTool?.vendorDir) {\n return buildOaUatPrompt(ctx, uatTool, ports);\n }\n return buildGenericE2ePrompt(ctx, ports);\n}\n\n/**\n * Load the \"e2e_prompt\" field from the oa_pc_uat config.json.\n * Returns the custom prompt string or null if not found / not set.\n */\nfunction loadUatConfigPrompt(configFile: string): string | null {\n if (!configFile || !fs.existsSync(configFile)) return null;\n try {\n const raw = JSON.parse(fs.readFileSync(configFile, 'utf-8'));\n if (typeof raw.e2e_prompt === 'string' && raw.e2e_prompt.trim()) {\n return raw.e2e_prompt.trim();\n }\n } catch { /* ignore parse errors */ }\n return null;\n}\n\nfunction buildOaUatPrompt(\n ctx: PromptContext,\n uatTool: UatToolConfig,\n ports?: E2ePromptPorts,\n): string {\n const vendorDir = uatTool.vendorDir;\n const configFile = uatTool.configFile\n || (fs.existsSync(path.join(vendorDir, 'config.json'))\n ? path.join(vendorDir, 'config.json')\n : '');\n\n const skillContent = loadUatSkill(vendorDir);\n const skillSection = skillContent\n ? `\\n\\n<uat-skills>\\n${skillContent}\\n</uat-skills>`\n : '';\n\n const configArg = configFile ? ` --config ${configFile}` : '';\n const outputDirArg = ` --output-dir ${vendorDir}/outputs/issue-${ctx.issueIid}`;\n const cfgLabel = configFile || 'config.json';\n const portHint = ports\n ? `\n\n> **⚠️ 端口覆盖(必须遵守)**\n> 系统已自动在动态端口启动前后端 Preview 服务,无需手动启动:\n> - 后端: http://${ports.host}:${ports.backendPort}\n> - 前端: https://${ports.host}:${ports.frontendPort}\n>\n> **在执行任何 E2E 脚本之前**,你必须先更新 \\`${cfgLabel}\\` 中的地址配置,\n> 将前端地址(base_url 等)改为 \\`https://${ports.host}:${ports.frontendPort}\\`,\n> 后端地址(api_url 等)改为 \\`http://${ports.host}:${ports.backendPort}\\`。\n> config.json 中原有的端口是开发环境默认值,不适用于当前 Preview 环境。`\n : `\n\n> **注意**:Preview 环境未启动。在执行 E2E 测试前,请确认前后端服务已运行。\n> 如果 \\`${cfgLabel}\\` 中配置的服务端口没有响应,请先手动启动前后端服务再执行脚本。`;\n\n const customPrompt = loadUatConfigPrompt(configFile);\n\n const cmdOverride = `\n\n> **⚠️ 命令参数覆盖**:项目指引中出现的所有 \\`python3 .../main.py\\` 命令,都必须替换为以下标准格式:\n> - 执行脚本:\\`python3 ${vendorDir}/main.py${configArg}${outputDirArg} --script <script.py> --headless\\`\n> - REPL 排障:\\`python3 ${vendorDir}/main.py${configArg}${outputDirArg} -i --headless\\`\n`;\n\n const instructionSection = customPrompt\n ? `\\n\\n### 项目 E2E 指引\\n\\n${customPrompt}\\n${cmdOverride}`\n : '';\n\n const defaultSteps = `\n### 执行要点\n\n1. 影响面分析:基于 \\`git diff\\` 分析本次变更影响的功能点\n2. 增量剧本生成:扫描 \\`uat-scripts/\\` 目录,仅为未覆盖场景生成新剧本\n3. 执行验证脚本:\n \\`\\`\\`bash\n python3 ${vendorDir}/main.py${configArg}${outputDirArg} --script <script.py> --headless\n \\`\\`\\`\n4. 失败时使用 REPL 排障:\n \\`\\`\\`bash\n python3 ${vendorDir}/main.py${configArg}${outputDirArg} -i --headless\n \\`\\`\\`\n5. 输出结构化验证总览(包含截图路径、执行结果、耗时)`;\n\n return `\n\n## E2E UI 验证(已启用 - OA Web UAT)\n\n本次变更已开启 E2E UI 自动验收,使用 oa_pc_uat 增量验证流水线。${portHint}\n\n**工具位置**: \\`${vendorDir}\\`\n${configFile ? `**配置文件**: \\`${configFile}\\`` : ''}\n**产物输出目录**: \\`${vendorDir}/outputs/issue-${ctx.issueIid}\\`(所有 --script 和 -i 命令必须携带 \\`${outputDirArg.trim()}\\` 参数)\n\n请严格按照以下 oa-web-uat skill 的流程执行端对端验证:\n${skillSection}\n${instructionSection}\n${customPrompt ? '' : defaultSteps}\n\n### ⛔ 阶段 Gate 约束(必须严格遵守)\n\nE2E 验证必须**严格按顺序**经过三个阶段,**禁止跳过或合并**:\n\n**Gate 1 — 影响面分析完成检查点**\n- 必须先通过 \\`git diff\\` 分析出具体的功能点清单\n- 产出物:功能点清单(列出每个受影响的功能名称、影响模块、需验证路径)\n- ❌ 如果没有产出功能点清单,禁止进入阶段 2\n\n**Gate 2 — 剧本生成完成检查点**\n- 必须先扫描 \\`uat-scripts/\\` 已有脚本,判断增量需求\n- 对于需要新增的场景,必须完成:编写 Markdown 用例 → 执行 \\`scenario-gen\\` 生成 result.json → 基于 result.json 编写 Python 脚本\n- 产出物:所有需要执行的 .py 脚本文件(已有 + 新增)必须实际存在于磁盘上\n- ✅ 验证方式:\\`ls -la\\` 确认每个脚本文件存在\n- ❌ 如果脚本文件不存在或未生成,禁止进入阶段 3\n- 📦 **中间产物归档**(Gate 2 通过后、进入 Gate 3 前执行):\n \\`\\`\\`bash\n mkdir -p ${vendorDir}/outputs/issue-${ctx.issueIid}/scenarios\n # 将 Markdown 用例、scenario-gen 的 result.json、生成的 .py 脚本都复制到产物目录\n cp <用例.md> ${vendorDir}/outputs/issue-${ctx.issueIid}/scenarios/\n cp <result.json> ${vendorDir}/outputs/issue-${ctx.issueIid}/scenarios/\n cp <生成的脚本.py> ${vendorDir}/outputs/issue-${ctx.issueIid}/scenarios/\n \\`\\`\\`\n 确保所有中间产物(用例 → 剧本 → 脚本)都可追溯。\n\n**Gate 3 — 执行阶段**\n- 只有 Gate 2 通过后才可以执行 \\`python3 ${vendorDir}/main.py${configArg}${outputDirArg} --script <script.py> --headless\\`\n- 每个脚本单独执行,逐一记录结果\n- 失败时进入 REPL 排障(\\`-i\\` 模式),排查并修复脚本\n- ⚠️ **REPL 排障后必须重跑脚本**:如果使用了 REPL 交互式探索或修改了脚本,**必须退出 REPL 后重新执行 \\`--script\\` 模式运行该脚本**。REPL 过程中产生的截图是调试中间状态,不能作为最终验证结果。只有 \\`--script\\` 模式产出的截图才是有效的验证截图\n- 最终验证标准:所有脚本都以 \\`--script\\` 模式成功执行,产出的截图反映最终正确状态\n\n将所有 E2E 测试结果汇总写入 \\`.claude-plan/issue-${ctx.issueIid}/03-uat-report.md\\`,包含:\n- 测试场景清单\n- 每个场景的执行结果(通过/失败)\n- 截图路径(如有)\n- 失败原因分析(如有失败)`;\n}\n\nfunction buildGenericE2ePrompt(ctx: PromptContext, ports?: E2ePromptPorts): string {\n const kv = getKnowledgeForPrompt();\n const frontendDir = kv.frontendDir;\n const e2eDir = kv.e2eDir;\n const e2eTool = kv.e2eTool;\n\n const serverSection = ports\n ? `\n**Preview 环境已启动(由系统管理,无需手动启动):**\n- 后端: http://${ports.host}:${ports.backendPort}\n- 前端: https://${ports.host}:${ports.frontendPort}\n\n执行 E2E 测试时请使用以下环境变量来连接已启动的服务:\n\\`\\`\\`bash\nE2E_PORT=${ports.frontendPort} E2E_HOST=${ports.host} E2E_BASE_URL=https://${ports.host}:${ports.frontendPort} \\\\\n cd ${frontendDir} && npx ${e2eTool.toLowerCase()} test\n\\`\\`\\`\n\n**注意**: 不要使用 pnpm test:e2e(它会尝试自行启动 webServer),直接用 npx ${e2eTool.toLowerCase()} test 即可复用已启动的前端。`\n : `\n执行 E2E 测试:\n\\`\\`\\`bash\ncd ${frontendDir} && pnpm test:e2e\n\\`\\`\\``;\n\n return `\n\n## E2E UI 验证(已启用)\n\n本次变更已开启 E2E UI 自动验收,请额外执行以下步骤:\n\n6. 如果本次变更涉及前端页面(${frontendDir}/ 目录有改动),请执行 UI E2E 验证:\n a. 在 ${e2eDir}/ 目录下编写针对本次变更的 ${e2eTool} 测试\n b. ${serverSection.trim()}\n c. 如果测试失败,分析失败原因并尝试修复\n7. 将 E2E 测试结果写入 \\`.claude-plan/issue-${ctx.issueIid}/03-uat-report.md\\`,包括:\n - 冒烟测试通过数 / 总数\n - 专项测试结果列表\n - 截图路径(如有)\n - 失败原因分析(如有失败)`;\n}\n\nexport interface ConflictResolveContext {\n issueIid: number;\n branchName: string;\n baseBranch: string;\n conflictFiles: string[];\n}\n\nexport function conflictResolvePrompt(ctx: ConflictResolveContext): string {\n const conflictFilesList = ctx.conflictFiles.map(f => `- \\`${f}\\``).join('\\n');\n return t('prompt.conflictResolve', {\n iid: ctx.issueIid,\n branch: ctx.branchName,\n baseBranch: ctx.baseBranch,\n conflictFilesList,\n });\n}\n\nexport function issueProgressComment(phase: string, status: string, detail?: string): string {\n const emoji: Record<string, string> = {\n analysis: '🔍', design: '📐', implement: '💻', verify: '✅',\n plan: '📋', review: '👀', build: '🔨', uat: '🧪',\n };\n const icon = emoji[phase] || '📋';\n const statusKey = status === 'completed' ? 'progress.completed' : status === 'failed' ? 'progress.failed' : 'progress.inProgress';\n const statusText = t(statusKey);\n let msg = t('progress.comment', { icon, phase, status: statusText });\n if (detail) {\n msg += `\\n\\n${detail}`;\n }\n return msg;\n}\n","import { GitOperations } from './GitOperations.js';\nimport type { AIRunner } from '../ai-runner/index.js';\nimport { conflictResolvePrompt } from '../prompts/templates.js';\nimport { logger as rootLogger } from '../logger.js';\n\nconst logger = rootLogger.child('ConflictResolver');\n\nexport interface ConflictResolveOptions {\n wtGit: GitOperations;\n targetRef: string;\n workDir: string;\n branchName: string;\n /** Identifier for logging and events (e.g. issueIid or taskId) */\n contextId: string | number;\n maxAttempts?: number;\n phaseTimeoutMs: number;\n onEvent?: (event: unknown) => void;\n}\n\n/**\n * Shared conflict resolution logic: rebase onto target, resolve conflicts with AI.\n * Extracted from PipelineOrchestrator.resolveConflict() for reuse by BraindumpOrchestrator.\n */\nexport class ConflictResolver {\n constructor(private aiRunner: AIRunner) {}\n\n /**\n * Rebase the current branch onto `targetRef` and resolve any conflicts using AI.\n * After successful resolution, the caller is responsible for force-pushing.\n *\n * @throws if conflicts cannot be resolved within maxAttempts\n */\n async resolve(opts: ConflictResolveOptions): Promise<void> {\n const { wtGit, targetRef, workDir, branchName, contextId, phaseTimeoutMs, onEvent } = opts;\n const maxAttempts = opts.maxAttempts ?? 20;\n\n // Abort residual rebase if any\n if (await wtGit.isRebaseInProgress()) {\n logger.warn('Found residual rebase in progress, aborting', { contextId });\n await wtGit.rebaseAbort();\n }\n\n // Attempt rebase\n const rebaseResult = await wtGit.rebase(targetRef);\n\n if (rebaseResult.success) {\n logger.info('Rebase succeeded without conflicts', { contextId });\n return;\n }\n\n // Has conflicts — resolve with AI\n let conflictFiles = rebaseResult.conflictFiles;\n let attempt = 0;\n\n while (conflictFiles.length > 0 && attempt < maxAttempts) {\n attempt++;\n logger.info('Resolving conflicts with AI', { contextId, attempt, conflictFiles });\n\n const prompt = conflictResolvePrompt({\n issueIid: typeof contextId === 'number' ? contextId : 0,\n branchName,\n baseBranch: targetRef.replace(/^origin\\//, ''),\n conflictFiles,\n });\n\n await this.aiRunner.run({\n prompt,\n workDir,\n timeoutMs: phaseTimeoutMs,\n onStreamEvent: onEvent ? (event: unknown) => onEvent(event) : undefined,\n });\n\n // Stage resolved files\n await wtGit.add(conflictFiles);\n\n // Continue rebase\n const continueResult = await wtGit.rebaseContinue();\n if (continueResult.done) {\n conflictFiles = [];\n } else {\n conflictFiles = continueResult.conflictFiles;\n }\n }\n\n if (conflictFiles.length > 0) {\n await wtGit.rebaseAbort();\n throw new Error(\n `Failed to resolve all conflicts after ${maxAttempts} attempts. Remaining: ${conflictFiles.join(', ')}`,\n );\n }\n\n logger.info('All conflicts resolved', { contextId, totalAttempts: attempt });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAG1B,IAAM,gBAAgB,UAAU,QAAQ;AACxC,IAAMA,UAAS,OAAW,MAAM,eAAe;AAExC,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EAER,YAAY,SAAiB;AAC3B,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAc,KAAK,MAAiC;AAClD,IAAAA,QAAO,MAAM,YAAY,EAAE,KAAK,CAAC;AACjC,UAAM,EAAE,OAAO,IAAI,MAAM,cAAc,OAAO,MAAM;AAAA,MAClD,KAAK,KAAK;AAAA,MACV,WAAW,KAAK,OAAO;AAAA,MACvB,KAAK,EAAE,GAAG,QAAQ,KAAK,OAAO,IAAI;AAAA,IACpC,CAAC;AACD,WAAO,OAAO,KAAK;AAAA,EACrB;AAAA,EAEA,MAAM,aAAa,QAA+B;AAChD,UAAM,KAAK,KAAK,CAAC,SAAS,QAAQ,CAAC;AACnC,UAAM,KAAK,KAAK,CAAC,YAAY,MAAM,MAAM,CAAC;AAC1C,UAAM,KAAK,KAAK,CAAC,QAAQ,UAAU,MAAM,CAAC;AAC1C,IAAAA,QAAO,KAAK,sBAAsB,EAAE,OAAO,CAAC;AAAA,EAC9C;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,KAAK,CAAC,SAAS,QAAQ,CAAC;AACnC,IAAAA,QAAO,KAAK,qBAAqB;AAAA,EACnC;AAAA,EAEA,MAAM,aAAa,MAAc,MAA6B;AAG5D,UAAM,KAAK,KAAK,CAAC,YAAY,MAAM,MAAM,MAAM,UAAU,IAAI,EAAE,CAAC;AAChE,IAAAA,QAAO,KAAK,kBAAkB,EAAE,MAAM,MAAM,UAAU,IAAI,GAAG,CAAC;AAAA,EAChE;AAAA,EAEA,MAAM,SAAS,QAA+B;AAC5C,UAAM,KAAK,KAAK,CAAC,YAAY,MAAM,MAAM,CAAC;AAC1C,IAAAA,QAAO,KAAK,eAAe,EAAE,OAAO,CAAC;AAAA,EACvC;AAAA,EAEA,MAAM,IAAI,OAAgC;AACxC,UAAM,KAAK,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;AAAA,EACnC;AAAA,EAEA,MAAM,OAAO,SAAgC;AAC3C,UAAM,KAAK,KAAK,CAAC,UAAU,eAAe,MAAM,OAAO,CAAC;AACxD,IAAAA,QAAO,KAAK,aAAa,EAAE,SAAS,QAAQ,MAAM,GAAG,EAAE,EAAE,CAAC;AAAA,EAC5D;AAAA,EAEA,MAAM,KAAK,QAA+B;AACxC,UAAM,KAAK,KAAK,CAAC,QAAQ,eAAe,MAAM,UAAU,MAAM,CAAC;AAC/D,IAAAA,QAAO,KAAK,UAAU,EAAE,OAAO,CAAC;AAAA,EAClC;AAAA,EAEA,MAAM,aAAa,MAAgC;AACjD,QAAI;AACF,YAAM,KAAK,KAAK,CAAC,aAAa,YAAY,IAAI,CAAC;AAC/C,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,mBAAmB,MAAgC;AACvD,QAAI;AACF,YAAM,KAAK,KAAK,CAAC,aAAa,eAAe,WAAW,UAAU,IAAI,CAAC;AACvE,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,mBAAoC;AACxC,WAAO,KAAK,KAAK,CAAC,aAAa,gBAAgB,MAAM,CAAC;AAAA,EACxD;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,KAAK,CAAC,OAAO,CAAC;AAAA,EAC3B;AAAA,EAEA,MAAM,WAA0B;AAC9B,UAAM,KAAK,KAAK,CAAC,SAAS,KAAK,CAAC;AAAA,EAClC;AAAA,EAEA,MAAM,aAA+B;AACnC,UAAM,SAAS,MAAM,KAAK,KAAK,CAAC,UAAU,aAAa,CAAC;AACxD,WAAO,OAAO,SAAS;AAAA,EACzB;AAAA,EAEA,MAAM,aAAa,OAAiB,SAAgC;AAClE,UAAM,KAAK,IAAI,KAAK;AACpB,UAAM,KAAK,OAAO,OAAO;AAAA,EAC3B;AAAA,EAEA,MAAM,YAAY,QAA+B;AAC/C,UAAM,KAAK,KAAK,CAAC,SAAS,UAAU,MAAM,CAAC;AAC3C,IAAAA,QAAO,KAAK,2BAA2B,EAAE,OAAO,CAAC;AAAA,EACnD;AAAA,EAEA,MAAM,cAAc,cAAqC;AACvD,UAAM,KAAK,YAAY,YAAY;AACnC,UAAM,KAAK,KAAK,CAAC,YAAY,MAAM,MAAM,cAAc,YAAY,CAAC;AACpE,IAAAA,QAAO,KAAK,4CAA4C,EAAE,aAAa,CAAC;AAAA,EAC1E;AAAA,EAEA,MAAM,iBAAiB,OAAiB,SAAiB,QAA+B;AACtF,UAAM,KAAK,IAAI,KAAK;AACpB,UAAM,KAAK,OAAO,OAAO;AACzB,UAAM,KAAK,KAAK,MAAM;AAAA,EACxB;AAAA,EAEA,MAAM,aAAa,MAA6B;AAC9C,UAAM,KAAK,KAAK,CAAC,UAAU,MAAM,IAAI,CAAC;AACtC,IAAAA,QAAO,KAAK,kBAAkB,EAAE,KAAK,CAAC;AAAA,EACxC;AAAA,EAEA,MAAM,mBAAmB,MAA6B;AACpD,UAAM,KAAK,KAAK,CAAC,QAAQ,UAAU,YAAY,IAAI,CAAC;AACpD,IAAAA,QAAO,KAAK,yBAAyB,EAAE,KAAK,CAAC;AAAA,EAC/C;AAAA,EAEA,MAAM,YAAY,KAAa,WAAmB,YAAmC;AACnF,UAAM,KAAK,KAAK,CAAC,YAAY,OAAO,MAAM,WAAW,KAAK,UAAU,CAAC;AACrE,IAAAA,QAAO,KAAK,+BAA+B,EAAE,KAAK,WAAW,WAAW,CAAC;AAAA,EAC3E;AAAA,EAEA,MAAM,oBAAoB,KAAa,QAA+B;AACpE,UAAM,KAAK,KAAK,CAAC,YAAY,OAAO,KAAK,MAAM,CAAC;AAChD,IAAAA,QAAO,KAAK,oCAAoC,EAAE,KAAK,OAAO,CAAC;AAAA,EACjE;AAAA,EAEA,MAAM,oBAAoB,KAAa,cAAqC;AAC1E,UAAM,KAAK,KAAK,CAAC,YAAY,OAAO,WAAW,MAAM,cAAc,KAAK,UAAU,YAAY,EAAE,CAAC;AACjG,IAAAA,QAAO,KAAK,oCAAoC,EAAE,KAAK,aAAa,CAAC;AAAA,EACvE;AAAA,EAEA,MAAM,eAAe,KAAa,QAAQ,OAAsB;AAC9D,UAAM,OAAO,CAAC,YAAY,UAAU,GAAG;AACvC,QAAI,MAAO,MAAK,KAAK,SAAS;AAC9B,UAAM,KAAK,KAAK,IAAI;AACpB,IAAAA,QAAO,KAAK,oBAAoB,EAAE,KAAK,MAAM,CAAC;AAAA,EAChD;AAAA,EAEA,MAAM,gBAA+B;AACnC,UAAM,KAAK,KAAK,CAAC,YAAY,OAAO,CAAC;AACrC,IAAAA,QAAO,KAAK,+BAA+B;AAAA,EAC7C;AAAA,EAEA,MAAM,eAAkC;AACtC,UAAM,SAAS,MAAM,KAAK,KAAK,CAAC,YAAY,QAAQ,aAAa,CAAC;AAClE,WAAO,OACJ,MAAM,IAAI,EACV,OAAO,CAAC,SAAS,KAAK,WAAW,WAAW,CAAC,EAC7C,IAAI,CAAC,SAAS,KAAK,QAAQ,aAAa,EAAE,CAAC;AAAA,EAChD;AAAA,EAEA,MAAM,SAAS,KAAa,UAA0C;AACpE,QAAI;AACF,aAAO,MAAM,KAAK,KAAK,CAAC,QAAQ,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC;AAAA,IACvD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,mBAAsC;AAC1C,UAAM,SAAS,MAAM,KAAK,KAAK,CAAC,QAAQ,eAAe,iBAAiB,CAAC;AACzE,QAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,WAAO,OAAO,MAAM,IAAI,EAAE,OAAO,OAAO;AAAA,EAC1C;AAAA,EAEA,MAAM,OAAO,WAA2E;AACtF,QAAI;AACF,YAAM,KAAK,KAAK,CAAC,UAAU,SAAS,CAAC;AACrC,aAAO,EAAE,SAAS,MAAM,eAAe,CAAC,EAAE;AAAA,IAC5C,SAAS,KAAK;AACZ,YAAM,MAAO,IAAc,WAAW;AACtC,UAAI,IAAI,SAAS,UAAU,KAAK,IAAI,SAAS,iBAAiB,GAAG;AAC/D,cAAM,gBAAgB,MAAM,KAAK,iBAAiB;AAClD,eAAO,EAAE,SAAS,OAAO,cAAc;AAAA,MACzC;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,iBAAsE;AAC1E,QAAI;AACF,YAAM,KAAK,KAAK,CAAC,MAAM,oBAAoB,UAAU,YAAY,CAAC;AAClE,aAAO,EAAE,MAAM,MAAM,eAAe,CAAC,EAAE;AAAA,IACzC,SAAS,KAAK;AACZ,YAAM,MAAO,IAAc,WAAW;AACtC,UAAI,IAAI,SAAS,UAAU,KAAK,IAAI,SAAS,iBAAiB,GAAG;AAC/D,cAAM,gBAAgB,MAAM,KAAK,iBAAiB;AAClD,eAAO,EAAE,MAAM,OAAO,cAAc;AAAA,MACtC;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,cAA6B;AACjC,UAAM,KAAK,KAAK,CAAC,UAAU,SAAS,CAAC;AACrC,IAAAA,QAAO,KAAK,gBAAgB;AAAA,EAC9B;AAAA,EAEA,MAAM,qBAAuC;AAC3C,UAAM,SAAS,MAAM,KAAK,KAAK,CAAC,QAAQ,CAAC;AACzC,WAAO,OAAO,SAAS,oBAAoB;AAAA,EAC7C;AAAA,EAEA,MAAM,UAAU,QAA+B;AAC7C,UAAM,KAAK,KAAK,CAAC,QAAQ,eAAe,sBAAsB,MAAM,UAAU,MAAM,CAAC;AACrF,IAAAA,QAAO,KAAK,gBAAgB,EAAE,OAAO,CAAC;AAAA,EACxC;AAAA,EAEA,MAAM,QAAQ,QAA+B;AAC3C,UAAM,KAAK,KAAK,CAAC,SAAS,aAAa,MAAM,CAAC;AAC9C,IAAAA,QAAO,KAAK,uBAAuB,EAAE,OAAO,CAAC;AAAA,EAC/C;AAAA,EAEA,MAAM,MAAM,QAAgB,SAAgC;AAC1D,UAAM,KAAK,KAAK,CAAC,SAAS,WAAW,eAAe,MAAM,SAAS,MAAM,CAAC;AAC1E,IAAAA,QAAO,KAAK,UAAU,EAAE,QAAQ,SAAS,QAAQ,MAAM,GAAG,EAAE,EAAE,CAAC;AAAA,EACjE;AACF;;;ACtOA,SAAS,oBAAoB;AAwEtB,IAAM,WAAN,cAAuB,aAAa;AAAA,EACzC,KAAK,UAA2B,MAA0B;AACxD,UAAM,KAAK,KAAK,OAAO,GAAG,IAAI;AAC9B,WAAO,MAAM,KAAK,OAAO,GAAG,IAAI;AAAA,EAClC;AAAA,EAEA,UAAU,MAAiB,MAAqB;AAC9C,UAAM,UAAwB;AAAA,MAC5B;AAAA,MACA;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AACA,SAAK,KAAK,MAAM,OAAO;AAAA,EACzB;AACF;AAQO,IAAM,WAAW,IAAI,SAAS;;;AC1F9B,IAAM,aAAN,MAAiB;AAAA,EACd,QAA2B,CAAC;AAAA,EAC5B,SAAS;AAAA,EAEjB,MAAM,aAAgB,IAAkC;AACtD,UAAM,KAAK,QAAQ;AACnB,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,UAAE;AACA,WAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAAA,EAEQ,UAAyB;AAC/B,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,SAAS;AACd,aAAO,QAAQ,QAAQ;AAAA,IACzB;AACA,WAAO,IAAI,QAAc,CAAC,YAAY;AACpC,WAAK,MAAM,KAAK,OAAO;AAAA,IACzB,CAAC;AAAA,EACH;AAAA,EAEQ,UAAgB;AACtB,UAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,QAAI,MAAM;AACR,WAAK;AAAA,IACP,OAAO;AACL,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,IAAI,WAAoB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,cAAsB;AACxB,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;;;AC3CA,OAAO,QAAQ;AACf,OAAO,UAAU;AASV,IAAe,cAAf,MAAoC;AAAA,EACtB;AAAA,EACT;AAAA;AAAA,EAGS;AAAA;AAAA,EAEA;AAAA,EAEnB,YAAY,SAAiB,UAAkB,eAAuB,aAAqB;AACzF,SAAK,gBAAgB;AACrB,SAAK,cAAc;AACnB,SAAK,WAAW,KAAK,KAAK,SAAS,QAAQ;AAC3C,SAAK,OAAO,KAAK,KAAK;AAAA,EACxB;AAAA,EAEU,OAAgD;AACxD,QAAI;AACF,UAAI,GAAG,WAAW,KAAK,QAAQ,GAAG;AAChC,cAAM,MAAM,GAAG,aAAa,KAAK,UAAU,OAAO;AAClD,eAAO,KAAK,MAAM,GAAG;AAAA,MACvB;AAAA,IACF,SAAS,KAAK;AACZ,aAAW,MAAM,KAAK,WAAW,EAAE;AAAA,QACjC;AAAA,QACA,EAAE,OAAQ,IAAc,QAAQ;AAAA,MAClC;AAAA,IACF;AACA,WAAO,EAAE,CAAC,KAAK,aAAa,GAAG,CAAC,EAAE;AAAA,EACpC;AAAA,EAEU,OAAa;AACrB,UAAM,MAAM,KAAK,QAAQ,KAAK,QAAQ;AACtC,QAAI,CAAC,GAAG,WAAW,GAAG,GAAG;AACvB,SAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACvC;AACA,UAAM,UAAU,KAAK;AAAA,MAAK;AAAA,MACxB,IAAI,KAAK,WAAW,IAAI,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC;AAAA,IAAM;AACzD,OAAG,cAAc,SAAS,KAAK,UAAU,KAAK,MAAM,MAAM,CAAC,GAAG,OAAO;AACrE,OAAG,WAAW,SAAS,KAAK,QAAQ;AAAA,EACtC;AAAA;AAAA,EAGA,IAAc,aAAsC;AAClD,WAAO,KAAK,KAAK,KAAK,aAAa;AAAA,EACrC;AAAA,EAEU,SAAS,KAAkC;AACnD,WAAO,KAAK,WAAW,GAAG;AAAA,EAC5B;AAAA,EAEU,gBAA2B;AACnC,WAAO,OAAO,OAAO,KAAK,UAAU;AAAA,EACtC;AAAA,EAEU,UAAU,KAAa,QAAuB;AACtD,SAAK,WAAW,GAAG,IAAI;AAAA,EACzB;AAAA,EAEU,YAAY,KAAsB;AAC1C,QAAI,CAAC,KAAK,WAAW,GAAG,EAAG,QAAO;AAClC,WAAO,KAAK,WAAW,GAAG;AAC1B,SAAK,KAAK;AACV,WAAO;AAAA,EACT;AACF;;;AClEO,SAAS,OAAO,QAA6B;AAClD,SAAO,OAAO,OAAO,WAAY,UAAU,SAAS;AACtD;AAGO,SAAS,cAAc,QAA6B;AACzD,SAAO,OAAO,OAAO,WAAY,UAAU,UAAU;AACvD;AAGO,SAAS,SAAS,QAA6B;AACpD,SAAO,OAAO,WAAY;AAC5B;;;ACgDO,SAAS,oBAAoB,cAAyC;AAC3E,UAAQ,cAAc;AAAA,IACpB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAKO,SAAS,oBAAoB,QAAmC;AACrE,UAAQ,QAAQ;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAGO,SAAS,wBAAwB,QAAmC;AACzE,UAAQ,QAAQ;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL;AACE,aAAO;AAAA,EACX;AACF;AAMO,SAAS,mBAAmB,QAAqB,IAAoC;AAC1F,MAAI,GAAG,WAAW,OAAO,KAAK,GAAG;AAC/B,QAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAI,OAAO,UAAU,WAAY,QAAO;AACxC,QAAI,OAAO,UAAU,YAAa,QAAO;AACzC,WAAO;AAAA,EACT;AACA,MAAI,GAAG,UAAU,OAAO,KAAK,EAAG,QAAO;AACvC,SAAO;AACT;AAKO,SAAS,sBACd,QACA,IACgB;AAChB,QAAM,cAAc,GAAG,QAAQ,OAAO,OAAO,OAAO,YAAY;AAGhE,QAAM,iBAAiB,GAAG,oBAAoB,OAAO,OAAO,OAAO,YAAY;AAC/E,QAAM,YAAY,GAAG,aAAa;AAClC,QAAM,gBAAgB,UAAU,IAAI,QAAM;AAAA,IACxC,MAAM,EAAE;AAAA,IACR,OAAO,EAAE;AAAA,IACT,QAAQ,eAAe,EAAE,IAAI,KAAK;AAAA,EACpC,EAAE;AAEF,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,OAAO,OAAO,MAAM,CAAC;AAAA,IAC7B,OAAO,SAAS,MAAM;AAAA,IACtB,QAAQ,oBAAoB,YAAY,MAAM;AAAA,IAC9C,UAAU,OAAO;AAAA,IACjB,WAAW,OAAO;AAAA,IAClB,WAAW,OAAO;AAAA,IAClB,WAAW,OAAO;AAAA,IAClB,YAAY,OAAO;AAAA,IACnB,aAAa,OAAO;AAAA,IACpB,eAAe,mBAAmB,QAAQ,EAAE;AAAA,IAC5C,cAAc,GAAG,aAAa,OAAO,OAAO,OAAO,YAAY;AAAA,IAC/D;AAAA,EACF;AACF;AAGO,SAAS,8BACd,MACA,OACgB;AAChB,QAAM,SAAS,oBAAoB,KAAK,MAAM;AAC9C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,IACZ;AAAA,IACA,UAAU,KAAK;AAAA,IACf,WAAW,KAAK;AAAA,IAChB,WAAW,KAAK,aAAa,MAAM;AAAA,IACnC,WAAW,KAAK,eAAe,KAAK,aAAa,MAAM;AAAA,IACvD,YAAY,KAAK;AAAA,IACjB,aAAa,KAAK;AAAA,IAClB,eAAe,wBAAwB,MAAM;AAAA,EAC/C;AACF;;;ACzMA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAqBjB,SAAS,QAAQ,KAAqB;AACpC,SAAO,sBAAsB,GAAG;AAClC;AAKO,SAAS,wBAAgD;AAC9D,QAAM,IAAsB,oBAAoB,KAAK;AAErD,QAAM,iBAA2B,CAAC;AAClC,MAAI,EAAE,UAAU,gBAAgB,UAAU;AACxC,mBAAe,KAAK,GAAG,EAAE,UAAU,UAAU,0BAAM;AAAA,EACrD,OAAO;AACL,mBAAe,KAAK,iBAAO;AAAA,EAC7B;AACA,iBAAe,KAAK,GAAG,EAAE,UAAU,SAAS,0BAAM;AAClD,iBAAe,KAAK,gCAAO;AAC3B,MAAI,EAAE,UAAU,iBAAiB,QAAQ;AACvC,mBAAe,KAAK,GAAG,EAAE,UAAU,eAAe;AAAA,EACpD;AAEA,QAAM,kBAAkB,EAAE,YAAY,IAAI,WAAS,KAAK,MAAM,WAAW,GAAG,MAAM,SAAS,SAAI,MAAM,MAAM,KAAK,EAAE,EAAE;AAEpH,SAAO;AAAA,IACL,qBAAqB,EAAE,UAAU,uBAAuB;AAAA,IACxD,gBAAgB,EAAE,UAAU;AAAA,IAC5B,wBAAwB,EAAE,UAAU,0BAA0B,GAAG,EAAE,UAAU,cAAc;AAAA,IAC3F,aAAa,EAAE,UAAU,eAAe;AAAA,IACxC,cAAc,EAAE,UAAU,gBAAgB;AAAA,IAC1C,aAAa,EAAE,UAAU,eAAe;AAAA,IACxC,kBAAkB,EAAE,UAAU,oBACzB,GAAG,EAAE,UAAU,eAAe,UAAU;AAAA,IAC7C,oBAAoB,gBAAgB,SAAS,IACzC,gBAAgB,KAAK,IAAI,IACzB;AAAA,IACJ,sBAAsB,eAAe,KAAK,QAAG;AAAA;AAAA,IAE7C,QAAQ,EAAE,UAAU,UAAU;AAAA,IAC9B,SAAS,EAAE,UAAU,WAAW;AAAA,IAChC,aAAa,EAAE,UAAU,eAAe;AAAA,EAC1C;AACF;AAKO,SAAS,sBAAsB,QAKpC;AACA,QAAM,QAAkB,CAAC;AACzB,QAAM,IAAI,OAAO;AACjB,MAAI,GAAG,aAAc,OAAM,KAAK;AAAA,EAAe,EAAE,YAAY,EAAE;AAC/D,MAAI,GAAG,mBAAoB,OAAM,KAAK;AAAA,EAAa,EAAE,kBAAkB,EAAE;AACzE,MAAI,GAAG,MAAO,OAAM,KAAK;AAAA,EAAa,EAAE,KAAK,EAAE;AAC/C,MAAI,GAAG,YAAa,OAAM,KAAK;AAAA,EAAa,EAAE,WAAW,EAAE;AAC3D,MAAI,GAAG,WAAY,OAAM,KAAK;AAAA,EAAa,EAAE,UAAU,EAAE;AACzD,MAAI,GAAG,SAAU,OAAM,KAAK;AAAA,EAAa,EAAE,QAAQ,EAAE;AACrD,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,aAAa,OAAO;AAAA,IACpB,WAAW,OAAO,UAAU,aAAa,OAAO;AAAA,IAChD,gBAAgB,MAAM,SAAS;AAAA;AAAA,EAAc,MAAM,KAAK,MAAM,CAAC,KAAK;AAAA,EACtE;AACF;AAMO,SAAS,sBAAsB,WAAqC;AACzE,MAAI,CAAC,aAAa,UAAU,MAAM,UAAU,EAAG,QAAO;AAEtD,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,QAAQ,UAAU,OAAO;AAClC,UAAM,UAAU,KAAK,QAAQ,KAAK,YAAY,KAAK,aAC/C,+BAAW,KAAK,IAAI,IAAI,KAAK,QAAQ,MAAM,KAAK,WAAW,SAAS,CAAC,CAAC,MACtE;AACJ,UAAM,WAAW,KAAK,SAAS,KAAK,YAAY,uBAAQ;AACxD,UAAM,KAAK,KAAK,KAAK,IAAI,QAAQ,OAAO,QAAQ,QAAQ,IAAI;AAAA,EAC9D;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,4SAA4D;AAEvE,SAAO,MAAM,KAAK,IAAI;AACxB;AAoCO,SAAS,aAAa,KAA4B;AACvD,QAAM,KAAK,QAAQ,IAAI,QAAQ;AAC/B,QAAM,KAAK,sBAAsB;AACjC,SAAO,EAAE,iBAAiB;AAAA,IACxB,KAAK,IAAI;AAAA,IACT,OAAO,IAAI;AAAA,IACX,SAAS;AAAA,IACT,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,qBAAqB,KAA4B;AAC/D,QAAM,KAAK,QAAQ,IAAI,QAAQ;AAC/B,QAAM,KAAK,sBAAsB;AACjC,QAAM,YAAY,sBAAsB,IAAI,SAAS;AACrD,QAAM,OAAO,EAAE,yBAAyB;AAAA,IACtC,KAAK,IAAI;AAAA,IACT,OAAO,IAAI;AAAA,IACX,SAAS;AAAA,IACT,GAAG;AAAA,EACL,CAAC;AACD,SAAO,YAAY,GAAG,IAAI;AAAA;AAAA,EAAO,SAAS,KAAK;AACjD;AAEO,SAAS,WAAW,KAA4B;AACrD,QAAM,oBAAoB,IAAI,iBAAiB;AAAA;AAAA,EAAO,IAAI,cAAc,KAAK;AAC7E,QAAM,YAAY,sBAAsB,IAAI,SAAS;AACrD,QAAM,KAAK,QAAQ,IAAI,QAAQ;AAC/B,QAAM,OAAO,EAAE,eAAe;AAAA,IAC5B,KAAK,IAAI;AAAA,IACT,OAAO,IAAI;AAAA,IACX,aAAa,IAAI;AAAA,IACjB,YAAY;AAAA,IACZ,SAAS;AAAA,EACX,CAAC;AACD,SAAO,YAAY,GAAG,IAAI;AAAA;AAAA,EAAO,SAAS,KAAK;AACjD;AAEO,SAAS,YAAY,KAA4B;AACtD,QAAM,KAAK,QAAQ,IAAI,QAAQ;AAC/B,QAAM,KAAK,sBAAsB;AACjC,QAAM,YAAY,sBAAsB,IAAI,SAAS;AACrD,QAAM,OAAO,EAAE,gBAAgB;AAAA,IAC7B,KAAK,IAAI;AAAA,IACT,OAAO,IAAI;AAAA,IACX,SAAS;AAAA,IACT,GAAG;AAAA,EACL,CAAC;AACD,SAAO,YAAY,GAAG,IAAI;AAAA;AAAA,EAAO,SAAS,KAAK;AACjD;AAQO,SAAS,aAAa,KAAoB,SAAyC;AACxF,QAAM,oBAAoB,IAAI,iBAAiB;AAAA;AAAA,EAAO,IAAI,cAAc,KAAK;AAC7E,QAAM,YAAY,sBAAsB,IAAI,SAAS;AACrD,QAAM,KAAK,QAAQ,IAAI,QAAQ;AAC/B,QAAM,gBAAgB,QAAQ;AAAA,IAC5B,OAAK,EAAE,sBAAsB,EAAE,OAAO,EAAE,OAAO,WAAW,EAAE,WAAW,UAAU,EAAE,SAAS,CAAC;AAAA,EAC/F,EAAE,KAAK,MAAM;AACb,QAAM,OAAO,EAAE,iBAAiB;AAAA,IAC9B,KAAK,IAAI;AAAA,IACT,OAAO,IAAI;AAAA,IACX,aAAa,IAAI;AAAA,IACjB,YAAY;AAAA,IACZ,cAAc,QAAQ;AAAA,IACtB;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AACD,SAAO,YAAY,GAAG,IAAI;AAAA;AAAA,EAAO,SAAS,KAAK;AACjD;AAkBA,SAAS,aAAa,WAAkC;AACtD,QAAM,YAAYC,MAAK,KAAK,WAAW,gBAAgB;AAEvD,MAAIC,IAAG,WAAW,SAAS,GAAG;AAC5B,QAAI;AACF,YAAM,UAAUA,IAAG,YAAY,WAAW,EAAE,eAAe,KAAK,CAAC,EAC9D,OAAO,OAAK,EAAE,YAAY,CAAC,EAC3B,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAE9C,YAAM,QAAkB,CAAC;AACzB,iBAAW,SAAS,SAAS;AAC3B,cAAM,YAAYD,MAAK,KAAK,WAAW,MAAM,MAAM,UAAU;AAC7D,YAAIC,IAAG,WAAW,SAAS,GAAG;AAC5B,cAAI;AACF,kBAAM,KAAKA,IAAG,aAAa,WAAW,OAAO,CAAC;AAAA,UAChD,QAAQ;AAAA,UAAwB;AAAA,QAClC;AAAA,MACF;AACA,UAAI,MAAM,SAAS,EAAG,QAAO,MAAM,KAAK,aAAa;AAAA,IACvD,QAAQ;AAAA,IAAqB;AAAA,EAC/B;AAEA,QAAM,WAAWD,MAAK,KAAK,WAAW,UAAU;AAChD,MAAIC,IAAG,WAAW,QAAQ,GAAG;AAC3B,QAAI;AAAE,aAAOA,IAAG,aAAa,UAAU,OAAO;AAAA,IAAG,QAAQ;AAAA,IAAa;AAAA,EACxE;AACA,SAAO;AACT;AAEO,SAAS,sBACd,KACA,OACA,SACQ;AACR,MAAI,SAAS,WAAW;AACtB,WAAO,iBAAiB,KAAK,SAAS,KAAK;AAAA,EAC7C;AACA,SAAO,sBAAsB,KAAK,KAAK;AACzC;AAMA,SAAS,oBAAoB,YAAmC;AAC9D,MAAI,CAAC,cAAc,CAACA,IAAG,WAAW,UAAU,EAAG,QAAO;AACtD,MAAI;AACF,UAAM,MAAM,KAAK,MAAMA,IAAG,aAAa,YAAY,OAAO,CAAC;AAC3D,QAAI,OAAO,IAAI,eAAe,YAAY,IAAI,WAAW,KAAK,GAAG;AAC/D,aAAO,IAAI,WAAW,KAAK;AAAA,IAC7B;AAAA,EACF,QAAQ;AAAA,EAA4B;AACpC,SAAO;AACT;AAEA,SAAS,iBACP,KACA,SACA,OACQ;AACR,QAAM,YAAY,QAAQ;AAC1B,QAAM,aAAa,QAAQ,eACrBA,IAAG,WAAWD,MAAK,KAAK,WAAW,aAAa,CAAC,IACjDA,MAAK,KAAK,WAAW,aAAa,IAClC;AAEN,QAAM,eAAe,aAAa,SAAS;AAC3C,QAAM,eAAe,eACjB;AAAA;AAAA;AAAA,EAAqB,YAAY;AAAA,iBACjC;AAEJ,QAAM,YAAY,aAAa,aAAa,UAAU,KAAK;AAC3D,QAAM,eAAe,iBAAiB,SAAS,kBAAkB,IAAI,QAAQ;AAC7E,QAAM,WAAW,cAAc;AAC/B,QAAM,WAAW,QACb;AAAA;AAAA;AAAA;AAAA,2BAIW,MAAM,IAAI,IAAI,MAAM,WAAW;AAAA,4BAC9B,MAAM,IAAI,IAAI,MAAM,YAAY;AAAA;AAAA,gHAElB,QAAQ;AAAA,oFACN,MAAM,IAAI,IAAI,MAAM,YAAY;AAAA,4EACnC,MAAM,IAAI,IAAI,MAAM,WAAW;AAAA,2KAExD;AAAA;AAAA;AAAA,mBAGG,QAAQ;AAEf,QAAM,eAAe,oBAAoB,UAAU;AAEnD,QAAM,cAAc;AAAA;AAAA;AAAA,8CAGD,SAAS,WAAW,SAAS,GAAG,YAAY;AAAA,uCACzC,SAAS,WAAW,SAAS,GAAG,YAAY;AAAA;AAGlE,QAAM,qBAAqB,eACvB;AAAA;AAAA;AAAA;AAAA,EAAwB,YAAY;AAAA,EAAK,WAAW,KACpD;AAEJ,QAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAOV,SAAS,WAAW,SAAS,GAAG,YAAY;AAAA;AAAA;AAAA;AAAA,aAI5C,SAAS,WAAW,SAAS,GAAG,YAAY;AAAA;AAAA;AAIvD,SAAO;AAAA;AAAA;AAAA;AAAA,yJAIkC,QAAQ;AAAA;AAAA,kCAErC,SAAS;AAAA,EACrB,aAAa,mCAAe,UAAU,OAAO,EAAE;AAAA,8CACjC,SAAS,kBAAkB,IAAI,QAAQ,kFAAgC,aAAa,KAAK,CAAC;AAAA;AAAA;AAAA,EAGxG,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,eAAe,KAAK,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAmBrB,SAAS,kBAAkB,IAAI,QAAQ;AAAA;AAAA,yBAErC,SAAS,kBAAkB,IAAI,QAAQ;AAAA,qBACjC,SAAS,kBAAkB,IAAI,QAAQ;AAAA,2CAC1C,SAAS,kBAAkB,IAAI,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,mFAKxB,SAAS,WAAW,SAAS,GAAG,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+FAMrC,IAAI,QAAQ;AAAA;AAAA;AAAA;AAAA;AAKpD;AAEA,SAAS,sBAAsB,KAAoB,OAAgC;AACjF,QAAM,KAAK,sBAAsB;AACjC,QAAM,cAAc,GAAG;AACvB,QAAM,SAAS,GAAG;AAClB,QAAM,UAAU,GAAG;AAEnB,QAAM,gBAAgB,QAClB;AAAA;AAAA,yBAES,MAAM,IAAI,IAAI,MAAM,WAAW;AAAA,0BAC9B,MAAM,IAAI,IAAI,MAAM,YAAY;AAAA;AAAA;AAAA;AAAA,WAIrC,MAAM,YAAY,aAAa,MAAM,IAAI,yBAAyB,MAAM,IAAI,IAAI,MAAM,YAAY;AAAA,OACtG,WAAW,WAAW,QAAQ,YAAY,CAAC;AAAA;AAAA;AAAA,6JAGO,QAAQ,YAAY,CAAC,6EACxE;AAAA;AAAA;AAAA,KAGD,WAAW;AAAA;AAGd,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mFAMS,WAAW;AAAA,eACnB,MAAM,8EAAkB,OAAO;AAAA,QACjC,cAAc,KAAK,CAAC;AAAA;AAAA,0EAEW,IAAI,QAAQ;AAAA;AAAA;AAAA;AAAA;AAKnD;AASO,SAAS,sBAAsB,KAAqC;AACzE,QAAM,oBAAoB,IAAI,cAAc,IAAI,OAAK,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI;AAC5E,SAAO,EAAE,0BAA0B;AAAA,IACjC,KAAK,IAAI;AAAA,IACT,QAAQ,IAAI;AAAA,IACZ,YAAY,IAAI;AAAA,IAChB;AAAA,EACF,CAAC;AACH;AAEO,SAAS,qBAAqB,OAAe,QAAgB,QAAyB;AAC3F,QAAM,QAAgC;AAAA,IACpC,UAAU;AAAA,IAAM,QAAQ;AAAA,IAAM,WAAW;AAAA,IAAM,QAAQ;AAAA,IACvD,MAAM;AAAA,IAAM,QAAQ;AAAA,IAAM,OAAO;AAAA,IAAM,KAAK;AAAA,EAC9C;AACA,QAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,QAAM,YAAY,WAAW,cAAc,uBAAuB,WAAW,WAAW,oBAAoB;AAC5G,QAAM,aAAa,EAAE,SAAS;AAC9B,MAAI,MAAM,EAAE,oBAAoB,EAAE,MAAM,OAAO,QAAQ,WAAW,CAAC;AACnE,MAAI,QAAQ;AACV,WAAO;AAAA;AAAA,EAAO,MAAM;AAAA,EACtB;AACA,SAAO;AACT;;;ACveA,IAAME,UAAS,OAAW,MAAM,kBAAkB;AAkB3C,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAAoB,UAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQzC,MAAM,QAAQ,MAA6C;AACzD,UAAM,EAAE,OAAO,WAAW,SAAS,YAAY,WAAW,gBAAgB,QAAQ,IAAI;AACtF,UAAM,cAAc,KAAK,eAAe;AAGxC,QAAI,MAAM,MAAM,mBAAmB,GAAG;AACpC,MAAAA,QAAO,KAAK,+CAA+C,EAAE,UAAU,CAAC;AACxE,YAAM,MAAM,YAAY;AAAA,IAC1B;AAGA,UAAM,eAAe,MAAM,MAAM,OAAO,SAAS;AAEjD,QAAI,aAAa,SAAS;AACxB,MAAAA,QAAO,KAAK,sCAAsC,EAAE,UAAU,CAAC;AAC/D;AAAA,IACF;AAGA,QAAI,gBAAgB,aAAa;AACjC,QAAI,UAAU;AAEd,WAAO,cAAc,SAAS,KAAK,UAAU,aAAa;AACxD;AACA,MAAAA,QAAO,KAAK,+BAA+B,EAAE,WAAW,SAAS,cAAc,CAAC;AAEhF,YAAM,SAAS,sBAAsB;AAAA,QACnC,UAAU,OAAO,cAAc,WAAW,YAAY;AAAA,QACtD;AAAA,QACA,YAAY,UAAU,QAAQ,aAAa,EAAE;AAAA,QAC7C;AAAA,MACF,CAAC;AAED,YAAM,KAAK,SAAS,IAAI;AAAA,QACtB;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,eAAe,UAAU,CAAC,UAAmB,QAAQ,KAAK,IAAI;AAAA,MAChE,CAAC;AAGD,YAAM,MAAM,IAAI,aAAa;AAG7B,YAAM,iBAAiB,MAAM,MAAM,eAAe;AAClD,UAAI,eAAe,MAAM;AACvB,wBAAgB,CAAC;AAAA,MACnB,OAAO;AACL,wBAAgB,eAAe;AAAA,MACjC;AAAA,IACF;AAEA,QAAI,cAAc,SAAS,GAAG;AAC5B,YAAM,MAAM,YAAY;AACxB,YAAM,IAAI;AAAA,QACR,yCAAyC,WAAW,yBAAyB,cAAc,KAAK,IAAI,CAAC;AAAA,MACvG;AAAA,IACF;AAEA,IAAAA,QAAO,KAAK,0BAA0B,EAAE,WAAW,eAAe,QAAQ,CAAC;AAAA,EAC7E;AACF;","names":["logger","fs","path","path","fs","logger"]}
|
package/dist/start-27GRO4DP.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
startCommand
|
|
3
|
-
} from "./chunk-JINMYD56.js";
|
|
4
|
-
import "./chunk-B7XUZJOK.js";
|
|
5
|
-
import "./chunk-KTYPZTF4.js";
|
|
6
|
-
import "./chunk-FWEW5E3B.js";
|
|
7
|
-
import "./chunk-AKXDQH25.js";
|
|
8
|
-
import "./chunk-TN2SYADO.js";
|
|
9
|
-
import "./chunk-4LFNFRCL.js";
|
|
10
|
-
import "./chunk-GF2RRYHB.js";
|
|
11
|
-
export {
|
|
12
|
-
startCommand
|
|
13
|
-
};
|
|
14
|
-
//# sourceMappingURL=start-27GRO4DP.js.map
|