@xdevops/issue-auto-finish 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDrE"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDrE"}
package/dist/cli.js CHANGED
@@ -23,11 +23,11 @@ var pkg = JSON.parse(readFileSync(findPackageJson(), "utf-8"));
23
23
  var program = new Command();
24
24
  program.name("issue-auto-finish").description("Issue Auto-Finish: AI-powered issue resolution daemon").version(pkg.version);
25
25
  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) => {
26
- const { initCommand } = await import("./init-LZGCIHE7.js");
26
+ const { initCommand } = await import("./init-QDTII4SP.js");
27
27
  await initCommand({ port: parseInt(opts.port, 10), config: opts.config });
28
28
  });
29
29
  program.command("start").description("Start the issue-auto-finish daemon service").option("-c, --config <path>", "Path to .env config file").action(async (opts) => {
30
- const { startCommand } = await import("./start-NMQHUKGF.js");
30
+ const { startCommand } = await import("./start-EDOZC5WL.js");
31
31
  await startCommand({ config: opts.config });
32
32
  });
33
33
  program.command("doctor").description("Check environment dependencies").action(async () => {
@@ -35,7 +35,7 @@ program.command("doctor").description("Check environment dependencies").action(a
35
35
  await doctorCommand();
36
36
  });
37
37
  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) => {
38
- const { analyzeCommand } = await import("./analyze-I7UOJB4F.js");
38
+ const { analyzeCommand } = await import("./analyze-ONQDTYCN.js");
39
39
  await analyzeCommand({ dir: opts.dir, output: opts.output, force: opts.force });
40
40
  });
41
41
  program.command("status").description("Show service status").option("-p, --port <port>", "Web UI port to query", "3000").action(async (opts) => {
@@ -0,0 +1,7 @@
1
+ import {
2
+ loadConfig
3
+ } from "./chunk-MH6LHFPB.js";
4
+ export {
5
+ loadConfig
6
+ };
7
+ //# sourceMappingURL=config-6GFBDMGD.js.map
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  main
3
- } from "./chunk-C6ZJVIPZ.js";
4
- import "./chunk-LEQYGOMJ.js";
3
+ } from "./chunk-VFQYIC6L.js";
4
+ import "./chunk-PTIL5AY2.js";
5
5
  import "./chunk-HCHEFK4Z.js";
6
6
  import "./chunk-PECYMYAK.js";
7
7
  import "./chunk-N5YK6YVI.js";
@@ -9,7 +9,7 @@ import "./chunk-3JUHZGX5.js";
9
9
  import "./chunk-JFYAXNNS.js";
10
10
  import "./chunk-5VUB3UUK.js";
11
11
  import "./chunk-5JYCGAU3.js";
12
- import "./chunk-KISVPNSV.js";
12
+ import "./chunk-MH6LHFPB.js";
13
13
  import "./chunk-SWG2Y7YX.js";
14
14
  import "./chunk-TZ6C7HL5.js";
15
15
  export {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createSetupRouter
3
- } from "./chunk-LEQYGOMJ.js";
3
+ } from "./chunk-PTIL5AY2.js";
4
4
  import "./chunk-HCHEFK4Z.js";
5
5
  import "./chunk-PECYMYAK.js";
6
6
  import "./chunk-3JUHZGX5.js";
@@ -32,7 +32,8 @@ async function initCommand(options) {
32
32
  }
33
33
  });
34
34
  app.use(setupRouter);
