@xdevops/issue-auto-finish 1.0.89 → 1.0.90
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-5JBADEKR.js → chunk-ENF24C44.js} +3 -3
- package/dist/{chunk-JMACM7AJ.js → chunk-SEO57UYI.js} +18 -5
- package/dist/chunk-SEO57UYI.js.map +1 -0
- package/dist/{chunk-YNRKPQLS.js → chunk-TDKTI363.js} +2 -2
- package/dist/{chunk-XSX3PGQW.js → chunk-Y62E72TA.js} +2 -2
- package/dist/{chunk-DVNAH2GV.js → chunk-Z3OBKODV.js} +11 -10
- package/dist/chunk-Z3OBKODV.js.map +1 -0
- package/dist/cli/setup/ConfigGenerator.d.ts +2 -0
- package/dist/cli/setup/ConfigGenerator.d.ts.map +1 -1
- package/dist/cli/setup/DependencyChecker.d.ts +1 -1
- package/dist/cli/setup/DependencyChecker.d.ts.map +1 -1
- package/dist/cli.js +4 -4
- package/dist/{doctor-ZG3DO7J5.js → doctor-LLETZLW2.js} +2 -2
- package/dist/index.js +4 -4
- package/dist/{init-37DLQ5AJ.js → init-UKTP7LXS.js} +4 -4
- package/dist/{restart-C7QBXT44.js → restart-2BCP6AMK.js} +3 -3
- package/dist/run.js +4 -4
- package/dist/{start-66JO56AW.js → start-ECUOKGM2.js} +3 -3
- package/package.json +1 -1
- package/src/web/frontend/dist/assets/index-DWOHf3bd.css +1 -0
- package/src/web/frontend/dist/assets/index-Dby4j-V_.js +151 -0
- package/src/web/frontend/dist/index.html +2 -2
- package/dist/chunk-DVNAH2GV.js.map +0 -1
- package/dist/chunk-JMACM7AJ.js.map +0 -1
- package/src/web/frontend/dist/assets/index-DJzC2saL.css +0 -1
- package/src/web/frontend/dist/assets/index-Mnu8M3ww.js +0 -151
- /package/dist/{chunk-5JBADEKR.js.map → chunk-ENF24C44.js.map} +0 -0
- /package/dist/{chunk-YNRKPQLS.js.map → chunk-TDKTI363.js.map} +0 -0
- /package/dist/{chunk-XSX3PGQW.js.map → chunk-Y62E72TA.js.map} +0 -0
- /package/dist/{doctor-ZG3DO7J5.js.map → doctor-LLETZLW2.js.map} +0 -0
- /package/dist/{init-37DLQ5AJ.js.map → init-UKTP7LXS.js.map} +0 -0
- /package/dist/{restart-C7QBXT44.js.map → restart-2BCP6AMK.js.map} +0 -0
- /package/dist/{start-66JO56AW.js.map → start-ECUOKGM2.js.map} +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DependencyChecker
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-Z3OBKODV.js";
|
|
4
4
|
import {
|
|
5
5
|
ConfigGenerator,
|
|
6
6
|
PreflightChecker
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-SEO57UYI.js";
|
|
8
8
|
import {
|
|
9
9
|
getProjectKnowledge
|
|
10
10
|
} from "./chunk-ACVOOHAR.js";
|
|
@@ -549,4 +549,4 @@ function createSetupRouter(deps = {}) {
|
|
|
549
549
|
export {
|
|
550
550
|
createSetupRouter
|
|
551
551
|
};
|
|
552
|
-
//# sourceMappingURL=chunk-
|
|
552
|
+
//# sourceMappingURL=chunk-ENF24C44.js.map
|
|
@@ -592,7 +592,7 @@ var ConfigGenerator = class _ConfigGenerator {
|
|
|
592
592
|
}
|
|
593
593
|
static readCurrent() {
|
|
594
594
|
const env = process.env;
|
|
595
|
-
const aiMode = env.AI_RUNNER_MODE || "
|
|
595
|
+
const aiMode = env.AI_RUNNER_MODE || "cursor-agent";
|
|
596
596
|
return {
|
|
597
597
|
gongfeng: {
|
|
598
598
|
apiUrl: env.GONGFENG_API_URL || "",
|
|
@@ -610,7 +610,9 @@ var ConfigGenerator = class _ConfigGenerator {
|
|
|
610
610
|
ai: {
|
|
611
611
|
mode: aiMode,
|
|
612
612
|
model: env.AI_MODEL || void 0,
|
|
613
|
-
phaseTimeoutMs: env.CLAUDE_PHASE_TIMEOUT_MS ? parseInt(env.CLAUDE_PHASE_TIMEOUT_MS, 10) : void 0
|
|
613
|
+
phaseTimeoutMs: env.CLAUDE_PHASE_TIMEOUT_MS ? parseInt(env.CLAUDE_PHASE_TIMEOUT_MS, 10) : void 0,
|
|
614
|
+
usePty: aiMode === "pty",
|
|
615
|
+
ptyDefaultAgent: env.PTY_DEFAULT_AGENT || void 0
|
|
614
616
|
},
|
|
615
617
|
poll: {
|
|
616
618
|
discoveryIntervalMs: env.POLL_DISCOVERY_INTERVAL_MS ? parseInt(env.POLL_DISCOVERY_INTERVAL_MS, 10) : void 0,
|
|
@@ -782,7 +784,12 @@ var ConfigGenerator = class _ConfigGenerator {
|
|
|
782
784
|
set("BRANCH_PREFIX", config.project.branchPrefix);
|
|
783
785
|
set("WORKTREE_BASE_DIR", config.project.worktreeBaseDir);
|
|
784
786
|
set("PROJECT_SUBDIR", config.project.projectSubDir);
|
|
785
|
-
|
|
787
|
+
if (config.ai.usePty) {
|
|
788
|
+
set("AI_RUNNER_MODE", "pty");
|
|
789
|
+
set("PTY_DEFAULT_AGENT", config.ai.ptyDefaultAgent || "claude-internal");
|
|
790
|
+
} else {
|
|
791
|
+
set("AI_RUNNER_MODE", config.ai.mode);
|
|
792
|
+
}
|
|
786
793
|
set("AI_MODEL", config.ai.model);
|
|
787
794
|
set("CLAUDE_PHASE_TIMEOUT_MS", config.ai.phaseTimeoutMs);
|
|
788
795
|
set("POLL_DISCOVERY_INTERVAL_MS", config.poll?.discoveryIntervalMs);
|
|
@@ -829,7 +836,13 @@ var ConfigGenerator = class _ConfigGenerator {
|
|
|
829
836
|
entries.set("GONGFENG_PRIVATE_TOKEN", config.gongfeng.privateToken);
|
|
830
837
|
entries.set("GONGFENG_PROJECT_PATH", config.gongfeng.projectPath);
|
|
831
838
|
entries.set("PROJECT_WORK_DIR", config.project.workDir);
|
|
832
|
-
|
|
839
|
+
if (config.ai.usePty) {
|
|
840
|
+
entries.set("AI_RUNNER_MODE", "pty");
|
|
841
|
+
entries.set("PTY_DEFAULT_AGENT", config.ai.ptyDefaultAgent || "claude-internal");
|
|
842
|
+
} else {
|
|
843
|
+
entries.set("AI_RUNNER_MODE", config.ai.mode);
|
|
844
|
+
entries.set("PTY_DEFAULT_AGENT", null);
|
|
845
|
+
}
|
|
833
846
|
const optionals = [
|
|
834
847
|
["GIT_ROOT_DIR", config.project.gitRootDir, ""],
|
|
835
848
|
["BASE_BRANCH", config.project.baseBranch, "master"],
|
|
@@ -909,4 +922,4 @@ export {
|
|
|
909
922
|
PreflightChecker,
|
|
910
923
|
ConfigGenerator
|
|
911
924
|
};
|
|
912
|
-
//# sourceMappingURL=chunk-
|
|
925
|
+
//# sourceMappingURL=chunk-SEO57UYI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/setup/PreflightChecker.ts","../src/cli/setup/ConfigGenerator.ts","../src/cli/setup/env-metadata.ts"],"sourcesContent":["/**\n * Preflight checker — validates environment before first `start`.\n *\n * Runs a battery of checks (git repo, branches, AI auth, Gongfeng creds,\n * port availability) and returns structured results so the init wizard and\n * CLI `start` command can surface actionable errors.\n */\n\nimport fs from 'node:fs';\nimport net from 'node:net';\nimport { spawn } from 'node:child_process';\nimport type { SetupConfig } from './ConfigGenerator.js';\nimport { getDefaultBinary } from '../../ai-runner/AIRunnerRegistry.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type CheckSeverity = 'error' | 'warn';\n\nexport interface PreflightResult {\n name: string;\n passed: boolean;\n severity: CheckSeverity;\n message: string;\n fix?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction run(cmd: string, args: string[], opts?: { cwd?: string; timeoutMs?: number }): Promise<{ code: number; stdout: string; stderr: string }> {\n return new Promise((resolve) => {\n const proc = spawn(cmd, args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n cwd: opts?.cwd,\n });\n\n let stdout = '';\n let stderr = '';\n proc.stdout.on('data', (d: Buffer) => { stdout += d.toString(); });\n proc.stderr.on('data', (d: Buffer) => { stderr += d.toString(); });\n\n const timer = setTimeout(() => {\n proc.kill('SIGTERM');\n }, opts?.timeoutMs ?? 15_000);\n\n proc.on('close', (code) => {\n clearTimeout(timer);\n resolve({ code: code ?? 1, stdout: stdout.trim(), stderr: stderr.trim() });\n });\n proc.on('error', () => {\n clearTimeout(timer);\n resolve({ code: 1, stdout: '', stderr: 'spawn error' });\n });\n });\n}\n\nfunction checkPortAvailable(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const server = net.createServer();\n server.once('error', () => resolve(false));\n server.once('listening', () => {\n server.close(() => resolve(true));\n });\n server.listen(port, '0.0.0.0');\n });\n}\n\n// ---------------------------------------------------------------------------\n// PreflightChecker\n// ---------------------------------------------------------------------------\n\nexport class PreflightChecker {\n constructor(private config: SetupConfig) {}\n\n async runAll(): Promise<PreflightResult[]> {\n const checks = await Promise.all([\n this.checkGitRepo(),\n this.checkOriginRemote(),\n this.checkBaseBranch(),\n this.checkWorktreeDir(),\n this.checkAIRunnerBinary(),\n this.checkGongfengToken(),\n this.checkGongfengProject(),\n this.checkWebPort(),\n ]);\n return checks;\n }\n\n hasErrors(results: PreflightResult[]): boolean {\n return results.some(r => !r.passed && r.severity === 'error');\n }\n\n // -------------------------------------------------------------------------\n // Individual checks\n // -------------------------------------------------------------------------\n\n async checkGitRepo(): Promise<PreflightResult> {\n const workDir = this.config.project.workDir;\n const gitDir = this.config.project.gitRootDir || workDir;\n\n if (!gitDir) {\n return { name: 'git-repo', passed: false, severity: 'error', message: 'PROJECT_WORK_DIR 未设置' };\n }\n\n if (!fs.existsSync(gitDir)) {\n return {\n name: 'git-repo', passed: false, severity: 'error',\n message: `目录不存在: ${gitDir}`,\n fix: `请创建目录或检查 PROJECT_WORK_DIR / GIT_ROOT_DIR 配置`,\n };\n }\n\n const { code } = await run('git', ['-C', gitDir, 'rev-parse', '--git-dir']);\n if (code !== 0) {\n return {\n name: 'git-repo', passed: false, severity: 'error',\n message: `${gitDir} 不是有效的 Git 仓库`,\n fix: `cd ${gitDir} && git init 或检查路径配置`,\n };\n }\n\n return { name: 'git-repo', passed: true, severity: 'error', message: 'Git 仓库有效' };\n }\n\n async checkOriginRemote(): Promise<PreflightResult> {\n const gitDir = this.config.project.gitRootDir || this.config.project.workDir;\n if (!gitDir || !fs.existsSync(gitDir)) {\n return { name: 'git-origin', passed: false, severity: 'error', message: '跳过 (Git 目录无效)' };\n }\n\n const { code, stdout } = await run('git', ['-C', gitDir, 'remote', 'get-url', 'origin']);\n if (code !== 0) {\n return {\n name: 'git-origin', passed: false, severity: 'error',\n message: '未找到 origin remote',\n fix: `git -C ${gitDir} remote add origin <仓库URL>`,\n };\n }\n\n return { name: 'git-origin', passed: true, severity: 'error', message: `origin: ${stdout.split('\\n')[0]}` };\n }\n\n async checkBaseBranch(): Promise<PreflightResult> {\n const gitDir = this.config.project.gitRootDir || this.config.project.workDir;\n const branch = this.config.project.baseBranch || 'master';\n\n if (!gitDir || !fs.existsSync(gitDir)) {\n return { name: 'base-branch', passed: false, severity: 'error', message: '跳过 (Git 目录无效)' };\n }\n\n // Check local branch first\n const { code: localCode } = await run('git', ['-C', gitDir, 'rev-parse', '--verify', branch]);\n if (localCode === 0) {\n return { name: 'base-branch', passed: true, severity: 'error', message: `分支 ${branch} 存在` };\n }\n\n // Check remote\n const { code: remoteCode } = await run('git', [\n '-C', gitDir, 'ls-remote', '--exit-code', '--heads', 'origin', branch,\n ]);\n if (remoteCode === 0) {\n return { name: 'base-branch', passed: true, severity: 'error', message: `远程分支 origin/${branch} 存在` };\n }\n\n return {\n name: 'base-branch', passed: false, severity: 'error',\n message: `分支 ${branch} 不存在 (本地和远程均未找到)`,\n fix: `请检查 BASE_BRANCH 配置,或执行 git fetch origin`,\n };\n }\n\n async checkWorktreeDir(): Promise<PreflightResult> {\n const dir = this.config.project.worktreeBaseDir;\n if (!dir) {\n return { name: 'worktree-dir', passed: true, severity: 'error', message: '使用默认 worktree 目录' };\n }\n\n if (!fs.existsSync(dir)) {\n // Try to create\n try {\n fs.mkdirSync(dir, { recursive: true });\n return { name: 'worktree-dir', passed: true, severity: 'error', message: `已创建 worktree 目录: ${dir}` };\n } catch {\n return {\n name: 'worktree-dir', passed: false, severity: 'error',\n message: `无法创建 worktree 目录: ${dir}`,\n fix: `请手动创建目录或检查权限`,\n };\n }\n }\n\n try {\n fs.accessSync(dir, fs.constants.W_OK);\n } catch {\n return {\n name: 'worktree-dir', passed: false, severity: 'error',\n message: `worktree 目录无写入权限: ${dir}`,\n fix: `chmod u+w ${dir}`,\n };\n }\n\n return { name: 'worktree-dir', passed: true, severity: 'error', message: `worktree 目录可写: ${dir}` };\n }\n\n async checkAIRunnerBinary(): Promise<PreflightResult> {\n const mode = this.config.ai.mode;\n\n if (mode === 'pty') {\n return this.checkPtyAgentBinaries();\n }\n\n const binary = getDefaultBinary(mode);\n\n const { code } = await run('which', [binary]);\n if (code !== 0) {\n const installHints: Record<string, string> = {\n 'claude-internal': 'npm install -g claude-code-internal',\n 'cursor-agent': 'curl -fsSL https://www.cursor.com/install-agent | bash',\n 'codebuddy': 'npm install -g codebuddy-code',\n 'codebuddy-acp': 'npm install -g codebuddy-code',\n 'sdk': 'npm install -g @anthropic-ai/claude-code',\n };\n return {\n name: 'ai-runner', passed: false, severity: 'error',\n message: `AI Runner 二进制未找到: ${binary}`,\n fix: installHints[mode] ?? `请安装 ${binary} 并确保在 PATH 中`,\n };\n }\n\n return { name: 'ai-runner', passed: true, severity: 'error', message: `AI Runner 可用: ${binary}` };\n }\n\n private async checkPtyAgentBinaries(): Promise<PreflightResult> {\n const defaultAgent = process.env.PTY_DEFAULT_AGENT || 'claude-internal';\n const phaseAgentsStr = process.env.PTY_PHASE_AGENTS || '';\n\n const agents = new Set([defaultAgent]);\n if (phaseAgentsStr) {\n for (const pair of phaseAgentsStr.split(',')) {\n const [, agent] = pair.split(':').map(s => s.trim());\n if (agent) agents.add(agent);\n }\n }\n\n const missing: string[] = [];\n for (const agent of agents) {\n const binary = getDefaultBinary(agent);\n const { code } = await run('which', [binary]);\n if (code !== 0) missing.push(`${agent} (${binary})`);\n }\n\n if (missing.length > 0) {\n return {\n name: 'ai-runner', passed: false, severity: 'error',\n message: `PTY 模式需要的 Agent 二进制未找到: ${missing.join(', ')}`,\n fix: '请安装缺失的 AI Agent CLI 并确保在 PATH 中',\n };\n }\n\n return {\n name: 'ai-runner', passed: true, severity: 'error',\n message: `PTY 模式 Agent 可用: ${[...agents].join(', ')}`,\n };\n }\n\n async checkGongfengToken(): Promise<PreflightResult> {\n const { apiUrl, privateToken } = this.config.gongfeng;\n if (!apiUrl || !privateToken) {\n return {\n name: 'gongfeng-token', passed: false, severity: 'error',\n message: '工蜂 API URL 或 Token 未配置',\n fix: '请在配置中填写 GONGFENG_API_URL 和 GONGFENG_PRIVATE_TOKEN',\n };\n }\n\n try {\n const url = `${apiUrl.replace(/\\/$/, '')}/api/v3/user`;\n const response = await fetch(url, {\n headers: { 'PRIVATE-TOKEN': privateToken },\n signal: AbortSignal.timeout(10_000),\n });\n\n if (!response.ok) {\n return {\n name: 'gongfeng-token', passed: false, severity: 'error',\n message: `工蜂 Token 验证失败 (HTTP ${response.status})`,\n fix: '请检查 GONGFENG_PRIVATE_TOKEN 是否有效 (需 api scope)',\n };\n }\n\n const user = await response.json() as { username?: string };\n return {\n name: 'gongfeng-token', passed: true, severity: 'error',\n message: `工蜂认证成功 (用户: ${user.username ?? 'unknown'})`,\n };\n } catch (err) {\n return {\n name: 'gongfeng-token', passed: false, severity: 'error',\n message: `工蜂 API 连接失败: ${(err as Error).message}`,\n fix: '请检查 GONGFENG_API_URL 是否可达,以及网络连接',\n };\n }\n }\n\n async checkGongfengProject(): Promise<PreflightResult> {\n const { apiUrl, privateToken, projectPath } = this.config.gongfeng;\n if (!apiUrl || !privateToken || !projectPath) {\n return {\n name: 'gongfeng-project', passed: false, severity: 'error',\n message: '工蜂项目路径未配置',\n fix: '请填写 GONGFENG_PROJECT_PATH (如 team/project)',\n };\n }\n\n try {\n const encoded = encodeURIComponent(projectPath);\n const url = `${apiUrl.replace(/\\/$/, '')}/api/v3/projects/${encoded}`;\n const response = await fetch(url, {\n headers: { 'PRIVATE-TOKEN': privateToken },\n signal: AbortSignal.timeout(10_000),\n });\n\n if (!response.ok) {\n return {\n name: 'gongfeng-project', passed: false, severity: 'error',\n message: `无法访问项目 ${projectPath} (HTTP ${response.status})`,\n fix: '请检查 GONGFENG_PROJECT_PATH,确保 Token 有权限访问该项目',\n };\n }\n\n return {\n name: 'gongfeng-project', passed: true, severity: 'error',\n message: `项目 ${projectPath} 可访问`,\n };\n } catch (err) {\n return {\n name: 'gongfeng-project', passed: false, severity: 'error',\n message: `项目验证请求失败: ${(err as Error).message}`,\n fix: '请检查网络连接和 GONGFENG_API_URL',\n };\n }\n }\n\n async checkWebPort(): Promise<PreflightResult> {\n const port = this.config.web?.port ?? 3000;\n const available = await checkPortAvailable(port);\n if (!available) {\n return {\n name: 'web-port', passed: false, severity: 'warn',\n message: `Web 端口 ${port} 被占用`,\n fix: `修改 WEB_PORT 或释放端口: lsof -i :${port}`,\n };\n }\n return { name: 'web-port', passed: true, severity: 'warn', message: `Web 端口 ${port} 可用` };\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { getLocalIP } from '../../utils/network.js';\nimport { getGlobalDir, resolveDataDir } from '../../paths.js';\nimport type { WorkspaceConfig } from '../../workspace/WorkspaceConfig.js';\nimport { envSchema } from '../../config-schema.js';\nimport { ENV_GROUPS, ENV_VAR_META } from './env-metadata.js';\n\nexport { getLocalIP };\n\nexport interface SetupConfig {\n gongfeng: {\n apiUrl: string;\n privateToken: string;\n projectPath: string;\n };\n project: {\n workDir: string;\n gitRootDir?: string;\n baseBranch?: string;\n branchPrefix?: string;\n worktreeBaseDir?: string;\n projectSubDir?: string;\n };\n ai: {\n mode: string;\n model?: string;\n phaseTimeoutMs?: number;\n usePty?: boolean;\n ptyDefaultAgent?: string;\n };\n poll?: {\n discoveryIntervalMs?: number;\n driveIntervalMs?: number;\n maxRetries?: number;\n maxConcurrent?: number;\n };\n web?: {\n port?: number;\n };\n pipeline?: {\n mode?: string;\n };\n review?: {\n enabled?: boolean;\n };\n e2e?: {\n uatVendorDir?: string;\n uatConfigFile?: string;\n pythonBin?: string;\n };\n release?: {\n enabled?: boolean;\n };\n}\n\nexport class ConfigGenerator {\n /** @deprecated Use `getLocalIP()` from `../../utils/network.js` instead */\n static getLocalIP(): string {\n return getLocalIP();\n }\n\n static getGlobalConfigDir(): string {\n return getGlobalDir();\n }\n\n static getGlobalConfigPath(): string {\n return path.join(ConfigGenerator.getGlobalConfigDir(), '.env');\n }\n\n static isInitialized(configPath?: string): boolean {\n const envPath = configPath ?? ConfigGenerator.getGlobalConfigPath();\n return fs.existsSync(envPath);\n }\n\n /** @deprecated Use `generateFull()` for new files. Kept for backward compat in mergeWrite(). */\n static generate(config: SetupConfig): string {\n const lines: string[] = [];\n\n const addSection = (title: string) => {\n if (lines.length > 0) lines.push('');\n lines.push('# ' + title);\n };\n\n const addVar = (\n key: string,\n value: string | number | boolean | undefined,\n ) => {\n if (value === undefined) return;\n lines.push(key + '=' + String(value));\n };\n\n const addNonDefault = (\n key: string,\n value: string | number | boolean | undefined,\n defaultValue: string | number | boolean,\n ) => {\n if (value === undefined || value === '' || value === defaultValue) return;\n lines.push(key + '=' + String(value));\n };\n\n addSection('Gongfeng');\n addVar('GONGFENG_API_URL', config.gongfeng.apiUrl);\n addVar('GONGFENG_PRIVATE_TOKEN', config.gongfeng.privateToken);\n addVar('GONGFENG_PROJECT_PATH', config.gongfeng.projectPath);\n\n addSection('Project');\n addVar('PROJECT_WORK_DIR', config.project.workDir);\n addNonDefault('GIT_ROOT_DIR', config.project.gitRootDir, '');\n addNonDefault('BASE_BRANCH', config.project.baseBranch, 'master');\n addNonDefault('BRANCH_PREFIX', config.project.branchPrefix, 'feat/issue');\n addNonDefault('WORKTREE_BASE_DIR', config.project.worktreeBaseDir, '');\n addNonDefault('PROJECT_SUBDIR', config.project.projectSubDir, '');\n\n addSection('AI');\n addVar('AI_RUNNER_MODE', config.ai.mode);\n addNonDefault('AI_MODEL', config.ai.model, 'Claude-4.6-Opus');\n\n addNonDefault('CLAUDE_PHASE_TIMEOUT_MS', config.ai.phaseTimeoutMs, 1800000);\n addNonDefault('POLL_DISCOVERY_INTERVAL_MS', config.poll?.discoveryIntervalMs, 60000);\n addNonDefault('POLL_DRIVE_INTERVAL_MS', config.poll?.driveIntervalMs, 15000);\n addNonDefault('MAX_RETRIES', config.poll?.maxRetries, 3);\n addNonDefault('MAX_CONCURRENT_ISSUES', config.poll?.maxConcurrent, 3);\n addNonDefault('PIPELINE_MODE', config.pipeline?.mode, 'auto');\n addNonDefault('REVIEW_ENABLED', config.review?.enabled, true);\n addNonDefault('RELEASE_ENABLED', config.release?.enabled, false);\n\n const port = config.web?.port ?? 3000;\n if (port !== 3000) {\n addNonDefault('WEB_PORT', port, 3000);\n }\n\n addNonDefault('E2E_UAT_VENDOR_DIR', config.e2e?.uatVendorDir, '');\n addNonDefault('E2E_UAT_CONFIG_FILE', config.e2e?.uatConfigFile, '');\n addNonDefault('E2E_PYTHON_BIN', config.e2e?.pythonBin, 'python3');\n\n addSection('Workspace');\n addVar('WORKSPACE_CONFIG_PATH', ConfigGenerator.getWorkspaceConfigPath());\n\n return lines.join('\\n') + '\\n';\n }\n\n static readCurrent(): SetupConfig {\n const env = process.env;\n const aiMode = env.AI_RUNNER_MODE || 'cursor-agent';\n return {\n gongfeng: {\n apiUrl: env.GONGFENG_API_URL || '',\n privateToken: env.GONGFENG_PRIVATE_TOKEN || '',\n projectPath: env.GONGFENG_PROJECT_PATH || '',\n },\n project: {\n workDir: env.PROJECT_WORK_DIR || '',\n gitRootDir: env.GIT_ROOT_DIR || undefined,\n baseBranch: env.BASE_BRANCH || undefined,\n branchPrefix: env.BRANCH_PREFIX || undefined,\n worktreeBaseDir: env.WORKTREE_BASE_DIR || undefined,\n projectSubDir: env.PROJECT_SUBDIR || undefined,\n },\n ai: {\n mode: aiMode,\n model: env.AI_MODEL || undefined,\n phaseTimeoutMs: env.CLAUDE_PHASE_TIMEOUT_MS\n ? parseInt(env.CLAUDE_PHASE_TIMEOUT_MS, 10)\n : undefined,\n usePty: aiMode === 'pty',\n ptyDefaultAgent: env.PTY_DEFAULT_AGENT || undefined,\n },\n poll: {\n discoveryIntervalMs: env.POLL_DISCOVERY_INTERVAL_MS\n ? parseInt(env.POLL_DISCOVERY_INTERVAL_MS, 10)\n : undefined,\n driveIntervalMs: env.POLL_DRIVE_INTERVAL_MS\n ? parseInt(env.POLL_DRIVE_INTERVAL_MS, 10)\n : undefined,\n maxRetries: env.MAX_RETRIES\n ? parseInt(env.MAX_RETRIES, 10)\n : undefined,\n maxConcurrent: env.MAX_CONCURRENT_ISSUES\n ? parseInt(env.MAX_CONCURRENT_ISSUES, 10)\n : undefined,\n },\n web: {\n port: env.WEB_PORT ? parseInt(env.WEB_PORT, 10) : undefined,\n },\n pipeline: {\n mode: env.PIPELINE_MODE || undefined,\n },\n review: {\n enabled: env.REVIEW_ENABLED !== undefined\n ? env.REVIEW_ENABLED === 'true'\n : undefined,\n },\n release: {\n enabled: env.RELEASE_ENABLED !== undefined\n ? env.RELEASE_ENABLED === 'true'\n : undefined,\n },\n e2e: {\n uatVendorDir: env.E2E_UAT_VENDOR_DIR || undefined,\n uatConfigFile: env.E2E_UAT_CONFIG_FILE || undefined,\n pythonBin: env.E2E_PYTHON_BIN || undefined,\n },\n };\n }\n\n static getWorkspaceConfigPath(): string {\n return path.join(resolveDataDir(), 'workspace.json');\n }\n\n static buildWorkspaceConfig(config: SetupConfig): WorkspaceConfig {\n return {\n primary: {\n name: 'primary',\n projectPath: config.gongfeng.projectPath,\n localGitRoot: config.project.gitRootDir ?? config.project.workDir,\n projectSubDir: config.project.projectSubDir ?? '',\n baseBranch: config.project.baseBranch,\n branchPrefix: config.project.branchPrefix,\n role: '',\n },\n associates: [],\n };\n }\n\n static writeWorkspaceConfig(config: SetupConfig): string {\n const wsPath = ConfigGenerator.getWorkspaceConfigPath();\n const dir = path.dirname(wsPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n const wsConfig = ConfigGenerator.buildWorkspaceConfig(config);\n fs.writeFileSync(wsPath, JSON.stringify(wsConfig, null, 2) + '\\n', 'utf-8');\n return wsPath;\n }\n\n static write(config: SetupConfig, outputPath?: string): string {\n const targetPath = outputPath ?? ConfigGenerator.getGlobalConfigPath();\n const dir = path.dirname(targetPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n const userValues = ConfigGenerator.setupConfigToEnvMap(config);\n const content = ConfigGenerator.generateFull(userValues);\n fs.writeFileSync(targetPath, content, 'utf-8');\n ConfigGenerator.writeWorkspaceConfig(config);\n return targetPath;\n }\n\n // ---------------------------------------------------------------------------\n // Full .env generation (complete, self-documenting)\n // ---------------------------------------------------------------------------\n\n /**\n * Extract the raw default value from a Zod v4 schema field.\n *\n * Handles three patterns used in `envSchema`:\n * - `def.type === 'default'` → `def.defaultValue` (string/number/enum defaults)\n * - `def.type === 'pipe'` → `def.in._zod.def.defaultValue` (envBoolean: .default().transform())\n * - anything else (optional / required without default) → `undefined`\n */\n static extractDefault(field: unknown): string | undefined {\n const def = (field as { _zod?: { def?: { type?: string; defaultValue?: unknown; in?: unknown } } })?._zod?.def;\n if (!def) return undefined;\n\n if (def.type === 'default' && def.defaultValue !== undefined) {\n return String(def.defaultValue);\n }\n\n // envBoolean pattern: pipe wraps a default schema\n if (def.type === 'pipe' && def.in) {\n const innerDef = (def.in as { _zod?: { def?: { type?: string; defaultValue?: unknown } } })?._zod?.def;\n if (innerDef?.type === 'default' && innerDef.defaultValue !== undefined) {\n return String(innerDef.defaultValue);\n }\n }\n\n return undefined;\n }\n\n /**\n * Generate a complete, self-documenting `.env` file containing ALL\n * variables from `envSchema`, grouped and commented in Chinese.\n *\n * Priority: `userValues[key]` > schema default > commented-out placeholder.\n *\n * @param userValues — key/value pairs from the setup wizard (flat env keys)\n */\n static generateFull(userValues?: Record<string, string>): string {\n const shape = envSchema.shape as Record<string, unknown>;\n const allKeys = Object.keys(shape);\n const user = userValues ?? {};\n\n // Build set of keys that belong to a known group\n const groupedKeys = new Set<string>();\n\n const lines: string[] = [\n '# ============================================================',\n '# Issue Auto-Finish 配置文件',\n '# 由 issue-auto-finish init 自动生成',\n '# ============================================================',\n ];\n\n for (const group of ENV_GROUPS) {\n // Collect keys in this group\n const keysInGroup = allKeys.filter(k => ENV_VAR_META[k]?.group === group.key);\n if (keysInGroup.length === 0) continue;\n\n lines.push('');\n lines.push(`# -----------------------------------------------------------`);\n lines.push(`# ${group.title}`);\n lines.push(`# -----------------------------------------------------------`);\n\n for (const key of keysInGroup) {\n groupedKeys.add(key);\n const meta = ENV_VAR_META[key];\n const desc = meta?.description ?? key;\n const isRequired = meta?.required === true;\n const schemaDefault = ConfigGenerator.extractDefault(shape[key]);\n const userVal = user[key];\n\n lines.push(`# ${desc}`);\n\n if (userVal !== undefined && userVal !== '') {\n // User provided a value\n lines.push(`${key}=${userVal}`);\n } else if (isRequired) {\n // Required, no value — placeholder\n lines.push(`${key}=<请填写>`);\n } else if (schemaDefault !== undefined) {\n // Has default — write it\n lines.push(`${key}=${schemaDefault}`);\n } else {\n // Optional, no default — comment out\n lines.push(`# ${key}=`);\n }\n }\n }\n\n // Safety net: any envSchema keys NOT in ENV_VAR_META (shouldn't happen,\n // but the sync test will catch it)\n const ungrouped = allKeys.filter(k => !groupedKeys.has(k));\n if (ungrouped.length > 0) {\n lines.push('');\n lines.push('# --- 其他 / Other ---');\n for (const key of ungrouped) {\n const schemaDefault = ConfigGenerator.extractDefault(shape[key]);\n const userVal = user[key];\n if (userVal !== undefined && userVal !== '') {\n lines.push(`${key}=${userVal}`);\n } else if (schemaDefault !== undefined) {\n lines.push(`${key}=${schemaDefault}`);\n } else {\n lines.push(`# ${key}=`);\n }\n }\n }\n\n return lines.join('\\n') + '\\n';\n }\n\n /**\n * Convert a `SetupConfig` (wizard output) to a flat `Record<string, string>`\n * suitable for `generateFull()`.\n */\n static setupConfigToEnvMap(config: SetupConfig): Record<string, string> {\n const m: Record<string, string> = {};\n\n const set = (key: string, val: string | number | boolean | undefined) => {\n if (val !== undefined && val !== '') m[key] = String(val);\n };\n\n set('GONGFENG_API_URL', config.gongfeng.apiUrl);\n set('GONGFENG_PRIVATE_TOKEN', config.gongfeng.privateToken);\n set('GONGFENG_PROJECT_PATH', config.gongfeng.projectPath);\n set('PROJECT_WORK_DIR', config.project.workDir);\n set('GIT_ROOT_DIR', config.project.gitRootDir);\n set('BASE_BRANCH', config.project.baseBranch);\n set('BRANCH_PREFIX', config.project.branchPrefix);\n set('WORKTREE_BASE_DIR', config.project.worktreeBaseDir);\n set('PROJECT_SUBDIR', config.project.projectSubDir);\n if (config.ai.usePty) {\n set('AI_RUNNER_MODE', 'pty');\n set('PTY_DEFAULT_AGENT', config.ai.ptyDefaultAgent || 'claude-internal');\n } else {\n set('AI_RUNNER_MODE', config.ai.mode);\n }\n set('AI_MODEL', config.ai.model);\n set('CLAUDE_PHASE_TIMEOUT_MS', config.ai.phaseTimeoutMs);\n set('POLL_DISCOVERY_INTERVAL_MS', config.poll?.discoveryIntervalMs);\n set('POLL_DRIVE_INTERVAL_MS', config.poll?.driveIntervalMs);\n set('MAX_RETRIES', config.poll?.maxRetries);\n set('MAX_CONCURRENT_ISSUES', config.poll?.maxConcurrent);\n set('PIPELINE_MODE', config.pipeline?.mode);\n set('REVIEW_ENABLED', config.review?.enabled);\n set('RELEASE_ENABLED', config.release?.enabled);\n set('WEB_PORT', config.web?.port);\n set('E2E_UAT_VENDOR_DIR', config.e2e?.uatVendorDir);\n set('E2E_UAT_CONFIG_FILE', config.e2e?.uatConfigFile);\n set('E2E_PYTHON_BIN', config.e2e?.pythonBin);\n set('WORKSPACE_CONFIG_PATH', ConfigGenerator.getWorkspaceConfigPath());\n\n return m;\n }\n\n /**\n * 增量更新 .env 文件:只更新 SetupConfig 涉及的 key,保留其余内容。\n * 如果文件不存在,退化为全量写入。\n */\n static mergeWrite(config: SetupConfig, outputPath?: string): string {\n const targetPath = outputPath ?? ConfigGenerator.getGlobalConfigPath();\n\n if (!fs.existsSync(targetPath)) {\n return ConfigGenerator.write(config, targetPath);\n }\n\n const existing = fs.readFileSync(targetPath, 'utf-8');\n const updates = ConfigGenerator.toEnvEntries(config);\n const merged = ConfigGenerator.mergeEnvContent(existing, updates);\n\n const dir = path.dirname(targetPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(targetPath, merged, 'utf-8');\n ConfigGenerator.writeWorkspaceConfig(config);\n return targetPath;\n }\n\n /**\n * 将 SetupConfig 转换为 env key-value 对。\n * null 值表示该 key 应从文件中删除(用户恢复为默认值时)。\n */\n static toEnvEntries(config: SetupConfig): Map<string, string | null> {\n const entries = new Map<string, string | null>();\n\n entries.set('GONGFENG_API_URL', config.gongfeng.apiUrl);\n entries.set('GONGFENG_PRIVATE_TOKEN', config.gongfeng.privateToken);\n entries.set('GONGFENG_PROJECT_PATH', config.gongfeng.projectPath);\n entries.set('PROJECT_WORK_DIR', config.project.workDir);\n if (config.ai.usePty) {\n entries.set('AI_RUNNER_MODE', 'pty');\n entries.set('PTY_DEFAULT_AGENT', config.ai.ptyDefaultAgent || 'claude-internal');\n } else {\n entries.set('AI_RUNNER_MODE', config.ai.mode);\n entries.set('PTY_DEFAULT_AGENT', null);\n }\n\n // 可选项:有值写入,值为默认值或空时标记删除\n const optionals: Array<[string, string | number | boolean | undefined, string | number | boolean]> = [\n ['GIT_ROOT_DIR', config.project.gitRootDir, ''],\n ['BASE_BRANCH', config.project.baseBranch, 'master'],\n ['BRANCH_PREFIX', config.project.branchPrefix, 'feat/issue'],\n ['WORKTREE_BASE_DIR', config.project.worktreeBaseDir, ''],\n ['PROJECT_SUBDIR', config.project.projectSubDir, ''],\n ['AI_MODEL', config.ai.model, 'Claude-4.6-Opus'],\n ['CLAUDE_PHASE_TIMEOUT_MS', config.ai.phaseTimeoutMs, 1800000],\n ['POLL_DISCOVERY_INTERVAL_MS', config.poll?.discoveryIntervalMs, 60000],\n ['POLL_DRIVE_INTERVAL_MS', config.poll?.driveIntervalMs, 15000],\n ['MAX_RETRIES', config.poll?.maxRetries, 3],\n ['MAX_CONCURRENT_ISSUES', config.poll?.maxConcurrent, 3],\n ['PIPELINE_MODE', config.pipeline?.mode, 'auto'],\n ['REVIEW_ENABLED', config.review?.enabled, true],\n ['RELEASE_ENABLED', config.release?.enabled, false],\n ['WEB_PORT', config.web?.port, 3000],\n ['E2E_UAT_VENDOR_DIR', config.e2e?.uatVendorDir, ''],\n ['E2E_UAT_CONFIG_FILE', config.e2e?.uatConfigFile, ''],\n ['E2E_PYTHON_BIN', config.e2e?.pythonBin, 'python3'],\n ['WORKSPACE_CONFIG_PATH', ConfigGenerator.getWorkspaceConfigPath(), ''],\n ];\n\n for (const [key, value, defaultValue] of optionals) {\n if (value === undefined || value === '' || value === defaultValue) {\n entries.set(key, null);\n } else {\n entries.set(key, String(value));\n }\n }\n\n return entries;\n }\n\n /**\n * 将 updates 合并到现有 .env 内容中。\n * - 已有的 key:原地更新值或删除行\n * - 新增的 key:追加到文件末尾\n * - 注释和空行:原样保留\n */\n static mergeEnvContent(\n existing: string,\n updates: Map<string, string | null>,\n ): string {\n const remaining = new Map(updates);\n const lines = existing.split('\\n');\n const result: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n // 空行或注释:保留\n if (trimmed === '' || trimmed.startsWith('#')) {\n result.push(line);\n continue;\n }\n // 解析 KEY=VALUE\n const eqIdx = trimmed.indexOf('=');\n if (eqIdx === -1) {\n result.push(line);\n continue;\n }\n const key = trimmed.substring(0, eqIdx).trim();\n if (remaining.has(key)) {\n const newValue = remaining.get(key);\n remaining.delete(key);\n if (newValue !== null) {\n result.push(`${key}=${newValue}`);\n }\n // newValue === null → 删除该行\n } else {\n // 不在 updates 范围内:原样保留\n result.push(line);\n }\n }\n\n // 追加新增的 key(原文件中不存在的)\n const newEntries = [...remaining.entries()].filter(([, v]) => v !== null);\n if (newEntries.length > 0) {\n if (result.length > 0 && result[result.length - 1]?.trim() !== '') {\n result.push('');\n }\n for (const [key, value] of newEntries) {\n result.push(`${key}=${value}`);\n }\n }\n\n return result.join('\\n');\n }\n}\n","/**\n * Environment variable metadata registry.\n *\n * Provides grouping and Chinese descriptions for every key in `envSchema`.\n * Used by `ConfigGenerator.generateFull()` to produce a complete, self-documenting\n * `.env` file. A CI test (`env-metadata-sync.test.ts`) ensures this registry\n * stays in sync with the schema.\n */\n\nexport interface EnvVarMeta {\n /** Group key — must reference an entry in ENV_GROUPS. */\n group: string;\n /** Chinese description shown as a comment above the variable. */\n description: string;\n /** Mark as required (no default, must be user-provided). */\n required?: boolean;\n}\n\n/**\n * Ordered group definitions. The array order determines the section order\n * in the generated `.env` file.\n */\nexport const ENV_GROUPS: Array<{ key: string; title: string }> = [\n { key: 'required', title: '必填项 / Required' },\n { key: 'paths', title: '路径覆盖 / Path Overrides' },\n { key: 'project', title: '项目 / Project' },\n { key: 'ai', title: 'AI 运行器 / AI Runner' },\n { key: 'pipeline', title: '流水线 / Pipeline' },\n { key: 'poll', title: '轮询与并发 / Polling & Concurrency' },\n { key: 'review', title: '审核 / Review Gate' },\n { key: 'web', title: 'Web 面板 / Dashboard' },\n { key: 'issueNoteSync', title: 'Issue 评论同步 / Note Sync' },\n { key: 'webhook', title: 'Webhook' },\n { key: 'e2e', title: 'E2E 测试 / E2E Testing' },\n { key: 'preview', title: '预览环境 / Preview' },\n { key: 'brainstorm', title: '头脑风暴 / Brainstorm' },\n { key: 'chat', title: '智能助手 / Chat Agent' },\n { key: 'braindump', title: '批量任务 / Braindump' },\n { key: 'autoUpdate', title: '自动更新 / Auto Update' },\n { key: 'iwiki', title: 'iWiki' },\n { key: 'locale', title: '语言 / Locale' },\n { key: 'knowledge', title: '知识管理 / Knowledge' },\n { key: 'distill', title: '知识蒸馏 / Distill' },\n { key: 'sync', title: '文件同步 / Sync' },\n { key: 'release', title: '发布 / Release' },\n { key: 'verifyFixLoop', title: '验证修复循环 / Verify-Fix Loop' },\n { key: 'terminal', title: '交互式终端 / Terminal' },\n { key: 'analytics', title: '运营分析 / Analytics' },\n { key: 'coordination', title: '多节点 / Multi-Node' },\n { key: 'workspace', title: '工作区 / Workspace' },\n { key: 'tenants', title: '多租户 / Multi-Tenant' },\n];\n\n/**\n * Per-variable metadata. Keys must match `envSchema.shape` exactly.\n */\nexport const ENV_VAR_META: Record<string, EnvVarMeta> = {\n // --- 必填 ---\n GONGFENG_API_URL: { group: 'required', description: '工蜂 GitLab API 地址', required: true },\n GONGFENG_PRIVATE_TOKEN: { group: 'required', description: '工蜂 API 访问令牌 (需 api scope)', required: true },\n GONGFENG_PROJECT_PATH: { group: 'required', description: '工蜂项目路径 (如 team/project)', required: true },\n PROJECT_WORK_DIR: { group: 'required', description: '项目本地工作目录 (绝对路径)', required: true },\n\n // --- 路径覆盖 ---\n DATA_DIR: { group: 'paths', description: '数据目录 (覆盖自动检测)' },\n LOGS_DIR: { group: 'paths', description: '日志目录 (覆盖自动检测)' },\n\n // --- 项目 ---\n GIT_ROOT_DIR: { group: 'project', description: 'Git 仓库根目录 (默认同 PROJECT_WORK_DIR)' },\n BASE_BRANCH: { group: 'project', description: '基础分支' },\n BRANCH_PREFIX: { group: 'project', description: '特性分支名前缀' },\n WORKTREE_BASE_DIR:{ group: 'project', description: 'Worktree 存放目录 (为空则使用默认位置)' },\n PROJECT_SUBDIR: { group: 'project', description: 'Monorepo 中项目子目录' },\n\n // --- AI ---\n AI_RUNNER_MODE: { group: 'ai', description: 'AI 运行模式 (claude-internal / cursor-agent / codebuddy)' },\n AI_MODEL: { group: 'ai', description: 'AI 模型' },\n CLAUDE_BINARY: { group: 'ai', description: 'Claude CLI 二进制路径 (覆盖默认)' },\n CURSOR_BINARY: { group: 'ai', description: 'Cursor Agent CLI 二进制路径 (覆盖默认)' },\n CODEBUDDY_BINARY: { group: 'ai', description: 'CodeBuddy CLI 二进制路径 (覆盖默认)' },\n CODEBUDDY_ACP_AUTO_APPROVE: { group: 'ai', description: 'CodeBuddy ACP 自动批准' },\n CLAUDE_PHASE_TIMEOUT_MS: { group: 'ai', description: 'AI 阶段执行超时 (毫秒)' },\n PHASE_TIMEOUT_GRACE_MS: { group: 'ai', description: '阶段超时宽限期 (毫秒, 默认 60000)' },\n PHASE_TIMEOUT_EXTENSION_MS: { group: 'ai', description: '阶段超时延长时间 (毫秒, 默认 600000)' },\n PHASE_TIMEOUT_MAX_EXTENSIONS: { group: 'ai', description: '阶段超时最大延长次数 (默认 3)' },\n AI_IDLE_TIMEOUT_MS: { group: 'ai', description: 'AI 空闲超时 (毫秒, 0 禁用)' },\n NVM_NODE_VERSION: { group: 'ai', description: 'AI Runner 使用的 Node.js 版本' },\n\n // --- 流水线 ---\n PIPELINE_MODE: { group: 'pipeline', description: '流水线模式 (auto 始终解析为 plan-mode)' },\n\n // --- 轮询 ---\n POLL_DISCOVERY_INTERVAL_MS: { group: 'poll', description: '新 Issue 发现间隔 (毫秒)' },\n POLL_DRIVE_INTERVAL_MS: { group: 'poll', description: '任务驱动间隔 (毫秒)' },\n MAX_RETRIES: { group: 'poll', description: '最大重试次数' },\n MAX_CONCURRENT_ISSUES: { group: 'poll', description: '最大并行 Issue 数' },\n\n // --- 审核 ---\n REVIEW_ENABLED: { group: 'review', description: '启用方案审核门禁' },\n REVIEW_AUTO_APPROVE_LABELS:{ group: 'review', description: '自动批准的标签 (逗号分隔)' },\n\n // --- Web ---\n WEB_ENABLED: { group: 'web', description: '启用 Web 监控面板' },\n WEB_HOST: { group: 'web', description: 'Web 监听地址' },\n WEB_PORT: { group: 'web', description: 'Web 面板端口' },\n FRONTEND_DIST_DIR: { group: 'web', description: '前端构建产物目录 (覆盖默认)' },\n\n // --- Issue 评论同步 ---\n ISSUE_NOTE_SYNC_ENABLED: { group: 'issueNoteSync', description: '启用 Issue 评论同步' },\n WEB_BASE_URL: { group: 'issueNoteSync', description: 'Web 面板外部访问地址 (默认自动检测)' },\n\n // --- Webhook ---\n WEBHOOK_ENABLED: { group: 'webhook', description: '启用 Webhook 接收工蜂推送事件' },\n WEBHOOK_HOST: { group: 'webhook', description: 'Webhook 监听地址' },\n WEBHOOK_PORT: { group: 'webhook', description: 'Webhook 端口 (需满足工蜂要求: 80/443/8080/8081)' },\n WEBHOOK_SECRET: { group: 'webhook', description: 'Webhook 密钥' },\n WEBHOOK_LLM_FALLBACK: { group: 'webhook', description: '正则匹配失败时用 LLM 解析自然语言意图' },\n WEBHOOK_LLM_BINARY: { group: 'webhook', description: '意图识别使用的 AI CLI (独立于 AI_RUNNER_MODE)' },\n\n // --- E2E ---\n E2E_UI_ENABLED: { group: 'e2e', description: '启用 E2E 测试功能' },\n E2E_BASE_URL: { group: 'e2e', description: 'E2E 测试目标 URL' },\n E2E_BACKEND_URL: { group: 'e2e', description: 'E2E 后端 URL' },\n E2E_AUTH_COOKIES: { group: 'e2e', description: 'E2E 认证 Cookies (JSON 数组)' },\n E2E_BACKEND_PORT_BASE: { group: 'e2e', description: 'E2E 后端端口基数' },\n E2E_FRONTEND_PORT_BASE: { group: 'e2e', description: 'E2E 前端端口基数' },\n E2E_UAT_VENDOR_DIR: { group: 'e2e', description: 'UAT 测试框架目录' },\n E2E_UAT_CONFIG_FILE: { group: 'e2e', description: 'UAT 配置文件路径' },\n E2E_PYTHON_BIN: { group: 'e2e', description: 'Python 可执行文件路径' },\n E2E_AI_RUNNER_MODE: { group: 'e2e', description: 'E2E 阶段使用的 AI Runner 模式' },\n E2E_AI_MODEL: { group: 'e2e', description: 'E2E 阶段使用的 AI 模型(默认复用 AI_MODEL)' },\n\n // --- 预览环境 ---\n PREVIEW_ENABLED: { group: 'preview', description: '启用预览环境' },\n PREVIEW_HOST: { group: 'preview', description: '预览环境主机名' },\n PREVIEW_TTL_MS: { group: 'preview', description: '预览环境存活时间 (毫秒)' },\n PREVIEW_KEEP_AFTER_COMPLETE:{ group: 'preview', description: 'Issue 完成后保留预览环境' },\n PREVIEW_REAP_INTERVAL_MS: { group: 'preview', description: '预览环境清理检查间隔 (毫秒)' },\n\n // --- 头脑风暴 ---\n BRAINSTORM_ENABLED: { group: 'brainstorm', description: '启用头脑风暴功能' },\n BRAINSTORM_MAX_ROUNDS: { group: 'brainstorm', description: '最大精炼轮数' },\n BRAINSTORM_TIMEOUT_MS: { group: 'brainstorm', description: '头脑风暴超时 (毫秒)' },\n BRAINSTORM_GENERATOR_MODE: { group: 'brainstorm', description: '生成器 AI Runner 模式 (默认跟随全局)' },\n BRAINSTORM_GENERATOR_BINARY: { group: 'brainstorm', description: '生成器 AI 二进制路径' },\n BRAINSTORM_GENERATOR_MODEL: { group: 'brainstorm', description: '生成器 AI 模型' },\n BRAINSTORM_REVIEWER_MODE: { group: 'brainstorm', description: '审核器 AI Runner 模式 (默认跟随全局)' },\n BRAINSTORM_REVIEWER_BINARY: { group: 'brainstorm', description: '审核器 AI 二进制路径' },\n BRAINSTORM_REVIEWER_MODEL: { group: 'brainstorm', description: '审核器 AI 模型' },\n\n // --- 智能助手 ---\n CHAT_ENABLED: { group: 'chat', description: '启用智能助手 (Chat Agent)' },\n CHAT_TIMEOUT_MS: { group: 'chat', description: '对话超时 (毫秒)' },\n CHAT_MAX_SESSION_MESSAGES: { group: 'chat', description: '单会话最大消息数' },\n CHAT_AGENT_MODE: { group: 'chat', description: 'Chat AI Runner 模式 (默认 claude-internal)' },\n CHAT_AGENT_BINARY: { group: 'chat', description: 'Chat AI 二进制路径' },\n CHAT_AGENT_MODEL: { group: 'chat', description: 'Chat AI 模型' },\n\n // --- 批量任务 ---\n BRAINDUMP_ENABLED: { group: 'braindump', description: '启用批量任务拆分 (Braindump)' },\n BRAINDUMP_MAX_CONCURRENT: { group: 'braindump', description: '批量任务最大并发 (默认跟随 MAX_CONCURRENT_ISSUES)' },\n BRAINDUMP_SPLIT_TIMEOUT_MS: { group: 'braindump', description: '任务拆分超时 (毫秒)' },\n BRAINDUMP_TASK_TIMEOUT_MS: { group: 'braindump', description: '单任务超时 (默认跟随 CLAUDE_PHASE_TIMEOUT_MS)' },\n BRAINDUMP_MAX_CONFLICT_ATTEMPTS:{ group: 'braindump', description: '合并冲突最大重试次数' },\n BRAINDUMP_CREATE_MR: { group: 'braindump', description: '任务完成后自动创建合并请求' },\n\n // --- 自动更新 ---\n AUTO_UPDATE_ENABLED: { group: 'autoUpdate', description: '启用自动检查 npm 新版本并升级' },\n AUTO_UPDATE_INTERVAL_MS: { group: 'autoUpdate', description: '检查更新间隔 (毫秒)' },\n AUTO_UPDATE_REGISTRY: { group: 'autoUpdate', description: 'npm 仓库地址' },\n AUTO_UPDATE_DRAIN_TIMEOUT_MS:{ group: 'autoUpdate', description: '更新前等待活跃任务完成的超时 (毫秒)' },\n\n // --- iWiki ---\n IWIKI_AUTH_COOKIE: { group: 'iwiki', description: 'iWiki 认证 Cookie' },\n IWIKI_AUTH_TOKEN: { group: 'iwiki', description: 'iWiki 认证 Token' },\n IWIKI_BASE_URL: { group: 'iwiki', description: 'iWiki 基础 URL' },\n\n // --- 语言 ---\n LOCALE: { group: 'locale', description: '界面语言 (zh-CN / en)' },\n\n // --- 知识管理 ---\n KNOWLEDGE_ENABLED: { group: 'knowledge', description: '启用知识管理' },\n KNOWLEDGE_PATH: { group: 'knowledge', description: '知识库路径 (覆盖默认)' },\n KNOWLEDGE_ORPHAN_BRANCH: { group: 'knowledge', description: '知识 Git 同步分支名' },\n KNOWLEDGE_SYNC_VECTORS: { group: 'knowledge', description: '同步时包含向量文件 (大文件)' },\n KNOWLEDGE_AUTO_RESTORE: { group: 'knowledge', description: '启动时自动从 orphan branch 恢复知识' },\n\n // --- 知识蒸馏 ---\n DISTILL_ENABLED: { group: 'distill', description: '启用知识蒸馏' },\n DISTILL_INTERVAL_MS: { group: 'distill', description: '蒸馏调度间隔 (毫秒)' },\n DISTILL_DIARY_SUMMARIZE: { group: 'distill', description: '蒸馏时总结日记' },\n DISTILL_MIN_DIARIES_FOR_DISTILL: { group: 'distill', description: '触发蒸馏所需最少日记数' },\n DISTILL_MEMORY_CONFIDENCE_THRESHOLD:{ group: 'distill', description: '记忆置信度阈值 (0-1)' },\n DISTILL_VECTOR_ENABLED: { group: 'distill', description: '启用向量存储' },\n\n // --- 文件同步 ---\n SYNC_KNOWLEDGE_TO_PROJECT: { group: 'sync', description: '将知识文件同步到目标项目' },\n SYNC_RULES_TO_PROJECT: { group: 'sync', description: '将规则文件同步到目标项目' },\n\n // --- 发布 ---\n RELEASE_ENABLED: { group: 'release', description: '启用发布功能' },\n RELEASE_DETECT_CACHE_TTL_MS:{ group: 'release', description: '发布检测缓存有效期 (毫秒)' },\n\n // --- 验证修复循环 ---\n VERIFY_FIX_LOOP_ENABLED: { group: 'verifyFixLoop', description: '启用验证失败后自动修复循环' },\n VERIFY_FIX_MAX_ITERATIONS: { group: 'verifyFixLoop', description: '最大修复迭代次数' },\n VERIFY_TODOLIST_CHECK_ENABLED: { group: 'verifyFixLoop', description: '启用 Todolist 完成度检查' },\n\n // --- 交互式终端 ---\n TERMINAL_ENABLED: { group: 'terminal', description: '启用交互式终端功能 (PTY 会话)' },\n TERMINAL_IDLE_TIMEOUT_MS: { group: 'terminal', description: '终端会话空闲超时 (毫秒)' },\n TERMINAL_MAX_SESSIONS: { group: 'terminal', description: '最大并发 PTY 会话数' },\n PTY_IDLE_DETECT_MS: { group: 'terminal', description: 'PTY 空闲检测间隔 (毫秒)' },\n PTY_DEFAULT_AGENT: { group: 'terminal', description: 'PTY 模式的默认代理' },\n PTY_PHASE_AGENTS: { group: 'terminal', description: '阶段专用代理映射 (格式: plan:agent,build:agent)' },\n\n // --- 运营分析 ---\n ANALYTICS_ENABLED: { group: 'analytics', description: '启用运营分析' },\n ANALYTICS_TARGET_API_URL: { group: 'analytics', description: '分析数据上报 API 地址' },\n ANALYTICS_TARGET_API_TOKEN: { group: 'analytics', description: '分析数据上报 API Token' },\n ANALYTICS_CACHE_TTL_MS: { group: 'analytics', description: '分析数据缓存有效期 (毫秒)' },\n ANALYTICS_SKILL_AUTO_DISCOVER:{ group: 'analytics', description: '自动发现 Skill 文件' },\n\n // --- 多节点 ---\n NODE_ID: { group: 'coordination', description: '节点标识 (多节点部署时区分实例)' },\n\n // --- 工作区 ---\n WORKSPACE_CONFIG_PATH: { group: 'workspace', description: '多仓库工作区配置文件路径' },\n\n // --- 多租户 ---\n TENANTS_CONFIG_PATH: { group: 'tenants', description: '多租户配置文件路径' },\n};\n"],"mappings":"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","names":["fs","fs"]}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
import {
|
|
7
7
|
ConfigGenerator,
|
|
8
8
|
PreflightChecker
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-SEO57UYI.js";
|
|
10
10
|
import {
|
|
11
11
|
resolveConfigFilePath
|
|
12
12
|
} from "./chunk-FJTZKAJA.js";
|
|
@@ -110,4 +110,4 @@ async function startDaemon(configPath) {
|
|
|
110
110
|
export {
|
|
111
111
|
startCommand
|
|
112
112
|
};
|
|
113
|
-
//# sourceMappingURL=chunk-
|
|
113
|
+
//# sourceMappingURL=chunk-TDKTI363.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "./chunk-5M5SB6ZA.js";
|
|
5
5
|
import {
|
|
6
6
|
createSetupRouter
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-ENF24C44.js";
|
|
8
8
|
import {
|
|
9
9
|
buildLockNoteBody,
|
|
10
10
|
buildReleaseNoteBody,
|
|
@@ -9303,4 +9303,4 @@ function migrateKnowledgeDir(srcDir, destDir) {
|
|
|
9303
9303
|
export {
|
|
9304
9304
|
main
|
|
9305
9305
|
};
|
|
9306
|
-
//# sourceMappingURL=chunk-
|
|
9306
|
+
//# sourceMappingURL=chunk-Y62E72TA.js.map
|
|
@@ -57,27 +57,28 @@ async function getVersion(binary, args = ["--version"]) {
|
|
|
57
57
|
});
|
|
58
58
|
}
|
|
59
59
|
var DependencyChecker = class {
|
|
60
|
-
async checkAll(
|
|
60
|
+
async checkAll(aiMode) {
|
|
61
|
+
const effectiveMode = aiMode || "cursor-agent";
|
|
62
|
+
const ptyAgent = effectiveMode === "pty" ? process.env.PTY_DEFAULT_AGENT || "claude-internal" : "";
|
|
61
63
|
const results = await Promise.all([
|
|
62
64
|
this.checkNode(),
|
|
63
65
|
this.checkGit(),
|
|
64
|
-
this.checkCursor(
|
|
65
|
-
|
|
66
|
-
this.
|
|
67
|
-
// 可选
|
|
68
|
-
this.checkCodebuddy(false)
|
|
69
|
-
// 可选
|
|
66
|
+
this.checkCursor(effectiveMode === "cursor-agent" || ptyAgent === "cursor-agent"),
|
|
67
|
+
this.checkClaudeInternal(effectiveMode === "claude-internal" || effectiveMode === "pty"),
|
|
68
|
+
this.checkCodebuddy(effectiveMode === "codebuddy" || ptyAgent === "codebuddy")
|
|
70
69
|
]);
|
|
71
70
|
return results;
|
|
72
71
|
}
|
|
73
72
|
async checkNode() {
|
|
74
73
|
const version = await getVersion("node");
|
|
74
|
+
const majorVersion = version ? parseInt(version.split(".")[0], 10) : 0;
|
|
75
|
+
const meetsMinVersion = version !== null && majorVersion >= 20;
|
|
75
76
|
return {
|
|
76
77
|
name: "node",
|
|
77
78
|
displayName: "Node.js (>= 20)",
|
|
78
79
|
required: true,
|
|
79
|
-
installed:
|
|
80
|
-
version: version
|
|
80
|
+
installed: meetsMinVersion,
|
|
81
|
+
version: version ? `${version}${!meetsMinVersion ? " (\u9700\u8981 >= 20)" : ""}` : void 0,
|
|
81
82
|
installCommand: platform() === "linux" ? "curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt-get install -y nodejs" : void 0,
|
|
82
83
|
installHint: "https://nodejs.org/ or nvm install 20",
|
|
83
84
|
category: "toolchain",
|
|
@@ -407,4 +408,4 @@ async function* streamProcessLines(proc, timeoutMs) {
|
|
|
407
408
|
export {
|
|
408
409
|
DependencyChecker
|
|
409
410
|
};
|
|
410
|
-
//# sourceMappingURL=chunk-
|
|
411
|
+
//# sourceMappingURL=chunk-Z3OBKODV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/setup/DependencyChecker.ts"],"sourcesContent":["import { ChildProcess, spawn } from 'node:child_process';\nimport { platform, arch } from 'node:os';\nimport { t } from '../../i18n/index.js';\n\nconst INSTALL_TIMEOUT_MS = 120_000;\nconst AI_INSTALL_TIMEOUT_MS = 180_000;\n\nexport type AuthStatus = 'logged_in' | 'not_logged_in' | 'unknown';\n\nexport interface DepCheckResult {\n name: string;\n displayName: string;\n required: boolean;\n installed: boolean;\n version?: string;\n installCommand?: string;\n installHint?: string;\n aiInstallable?: boolean;\n category: 'ai-cli' | 'toolchain';\n authStatus?: AuthStatus;\n loginCommand?: string;\n}\n\nexport interface InstallAllEvent {\n phase?: string;\n dep?: string;\n status?: 'start' | 'done';\n installed?: boolean;\n line?: string;\n}\n\nasync function checkAuth(binary: string, args: string[]): Promise<AuthStatus> {\n return new Promise((resolve) => {\n const proc = spawn(binary, args, { stdio: ['ignore', 'pipe', 'pipe'] });\n const timer = setTimeout(() => { proc.kill('SIGTERM'); resolve('unknown'); }, 10_000);\n proc.on('close', (code) => { clearTimeout(timer); resolve(code === 0 ? 'logged_in' : 'not_logged_in'); });\n proc.on('error', () => { clearTimeout(timer); resolve('unknown'); });\n });\n}\n\nasync function which(binary: string): Promise<string | null> {\n return new Promise((resolve) => {\n const proc = spawn('which', [binary], { stdio: ['ignore', 'pipe', 'ignore'] });\n let out = '';\n proc.stdout.on('data', (d) => { out += d.toString(); });\n proc.on('close', (code) => resolve(code === 0 ? out.trim() : null));\n proc.on('error', () => resolve(null));\n });\n}\n\nasync function getVersion(binary: string, args: string[] = ['--version']): Promise<string | null> {\n return new Promise((resolve) => {\n const proc = spawn(binary, args, { stdio: ['ignore', 'pipe', 'pipe'] });\n let out = '';\n proc.stdout.on('data', (d) => { out += d.toString(); });\n proc.stderr.on('data', (d) => { out += d.toString(); });\n proc.on('close', (code) => {\n if (code === 0 && out.trim()) {\n const match = out.trim().match(/[\\d]+\\.[\\d]+[\\d.a-z-]*/);\n resolve(match ? match[0] : out.trim().split('\\n')[0]);\n } else {\n resolve(null);\n }\n });\n proc.on('error', () => resolve(null));\n });\n}\n\nexport class DependencyChecker {\n async checkAll(aiMode?: string): Promise<DepCheckResult[]> {\n const effectiveMode = aiMode || 'cursor-agent';\n const ptyAgent = effectiveMode === 'pty' ? (process.env.PTY_DEFAULT_AGENT || 'claude-internal') : '';\n const results = await Promise.all([\n this.checkNode(),\n this.checkGit(),\n this.checkCursor(effectiveMode === 'cursor-agent' || ptyAgent === 'cursor-agent'),\n this.checkClaudeInternal(effectiveMode === 'claude-internal' || effectiveMode === 'pty'),\n this.checkCodebuddy(effectiveMode === 'codebuddy' || ptyAgent === 'codebuddy'),\n ]);\n return results;\n }\n\n async checkNode(): Promise<DepCheckResult> {\n const version = await getVersion('node');\n const majorVersion = version ? parseInt(version.split('.')[0], 10) : 0;\n const meetsMinVersion = version !== null && majorVersion >= 20;\n return {\n name: 'node',\n displayName: 'Node.js (>= 20)',\n required: true,\n installed: meetsMinVersion,\n version: version ? `${version}${!meetsMinVersion ? ' (需要 >= 20)' : ''}` : undefined,\n installCommand: platform() === 'linux' ? 'curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt-get install -y nodejs' : undefined,\n installHint: 'https://nodejs.org/ or nvm install 20',\n category: 'toolchain',\n aiInstallable: true,\n };\n }\n\n async checkGit(): Promise<DepCheckResult> {\n const version = await getVersion('git');\n return {\n name: 'git',\n displayName: 'Git',\n required: true,\n installed: version !== null,\n version: version ?? undefined,\n installCommand: platform() === 'linux' ? 'sudo apt-get install -y git' : undefined,\n installHint: 'sudo apt install git / brew install git',\n category: 'toolchain',\n aiInstallable: true,\n };\n }\n\n async checkClaudeInternal(required: boolean): Promise<DepCheckResult> {\n const binPath = await which('claude-internal');\n const version = binPath ? await getVersion('claude-internal') : null;\n const cmd = 'npm install -g claude-code-internal';\n const authStatus: AuthStatus = binPath ? await checkAuth('claude-internal', ['auth', 'status']) : 'unknown';\n return {\n name: 'claude-internal',\n displayName: 'Claude Internal CLI',\n required,\n installed: binPath !== null,\n version: version ?? undefined,\n installCommand: cmd,\n installHint: cmd,\n category: 'ai-cli',\n aiInstallable: false,\n authStatus,\n loginCommand: 'claude-internal auth login',\n };\n }\n\n async checkCursor(required: boolean): Promise<DepCheckResult> {\n const binPath = await which('cursor-agent');\n const version = binPath ? await getVersion('cursor-agent', ['-v']) : null;\n const authStatus: AuthStatus = binPath ? await checkAuth('cursor-agent', ['auth', 'whoami']) : 'unknown';\n return {\n name: 'cursor-agent',\n displayName: 'Cursor Agent CLI',\n required,\n installed: version !== null,\n version: version ?? undefined,\n // 不设置 installCommand → 前端不显示自动安装按钮\n // cursor-agent 使用 curl | bash 管道安装,在非 TTY 环境下无输出,改为手动安装\n installHint: t('cli.cursorInstallHint'),\n category: 'ai-cli',\n aiInstallable: false,\n authStatus,\n loginCommand: 'cursor-agent auth login',\n };\n }\n\n async checkCodebuddy(required: boolean): Promise<DepCheckResult> {\n const binPath = await which('codebuddy');\n const version = binPath ? await getVersion('codebuddy') : null;\n const cmd = 'npm install -g codebuddy-code';\n const authStatus: AuthStatus = binPath ? await checkAuth('codebuddy', ['auth', 'status']) : 'unknown';\n return {\n name: 'codebuddy',\n displayName: 'CodeBuddy CLI',\n required,\n installed: binPath !== null,\n version: version ?? undefined,\n installCommand: cmd,\n installHint: cmd,\n category: 'ai-cli',\n aiInstallable: false,\n authStatus,\n loginCommand: 'codebuddy auth login',\n };\n }\n\n async checkOne(name: string): Promise<DepCheckResult | null> {\n switch (name) {\n case 'node': return this.checkNode();\n case 'git': return this.checkGit();\n case 'claude-internal': return this.checkClaudeInternal(true);\n case 'cursor-agent': return this.checkCursor(true);\n case 'codebuddy': return this.checkCodebuddy(true);\n default: return null;\n }\n }\n\n async *install(name: string): AsyncGenerator<string> {\n yield t('cli.checkingDep', { name });\n const dep = await this.checkOne(name);\n if (!dep) {\n yield t('cli.unknownDep', { name });\n return;\n }\n if (dep.installed) {\n yield t('cli.alreadyInstalled', { name: dep.displayName, version: dep.version ?? '' });\n return;\n }\n if (!dep.installCommand) {\n yield t('cli.manualInstall', { name: dep.displayName, hint: dep.installHint ?? '' });\n return;\n }\n\n yield t('cli.installing', { name: dep.displayName });\n yield `$ ${dep.installCommand}`;\n\n const proc = spawn(dep.installCommand, {\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: true,\n });\n\n const { exitCode, timedOut, lineCount } = yield* streamProcess(proc, INSTALL_TIMEOUT_MS);\n\n if (timedOut) {\n yield t('cli.installTimeout', { name: dep.displayName, seconds: INSTALL_TIMEOUT_MS / 1000 });\n return;\n }\n\n if (lineCount === 0) {\n yield t('cli.noOutput');\n }\n\n yield t('cli.verifyingInstall');\n\n if (exitCode === 0) {\n yield t('cli.installSuccess', { name: dep.displayName });\n } else {\n yield t('cli.installFailed', { name: dep.displayName, code: exitCode });\n }\n }\n\n async *installWithAI(dep: DepCheckResult): AsyncGenerator<string> {\n const claudePath = await which('claude-internal');\n if (!claudePath) {\n yield t('cli.aiInstallUnavailable');\n return;\n }\n\n yield t('cli.aiInstalling', { name: dep.displayName });\n\n const osInfo = `${platform()} ${arch()}`;\n const prompt = `Please install ${dep.displayName} on the current system (${osInfo}).\\nReference hint: ${dep.installHint ?? dep.installCommand ?? dep.name}\\nAfter installation, verify it was successful by running the version check command.\\nIf you need to modify shell config files (e.g. .bashrc), do it directly.`;\n\n // Remove CLAUDECODE env var to prevent nested session detection\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { CLAUDECODE, ...env } = process.env;\n const proc = spawn('claude-internal', [\n '-p', prompt,\n '--dangerously-skip-permissions',\n ], {\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: false,\n env,\n });\n\n const { exitCode, timedOut } = yield* streamProcess(proc, AI_INSTALL_TIMEOUT_MS, true);\n\n if (timedOut) {\n yield t('cli.aiInstallTimeout', { name: dep.displayName, seconds: AI_INSTALL_TIMEOUT_MS / 1000 });\n return;\n }\n\n if (exitCode === 0) {\n yield t('cli.aiInstallSuccess', { name: dep.displayName });\n } else {\n yield t('cli.aiInstallFailed', { name: dep.displayName, code: exitCode });\n }\n }\n\n async *installAll(aiMode?: string): AsyncGenerator<InstallAllEvent> {\n yield { line: t('cli.installAllStart') };\n\n const installOrder: string[] = ['claude-internal'];\n if (aiMode === 'cursor-agent') {\n installOrder.push('cursor-agent');\n } else if (aiMode === 'codebuddy') {\n installOrder.push('codebuddy');\n }\n installOrder.push('node', 'git');\n\n let checks = await this.checkAll(aiMode);\n\n for (const depName of installOrder) {\n let dep = checks.find((d) => d.name === depName);\n if (!dep) continue;\n\n if (dep.installed) {\n yield { line: t('cli.skippingInstalled', { name: dep.displayName, version: dep.version ?? '' }) };\n continue;\n }\n\n const phase = dep.category === 'ai-cli' ? 'ai-cli' : 'toolchain';\n yield { phase, dep: depName, status: 'start' };\n\n let installed = false;\n let lineCount = 0;\n\n // Skip deps without installCommand (e.g. cursor-agent needs manual install)\n if (!dep.installCommand) {\n yield { line: t('cli.manualInstallRequired', { name: dep.displayName, hint: dep.installHint ?? '' }), dep: depName };\n yield { phase, dep: depName, status: 'done', installed: false };\n continue;\n }\n\n // Try installCommand first\n if (dep.installCommand) {\n yield { line: t('cli.installing', { name: dep.displayName }), dep: depName };\n yield { line: `$ ${dep.installCommand}`, dep: depName };\n\n const proc = spawn(dep.installCommand, {\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: true,\n });\n\n for await (const chunk of streamProcessLines(proc, INSTALL_TIMEOUT_MS)) {\n yield { line: chunk.line, dep: depName };\n lineCount += chunk.count;\n }\n\n if (lineCount === 0) {\n yield { line: t('cli.noOutput'), dep: depName };\n }\n\n yield { line: t('cli.verifyingInstall'), dep: depName };\n\n // Re-check installation\n checks = await this.checkAll(aiMode);\n dep = checks.find((d) => d.name === depName)!;\n installed = dep.installed;\n }\n\n // AI fallback for toolchain deps\n if (!installed && dep.aiInstallable) {\n const claudePath = await which('claude-internal');\n if (claudePath) {\n yield { line: t('cli.tryingAiFallback', { name: dep.displayName }), dep: depName };\n yield { phase: 'ai-fallback', dep: depName, status: 'start' };\n\n for await (const chunk of this.installWithAILines(dep)) {\n yield { line: chunk, dep: depName };\n }\n\n // Re-check installation\n checks = await this.checkAll(aiMode);\n dep = checks.find((d) => d.name === depName)!;\n installed = dep.installed;\n }\n }\n\n yield { phase, dep: depName, status: 'done', installed };\n }\n\n yield { line: t('cli.installAllDone') };\n }\n\n private async *installWithAILines(dep: DepCheckResult): AsyncGenerator<string> {\n for await (const line of this.installWithAI(dep)) {\n yield line;\n }\n }\n}\n\nasync function* streamProcess(\n proc: ChildProcess,\n timeoutMs: number,\n markStderr = false,\n): AsyncGenerator<string, { exitCode: number; timedOut: boolean; lineCount: number }> {\n const chunks: string[] = [];\n let notify: (() => void) | null = null;\n let closed = false;\n let closedCode = 1;\n let timedOut = false;\n let lineCount = 0;\n\n const onStdout = (d: Buffer) => {\n chunks.push(d.toString());\n notify?.();\n };\n const onStderr = (d: Buffer) => {\n const text = d.toString();\n chunks.push(markStderr ? `[stderr] ${text}` : text);\n notify?.();\n };\n proc.stdout?.on('data', onStdout);\n proc.stderr?.on('data', onStderr);\n\n proc.on('close', (code) => {\n closed = true;\n closedCode = code ?? 1;\n notify?.();\n });\n\n const timer = setTimeout(() => {\n timedOut = true;\n proc.kill('SIGTERM');\n setTimeout(() => { if (!closed) proc.kill('SIGKILL'); }, 5000);\n notify?.();\n }, timeoutMs);\n\n try {\n while (!closed || chunks.length > 0) {\n if (chunks.length > 0) {\n lineCount++;\n yield chunks.shift()!;\n } else if (!closed) {\n await new Promise<void>((r) => { notify = r; });\n notify = null;\n }\n }\n } finally {\n clearTimeout(timer);\n }\n\n return { exitCode: closedCode, timedOut, lineCount };\n}\n\nasync function* streamProcessLines(\n proc: ChildProcess,\n timeoutMs: number,\n): AsyncGenerator<{ line: string; count: number }> {\n const chunks: string[] = [];\n let notify: (() => void) | null = null;\n let closed = false;\n let timedOut = false;\n let count = 0;\n\n const onStdout = (d: Buffer) => {\n chunks.push(d.toString());\n notify?.();\n };\n const onStderr = (d: Buffer) => {\n chunks.push(`[stderr] ${d.toString()}`);\n notify?.();\n };\n proc.stdout?.on('data', onStdout);\n proc.stderr?.on('data', onStderr);\n\n proc.on('close', () => {\n closed = true;\n notify?.();\n });\n\n const timer = setTimeout(() => {\n timedOut = true;\n proc.kill('SIGTERM');\n setTimeout(() => { if (!closed) proc.kill('SIGKILL'); }, 5000);\n notify?.();\n }, timeoutMs);\n\n try {\n while (!closed || chunks.length > 0) {\n if (chunks.length > 0) {\n count++;\n yield { line: chunks.shift()!, count };\n } else if (!closed) {\n await new Promise<void>((r) => { notify = r; });\n notify = null;\n }\n }\n } finally {\n clearTimeout(timer);\n }\n\n if (timedOut) {\n yield { line: '[stderr] Process timed out', count };\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigGenerator.d.ts","sourceRoot":"","sources":["../../../src/cli/setup/ConfigGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAI1E,OAAO,EAAE,UAAU,EAAE,CAAC;AAEtB,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,EAAE,EAAE;QACF,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,cAAc,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ConfigGenerator.d.ts","sourceRoot":"","sources":["../../../src/cli/setup/ConfigGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,7 @@ export interface InstallAllEvent {
|
|
|
20
20
|
line?: string;
|
|
21
21
|
}
|
|
22
22
|
export declare class DependencyChecker {
|
|
23
|
-
checkAll(
|
|
23
|
+
checkAll(aiMode?: string): Promise<DepCheckResult[]>;
|
|
24
24
|
checkNode(): Promise<DepCheckResult>;
|
|
25
25
|
checkGit(): Promise<DepCheckResult>;
|
|
26
26
|
checkClaudeInternal(required: boolean): Promise<DepCheckResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DependencyChecker.d.ts","sourceRoot":"","sources":["../../../src/cli/setup/DependencyChecker.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,eAAe,GAAG,SAAS,CAAC;AAEnE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,QAAQ,GAAG,WAAW,CAAC;IACjC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAuCD,qBAAa,iBAAiB;IACtB,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"DependencyChecker.d.ts","sourceRoot":"","sources":["../../../src/cli/setup/DependencyChecker.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,eAAe,GAAG,SAAS,CAAC;AAEnE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,QAAQ,GAAG,WAAW,CAAC;IACjC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAuCD,qBAAa,iBAAiB;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAapD,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC;IAiBpC,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC;IAenC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;IAoB/D,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;IAoBvD,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;IAoB1D,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAWrD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC;IA4C7C,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC;IAsC1D,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,eAAe,CAAC;YAsFpD,kBAAkB;CAKlC"}
|
package/dist/cli.js
CHANGED
|
@@ -89,11 +89,11 @@ var defaults = getCliDefaults();
|
|
|
89
89
|
var program = new Command();
|
|
90
90
|
program.name("issue-auto-finish").description("Issue Auto-Finish: AI-powered issue resolution daemon").version(pkg.version, "-v, --version");
|
|
91
91
|
program.command("init").description("Launch the interactive web setup wizard").option("-p, --port <port>", "Port for the setup wizard", "3456").option("-c, --config <path>", "Config file path to generate").action(async (opts) => {
|
|
92
|
-
const { initCommand } = await import("./init-
|
|
92
|
+
const { initCommand } = await import("./init-UKTP7LXS.js");
|
|
93
93
|
await initCommand({ port: parseInt(opts.port, 10), config: opts.config });
|
|
94
94
|
});
|
|
95
95
|
program.command("start").description("Start the issue-auto-finish daemon service").option("-c, --config <path>", "Path to .env config file").option("-d, --daemon", "Run as a background daemon").action(async (opts) => {
|
|
96
|
-
const { startCommand } = await import("./start-
|
|
96
|
+
const { startCommand } = await import("./start-ECUOKGM2.js");
|
|
97
97
|
await startCommand({ config: opts.config, daemon: opts.daemon });
|
|
98
98
|
});
|
|
99
99
|
program.command("stop").description("Stop the running service").option("-p, --port <port>", "Web UI port", defaults.port).option("-H, --host <host>", "Service host", defaults.host).option("-f, --force", "Force kill via SIGKILL").action(async (opts) => {
|
|
@@ -105,7 +105,7 @@ program.command("stop").description("Stop the running service").option("-p, --po
|
|
|
105
105
|
});
|
|
106
106
|
});
|
|
107
107
|
program.command("restart").description("Restart the service (stop + start)").option("-c, --config <path>", "Path to .env config file").option("-p, --port <port>", "Web UI port", defaults.port).option("-H, --host <host>", "Service host", defaults.host).option("-d, --daemon", "Restart as a background daemon").action(async (opts) => {
|
|
108
|
-
const { restartCommand } = await import("./restart-
|
|
108
|
+
const { restartCommand } = await import("./restart-2BCP6AMK.js");
|
|
109
109
|
await restartCommand({
|
|
110
110
|
config: opts.config,
|
|
111
111
|
host: opts.host,
|
|
@@ -114,7 +114,7 @@ program.command("restart").description("Restart the service (stop + start)").opt
|
|
|
114
114
|
});
|
|
115
115
|
});
|
|
116
116
|
program.command("doctor").description("Check environment dependencies").action(async () => {
|
|
117
|
-
const { doctorCommand } = await import("./doctor-
|
|
117
|
+
const { doctorCommand } = await import("./doctor-LLETZLW2.js");
|
|
118
118
|
await doctorCommand();
|
|
119
119
|
});
|
|
120
120
|
program.command("analyze").description("Analyze target repository and generate knowledge.json").option("-d, --dir <path>", "Project directory to analyze (defaults to PROJECT_WORK_DIR)").option("-o, --output <path>", "Output path for knowledge.json").option("-f, --force", "Overwrite existing knowledge.json").action(async (opts) => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DependencyChecker
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-Z3OBKODV.js";
|
|
4
4
|
import "./chunk-OBGEEGQ3.js";
|
|
5
5
|
import {
|
|
6
6
|
resolveDataDir
|
|
@@ -98,4 +98,4 @@ async function doctorCommand() {
|
|
|
98
98
|
export {
|
|
99
99
|
doctorCommand
|
|
100
100
|
};
|
|
101
|
-
//# sourceMappingURL=doctor-
|
|
101
|
+
//# sourceMappingURL=doctor-LLETZLW2.js.map
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
main
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-Y62E72TA.js";
|
|
4
4
|
import "./chunk-5M5SB6ZA.js";
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
import "./chunk-ENF24C44.js";
|
|
6
|
+
import "./chunk-Z3OBKODV.js";
|
|
7
7
|
import "./chunk-EU4XFZ2T.js";
|
|
8
8
|
import "./chunk-KC5S66OZ.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-SEO57UYI.js";
|
|
10
10
|
import "./chunk-IWSMQXBL.js";
|
|
11
11
|
import "./chunk-GPZX4DSY.js";
|
|
12
12
|
import "./chunk-MSL7ROVK.js";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createSetupRouter
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
5
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-ENF24C44.js";
|
|
4
|
+
import "./chunk-Z3OBKODV.js";
|
|
5
|
+
import "./chunk-SEO57UYI.js";
|
|
6
6
|
import "./chunk-ACVOOHAR.js";
|
|
7
7
|
import "./chunk-B7TVVODN.js";
|
|
8
8
|
import "./chunk-OBGEEGQ3.js";
|
|
@@ -88,4 +88,4 @@ async function initCommand(options) {
|
|
|
88
88
|
export {
|
|
89
89
|
initCommand
|
|
90
90
|
};
|
|
91
|
-
//# sourceMappingURL=init-
|
|
91
|
+
//# sourceMappingURL=init-UKTP7LXS.js.map
|
|
@@ -3,12 +3,12 @@ import {
|
|
|
3
3
|
} from "./chunk-WIEUIU6L.js";
|
|
4
4
|
import {
|
|
5
5
|
startCommand
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-TDKTI363.js";
|
|
7
7
|
import {
|
|
8
8
|
dim,
|
|
9
9
|
yellow
|
|
10
10
|
} from "./chunk-B7XUZJOK.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-SEO57UYI.js";
|
|
12
12
|
import "./chunk-FJTZKAJA.js";
|
|
13
13
|
import "./chunk-AKXDQH25.js";
|
|
14
14
|
import "./chunk-TN2SYADO.js";
|
|
@@ -45,4 +45,4 @@ async function restartCommand(options) {
|
|
|
45
45
|
export {
|
|
46
46
|
restartCommand
|
|
47
47
|
};
|
|
48
|
-
//# sourceMappingURL=restart-
|
|
48
|
+
//# sourceMappingURL=restart-2BCP6AMK.js.map
|
package/dist/run.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
main
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-Y62E72TA.js";
|
|
4
4
|
import "./chunk-5M5SB6ZA.js";
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
import "./chunk-ENF24C44.js";
|
|
6
|
+
import "./chunk-Z3OBKODV.js";
|
|
7
7
|
import "./chunk-EU4XFZ2T.js";
|
|
8
8
|
import "./chunk-KC5S66OZ.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-SEO57UYI.js";
|
|
10
10
|
import "./chunk-IWSMQXBL.js";
|
|
11
11
|
import "./chunk-GPZX4DSY.js";
|
|
12
12
|
import "./chunk-MSL7ROVK.js";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
startCommand
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-TDKTI363.js";
|
|
4
4
|
import "./chunk-B7XUZJOK.js";
|
|
5
|
-
import "./chunk-
|
|
5
|
+
import "./chunk-SEO57UYI.js";
|
|
6
6
|
import "./chunk-FJTZKAJA.js";
|
|
7
7
|
import "./chunk-AKXDQH25.js";
|
|
8
8
|
import "./chunk-TN2SYADO.js";
|
|
@@ -13,4 +13,4 @@ import "./chunk-GF2RRYHB.js";
|
|
|
13
13
|
export {
|
|
14
14
|
startCommand
|
|
15
15
|
};
|
|
16
|
-
//# sourceMappingURL=start-
|
|
16
|
+
//# sourceMappingURL=start-ECUOKGM2.js.map
|