@xdevops/issue-auto-finish 1.0.2 → 1.0.3
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/KnowledgeAnalyzer-EZSJT2MJ.js +13 -0
- package/dist/KnowledgeAnalyzer-EZSJT2MJ.js.map +1 -0
- package/dist/KnowledgeStore-4ROC6F56.js +10 -0
- package/dist/KnowledgeStore-4ROC6F56.js.map +1 -0
- package/dist/ai-runner/AIRunner.d.ts +2 -0
- package/dist/ai-runner/AIRunner.d.ts.map +1 -1
- package/dist/ai-runner/BaseAIRunner.d.ts +9 -0
- package/dist/ai-runner/BaseAIRunner.d.ts.map +1 -1
- package/dist/ai-runner-RGAJPOOW.js +16 -0
- package/dist/ai-runner-RGAJPOOW.js.map +1 -0
- package/dist/analyze-I7UOJB4F.js +72 -0
- package/dist/analyze-I7UOJB4F.js.map +1 -0
- package/dist/chunk-3JUHZGX5.js +171 -0
- package/dist/chunk-3JUHZGX5.js.map +1 -0
- package/dist/chunk-5JYCGAU3.js +318 -0
- package/dist/chunk-5JYCGAU3.js.map +1 -0
- package/dist/chunk-5VUB3UUK.js +643 -0
- package/dist/chunk-5VUB3UUK.js.map +1 -0
- package/dist/{chunk-IDUKWCC2.js → chunk-C6ZJVIPZ.js} +1151 -80
- package/dist/chunk-C6ZJVIPZ.js.map +1 -0
- package/dist/{chunk-OWVT3Z34.js → chunk-JFYAXNNS.js} +121 -31
- package/dist/chunk-JFYAXNNS.js.map +1 -0
- package/dist/chunk-KISVPNSV.js +188 -0
- package/dist/chunk-KISVPNSV.js.map +1 -0
- package/dist/{chunk-I3T573SU.js → chunk-LEQYGOMJ.js} +65 -2
- package/dist/chunk-LEQYGOMJ.js.map +1 -0
- package/dist/{chunk-TBIEB3JY.js → chunk-N5YK6YVI.js} +592 -767
- package/dist/chunk-N5YK6YVI.js.map +1 -0
- package/dist/{chunk-RIUI4ROA.js → chunk-PECYMYAK.js} +2 -2
- package/dist/chunk-SWG2Y7YX.js +410 -0
- package/dist/chunk-SWG2Y7YX.js.map +1 -0
- package/dist/chunk-TZ6C7HL5.js +59 -0
- package/dist/chunk-TZ6C7HL5.js.map +1 -0
- package/dist/cli/commands/analyze.d.ts +8 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli.js +67 -3
- package/dist/cli.js.map +1 -1
- package/dist/clients/GongfengClient.d.ts +5 -0
- package/dist/clients/GongfengClient.d.ts.map +1 -1
- package/dist/config-RI7NLDXI.js +7 -0
- package/dist/config-RI7NLDXI.js.map +1 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/{doctor-B26Q6JWI.js → doctor-ZPGIBA5N.js} +3 -3
- package/dist/events/EventBus.d.ts +1 -1
- package/dist/events/EventBus.d.ts.map +1 -1
- package/dist/git/GitOperations.d.ts +12 -0
- package/dist/git/GitOperations.d.ts.map +1 -1
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -5
- package/dist/{init-L3VIWCOV.js → init-LZGCIHE7.js} +8 -4
- package/dist/{init-L3VIWCOV.js.map → init-LZGCIHE7.js.map} +1 -1
- package/dist/knowledge/KnowledgeAnalyzer.d.ts +31 -0
- package/dist/knowledge/KnowledgeAnalyzer.d.ts.map +1 -0
- package/dist/knowledge/KnowledgeDefaults.d.ts +7 -0
- package/dist/knowledge/KnowledgeDefaults.d.ts.map +1 -0
- package/dist/knowledge/KnowledgeEntry.d.ts +30 -0
- package/dist/knowledge/KnowledgeEntry.d.ts.map +1 -0
- package/dist/knowledge/KnowledgeLoader.d.ts +18 -0
- package/dist/knowledge/KnowledgeLoader.d.ts.map +1 -0
- package/dist/knowledge/KnowledgeStore.d.ts +35 -0
- package/dist/knowledge/KnowledgeStore.d.ts.map +1 -0
- package/dist/knowledge/ProjectKnowledge.d.ts +79 -0
- package/dist/knowledge/ProjectKnowledge.d.ts.map +1 -0
- package/dist/knowledge/analyze-prompt.d.ts +2 -0
- package/dist/knowledge/analyze-prompt.d.ts.map +1 -0
- package/dist/knowledge/importers/GongfengExtractor.d.ts +27 -0
- package/dist/knowledge/importers/GongfengExtractor.d.ts.map +1 -0
- package/dist/knowledge/importers/IwikiImporter.d.ts +21 -0
- package/dist/knowledge/importers/IwikiImporter.d.ts.map +1 -0
- package/dist/knowledge/index.d.ts +12 -0
- package/dist/knowledge/index.d.ts.map +1 -0
- package/dist/lib.js +19 -10
- package/dist/orchestrator/PipelineOrchestrator.d.ts +5 -1
- package/dist/orchestrator/PipelineOrchestrator.d.ts.map +1 -1
- package/dist/phases/BasePhase.d.ts.map +1 -1
- package/dist/poller/IssuePoller.d.ts +5 -0
- package/dist/poller/IssuePoller.d.ts.map +1 -1
- package/dist/prompts/chat-templates.d.ts +4 -0
- package/dist/prompts/chat-templates.d.ts.map +1 -0
- package/dist/prompts/templates.d.ts +11 -0
- package/dist/prompts/templates.d.ts.map +1 -1
- package/dist/rules/RuleResolver.d.ts +4 -0
- package/dist/rules/RuleResolver.d.ts.map +1 -1
- package/dist/run.js +11 -5
- package/dist/run.js.map +1 -1
- package/dist/services/ChatService.d.ts +39 -0
- package/dist/services/ChatService.d.ts.map +1 -0
- package/dist/shutdown/ShutdownSignal.d.ts +3 -0
- package/dist/shutdown/ShutdownSignal.d.ts.map +1 -0
- package/dist/{start-TVN4SS6E.js → start-NMQHUKGF.js} +1 -1
- package/dist/tracker/IssueState.d.ts +1 -0
- package/dist/tracker/IssueState.d.ts.map +1 -1
- package/dist/tracker/IssueTracker.d.ts +2 -0
- package/dist/tracker/IssueTracker.d.ts.map +1 -1
- package/dist/updater/AutoUpdater.d.ts +33 -0
- package/dist/updater/AutoUpdater.d.ts.map +1 -0
- package/dist/updater/UpdateExecutor.d.ts +7 -0
- package/dist/updater/UpdateExecutor.d.ts.map +1 -0
- package/dist/updater/VersionChecker.d.ts +22 -0
- package/dist/updater/VersionChecker.d.ts.map +1 -0
- package/dist/web/WebServer.d.ts +4 -0
- package/dist/web/WebServer.d.ts.map +1 -1
- package/dist/web/routes/api.d.ts +4 -0
- package/dist/web/routes/api.d.ts.map +1 -1
- package/dist/web/routes/chat.d.ts +7 -0
- package/dist/web/routes/chat.d.ts.map +1 -0
- package/dist/web/routes/knowledge.d.ts +13 -0
- package/dist/web/routes/knowledge.d.ts.map +1 -0
- package/dist/web/routes/setup.d.ts.map +1 -1
- package/dist/webhook/CommandExecutor.d.ts +4 -0
- package/dist/webhook/CommandExecutor.d.ts.map +1 -1
- package/dist/webhook/CommandParser.d.ts +2 -2
- package/dist/webhook/CommandParser.d.ts.map +1 -1
- package/dist/webhook/WebhookHandler.d.ts +8 -0
- package/dist/webhook/WebhookHandler.d.ts.map +1 -1
- package/dist/webhook/WebhookServer.d.ts +2 -0
- package/dist/webhook/WebhookServer.d.ts.map +1 -1
- package/package.json +4 -2
- package/src/web/frontend/dist/assets/index-AcJ0lPIv.js +67 -0
- package/src/web/frontend/dist/assets/index-BbRt5BAr.css +1 -0
- package/src/web/frontend/dist/index.html +2 -2
- package/dist/chunk-I3T573SU.js.map +0 -1
- package/dist/chunk-IDUKWCC2.js.map +0 -1
- package/dist/chunk-OWVT3Z34.js.map +0 -1
- package/dist/chunk-TBIEB3JY.js.map +0 -1
- package/src/web/frontend/dist/assets/index-CQdlU9PE.js +0 -65
- package/src/web/frontend/dist/assets/index-CgMEkyZJ.css +0 -1
- /package/dist/{chunk-RIUI4ROA.js.map → chunk-PECYMYAK.js.map} +0 -0
- /package/dist/{doctor-B26Q6JWI.js.map → doctor-ZPGIBA5N.js.map} +0 -0
- /package/dist/{start-TVN4SS6E.js.map → start-NMQHUKGF.js.map} +0 -0
|
@@ -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(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":[]}
|
|
@@ -3,7 +3,14 @@ import {
|
|
|
3
3
|
} from "./chunk-HCHEFK4Z.js";
|
|
4
4
|
import {
|
|
5
5
|
DependencyChecker
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-PECYMYAK.js";
|
|
7
|
+
import {
|
|
8
|
+
getProjectKnowledge
|
|
9
|
+
} from "./chunk-3JUHZGX5.js";
|
|
10
|
+
import {
|
|
11
|
+
analyze,
|
|
12
|
+
collectStaticInfo
|
|
13
|
+
} from "./chunk-5VUB3UUK.js";
|
|
7
14
|
|
|
8
15
|
// src/web/routes/setup.ts
|
|
9
16
|
import { Router } from "express";
|
|
@@ -144,10 +151,66 @@ function createSetupRouter(deps = {}) {
|
|
|
144
151
|
res.json({ exists: false, isDirectory: false, isGitRepo: false, error: err.message });
|
|
145
152
|
}
|
|
146
153
|
});
|
|
154
|
+
router.post("/api/setup/analyze-repo", (req, res) => {
|
|
155
|
+
const { workDir, aiRunner } = req.body;
|
|
156
|
+
if (!workDir) {
|
|
157
|
+
res.status(400).json({ error: "workDir is required" });
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
res.setHeader("Content-Type", "text/event-stream");
|
|
161
|
+
res.setHeader("Cache-Control", "no-cache");
|
|
162
|
+
res.setHeader("Connection", "keep-alive");
|
|
163
|
+
res.flushHeaders();
|
|
164
|
+
(async () => {
|
|
165
|
+
try {
|
|
166
|
+
res.write(`data: ${JSON.stringify({ step: "collecting", message: "Collecting project info..." })}
|
|
167
|
+
|
|
168
|
+
`);
|
|
169
|
+
const staticInfo = await collectStaticInfo(workDir);
|
|
170
|
+
res.write(`data: ${JSON.stringify({ step: "collected", message: "Static info collected" })}
|
|
171
|
+
|
|
172
|
+
`);
|
|
173
|
+
res.write(`data: ${JSON.stringify({ step: "analyzing", message: "Running AI analysis..." })}
|
|
174
|
+
|
|
175
|
+
`);
|
|
176
|
+
try {
|
|
177
|
+
const { loadConfig } = await import("./config-RI7NLDXI.js");
|
|
178
|
+
const { createAIRunner } = await import("./ai-runner-RGAJPOOW.js");
|
|
179
|
+
const config = loadConfig();
|
|
180
|
+
const runner = createAIRunner(config.ai);
|
|
181
|
+
const knowledge = await analyze({ workDir, aiRunner: runner });
|
|
182
|
+
res.write(`data: ${JSON.stringify({ step: "done", knowledge })}
|
|
183
|
+
|
|
184
|
+
`);
|
|
185
|
+
} catch (aiErr) {
|
|
186
|
+
res.write(`data: ${JSON.stringify({ step: "ai_unavailable", message: aiErr.message, staticInfo })}
|
|
187
|
+
|
|
188
|
+
`);
|
|
189
|
+
}
|
|
190
|
+
} catch (err) {
|
|
191
|
+
res.write(`data: ${JSON.stringify({ step: "error", error: err.message })}
|
|
192
|
+
|
|
193
|
+
`);
|
|
194
|
+
} finally {
|
|
195
|
+
res.end();
|
|
196
|
+
}
|
|
197
|
+
})();
|
|
198
|
+
req.on("close", () => {
|
|
199
|
+
res.end();
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
router.get("/api/setup/knowledge-preview", (_req, res) => {
|
|
203
|
+
const knowledge = getProjectKnowledge();
|
|
204
|
+
if (knowledge) {
|
|
205
|
+
res.json({ exists: true, knowledge });
|
|
206
|
+
} else {
|
|
207
|
+
res.json({ exists: false, knowledge: null });
|
|
208
|
+
}
|
|
209
|
+
});
|
|
147
210
|
return router;
|
|
148
211
|
}
|
|
149
212
|
|
|
150
213
|
export {
|
|
151
214
|
createSetupRouter
|
|
152
215
|
};
|
|
153
|
-
//# sourceMappingURL=chunk-
|
|
216
|
+
//# sourceMappingURL=chunk-LEQYGOMJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/web/routes/setup.ts"],"sourcesContent":["import { Router, Request, Response } from 'express';\nimport fs from 'node:fs';\nimport { DependencyChecker } from '../../cli/setup/DependencyChecker.js';\nimport { ConfigGenerator, SetupConfig } from '../../cli/setup/ConfigGenerator.js';\nimport { collectStaticInfo, analyze } from '../../knowledge/KnowledgeAnalyzer.js';\nimport { getProjectKnowledge } from '../../knowledge/index.js';\n\nexport interface SetupRouterDeps {\n configPath?: string;\n onComplete?: (configPath: string) => void;\n serviceMode?: boolean;\n}\n\nexport function createSetupRouter(deps: SetupRouterDeps = {}): Router {\n const router = Router();\n const checker = new DependencyChecker();\n\n router.get('/api/setup/status', (_req: Request, res: Response) => {\n const initialized = deps.serviceMode || ConfigGenerator.isInitialized(deps.configPath);\n res.json({\n initialized,\n configPath: deps.configPath ?? ConfigGenerator.getGlobalConfigPath(),\n globalConfigDir: ConfigGenerator.getGlobalConfigDir(),\n });\n });\n\n router.get('/api/setup/check-env', async (_req: Request, res: Response) => {\n try {\n const aiMode = ((_req.query.aiMode as string) || undefined);\n const results = await checker.checkAll(aiMode);\n res.json({ dependencies: results });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n router.post('/api/setup/validate-token', async (req: Request, res: Response) => {\n const { apiUrl, token } = req.body as { apiUrl?: string; token?: string };\n if (!apiUrl || !token) {\n res.status(400).json({ error: 'apiUrl and token are required' });\n return;\n }\n try {\n const url = `${apiUrl.replace(/\\/$/, '')}/api/v3/user`;\n const resp = await fetch(url, {\n headers: { 'PRIVATE-TOKEN': token },\n signal: AbortSignal.timeout(10000),\n });\n if (resp.ok) {\n const user = (await resp.json()) as { username?: string; name?: string };\n res.json({ valid: true, user: { username: user.username, name: user.name } });\n } else {\n res.json({ valid: false, error: `HTTP ${resp.status}: ${resp.statusText}` });\n }\n } catch (err) {\n res.json({ valid: false, error: (err as Error).message });\n }\n });\n\n router.post('/api/setup/validate-repo', async (req: Request, res: Response) => {\n const { apiUrl, token, projectPath } = req.body as {\n apiUrl?: string; token?: string; projectPath?: string;\n };\n if (!apiUrl || !token || !projectPath) {\n res.status(400).json({ error: 'apiUrl, token, and projectPath are required' });\n return;\n }\n try {\n const encoded = encodeURIComponent(projectPath);\n const url = `${apiUrl.replace(/\\/$/, '')}/api/v3/projects/${encoded}`;\n const resp = await fetch(url, {\n headers: { 'PRIVATE-TOKEN': token },\n signal: AbortSignal.timeout(10000),\n });\n if (resp.ok) {\n const project = (await resp.json()) as {\n id?: number; name?: string; path_with_namespace?: string;\n };\n res.json({ valid: true, project });\n } else {\n res.json({ valid: false, error: `HTTP ${resp.status}: ${resp.statusText}` });\n }\n } catch (err) {\n res.json({ valid: false, error: (err as Error).message });\n }\n });\n\n router.post('/api/setup/install-dep', (req: Request, res: Response) => {\n const { name } = req.body as { name?: string };\n if (!name) {\n res.status(400).json({ error: 'name is required' });\n return;\n }\n\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.flushHeaders();\n\n (async () => {\n try {\n for await (const line of checker.install(name)) {\n res.write(`data: ${JSON.stringify({ line })}\\n\\n`);\n }\n res.write(`data: ${JSON.stringify({ done: true })}\\n\\n`);\n } catch (err) {\n res.write(`data: ${JSON.stringify({ error: (err as Error).message })}\\n\\n`);\n } finally {\n res.end();\n }\n })();\n\n req.on('close', () => {\n res.end();\n });\n });\n\n router.post('/api/setup/generate-preview', (req: Request, res: Response) => {\n const config = req.body as SetupConfig;\n try {\n const preview = ConfigGenerator.generate(config);\n res.json({ preview });\n } catch (err) {\n res.status(400).json({ error: (err as Error).message });\n }\n });\n\n router.post('/api/setup/complete', (req: Request, res: Response) => {\n const { config, outputPath } = req.body as {\n config?: SetupConfig;\n outputPath?: string;\n };\n if (!config) {\n res.status(400).json({ error: 'config is required' });\n return;\n }\n try {\n const targetPath = outputPath ?? deps.configPath;\n const savedPath = ConfigGenerator.write(config, targetPath);\n res.json({ success: true, configPath: savedPath });\n deps.onComplete?.(savedPath);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n router.post('/api/setup/check-path', (req: Request, res: Response) => {\n const { path: dirPath } = req.body as { path?: string };\n if (!dirPath) {\n res.status(400).json({ error: 'path is required' });\n return;\n }\n try {\n const exists = fs.existsSync(dirPath);\n const isDirectory = exists && fs.statSync(dirPath).isDirectory();\n const isGitRepo = exists && fs.existsSync(dirPath + '/.git');\n res.json({ exists, isDirectory, isGitRepo });\n } catch (err) {\n res.json({ exists: false, isDirectory: false, isGitRepo: false, error: (err as Error).message });\n }\n });\n\n router.post('/api/setup/analyze-repo', (req: Request, res: Response) => {\n const { workDir, aiRunner } = req.body as { workDir?: string; aiRunner?: unknown };\n if (!workDir) {\n res.status(400).json({ error: 'workDir is required' });\n return;\n }\n\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.flushHeaders();\n\n (async () => {\n try {\n res.write(`data: ${JSON.stringify({ step: 'collecting', message: 'Collecting project info...' })}\\n\\n`);\n const staticInfo = await collectStaticInfo(workDir);\n res.write(`data: ${JSON.stringify({ step: 'collected', message: 'Static info collected' })}\\n\\n`);\n\n // AI analysis requires an AI runner; for setup wizard we attempt if runner deps available\n res.write(`data: ${JSON.stringify({ step: 'analyzing', message: 'Running AI analysis...' })}\\n\\n`);\n\n try {\n const { loadConfig } = await import('../../config.js');\n const { createAIRunner } = await import('../../ai-runner/index.js');\n const config = loadConfig();\n const runner = createAIRunner(config.ai);\n const knowledge = await analyze({ workDir, aiRunner: runner });\n res.write(`data: ${JSON.stringify({ step: 'done', knowledge })}\\n\\n`);\n } catch (aiErr) {\n // AI not available, return static info only\n res.write(`data: ${JSON.stringify({ step: 'ai_unavailable', message: (aiErr as Error).message, staticInfo })}\\n\\n`);\n }\n } catch (err) {\n res.write(`data: ${JSON.stringify({ step: 'error', error: (err as Error).message })}\\n\\n`);\n } finally {\n res.end();\n }\n })();\n\n req.on('close', () => {\n res.end();\n });\n });\n\n router.get('/api/setup/knowledge-preview', (_req: Request, res: Response) => {\n const knowledge = getProjectKnowledge();\n if (knowledge) {\n res.json({ exists: true, knowledge });\n } else {\n res.json({ exists: false, knowledge: null });\n }\n });\n\n return router;\n}\n"],"mappings":"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","names":[]}
|