@xdevops/issue-auto-finish 1.0.3 → 1.0.5
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/{analyze-I7UOJB4F.js → analyze-ONQDTYCN.js} +2 -2
- package/dist/{chunk-C6ZJVIPZ.js → chunk-F4IB7IRT.js} +7 -7
- package/dist/{chunk-C6ZJVIPZ.js.map → chunk-F4IB7IRT.js.map} +1 -1
- package/dist/{chunk-LEQYGOMJ.js → chunk-F7AYCERS.js} +3 -3
- package/dist/{chunk-KISVPNSV.js → chunk-MH6LHFPB.js} +2 -2
- package/dist/chunk-MH6LHFPB.js.map +1 -0
- package/dist/{chunk-PECYMYAK.js → chunk-XJYGHL6J.js} +12 -2
- package/dist/chunk-XJYGHL6J.js.map +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/setup/DependencyChecker.d.ts.map +1 -1
- package/dist/cli.js +4 -4
- package/dist/config-6GFBDMGD.js +7 -0
- package/dist/{doctor-ZPGIBA5N.js → doctor-EOYNPACK.js} +2 -2
- package/dist/index.js +4 -4
- package/dist/{init-LZGCIHE7.js → init-KF5OGQ3B.js} +5 -4
- package/dist/init-KF5OGQ3B.js.map +1 -0
- package/dist/lib.js +1 -1
- package/dist/run.js +4 -4
- package/dist/{start-NMQHUKGF.js → start-3XVP2TAP.js} +1 -1
- package/dist/updater/UpdateExecutor.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-KISVPNSV.js.map +0 -1
- package/dist/chunk-PECYMYAK.js.map +0 -1
- package/dist/config-RI7NLDXI.js +0 -7
- package/dist/init-LZGCIHE7.js.map +0 -1
- /package/dist/{analyze-I7UOJB4F.js.map → analyze-ONQDTYCN.js.map} +0 -0
- /package/dist/{chunk-LEQYGOMJ.js.map → chunk-F7AYCERS.js.map} +0 -0
- /package/dist/{config-RI7NLDXI.js.map → config-6GFBDMGD.js.map} +0 -0
- /package/dist/{doctor-ZPGIBA5N.js.map → doctor-EOYNPACK.js.map} +0 -0
- /package/dist/{start-NMQHUKGF.js.map → start-3XVP2TAP.js.map} +0 -0
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-HCHEFK4Z.js";
|
|
4
4
|
import {
|
|
5
5
|
DependencyChecker
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-XJYGHL6J.js";
|
|
7
7
|
import {
|
|
8
8
|
getProjectKnowledge
|
|
9
9
|
} from "./chunk-3JUHZGX5.js";
|
|
@@ -174,7 +174,7 @@ function createSetupRouter(deps = {}) {
|
|
|
174
174
|
|
|
175
175
|
`);
|
|
176
176
|
try {
|
|
177
|
-
const { loadConfig } = await import("./config-
|
|
177
|
+
const { loadConfig } = await import("./config-6GFBDMGD.js");
|
|
178
178
|
const { createAIRunner } = await import("./ai-runner-RGAJPOOW.js");
|
|
179
179
|
const config = loadConfig();
|
|
180
180
|
const runner = createAIRunner(config.ai);
|
|
@@ -213,4 +213,4 @@ function createSetupRouter(deps = {}) {
|
|
|
213
213
|
export {
|
|
214
214
|
createSetupRouter
|
|
215
215
|
};
|
|
216
|
-
//# sourceMappingURL=chunk-
|
|
216
|
+
//# sourceMappingURL=chunk-F7AYCERS.js.map
|
|
@@ -76,7 +76,7 @@ function loadConfig() {
|
|
|
76
76
|
port: parseInt(optionalEnv("WEB_PORT", "3000"), 10),
|
|
77
77
|
frontendDistDir: optionalEnv(
|
|
78
78
|
"FRONTEND_DIST_DIR",
|
|
79
|
-
path.resolve(
|
|
79
|
+
path.resolve(__dirname, "..", "src/web/frontend/dist")
|
|
80
80
|
)
|
|
81
81
|
},
|
|
82
82
|
issueNoteSync: {
|
|
@@ -185,4 +185,4 @@ function buildChatAgentConfig() {
|
|
|
185
185
|
export {
|
|
186
186
|
loadConfig
|
|
187
187
|
};
|
|
188
|
-
//# sourceMappingURL=chunk-
|
|
188
|
+
//# sourceMappingURL=chunk-MH6LHFPB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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(__dirname, '..', '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":[]}
|
|
@@ -4,6 +4,8 @@ import {
|
|
|
4
4
|
|
|
5
5
|
// src/cli/setup/DependencyChecker.ts
|
|
6
6
|
import { spawn } from "child_process";
|
|
7
|
+
import { homedir } from "os";
|
|
8
|
+
import { join } from "path";
|
|
7
9
|
async function which(binary) {
|
|
8
10
|
return new Promise((resolve) => {
|
|
9
11
|
const proc = spawn("which", [binary], { stdio: ["ignore", "pipe", "ignore"] });
|
|
@@ -53,13 +55,15 @@ var DependencyChecker = class {
|
|
|
53
55
|
}
|
|
54
56
|
async checkVolta() {
|
|
55
57
|
const version = await getVersion("volta");
|
|
58
|
+
const cmd = "curl https://get.volta.sh | bash";
|
|
56
59
|
return {
|
|
57
60
|
name: "volta",
|
|
58
61
|
displayName: "Volta",
|
|
59
62
|
required: true,
|
|
60
63
|
installed: version !== null,
|
|
61
64
|
version: version ?? void 0,
|
|
62
|
-
|
|
65
|
+
installCommand: cmd,
|
|
66
|
+
installHint: cmd
|
|
63
67
|
};
|
|
64
68
|
}
|
|
65
69
|
async checkNode() {
|
|
@@ -167,6 +171,12 @@ var DependencyChecker = class {
|
|
|
167
171
|
proc.on("close", (code) => resolve(code ?? 1));
|
|
168
172
|
});
|
|
169
173
|
if (exitCode === 0) {
|
|
174
|
+
if (name === "volta") {
|
|
175
|
+
const voltaBin = join(homedir(), ".volta", "bin");
|
|
176
|
+
if (!process.env.PATH?.includes(voltaBin)) {
|
|
177
|
+
process.env.PATH = `${voltaBin}:${process.env.PATH}`;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
170
180
|
yield t("cli.installSuccess", { name: dep.displayName });
|
|
171
181
|
} else {
|
|
172
182
|
yield t("cli.installFailed", { name: dep.displayName, code: exitCode });
|
|
@@ -177,4 +187,4 @@ var DependencyChecker = class {
|
|
|
177
187
|
export {
|
|
178
188
|
DependencyChecker
|
|
179
189
|
};
|
|
180
|
-
//# sourceMappingURL=chunk-
|
|
190
|
+
//# sourceMappingURL=chunk-XJYGHL6J.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/setup/DependencyChecker.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { t } from '../../i18n/index.js';\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}\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 isCodebuddy = aiMode === 'codebuddy';\n const isCursor = aiMode === 'cursor-agent';\n const results = await Promise.all([\n this.checkVolta(),\n this.checkNode(),\n this.checkGit(),\n this.checkPnpm(),\n this.checkClaudeInternal(!isCursor && !isCodebuddy),\n this.checkCursor(isCursor),\n this.checkCodebuddy(isCodebuddy),\n ]);\n return results;\n }\n\n async checkVolta(): Promise<DepCheckResult> {\n const version = await getVersion('volta');\n const cmd = 'curl https://get.volta.sh | bash';\n return {\n name: 'volta',\n displayName: 'Volta',\n required: true,\n installed: version !== null,\n version: version ?? undefined,\n installCommand: cmd,\n installHint: cmd,\n };\n }\n\n async checkNode(): Promise<DepCheckResult> {\n const version = await getVersion('node');\n return {\n name: 'node',\n displayName: 'Node.js (>= 20)',\n required: true,\n installed: version !== null,\n version: version ?? undefined,\n installHint: t('cli.nodeInstallHint'),\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 installHint: 'sudo apt install git / brew install git',\n };\n }\n\n async checkPnpm(): Promise<DepCheckResult> {\n const version = await getVersion('pnpm');\n return {\n name: 'pnpm',\n displayName: 'pnpm (>= 9)',\n required: true,\n installed: version !== null,\n version: version ?? undefined,\n installCommand: 'volta install pnpm@9',\n installHint: 'volta install pnpm@9',\n };\n }\n\n async checkClaudeInternal(required: boolean): Promise<DepCheckResult> {\n const path = await which('claude-internal');\n const version = path ? await getVersion('claude-internal') : null;\n const cmd = 'npm install -g claude-code-internal';\n return {\n name: 'claude-internal',\n displayName: 'Claude Internal CLI',\n required,\n installed: path !== null,\n version: version ?? undefined,\n installCommand: cmd,\n installHint: cmd,\n };\n }\n\n async checkCursor(required: boolean): Promise<DepCheckResult> {\n const path = await which('cursor');\n const version = path ? await getVersion('cursor') : null;\n return {\n name: 'cursor',\n displayName: 'Cursor Agent CLI',\n required,\n installed: path !== null,\n version: version ?? undefined,\n installHint: t('cli.cursorInstallHint'),\n };\n }\n\n async checkCodebuddy(required: boolean): Promise<DepCheckResult> {\n const path = await which('codebuddy');\n const version = path ? await getVersion('codebuddy') : null;\n const cmd = 'npm install -g codebuddy-code';\n return {\n name: 'codebuddy',\n displayName: 'CodeBuddy CLI',\n required,\n installed: path !== null,\n version: version ?? undefined,\n installCommand: cmd,\n installHint: cmd,\n };\n }\n\n async *install(name: string): AsyncGenerator<string> {\n const checks = await this.checkAll();\n const dep = checks.find((d) => d.name === 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 for await (const chunk of proc.stdout) {\n yield chunk.toString();\n }\n for await (const chunk of proc.stderr) {\n yield chunk.toString();\n }\n\n const exitCode = await new Promise<number>((resolve) => {\n proc.on('close', (code) => resolve(code ?? 1));\n });\n\n if (exitCode === 0) {\n if (name === 'volta') {\n const voltaBin = join(homedir(), '.volta', 'bin');\n if (!process.env.PATH?.includes(voltaBin)) {\n process.env.PATH = `${voltaBin}:${process.env.PATH}`;\n }\n }\n yield t('cli.installSuccess', { name: dep.displayName });\n } else {\n yield t('cli.installFailed', { name: dep.displayName, code: exitCode });\n }\n }\n}\n"],"mappings":";;;;;AAAA,SAAS,aAAa;AACtB,SAAS,eAAe;AACxB,SAAS,YAAY;AAarB,eAAe,MAAM,QAAwC;AAC3D,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,OAAO,MAAM,SAAS,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,UAAU,QAAQ,QAAQ,EAAE,CAAC;AAC7E,QAAI,MAAM;AACV,SAAK,OAAO,GAAG,QAAQ,CAAC,MAAM;AAAE,aAAO,EAAE,SAAS;AAAA,IAAG,CAAC;AACtD,SAAK,GAAG,SAAS,CAAC,SAAS,QAAQ,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC;AAClE,SAAK,GAAG,SAAS,MAAM,QAAQ,IAAI,CAAC;AAAA,EACtC,CAAC;AACH;AAEA,eAAe,WAAW,QAAgB,OAAiB,CAAC,WAAW,GAA2B;AAChG,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,OAAO,MAAM,QAAQ,MAAM,EAAE,OAAO,CAAC,UAAU,QAAQ,MAAM,EAAE,CAAC;AACtE,QAAI,MAAM;AACV,SAAK,OAAO,GAAG,QAAQ,CAAC,MAAM;AAAE,aAAO,EAAE,SAAS;AAAA,IAAG,CAAC;AACtD,SAAK,OAAO,GAAG,QAAQ,CAAC,MAAM;AAAE,aAAO,EAAE,SAAS;AAAA,IAAG,CAAC;AACtD,SAAK,GAAG,SAAS,CAAC,SAAS;AACzB,UAAI,SAAS,KAAK,IAAI,KAAK,GAAG;AAC5B,cAAM,QAAQ,IAAI,KAAK,EAAE,MAAM,wBAAwB;AACvD,gBAAQ,QAAQ,MAAM,CAAC,IAAI,IAAI,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;AAAA,MACtD,OAAO;AACL,gBAAQ,IAAI;AAAA,MACd;AAAA,IACF,CAAC;AACD,SAAK,GAAG,SAAS,MAAM,QAAQ,IAAI,CAAC;AAAA,EACtC,CAAC;AACH;AAEO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,MAAM,SAAS,QAA4C;AACzD,UAAM,cAAc,WAAW;AAC/B,UAAM,WAAW,WAAW;AAC5B,UAAM,UAAU,MAAM,QAAQ,IAAI;AAAA,MAChC,KAAK,WAAW;AAAA,MAChB,KAAK,UAAU;AAAA,MACf,KAAK,SAAS;AAAA,MACd,KAAK,UAAU;AAAA,MACf,KAAK,oBAAoB,CAAC,YAAY,CAAC,WAAW;AAAA,MAClD,KAAK,YAAY,QAAQ;AAAA,MACzB,KAAK,eAAe,WAAW;AAAA,IACjC,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAAsC;AAC1C,UAAM,UAAU,MAAM,WAAW,OAAO;AACxC,UAAM,MAAM;AACZ,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,WAAW,YAAY;AAAA,MACvB,SAAS,WAAW;AAAA,MACpB,gBAAgB;AAAA,MAChB,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEA,MAAM,YAAqC;AACzC,UAAM,UAAU,MAAM,WAAW,MAAM;AACvC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,WAAW,YAAY;AAAA,MACvB,SAAS,WAAW;AAAA,MACpB,aAAa,EAAE,qBAAqB;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAM,WAAoC;AACxC,UAAM,UAAU,MAAM,WAAW,KAAK;AACtC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,WAAW,YAAY;AAAA,MACvB,SAAS,WAAW;AAAA,MACpB,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEA,MAAM,YAAqC;AACzC,UAAM,UAAU,MAAM,WAAW,MAAM;AACvC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,WAAW,YAAY;AAAA,MACvB,SAAS,WAAW;AAAA,MACpB,gBAAgB;AAAA,MAChB,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,UAA4C;AACpE,UAAM,OAAO,MAAM,MAAM,iBAAiB;AAC1C,UAAM,UAAU,OAAO,MAAM,WAAW,iBAAiB,IAAI;AAC7D,UAAM,MAAM;AACZ,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb;AAAA,MACA,WAAW,SAAS;AAAA,MACpB,SAAS,WAAW;AAAA,MACpB,gBAAgB;AAAA,MAChB,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,UAA4C;AAC5D,UAAM,OAAO,MAAM,MAAM,QAAQ;AACjC,UAAM,UAAU,OAAO,MAAM,WAAW,QAAQ,IAAI;AACpD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb;AAAA,MACA,WAAW,SAAS;AAAA,MACpB,SAAS,WAAW;AAAA,MACpB,aAAa,EAAE,uBAAuB;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,UAA4C;AAC/D,UAAM,OAAO,MAAM,MAAM,WAAW;AACpC,UAAM,UAAU,OAAO,MAAM,WAAW,WAAW,IAAI;AACvD,UAAM,MAAM;AACZ,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb;AAAA,MACA,WAAW,SAAS;AAAA,MACpB,SAAS,WAAW;AAAA,MACpB,gBAAgB;AAAA,MAChB,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEA,OAAO,QAAQ,MAAsC;AACnD,UAAM,SAAS,MAAM,KAAK,SAAS;AACnC,UAAM,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAC9C,QAAI,CAAC,KAAK;AACR,YAAM,EAAE,kBAAkB,EAAE,KAAK,CAAC;AAClC;AAAA,IACF;AACA,QAAI,IAAI,WAAW;AACjB,YAAM,EAAE,wBAAwB,EAAE,MAAM,IAAI,aAAa,SAAS,IAAI,WAAW,GAAG,CAAC;AACrF;AAAA,IACF;AACA,QAAI,CAAC,IAAI,gBAAgB;AACvB,YAAM,EAAE,qBAAqB,EAAE,MAAM,IAAI,aAAa,MAAM,IAAI,eAAe,GAAG,CAAC;AACnF;AAAA,IACF;AAEA,UAAM,EAAE,kBAAkB,EAAE,MAAM,IAAI,YAAY,CAAC;AACnD,UAAM,KAAK,IAAI,cAAc;AAE7B,UAAM,OAAO,MAAM,IAAI,gBAAgB;AAAA,MACrC,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAChC,OAAO;AAAA,IACT,CAAC;AAED,qBAAiB,SAAS,KAAK,QAAQ;AACrC,YAAM,MAAM,SAAS;AAAA,IACvB;AACA,qBAAiB,SAAS,KAAK,QAAQ;AACrC,YAAM,MAAM,SAAS;AAAA,IACvB;AAEA,UAAM,WAAW,MAAM,IAAI,QAAgB,CAAC,YAAY;AACtD,WAAK,GAAG,SAAS,CAAC,SAAS,QAAQ,QAAQ,CAAC,CAAC;AAAA,IAC/C,CAAC;AAED,QAAI,aAAa,GAAG;AAClB,UAAI,SAAS,SAAS;AACpB,cAAM,WAAW,KAAK,QAAQ,GAAG,UAAU,KAAK;AAChD,YAAI,CAAC,QAAQ,IAAI,MAAM,SAAS,QAAQ,GAAG;AACzC,kBAAQ,IAAI,OAAO,GAAG,QAAQ,IAAI,QAAQ,IAAI,IAAI;AAAA,QACpD;AAAA,MACF;AACA,YAAM,EAAE,sBAAsB,EAAE,MAAM,IAAI,YAAY,CAAC;AAAA,IACzD,OAAO;AACL,YAAM,EAAE,qBAAqB,EAAE,MAAM,IAAI,aAAa,MAAM,SAAS,CAAC;AAAA,IACxE;AAAA,EACF;AACF;","names":[]}
|
|
@@ -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,
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DependencyChecker.d.ts","sourceRoot":"","sources":["../../../src/cli/setup/DependencyChecker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DependencyChecker.d.ts","sourceRoot":"","sources":["../../../src/cli/setup/DependencyChecker.ts"],"names":[],"mappings":"AAKA,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;CACtB;AA8BD,qBAAa,iBAAiB;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAepD,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC;IAcrC,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC;IAYpC,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC;IAYnC,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC;IAapC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;IAe/D,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;IAavD,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;IAezD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC;CA+CrD"}
|
package/dist/cli.js
CHANGED
|
@@ -23,19 +23,19 @@ 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-
|
|
26
|
+
const { initCommand } = await import("./init-KF5OGQ3B.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-
|
|
30
|
+
const { startCommand } = await import("./start-3XVP2TAP.js");
|
|
31
31
|
await startCommand({ config: opts.config });
|
|
32
32
|
});
|
|
33
33
|
program.command("doctor").description("Check environment dependencies").action(async () => {
|
|
34
|
-
const { doctorCommand } = await import("./doctor-
|
|
34
|
+
const { doctorCommand } = await import("./doctor-EOYNPACK.js");
|
|
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-
|
|
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) => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DependencyChecker
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-XJYGHL6J.js";
|
|
4
4
|
import "./chunk-JFYAXNNS.js";
|
|
5
5
|
|
|
6
6
|
// src/cli/commands/doctor.ts
|
|
@@ -30,4 +30,4 @@ async function doctorCommand() {
|
|
|
30
30
|
export {
|
|
31
31
|
doctorCommand
|
|
32
32
|
};
|
|
33
|
-
//# sourceMappingURL=doctor-
|
|
33
|
+
//# sourceMappingURL=doctor-EOYNPACK.js.map
|
package/dist/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
main
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-F4IB7IRT.js";
|
|
4
|
+
import "./chunk-F7AYCERS.js";
|
|
5
5
|
import "./chunk-HCHEFK4Z.js";
|
|
6
|
-
import "./chunk-
|
|
6
|
+
import "./chunk-XJYGHL6J.js";
|
|
7
7
|
import "./chunk-N5YK6YVI.js";
|
|
8
8
|
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-
|
|
12
|
+
import "./chunk-MH6LHFPB.js";
|
|
13
13
|
import "./chunk-SWG2Y7YX.js";
|
|
14
14
|
import "./chunk-TZ6C7HL5.js";
|
|
15
15
|
export {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createSetupRouter
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-F7AYCERS.js";
|
|
4
4
|
import "./chunk-HCHEFK4Z.js";
|
|
5
|
-
import "./chunk-
|
|
5
|
+
import "./chunk-XJYGHL6J.js";
|
|
6
6
|
import "./chunk-3JUHZGX5.js";
|
|
7
7
|
import "./chunk-JFYAXNNS.js";
|
|
8
8
|
import "./chunk-5VUB3UUK.js";
|
|
@@ -32,7 +32,8 @@ async function initCommand(options) {
|
|
|
32
32
|
}
|
|
33
33
|
});
|
|
34
34
|
app.use(setupRouter);
|
|
35
|
-
const
|
|
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-
|
|
70
|
+
//# sourceMappingURL=init-KF5OGQ3B.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
package/dist/run.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
main
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-F4IB7IRT.js";
|
|
4
|
+
import "./chunk-F7AYCERS.js";
|
|
5
5
|
import "./chunk-HCHEFK4Z.js";
|
|
6
|
-
import "./chunk-
|
|
6
|
+
import "./chunk-XJYGHL6J.js";
|
|
7
7
|
import "./chunk-N5YK6YVI.js";
|
|
8
8
|
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-
|
|
12
|
+
import "./chunk-MH6LHFPB.js";
|
|
13
13
|
import "./chunk-SWG2Y7YX.js";
|
|
14
14
|
import "./chunk-TZ6C7HL5.js";
|
|
15
15
|
|
|
@@ -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;
|
|
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 +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 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/setup/DependencyChecker.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\nimport { t } from '../../i18n/index.js';\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}\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 isCodebuddy = aiMode === 'codebuddy';\n const isCursor = aiMode === 'cursor-agent';\n const results = await Promise.all([\n this.checkVolta(),\n this.checkNode(),\n this.checkGit(),\n this.checkPnpm(),\n this.checkClaudeInternal(!isCursor && !isCodebuddy),\n this.checkCursor(isCursor),\n this.checkCodebuddy(isCodebuddy),\n ]);\n return results;\n }\n\n async checkVolta(): Promise<DepCheckResult> {\n const version = await getVersion('volta');\n return {\n name: 'volta',\n displayName: 'Volta',\n required: true,\n installed: version !== null,\n version: version ?? undefined,\n installHint: 'curl https://get.volta.sh | bash',\n };\n }\n\n async checkNode(): Promise<DepCheckResult> {\n const version = await getVersion('node');\n return {\n name: 'node',\n displayName: 'Node.js (>= 20)',\n required: true,\n installed: version !== null,\n version: version ?? undefined,\n installHint: t('cli.nodeInstallHint'),\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 installHint: 'sudo apt install git / brew install git',\n };\n }\n\n async checkPnpm(): Promise<DepCheckResult> {\n const version = await getVersion('pnpm');\n return {\n name: 'pnpm',\n displayName: 'pnpm (>= 9)',\n required: true,\n installed: version !== null,\n version: version ?? undefined,\n installCommand: 'volta install pnpm@9',\n installHint: 'volta install pnpm@9',\n };\n }\n\n async checkClaudeInternal(required: boolean): Promise<DepCheckResult> {\n const path = await which('claude-internal');\n const version = path ? await getVersion('claude-internal') : null;\n const cmd = 'npm install -g claude-code-internal';\n return {\n name: 'claude-internal',\n displayName: 'Claude Internal CLI',\n required,\n installed: path !== null,\n version: version ?? undefined,\n installCommand: cmd,\n installHint: cmd,\n };\n }\n\n async checkCursor(required: boolean): Promise<DepCheckResult> {\n const path = await which('cursor');\n const version = path ? await getVersion('cursor') : null;\n return {\n name: 'cursor',\n displayName: 'Cursor Agent CLI',\n required,\n installed: path !== null,\n version: version ?? undefined,\n installHint: t('cli.cursorInstallHint'),\n };\n }\n\n async checkCodebuddy(required: boolean): Promise<DepCheckResult> {\n const path = await which('codebuddy');\n const version = path ? await getVersion('codebuddy') : null;\n const cmd = 'npm install -g codebuddy-code';\n return {\n name: 'codebuddy',\n displayName: 'CodeBuddy CLI',\n required,\n installed: path !== null,\n version: version ?? undefined,\n installCommand: cmd,\n installHint: cmd,\n };\n }\n\n async *install(name: string): AsyncGenerator<string> {\n const checks = await this.checkAll();\n const dep = checks.find((d) => d.name === 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 for await (const chunk of proc.stdout) {\n yield chunk.toString();\n }\n for await (const chunk of proc.stderr) {\n yield chunk.toString();\n }\n\n const exitCode = await new Promise<number>((resolve) => {\n proc.on('close', (code) => resolve(code ?? 1));\n });\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"],"mappings":"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","names":[]}
|
package/dist/config-RI7NLDXI.js
DELETED
|
@@ -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":[]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|