35
- const publicDir = path.resolve(process.cwd(), "src/web/frontend/dist");
35
+ const packageRoot = path.resolve(__dirname, "..");
36
+ const publicDir = path.resolve(packageRoot, "src/web/frontend/dist");
36
37
  if (fs.existsSync(publicDir)) {
37
38
  app.use(express.static(publicDir));
38
39
  app.get("{*path}", (_req, res) => {
@@ -66,4 +67,4 @@ async function initCommand(options) {
66
67
  export {
67
68
  initCommand
68
69
  };
69
- //# sourceMappingURL=init-LZGCIHE7.js.map
70
+ //# sourceMappingURL=init-QDTII4SP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/init.ts"],"sourcesContent":["import express from 'express';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { createSetupRouter } from '../../web/routes/setup.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport interface InitOptions {\n port: number;\n config?: string;\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n const app = express();\n app.use(express.json());\n\n let serverRef: ReturnType<typeof app.listen> | null = null;\n\n const setupRouter = createSetupRouter({\n configPath: options.config,\n onComplete: (configPath) => {\n console.log(`\\n Configuration saved to: ${configPath}`);\n console.log(' Run \"issue-auto-finish start\" to start the service.\\n');\n setTimeout(() => {\n serverRef?.close();\n process.exit(0);\n }, 1000);\n },\n });\n\n app.use(setupRouter);\n\n const packageRoot = path.resolve(__dirname, '..');\n const publicDir = path.resolve(packageRoot, 'src/web/frontend/dist');\n\n if (fs.existsSync(publicDir)) {\n app.use(express.static(publicDir));\n app.get('{*path}', (_req, res) => {\n res.sendFile(path.join(publicDir, 'index.html'));\n });\n } else {\n app.get('/', (_req, res) => {\n res.type('html').send(`<!DOCTYPE html>\n<html><head><title>Issue Auto-Finish Setup</title></head>\n<body style=\"font-family:system-ui;max-width:600px;margin:60px auto;padding:20px\">\n<h1>Issue Auto-Finish Setup</h1>\n<p>Frontend assets not found. Please build the frontend first:</p>\n<pre>cd issue-auto-finish && pnpm web:build</pre>\n<p>Or use the API directly at <code>/api/setup/*</code></p>\n</body></html>`);\n });\n }\n\n serverRef = app.listen(options.port, async () => {\n const url = `http://localhost:${options.port}`;\n console.log(`\\n Issue Auto-Finish Setup Wizard`);\n console.log(` Open: ${url}\\n`);\n\n try {\n const open = (await import('open')).default;\n await open(url);\n } catch {\n // Browser open failed, user can manually navigate\n }\n });\n}\n"],"mappings":";;;;;;;;;;;;AAAA,OAAO,aAAa;AACpB,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAG9B,IAAM,YAAY,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAO7D,eAAsB,YAAY,SAAqC;AACrE,QAAM,MAAM,QAAQ;AACpB,MAAI,IAAI,QAAQ,KAAK,CAAC;AAEtB,MAAI,YAAkD;AAEtD,QAAM,cAAc,kBAAkB;AAAA,IACpC,YAAY,QAAQ;AAAA,IACpB,YAAY,CAAC,eAAe;AAC1B,cAAQ,IAAI;AAAA,4BAA+B,UAAU,EAAE;AACvD,cAAQ,IAAI,yDAAyD;AACrE,iBAAW,MAAM;AACf,mBAAW,MAAM;AACjB,gBAAQ,KAAK,CAAC;AAAA,MAChB,GAAG,GAAI;AAAA,IACT;AAAA,EACF,CAAC;AAED,MAAI,IAAI,WAAW;AAEnB,QAAM,cAAc,KAAK,QAAQ,WAAW,IAAI;AAChD,QAAM,YAAY,KAAK,QAAQ,aAAa,uBAAuB;AAEnE,MAAI,GAAG,WAAW,SAAS,GAAG;AAC5B,QAAI,IAAI,QAAQ,OAAO,SAAS,CAAC;AACjC,QAAI,IAAI,WAAW,CAAC,MAAM,QAAQ;AAChC,UAAI,SAAS,KAAK,KAAK,WAAW,YAAY,CAAC;AAAA,IACjD,CAAC;AAAA,EACH,OAAO;AACL,QAAI,IAAI,KAAK,CAAC,MAAM,QAAQ;AAC1B,UAAI,KAAK,MAAM,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAOb;AAAA,IACX,CAAC;AAAA,EACH;AAEA,cAAY,IAAI,OAAO,QAAQ,MAAM,YAAY;AAC/C,UAAM,MAAM,oBAAoB,QAAQ,IAAI;AAC5C,YAAQ,IAAI;AAAA,iCAAoC;AAChD,YAAQ,IAAI,WAAW,GAAG;AAAA,CAAI;AAE9B,QAAI;AACF,YAAM,QAAQ,MAAM,OAAO,MAAM,GAAG;AACpC,YAAM,KAAK,GAAG;AAAA,IAChB,QAAQ;AAAA,IAER;AAAA,EACF,CAAC;AACH;","names":[]}
package/dist/lib.js CHANGED
@@ -20,7 +20,7 @@ import "./chunk-5VUB3UUK.js";
20
20
  import "./chunk-5JYCGAU3.js";
21
21
  import {
22
22
  loadConfig
23
- } from "./chunk-KISVPNSV.js";
23
+ } from "./chunk-MH6LHFPB.js";
24
24
  import {
25
25
  BaseAIRunner,
26
26
  ClaudeInternalRunner,
package/dist/run.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  main
3
- } from "./chunk-C6ZJVIPZ.js";
4
- import "./chunk-LEQYGOMJ.js";
3
+ } from "./chunk-VFQYIC6L.js";
4
+ import "./chunk-PTIL5AY2.js";
5
5
  import "./chunk-HCHEFK4Z.js";
6
6
  import "./chunk-PECYMYAK.js";
7
7
  import "./chunk-N5YK6YVI.js";
@@ -9,7 +9,7 @@ import "./chunk-3JUHZGX5.js";
9
9
  import "./chunk-JFYAXNNS.js";
10
10
  import "./chunk-5VUB3UUK.js";
11
11
  import "./chunk-5JYCGAU3.js";
12
- import "./chunk-KISVPNSV.js";
12
+ import "./chunk-MH6LHFPB.js";
13
13
  import "./chunk-SWG2Y7YX.js";
14
14
  import "./chunk-TZ6C7HL5.js";
15
15
 
@@ -22,4 +22,4 @@ async function startCommand(options) {
22
22
  export {
23
23
  startCommand
24
24
  };
25
- //# sourceMappingURL=start-NMQHUKGF.js.map
25
+ //# sourceMappingURL=start-EDOZC5WL.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UpdateExecutor.d.ts","sourceRoot":"","sources":["../../src/updater/UpdateExecutor.ts"],"names":[],"mappings":"AA8BA,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM;IAKzB,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAmDpD"}
1
+ {"version":3,"file":"UpdateExecutor.d.ts","sourceRoot":"","sources":["../../src/updater/UpdateExecutor.ts"],"names":[],"mappings":"AA8BA,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM;IAKzB,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAkDpD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xdevops/issue-auto-finish",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "Issue Auto-Finish: AI-powered issue resolution daemon",
5
5
  "type": "module",
6
6
  "main": "./dist/lib.js",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config.ts"],"sourcesContent":["import { config as loadDotenv } from 'dotenv';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport { fileURLToPath } from 'node:url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nfunction resolveEnvPath(): string {\n if (process.env.IAF_CONFIG_PATH) return process.env.IAF_CONFIG_PATH;\n\n const localEnv = path.resolve(__dirname, '../.env');\n if (fs.existsSync(localEnv)) return localEnv;\n\n const cwdEnv = path.resolve(process.cwd(), '.env');\n if (fs.existsSync(cwdEnv)) return cwdEnv;\n\n const globalEnv = path.join(os.homedir(), '.issue-auto-finish', '.env');\n if (fs.existsSync(globalEnv)) return globalEnv;\n\n return localEnv;\n}\n\nlet _dotenvLoaded = false;\nfunction ensureDotenvLoaded(): void {\n if (_dotenvLoaded) return;\n _dotenvLoaded = true;\n loadDotenv({ path: resolveEnvPath() });\n}\n\nexport interface Config {\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 /** @deprecated Use ai instead */\n claude?: {\n binary: string;\n phaseTimeoutMs: number;\n nvmNodeVersion: string;\n };\n ai: {\n mode: 'claude-internal' | 'cursor-agent' | 'codebuddy';\n binary: string;\n phaseTimeoutMs: number;\n nvmNodeVersion: string;\n model?: string;\n };\n poll: {\n /** @deprecated Use discoveryIntervalMs instead */\n intervalMs: number;\n discoveryIntervalMs: number;\n driveIntervalMs: number;\n maxRetries: number;\n maxConcurrent: number;\n };\n pipeline: {\n mode: 'auto' | 'classic' | 'plan-mode';\n };\n review: {\n enabled: boolean;\n autoApproveLabels: string[];\n };\n web: {\n enabled: boolean;\n port: number;\n frontendDistDir: string;\n };\n issueNoteSync: {\n enabled: boolean;\n webBaseUrl: string;\n };\n webhook: {\n enabled: boolean;\n port: number;\n secret: string;\n /** Use LLM to parse natural-language commands when regex fails */\n llmFallback: boolean;\n /** Binary for LLM intent recognition (defaults to claude-internal, independent of AI_RUNNER_MODE) */\n llmBinary: string;\n };\n e2e: {\n enabled: boolean;\n baseUrl: string;\n backendUrl: string;\n authCookies: string;\n backendPortBase: number;\n frontendPortBase: number;\n };\n preview: {\n enabled: boolean;\n host: string;\n ttlMs: number;\n keepAfterComplete: boolean;\n };\n brainstorm: {\n enabled: boolean;\n maxRefinementRounds: number;\n timeoutMs: number;\n generator: BrainstormAgentConfig;\n reviewer: BrainstormAgentConfig;\n };\n chat: {\n enabled: boolean;\n timeoutMs: number;\n maxSessionMessages: number;\n agent: ChatAgentConfig;\n };\n autoUpdate: {\n enabled: boolean;\n intervalMs: number;\n registry: string;\n drainTimeoutMs: number;\n };\n iwiki?: {\n authCookie?: string;\n authToken?: string;\n baseUrl?: string;\n };\n locale: 'zh-CN' | 'en';\n knowledgePath?: string;\n}\n\nexport type AIRunnerMode = 'claude-internal' | 'cursor-agent' | 'codebuddy';\n\nexport interface BrainstormAgentConfig {\n mode: AIRunnerMode;\n binary: string;\n nvmNodeVersion: string;\n model?: string;\n}\n\nexport type ChatAgentConfig = BrainstormAgentConfig;\n\nconst DEFAULT_AI_MODEL = 'Claude-4.6-Opus';\n\nfunction requireEnv(key: string): string {\n const val = process.env[key];\n if (!val) {\n throw new Error(`Missing required environment variable: ${key}`);\n }\n return val;\n}\n\nfunction optionalEnv(key: string, defaultValue: string): string {\n return process.env[key] || defaultValue;\n}\n\nexport function loadConfig(): Config {\n ensureDotenvLoaded();\n return {\n gongfeng: {\n apiUrl: requireEnv('GONGFENG_API_URL'),\n privateToken: requireEnv('GONGFENG_PRIVATE_TOKEN'),\n projectPath: requireEnv('GONGFENG_PROJECT_PATH'),\n },\n project: {\n workDir: requireEnv('PROJECT_WORK_DIR'),\n gitRootDir: optionalEnv('GIT_ROOT_DIR', requireEnv('PROJECT_WORK_DIR')),\n baseBranch: optionalEnv('BASE_BRANCH', 'master'),\n branchPrefix: optionalEnv('BRANCH_PREFIX', 'feat/issue'),\n worktreeBaseDir: optionalEnv('WORKTREE_BASE_DIR', ''),\n projectSubDir: optionalEnv('PROJECT_SUBDIR', ''),\n },\n claude: {\n binary: optionalEnv('CLAUDE_BINARY', 'claude-internal'),\n phaseTimeoutMs: parseInt(optionalEnv('CLAUDE_PHASE_TIMEOUT_MS', '1800000'), 10),\n nvmNodeVersion: optionalEnv('NVM_NODE_VERSION', '20'),\n },\n ai: buildAIConfig(),\n poll: {\n intervalMs: parseInt(optionalEnv('POLL_INTERVAL_MS', '60000'), 10),\n discoveryIntervalMs: parseInt(\n optionalEnv('POLL_DISCOVERY_INTERVAL_MS', optionalEnv('POLL_INTERVAL_MS', '60000')),\n 10,\n ),\n driveIntervalMs: parseInt(optionalEnv('POLL_DRIVE_INTERVAL_MS', '15000'), 10),\n maxRetries: parseInt(optionalEnv('MAX_RETRIES', '3'), 10),\n maxConcurrent: parseInt(optionalEnv('MAX_CONCURRENT_ISSUES', '3'), 10),\n },\n pipeline: {\n mode: optionalEnv('PIPELINE_MODE', 'auto') as 'auto' | 'classic' | 'plan-mode',\n },\n review: {\n enabled: optionalEnv('REVIEW_ENABLED', 'true') === 'true',\n autoApproveLabels: optionalEnv('REVIEW_AUTO_APPROVE_LABELS', '')\n .split(',').map(s => s.trim()).filter(Boolean),\n },\n web: {\n enabled: optionalEnv('WEB_ENABLED', 'true') === 'true',\n port: parseInt(optionalEnv('WEB_PORT', '3000'), 10),\n frontendDistDir: optionalEnv(\n 'FRONTEND_DIST_DIR',\n path.resolve(process.cwd(), 'src/web/frontend/dist'),\n ),\n },\n issueNoteSync: {\n enabled: optionalEnv('ISSUE_NOTE_SYNC_ENABLED', 'true') === 'true',\n webBaseUrl: optionalEnv(\n 'WEB_BASE_URL',\n `http://localhost:${optionalEnv('WEB_PORT', '3000')}`,\n ),\n },\n webhook: {\n enabled: optionalEnv('WEBHOOK_ENABLED', 'false') === 'true',\n port: parseInt(optionalEnv('WEBHOOK_PORT', '8081'), 10),\n secret: optionalEnv('WEBHOOK_SECRET', ''),\n llmFallback: optionalEnv('WEBHOOK_LLM_FALLBACK', 'true') === 'true',\n llmBinary: optionalEnv('WEBHOOK_LLM_BINARY', 'claude-internal'),\n },\n e2e: {\n enabled: optionalEnv('E2E_UI_ENABLED', 'false') === 'true',\n baseUrl: optionalEnv('E2E_BASE_URL', 'https://localhost:8890'),\n backendUrl: optionalEnv('E2E_BACKEND_URL', 'http://127.0.0.1:3000'),\n authCookies: optionalEnv('E2E_AUTH_COOKIES', '[]'),\n backendPortBase: parseInt(optionalEnv('E2E_BACKEND_PORT_BASE', '4000'), 10),\n frontendPortBase: parseInt(optionalEnv('E2E_FRONTEND_PORT_BASE', '9000'), 10),\n },\n preview: {\n enabled: optionalEnv('PREVIEW_ENABLED', 'false') === 'true',\n host: optionalEnv('PREVIEW_HOST', ''),\n ttlMs: parseInt(optionalEnv('PREVIEW_TTL_MS', String(24 * 60 * 60 * 1000)), 10),\n keepAfterComplete: optionalEnv('PREVIEW_KEEP_AFTER_COMPLETE', 'true') === 'true',\n },\n brainstorm: {\n enabled: optionalEnv('BRAINSTORM_ENABLED', 'true') === 'true',\n maxRefinementRounds: parseInt(optionalEnv('BRAINSTORM_MAX_ROUNDS', '5'), 10),\n timeoutMs: parseInt(optionalEnv('BRAINSTORM_TIMEOUT_MS', '600000'), 10),\n generator: buildBrainstormAgentConfig('GENERATOR'),\n reviewer: buildBrainstormAgentConfig('REVIEWER'),\n },\n chat: {\n enabled: optionalEnv('CHAT_ENABLED', 'true') === 'true',\n timeoutMs: parseInt(optionalEnv('CHAT_TIMEOUT_MS', '300000'), 10),\n maxSessionMessages: parseInt(optionalEnv('CHAT_MAX_SESSION_MESSAGES', '100'), 10),\n agent: buildChatAgentConfig(),\n },\n autoUpdate: {\n enabled: optionalEnv('AUTO_UPDATE_ENABLED', 'true') === 'true',\n intervalMs: parseInt(optionalEnv('AUTO_UPDATE_INTERVAL_MS', '600000'), 10),\n registry: optionalEnv('AUTO_UPDATE_REGISTRY', 'https://registry.npmjs.org'),\n drainTimeoutMs: parseInt(optionalEnv('AUTO_UPDATE_DRAIN_TIMEOUT_MS', '300000'), 10),\n },\n iwiki: {\n authCookie: process.env.IWIKI_AUTH_COOKIE || undefined,\n authToken: process.env.IWIKI_AUTH_TOKEN || undefined,\n baseUrl: process.env.IWIKI_BASE_URL || undefined,\n },\n locale: (optionalEnv('LOCALE', 'zh-CN') === 'en' ? 'en' : 'zh-CN') as 'zh-CN' | 'en',\n knowledgePath: process.env.KNOWLEDGE_PATH || undefined,\n };\n}\n\nfunction resolveAIRunnerMode(raw: string): AIRunnerMode {\n if (raw === 'cursor-agent') return 'cursor-agent';\n if (raw === 'codebuddy') return 'codebuddy';\n return 'claude-internal';\n}\n\nfunction resolveAIBinary(mode: AIRunnerMode): string {\n switch (mode) {\n case 'cursor-agent':\n return optionalEnv('CURSOR_BINARY', 'cursor');\n case 'codebuddy':\n return optionalEnv('CODEBUDDY_BINARY', 'codebuddy');\n default:\n return optionalEnv('CLAUDE_BINARY', 'claude-internal');\n }\n}\n\nfunction buildAIConfig(): Config['ai'] {\n const mode = resolveAIRunnerMode(optionalEnv('AI_RUNNER_MODE', 'claude-internal'));\n return {\n mode,\n binary: resolveAIBinary(mode),\n phaseTimeoutMs: parseInt(optionalEnv('CLAUDE_PHASE_TIMEOUT_MS', '1800000'), 10),\n nvmNodeVersion: optionalEnv('NVM_NODE_VERSION', '20'),\n model: optionalEnv('AI_MODEL', DEFAULT_AI_MODEL),\n };\n}\n\nfunction buildBrainstormAgentConfig(role: 'GENERATOR' | 'REVIEWER'): BrainstormAgentConfig {\n const globalMode = optionalEnv('AI_RUNNER_MODE', 'claude-internal');\n const roleMode = optionalEnv(`BRAINSTORM_${role}_MODE`, globalMode);\n const mode = resolveAIRunnerMode(roleMode);\n\n return {\n mode,\n binary: optionalEnv(`BRAINSTORM_${role}_BINARY`, resolveAIBinary(mode)),\n nvmNodeVersion: optionalEnv('NVM_NODE_VERSION', '20'),\n model: process.env[`BRAINSTORM_${role}_MODEL`] || optionalEnv('AI_MODEL', DEFAULT_AI_MODEL),\n };\n}\n\nfunction buildChatAgentConfig(): ChatAgentConfig {\n // Chat defaults to claude-internal for lightweight conversational use,\n // independent of the global AI_RUNNER_MODE (which may be cursor-agent).\n const chatMode = optionalEnv('CHAT_AGENT_MODE', 'claude-internal');\n const mode = resolveAIRunnerMode(chatMode);\n\n return {\n mode,\n binary: optionalEnv('CHAT_AGENT_BINARY', resolveAIBinary(mode)),\n nvmNodeVersion: optionalEnv('NVM_NODE_VERSION', '20'),\n model: process.env.CHAT_AGENT_MODEL || optionalEnv('AI_MODEL', DEFAULT_AI_MODEL),\n };\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +0,0 @@
1
- import {
2
- loadConfig
3
- } from "./chunk-KISVPNSV.js";
4
- export {
5
- loadConfig
6
- };
7
- //# sourceMappingURL=config-RI7NLDXI.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/commands/init.ts"],"sourcesContent":["import express from 'express';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { createSetupRouter } from '../../web/routes/setup.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport interface InitOptions {\n port: number;\n config?: string;\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n const app = express();\n app.use(express.json());\n\n let serverRef: ReturnType<typeof app.listen> | null = null;\n\n const setupRouter = createSetupRouter({\n configPath: options.config,\n onComplete: (configPath) => {\n console.log(`\\n Configuration saved to: ${configPath}`);\n console.log(' Run \"issue-auto-finish start\" to start the service.\\n');\n setTimeout(() => {\n serverRef?.close();\n process.exit(0);\n }, 1000);\n },\n });\n\n app.use(setupRouter);\n\n const publicDir = path.resolve(process.cwd(), 'src/web/frontend/dist');\n\n if (fs.existsSync(publicDir)) {\n app.use(express.static(publicDir));\n app.get('{*path}', (_req, res) => {\n res.sendFile(path.join(publicDir, 'index.html'));\n });\n } else {\n app.get('/', (_req, res) => {\n res.type('html').send(`<!DOCTYPE html>\n<html><head><title>Issue Auto-Finish Setup</title></head>\n<body style=\"font-family:system-ui;max-width:600px;margin:60px auto;padding:20px\">\n<h1>Issue Auto-Finish Setup</h1>\n<p>Frontend assets not found. Please build the frontend first:</p>\n<pre>cd issue-auto-finish && pnpm web:build</pre>\n<p>Or use the API directly at <code>/api/setup/*</code></p>\n</body></html>`);\n });\n }\n\n serverRef = app.listen(options.port, async () => {\n const url = `http://localhost:${options.port}`;\n console.log(`\\n Issue Auto-Finish Setup Wizard`);\n console.log(` Open: ${url}\\n`);\n\n try {\n const open = (await import('open')).default;\n await open(url);\n } catch {\n // Browser open failed, user can manually navigate\n }\n });\n}\n"],"mappings":";;;;;;;;;;;;AAAA,OAAO,aAAa;AACpB,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAG9B,IAAM,YAAY,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAO7D,eAAsB,YAAY,SAAqC;AACrE,QAAM,MAAM,QAAQ;AACpB,MAAI,IAAI,QAAQ,KAAK,CAAC;AAEtB,MAAI,YAAkD;AAEtD,QAAM,cAAc,kBAAkB;AAAA,IACpC,YAAY,QAAQ;AAAA,IACpB,YAAY,CAAC,eAAe;AAC1B,cAAQ,IAAI;AAAA,4BAA+B,UAAU,EAAE;AACvD,cAAQ,IAAI,yDAAyD;AACrE,iBAAW,MAAM;AACf,mBAAW,MAAM;AACjB,gBAAQ,KAAK,CAAC;AAAA,MAChB,GAAG,GAAI;AAAA,IACT;AAAA,EACF,CAAC;AAED,MAAI,IAAI,WAAW;AAEnB,QAAM,YAAY,KAAK,QAAQ,QAAQ,IAAI,GAAG,uBAAuB;AAErE,MAAI,GAAG,WAAW,SAAS,GAAG;AAC5B,QAAI,IAAI,QAAQ,OAAO,SAAS,CAAC;AACjC,QAAI,IAAI,WAAW,CAAC,MAAM,QAAQ;AAChC,UAAI,SAAS,KAAK,KAAK,WAAW,YAAY,CAAC;AAAA,IACjD,CAAC;AAAA,EACH,OAAO;AACL,QAAI,IAAI,KAAK,CAAC,MAAM,QAAQ;AAC1B,UAAI,KAAK,MAAM,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAOb;AAAA,IACX,CAAC;AAAA,EACH;AAEA,cAAY,IAAI,OAAO,QAAQ,MAAM,YAAY;AAC/C,UAAM,MAAM,oBAAoB,QAAQ,IAAI;AAC5C,YAAQ,IAAI;AAAA,iCAAoC;AAChD,YAAQ,IAAI,WAAW,GAAG;AAAA,CAAI;AAE9B,QAAI;AACF,YAAM,QAAQ,MAAM,OAAO,MAAM,GAAG;AACpC,YAAM,KAAK,GAAG;AAAA,IAChB,QAAQ;AAAA,IAER;AAAA,EACF,CAAC;AACH;","names":[]}