@xdevops/issue-auto-finish 1.0.1 → 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.
Files changed (133) hide show
  1. package/dist/KnowledgeAnalyzer-EZSJT2MJ.js +13 -0
  2. package/dist/KnowledgeAnalyzer-EZSJT2MJ.js.map +1 -0
  3. package/dist/KnowledgeStore-4ROC6F56.js +10 -0
  4. package/dist/KnowledgeStore-4ROC6F56.js.map +1 -0
  5. package/dist/ai-runner/AIRunner.d.ts +2 -0
  6. package/dist/ai-runner/AIRunner.d.ts.map +1 -1
  7. package/dist/ai-runner/BaseAIRunner.d.ts +9 -0
  8. package/dist/ai-runner/BaseAIRunner.d.ts.map +1 -1
  9. package/dist/ai-runner-RGAJPOOW.js +16 -0
  10. package/dist/ai-runner-RGAJPOOW.js.map +1 -0
  11. package/dist/analyze-I7UOJB4F.js +72 -0
  12. package/dist/analyze-I7UOJB4F.js.map +1 -0
  13. package/dist/chunk-3JUHZGX5.js +171 -0
  14. package/dist/chunk-3JUHZGX5.js.map +1 -0
  15. package/dist/chunk-5JYCGAU3.js +318 -0
  16. package/dist/chunk-5JYCGAU3.js.map +1 -0
  17. package/dist/chunk-5VUB3UUK.js +643 -0
  18. package/dist/chunk-5VUB3UUK.js.map +1 -0
  19. package/dist/{chunk-IDUKWCC2.js → chunk-C6ZJVIPZ.js} +1151 -80
  20. package/dist/chunk-C6ZJVIPZ.js.map +1 -0
  21. package/dist/{chunk-OWVT3Z34.js → chunk-JFYAXNNS.js} +121 -31
  22. package/dist/chunk-JFYAXNNS.js.map +1 -0
  23. package/dist/chunk-KISVPNSV.js +188 -0
  24. package/dist/chunk-KISVPNSV.js.map +1 -0
  25. package/dist/{chunk-I3T573SU.js → chunk-LEQYGOMJ.js} +65 -2
  26. package/dist/chunk-LEQYGOMJ.js.map +1 -0
  27. package/dist/{chunk-TBIEB3JY.js → chunk-N5YK6YVI.js} +592 -767
  28. package/dist/chunk-N5YK6YVI.js.map +1 -0
  29. package/dist/{chunk-RIUI4ROA.js → chunk-PECYMYAK.js} +2 -2
  30. package/dist/chunk-SWG2Y7YX.js +410 -0
  31. package/dist/chunk-SWG2Y7YX.js.map +1 -0
  32. package/dist/chunk-TZ6C7HL5.js +59 -0
  33. package/dist/chunk-TZ6C7HL5.js.map +1 -0
  34. package/dist/cli/commands/analyze.d.ts +8 -0
  35. package/dist/cli/commands/analyze.d.ts.map +1 -0
  36. package/dist/cli.js +67 -3
  37. package/dist/cli.js.map +1 -1
  38. package/dist/clients/GongfengClient.d.ts +5 -0
  39. package/dist/clients/GongfengClient.d.ts.map +1 -1
  40. package/dist/config-RI7NLDXI.js +7 -0
  41. package/dist/config-RI7NLDXI.js.map +1 -0
  42. package/dist/config.d.ts +19 -0
  43. package/dist/config.d.ts.map +1 -1
  44. package/dist/{doctor-B26Q6JWI.js → doctor-ZPGIBA5N.js} +3 -3
  45. package/dist/events/EventBus.d.ts +1 -1
  46. package/dist/events/EventBus.d.ts.map +1 -1
  47. package/dist/git/GitOperations.d.ts +12 -0
  48. package/dist/git/GitOperations.d.ts.map +1 -1
  49. package/dist/i18n/locales/en.d.ts.map +1 -1
  50. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +11 -5
  53. package/dist/{init-L3VIWCOV.js → init-LZGCIHE7.js} +8 -4
  54. package/dist/{init-L3VIWCOV.js.map → init-LZGCIHE7.js.map} +1 -1
  55. package/dist/knowledge/KnowledgeAnalyzer.d.ts +31 -0
  56. package/dist/knowledge/KnowledgeAnalyzer.d.ts.map +1 -0
  57. package/dist/knowledge/KnowledgeDefaults.d.ts +7 -0
  58. package/dist/knowledge/KnowledgeDefaults.d.ts.map +1 -0
  59. package/dist/knowledge/KnowledgeEntry.d.ts +30 -0
  60. package/dist/knowledge/KnowledgeEntry.d.ts.map +1 -0
  61. package/dist/knowledge/KnowledgeLoader.d.ts +18 -0
  62. package/dist/knowledge/KnowledgeLoader.d.ts.map +1 -0
  63. package/dist/knowledge/KnowledgeStore.d.ts +35 -0
  64. package/dist/knowledge/KnowledgeStore.d.ts.map +1 -0
  65. package/dist/knowledge/ProjectKnowledge.d.ts +79 -0
  66. package/dist/knowledge/ProjectKnowledge.d.ts.map +1 -0
  67. package/dist/knowledge/analyze-prompt.d.ts +2 -0
  68. package/dist/knowledge/analyze-prompt.d.ts.map +1 -0
  69. package/dist/knowledge/importers/GongfengExtractor.d.ts +27 -0
  70. package/dist/knowledge/importers/GongfengExtractor.d.ts.map +1 -0
  71. package/dist/knowledge/importers/IwikiImporter.d.ts +21 -0
  72. package/dist/knowledge/importers/IwikiImporter.d.ts.map +1 -0
  73. package/dist/knowledge/index.d.ts +12 -0
  74. package/dist/knowledge/index.d.ts.map +1 -0
  75. package/dist/lib.js +19 -10
  76. package/dist/orchestrator/PipelineOrchestrator.d.ts +5 -1
  77. package/dist/orchestrator/PipelineOrchestrator.d.ts.map +1 -1
  78. package/dist/phases/BasePhase.d.ts.map +1 -1
  79. package/dist/poller/IssuePoller.d.ts +5 -0
  80. package/dist/poller/IssuePoller.d.ts.map +1 -1
  81. package/dist/prompts/chat-templates.d.ts +4 -0
  82. package/dist/prompts/chat-templates.d.ts.map +1 -0
  83. package/dist/prompts/templates.d.ts +11 -0
  84. package/dist/prompts/templates.d.ts.map +1 -1
  85. package/dist/rules/RuleResolver.d.ts +4 -0
  86. package/dist/rules/RuleResolver.d.ts.map +1 -1
  87. package/dist/run.js +11 -5
  88. package/dist/run.js.map +1 -1
  89. package/dist/services/ChatService.d.ts +39 -0
  90. package/dist/services/ChatService.d.ts.map +1 -0
  91. package/dist/shutdown/ShutdownSignal.d.ts +3 -0
  92. package/dist/shutdown/ShutdownSignal.d.ts.map +1 -0
  93. package/dist/{start-TVN4SS6E.js → start-NMQHUKGF.js} +1 -1
  94. package/dist/tracker/IssueState.d.ts +1 -0
  95. package/dist/tracker/IssueState.d.ts.map +1 -1
  96. package/dist/tracker/IssueTracker.d.ts +2 -0
  97. package/dist/tracker/IssueTracker.d.ts.map +1 -1
  98. package/dist/updater/AutoUpdater.d.ts +33 -0
  99. package/dist/updater/AutoUpdater.d.ts.map +1 -0
  100. package/dist/updater/UpdateExecutor.d.ts +7 -0
  101. package/dist/updater/UpdateExecutor.d.ts.map +1 -0
  102. package/dist/updater/VersionChecker.d.ts +22 -0
  103. package/dist/updater/VersionChecker.d.ts.map +1 -0
  104. package/dist/web/WebServer.d.ts +4 -0
  105. package/dist/web/WebServer.d.ts.map +1 -1
  106. package/dist/web/routes/api.d.ts +4 -0
  107. package/dist/web/routes/api.d.ts.map +1 -1
  108. package/dist/web/routes/chat.d.ts +7 -0
  109. package/dist/web/routes/chat.d.ts.map +1 -0
  110. package/dist/web/routes/knowledge.d.ts +13 -0
  111. package/dist/web/routes/knowledge.d.ts.map +1 -0
  112. package/dist/web/routes/setup.d.ts.map +1 -1
  113. package/dist/webhook/CommandExecutor.d.ts +4 -0
  114. package/dist/webhook/CommandExecutor.d.ts.map +1 -1
  115. package/dist/webhook/CommandParser.d.ts +2 -2
  116. package/dist/webhook/CommandParser.d.ts.map +1 -1
  117. package/dist/webhook/WebhookHandler.d.ts +8 -0
  118. package/dist/webhook/WebhookHandler.d.ts.map +1 -1
  119. package/dist/webhook/WebhookServer.d.ts +2 -0
  120. package/dist/webhook/WebhookServer.d.ts.map +1 -1
  121. package/package.json +4 -2
  122. package/src/web/frontend/dist/assets/index-AcJ0lPIv.js +67 -0
  123. package/src/web/frontend/dist/assets/index-BbRt5BAr.css +1 -0
  124. package/src/web/frontend/dist/index.html +2 -2
  125. package/dist/chunk-I3T573SU.js.map +0 -1
  126. package/dist/chunk-IDUKWCC2.js.map +0 -1
  127. package/dist/chunk-OWVT3Z34.js.map +0 -1
  128. package/dist/chunk-TBIEB3JY.js.map +0 -1
  129. package/src/web/frontend/dist/assets/index-CQdlU9PE.js +0 -65
  130. package/src/web/frontend/dist/assets/index-CgMEkyZJ.css +0 -1
  131. /package/dist/{chunk-RIUI4ROA.js.map → chunk-PECYMYAK.js.map} +0 -0
  132. /package/dist/{doctor-B26Q6JWI.js.map → doctor-ZPGIBA5N.js.map} +0 -0
  133. /package/dist/{start-TVN4SS6E.js.map → start-NMQHUKGF.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/knowledge/KnowledgeAnalyzer.ts","../src/knowledge/KnowledgeDefaults.ts","../src/knowledge/analyze-prompt.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { logger as rootLogger } from '../logger.js';\nimport type { AIRunner } from '../ai-runner/index.js';\nimport type { ProjectKnowledge } from './ProjectKnowledge.js';\nimport { KNOWLEDGE_DEFAULTS } from './KnowledgeDefaults.js';\nimport { buildAnalyzePrompt } from './analyze-prompt.js';\nimport type { KnowledgeStore } from './KnowledgeStore.js';\nimport { projectKnowledgeToMarkdown } from './KnowledgeStore.js';\n\nconst execFileAsync = promisify(execFile);\nconst logger = rootLogger.child('KnowledgeAnalyzer');\n\nexport interface AnalyzeOptions {\n workDir: string;\n aiRunner: AIRunner;\n timeoutMs?: number;\n outputPath?: string;\n}\n\nexport interface IncrementalAnalyzeOptions {\n workDir: string;\n aiRunner: AIRunner;\n store: KnowledgeStore;\n timeoutMs?: number;\n}\n\nasync function collectSkillFiles(\n dir: string,\n basePath = '',\n): Promise<Array<{ relativePath: string; content: string }>> {\n const results: Array<{ relativePath: string; content: string }> = [];\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const rel = basePath ? `${basePath}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n const sub = await collectSkillFiles(path.join(dir, entry.name), rel);\n results.push(...sub);\n } else if (entry.name === 'SKILL.md') {\n const content = await readFile(path.join(dir, entry.name), 'utf-8');\n results.push({ relativePath: rel, content });\n }\n }\n } catch { /* skip */ }\n return results;\n}\n\n/**\n * Collect static project info (no AI needed).\n */\nexport async function collectStaticInfo(workDir: string): Promise<string> {\n const sections: string[] = [];\n\n // package.json\n const pkgPath = path.join(workDir, 'package.json');\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n sections.push('### package.json');\n sections.push('```json');\n sections.push(JSON.stringify({\n name: pkg.name,\n scripts: pkg.scripts,\n dependencies: Object.keys(pkg.dependencies ?? {}),\n devDependencies: Object.keys(pkg.devDependencies ?? {}),\n }, null, 2));\n sections.push('```');\n } catch { /* skip */ }\n }\n\n // Lockfile type\n const lockfiles = ['pnpm-lock.yaml', 'package-lock.json', 'yarn.lock', 'bun.lockb'];\n const foundLockfile = lockfiles.find(f => fs.existsSync(path.join(workDir, f)));\n if (foundLockfile) {\n sections.push(`### Lockfile: ${foundLockfile}`);\n }\n\n // Non-Node project files\n for (const configFile of ['pyproject.toml', 'Cargo.toml', 'go.mod', 'Makefile']) {\n const cfgPath = path.join(workDir, configFile);\n if (fs.existsSync(cfgPath)) {\n try {\n const content = fs.readFileSync(cfgPath, 'utf-8');\n sections.push(`### ${configFile}`);\n sections.push('```');\n sections.push(content.slice(0, 3000));\n sections.push('```');\n } catch { /* skip */ }\n }\n }\n\n // .editorconfig\n const editorConfigPath = path.join(workDir, '.editorconfig');\n if (fs.existsSync(editorConfigPath)) {\n try {\n const content = fs.readFileSync(editorConfigPath, 'utf-8');\n sections.push('### .editorconfig');\n sections.push('```');\n sections.push(content);\n sections.push('```');\n } catch { /* skip */ }\n }\n\n // ESLint / Prettier configs\n const styleConfigs = [\n '.eslintrc.json', '.eslintrc.js', '.eslintrc.cjs', 'eslint.config.js', 'eslint.config.mjs',\n '.prettierrc', '.prettierrc.json', 'prettier.config.js',\n ];\n for (const cfg of styleConfigs) {\n const cfgPath = path.join(workDir, cfg);\n if (fs.existsSync(cfgPath)) {\n try {\n const content = fs.readFileSync(cfgPath, 'utf-8');\n sections.push(`### ${cfg}`);\n sections.push('```');\n sections.push(content.slice(0, 2000));\n sections.push('```');\n } catch { /* skip */ }\n }\n }\n\n // Monorepo markers\n const monoRepoFiles = ['pnpm-workspace.yaml', 'lerna.json', 'nx.json'];\n for (const mf of monoRepoFiles) {\n const mfPath = path.join(workDir, mf);\n if (fs.existsSync(mfPath)) {\n try {\n const content = fs.readFileSync(mfPath, 'utf-8');\n sections.push(`### ${mf} (monorepo marker)`);\n sections.push('```');\n sections.push(content.slice(0, 1000));\n sections.push('```');\n } catch { /* skip */ }\n }\n }\n\n // .cursor/rules/*.mdc files (full content - primary agent knowledge)\n const rulesDir = path.join(workDir, '.cursor', 'rules');\n if (fs.existsSync(rulesDir)) {\n try {\n const files = await readdir(rulesDir);\n const mdcFiles = files.filter(f => f.endsWith('.mdc'));\n for (const mdc of mdcFiles) {\n try {\n const content = await readFile(path.join(rulesDir, mdc), 'utf-8');\n sections.push(`### .cursor/rules/${mdc}`);\n sections.push('```');\n sections.push(content);\n sections.push('```');\n } catch { /* skip */ }\n }\n } catch { /* skip */ }\n }\n\n // .cursorrules (legacy Cursor rules)\n const legacyRulesPath = path.join(workDir, '.cursorrules');\n if (fs.existsSync(legacyRulesPath)) {\n try {\n const content = fs.readFileSync(legacyRulesPath, 'utf-8');\n sections.push('### .cursorrules (legacy)');\n sections.push('```');\n sections.push(content.slice(0, 10_000));\n if (content.length > 10_000) sections.push('... (truncated)');\n sections.push('```');\n } catch { /* skip */ }\n }\n\n // CLAUDE.md (full content - most important business knowledge)\n const claudeMdPath = path.join(workDir, 'CLAUDE.md');\n if (fs.existsSync(claudeMdPath)) {\n try {\n const content = fs.readFileSync(claudeMdPath, 'utf-8');\n sections.push('### CLAUDE.md');\n sections.push('```markdown');\n sections.push(content);\n sections.push('```');\n } catch { /* skip */ }\n }\n\n // AGENTS.md\n const agentsMdPath = path.join(workDir, 'AGENTS.md');\n if (fs.existsSync(agentsMdPath)) {\n try {\n const content = fs.readFileSync(agentsMdPath, 'utf-8');\n sections.push('### AGENTS.md');\n sections.push('```markdown');\n sections.push(content);\n sections.push('```');\n } catch { /* skip */ }\n }\n\n // .agents/**/SKILL.md files\n const agentsDir = path.join(workDir, '.agents');\n if (fs.existsSync(agentsDir)) {\n try {\n const skillFiles = await collectSkillFiles(agentsDir);\n for (const { relativePath, content } of skillFiles) {\n sections.push(`### .agents/${relativePath}`);\n sections.push('```markdown');\n sections.push(content.slice(0, 5000));\n if (content.length > 5000) sections.push('... (truncated)');\n sections.push('```');\n }\n } catch { /* skip */ }\n }\n\n // .claude/ directory config\n const claudeDir = path.join(workDir, '.claude');\n if (fs.existsSync(claudeDir)) {\n try {\n const claudeFiles = await readdir(claudeDir);\n for (const cf of claudeFiles.filter(f => f.endsWith('.json') || f.endsWith('.md'))) {\n try {\n const content = await readFile(path.join(claudeDir, cf), 'utf-8');\n sections.push(`### .claude/${cf}`);\n sections.push('```');\n sections.push(content.slice(0, 3000));\n if (content.length > 3000) sections.push('... (truncated)');\n sections.push('```');\n } catch { /* skip */ }\n }\n } catch { /* skip */ }\n }\n\n // README.md (expanded)\n const readmePath = path.join(workDir, 'README.md');\n if (fs.existsSync(readmePath)) {\n try {\n const content = fs.readFileSync(readmePath, 'utf-8');\n sections.push('### README.md');\n sections.push('```markdown');\n sections.push(content.slice(0, 15_000));\n if (content.length > 15_000) sections.push('... (truncated)');\n sections.push('```');\n } catch { /* skip */ }\n }\n\n // docs/ directory overview\n const docsDir = path.join(workDir, 'docs');\n if (fs.existsSync(docsDir)) {\n try {\n const docFiles = await readdir(docsDir);\n const mdFiles = docFiles.filter(f => f.endsWith('.md'));\n if (mdFiles.length > 0) {\n sections.push('### docs/ directory');\n for (const doc of mdFiles.slice(0, 10)) {\n try {\n const content = await readFile(path.join(docsDir, doc), 'utf-8');\n const firstLine = content.split('\\n').find(l => l.startsWith('#'))?.replace(/^#+\\s*/, '') || doc;\n sections.push(`- ${doc}: ${firstLine}`);\n } catch {\n sections.push(`- ${doc}`);\n }\n }\n }\n } catch { /* skip */ }\n }\n\n // Entry files (understand business entry points)\n const entryFiles = ['src/index.ts', 'src/main.ts', 'src/app.ts', 'src/index.js', 'src/main.js', 'src/app.js'];\n for (const entry of entryFiles) {\n const entryPath = path.join(workDir, entry);\n if (fs.existsSync(entryPath)) {\n try {\n const content = fs.readFileSync(entryPath, 'utf-8');\n const lines = content.split('\\n');\n sections.push(`### ${entry} (entry point)`);\n sections.push('```');\n sections.push(lines.slice(0, 100).join('\\n'));\n if (lines.length > 100) sections.push('... (truncated)');\n sections.push('```');\n } catch { /* skip */ }\n }\n }\n\n // Directory tree (depth=2)\n try {\n const { stdout } = await execFileAsync('find', [\n workDir, '-maxdepth', '2', '-not', '-path', '*/node_modules/*',\n '-not', '-path', '*/.git/*', '-not', '-path', '*/dist/*',\n ], { timeout: 10_000 });\n const tree = stdout\n .split('\\n')\n .map(p => p.replace(workDir, '.'))\n .filter(p => p && p !== '.')\n .sort()\n .slice(0, 100)\n .join('\\n');\n sections.push('### Directory tree (depth=2)');\n sections.push('```');\n sections.push(tree);\n sections.push('```');\n } catch { /* skip */ }\n\n return sections.join('\\n\\n');\n}\n\nfunction parseJsonFromOutput(output: string): Record<string, unknown> | null {\n // Try extracting ```json block first\n const jsonBlockMatch = output.match(/```json\\s*\\n([\\s\\S]*?)```/);\n if (jsonBlockMatch) {\n try {\n return JSON.parse(jsonBlockMatch[1].trim());\n } catch { /* fall through */ }\n }\n\n // Try direct parse\n try {\n return JSON.parse(output.trim());\n } catch { /* fall through */ }\n\n return null;\n}\n\nfunction deepMergeKnowledge(\n defaults: Record<string, unknown>,\n overrides: Record<string, unknown>,\n): Record<string, unknown> {\n const result = { ...defaults };\n for (const key of Object.keys(overrides)) {\n const val = overrides[key];\n if (val !== null && val !== undefined) {\n if (typeof val === 'object' && !Array.isArray(val) && typeof result[key] === 'object' && !Array.isArray(result[key])) {\n result[key] = deepMergeKnowledge(result[key] as Record<string, unknown>, val as Record<string, unknown>);\n } else {\n result[key] = val;\n }\n }\n }\n return result;\n}\n\n/**\n * Analyze a project with AI and generate knowledge.json.\n */\nexport async function analyze(options: AnalyzeOptions): Promise<ProjectKnowledge> {\n const { workDir, aiRunner, timeoutMs = 600_000, outputPath } = options;\n\n logger.info('Collecting static project info', { workDir });\n const staticInfo = await collectStaticInfo(workDir);\n\n logger.info('Running AI analysis');\n const prompt = buildAnalyzePrompt(staticInfo);\n const result = await aiRunner.run({\n prompt,\n workDir,\n timeoutMs,\n });\n\n if (!result.success) {\n throw new Error(`AI analysis failed: ${result.output.slice(0, 500)}`);\n }\n\n const parsed = parseJsonFromOutput(result.output);\n if (!parsed) {\n throw new Error(`Failed to parse AI output as JSON. Raw output:\\n${result.output.slice(0, 1000)}`);\n }\n\n // Merge with defaults to fill missing fields\n const merged = deepMergeKnowledge(\n KNOWLEDGE_DEFAULTS as unknown as Record<string, unknown>,\n parsed,\n ) as unknown as ProjectKnowledge;\n\n merged.version = 1;\n merged.generatedAt = new Date().toISOString();\n merged.repoPath = workDir;\n\n // Persist\n const savePath = outputPath ?? path.join(workDir, 'knowledge.json');\n fs.writeFileSync(savePath, JSON.stringify(merged, null, 2), 'utf-8');\n logger.info('Knowledge saved', { path: savePath });\n\n return merged;\n}\n\n/**\n * Incremental analysis: detect changes since last analysis and update project-meta.\n */\nexport async function analyzeIncremental(\n options: IncrementalAnalyzeOptions,\n): Promise<{ knowledge: ProjectKnowledge; changedFiles: string[] } | null> {\n const { workDir, aiRunner, store, timeoutMs = 600_000 } = options;\n\n const stats = store.getStats();\n const since = stats.lastAnalyzedAt;\n\n let changedFiles: string[] = [];\n if (since) {\n try {\n const { stdout } = await execFileAsync('git', [\n 'diff', '--name-only', '--diff-filter=ACMR',\n '--since=' + since,\n 'HEAD',\n ], { cwd: workDir, timeout: 10_000 });\n changedFiles = stdout.trim().split('\\n').filter(Boolean);\n } catch {\n logger.warn('git diff failed, falling back to full analysis');\n }\n }\n\n if (since && changedFiles.length === 0) {\n logger.info('No changes detected since last analysis, skipping');\n return null;\n }\n\n logger.info('Running incremental analysis', { changedFiles: changedFiles.length });\n\n const staticInfo = await collectStaticInfo(workDir);\n const existingMeta = store.getProjectMeta();\n\n let prompt: string;\n if (existingMeta && changedFiles.length > 0) {\n prompt = buildIncrementalPrompt(staticInfo, existingMeta.content, changedFiles);\n } else {\n prompt = buildAnalyzePrompt(staticInfo);\n }\n\n const result = await aiRunner.run({ prompt, workDir, timeoutMs });\n if (!result.success) {\n throw new Error('AI analysis failed: ' + result.output.slice(0, 500));\n }\n\n const parsed = parseJsonFromOutput(result.output);\n if (!parsed) {\n throw new Error('Failed to parse AI output as JSON');\n }\n\n const merged = deepMergeKnowledge(\n KNOWLEDGE_DEFAULTS as unknown as Record<string, unknown>,\n parsed,\n ) as unknown as ProjectKnowledge;\n\n merged.version = 1;\n merged.generatedAt = new Date().toISOString();\n merged.repoPath = workDir;\n\n // Save to legacy path for backward compatibility\n const savePath = path.join(workDir, 'knowledge.json');\n fs.writeFileSync(savePath, JSON.stringify(merged, null, 2), 'utf-8');\n\n // Update KnowledgeStore\n const markdown = projectKnowledgeToMarkdown(merged);\n store.upsertProjectMeta(markdown, merged);\n store.setLastAnalyzedAt(merged.generatedAt);\n\n logger.info('Incremental analysis complete', { changedFiles: changedFiles.length });\n return { knowledge: merged, changedFiles };\n}\n\nconst KNOWLEDGE_FILE_PATTERNS = [\n '.cursor/rules/', 'CLAUDE.md', 'AGENTS.md', '.cursorrules',\n '.agents/', '.claude/', 'README.md', 'docs/',\n];\n\nfunction buildIncrementalPrompt(\n staticInfo: string,\n existingKnowledge: string,\n changedFiles: string[],\n): string {\n const knowledgeFilesChanged = changedFiles.filter(f =>\n KNOWLEDGE_FILE_PATTERNS.some(p => f.includes(p)),\n );\n\n const focusHint = knowledgeFilesChanged.length > 0\n ? `\\n\\n**注意**:以下 Agent 知识文件发生了变更,请重点更新 agentKnowledge、businessContext、architecture、domainConcepts 字段:\\n${knowledgeFilesChanged.map(f => '- ' + f).join('\\n')}`\n : '';\n\n const outputSection = buildAnalyzePrompt('').split('## 输出要求').slice(1).join('## 输出要求');\n\n return [\n '你是一个项目分析专家。项目代码已发生变更,请根据最新信息更新知识配置。',\n '你需要保留现有知识中正确的部分,更新受变更影响的部分,并确保业务理解和 Agent 知识始终是最新的。',\n focusHint,\n '',\n '## 现有知识',\n existingKnowledge,\n '',\n '## 变更文件列表',\n changedFiles.join('\\n'),\n '',\n '## 当前项目信息',\n staticInfo,\n '',\n outputSection ? '## 输出要求' + outputSection : '',\n ].join('\\n');\n}\n","import type { ProjectKnowledge } from './ProjectKnowledge.js';\n\n/**\n * Default knowledge matching current hardcoded behavior.\n * Used as fallback when knowledge.json does not exist.\n */\nexport const KNOWLEDGE_DEFAULTS: ProjectKnowledge = {\n version: 1,\n generatedAt: '2024-01-01T00:00:00Z',\n repoPath: '',\n structure: {\n primaryLanguage: 'TypeScript',\n frameworks: ['Node.js'],\n isMonorepo: false,\n hasFrontendBackendSplit: true,\n frontendDir: 'frontend',\n e2eDir: 'frontend/e2e/dynamic',\n e2eTool: 'Playwright',\n },\n toolchain: {\n packageManager: 'pnpm',\n installCommand: 'pnpm install --frozen-lockfile',\n installFallbackCommand: 'pnpm install --frozen-lockfile --ignore-scripts',\n lintCommand: 'pnpm run lint',\n buildCommand: 'pnpm run build',\n testCommand: 'pnpm test',\n testFilesCommand: 'pnpm test4vscode --files {files}',\n dependencyCheckPath: 'node_modules/.bin/eslint',\n },\n codeStyle: {\n indentStyle: 'spaces',\n indentSize: 2,\n lineWidth: 120,\n },\n businessContext: {\n purpose: '',\n targetUsers: '',\n domain: '',\n coreFeatures: [],\n },\n architecture: {\n overview: '',\n keyModules: [],\n dataFlow: '',\n designPatterns: [],\n externalDependencies: [],\n },\n domainConcepts: [],\n agentKnowledge: {\n summary: '',\n cursorRules: [],\n conventions: [],\n },\n ruleTriggers: [\n {\n filename: 'session-rule.mdc',\n keywords: ['Session', 'PublishSession', 'SessionData', '会话', 'ActivitySession'],\n },\n {\n filename: 'backend-api-implementation.mdc',\n keywords: ['新增接口', '添加接口', '修改接口', 'Controller', 'ServiceImpl', '路由'],\n },\n {\n filename: 'artifact-publish-rule.mdc',\n keywords: ['制品发布', 'ArtifactPublish', 'lockResource', 'unlockResource', '发布系统'],\n },\n {\n filename: 'activity-realization-rule.mdc',\n keywords: ['活动实现', 'ActivityRealization', 'BaseActivityRealization', 'syncExecuteStatus', 'queryExec'],\n },\n {\n filename: 'appset.mdc',\n keywords: ['AppSet', 'appset', 'ComponentInstance', 'StorageService', 'IDC Set'],\n },\n {\n filename: 'add-artifact-workflow.mdc',\n keywords: ['添加制品', '新增制品', '制品类型', 'ArtifactType', 'ArtifactTypeId'],\n },\n {\n filename: 'add-appset-api-workflow.mdc',\n keywords: ['AppSet接口', 'AppSet API', 'proto', 'protobuf', 'devops-contracts'],\n },\n ],\n knownIssues: [\n {\n description: \"build 阶段 tests/ 目录可能出现 TS2307: Cannot find module 'japa' 或 'sinon'\",\n pattern: 'TS2307',\n advice: '这是测试框架类型声明的已知问题,可以忽略',\n },\n ],\n};\n","export function buildAnalyzePrompt(staticInfo: string): string {\n return `你是一个项目分析专家。请根据以下收集到的项目信息,深度分析该项目并生成结构化的知识配置。你需要同时理解项目的**技术元数据**和**业务语义**。\n\n## 收集到的项目信息\n\n${staticInfo}\n\n## 输出要求\n\n请严格按照以下 JSON 格式输出,包裹在 \\`\\`\\`json 代码块中。所有字段都需要根据实际分析结果填写:\n\n\\`\\`\\`json\n{\n \"version\": 1,\n \"generatedAt\": \"<ISO 时间戳>\",\n \"repoPath\": \"<项目路径>\",\n \"structure\": {\n \"primaryLanguage\": \"<主语言: TypeScript/JavaScript/Python/Go/Rust/Java 等>\",\n \"frameworks\": [\"<框架列表>\"],\n \"isMonorepo\": false,\n \"hasFrontendBackendSplit\": false,\n \"frontendDir\": \"<前端目录,无则省略>\",\n \"e2eDir\": \"<E2E 测试目录,无则省略>\",\n \"e2eTool\": \"<E2E 工具: Playwright/Cypress/Selenium 等,无则省略>\",\n \"description\": \"<简短项目描述>\"\n },\n \"toolchain\": {\n \"packageManager\": \"<包管理器: pnpm/npm/yarn/bun/pip/cargo/go 等>\",\n \"installCommand\": \"<安装依赖的命令>\",\n \"installFallbackCommand\": \"<安装失败时的降级命令,可选>\",\n \"lintCommand\": \"<lint 命令,无则省略>\",\n \"buildCommand\": \"<build 命令,无则省略>\",\n \"testCommand\": \"<test 命令,无则省略>\",\n \"testFilesCommand\": \"<运行指定文件测试的命令,用 {files} 作为占位符,无则省略>\",\n \"dependencyCheckPath\": \"<用于检查依赖是否安装完成的文件路径,如 node_modules/.bin/eslint>\"\n },\n \"codeStyle\": {\n \"indentStyle\": \"spaces\",\n \"indentSize\": 2,\n \"lineWidth\": 120,\n \"additionalRules\": [\"<额外代码规范说明>\"]\n },\n \"businessContext\": {\n \"purpose\": \"<项目做什么、解决什么问题,用 2-3 句话说清楚>\",\n \"targetUsers\": \"<目标用户群体和使用场景>\",\n \"domain\": \"<业务领域,如 DevOps、电商、金融、社交、教育等>\",\n \"coreFeatures\": [\"<核心功能列表,每条用一句话描述>\"]\n },\n \"architecture\": {\n \"overview\": \"<架构概述,描述系统的整体组织方式、分层结构、核心流转路径,1-2 段>\",\n \"keyModules\": [\n {\n \"name\": \"<模块名>\",\n \"path\": \"<对应的目录/文件路径>\",\n \"responsibility\": \"<该模块的职责,用一句话说清楚>\"\n }\n ],\n \"dataFlow\": \"<核心数据流描述:数据从哪里来、经过哪些模块处理、最终到哪里>\",\n \"designPatterns\": [\"<使用的设计模式列表,如策略模式、观察者模式等>\"],\n \"externalDependencies\": [\"<关键外部依赖/服务,如数据库、消息队列、第三方 API 等>\"]\n },\n \"domainConcepts\": [\n {\n \"term\": \"<业务术语>\",\n \"definition\": \"<该术语在此项目中的含义>\"\n }\n ],\n \"agentKnowledge\": {\n \"summary\": \"<Agent 知识沉淀的整体摘要:有哪些规则文件、CLAUDE.md 包含什么信息、整体对 AI 协作有什么指导>\",\n \"cursorRules\": [\n {\n \"filename\": \"<.mdc 文件名>\",\n \"purpose\": \"<该规则的目的和适用场景>\",\n \"keyPoints\": [\"<该规则中最重要的要点,每条用一句话>\"]\n }\n ],\n \"claudeMdSummary\": \"<CLAUDE.md 的核心内容摘要:项目概述、架构、开发约定、扩展指南等关键信息>\",\n \"conventions\": [\"<从 agent 知识中提炼的开发约定,如 ESM 导入规范、命名规范、测试规范等>\"]\n },\n \"ruleTriggers\": [\n {\n \"filename\": \"<.mdc 文件名>\",\n \"keywords\": [\"<触发关键词列表,每个文件 5-15 个>\"],\n \"description\": \"<规则简短描述>\"\n }\n ],\n \"knownIssues\": [\n {\n \"description\": \"<已知问题描述>\",\n \"pattern\": \"<错误匹配模式,可选>\",\n \"advice\": \"<处理建议>\"\n }\n ]\n}\n\\`\\`\\`\n\n## 分析指导\n\n### 技术元数据\n1. **工具链推断**:从 package.json 的 scripts 字段推断 lint/build/test 命令;从 lockfile 类型判断包管理器\n2. **代码规范**:从 .editorconfig 推断缩进和行宽;从 ESLint/Prettier 配置提取额外规则\n3. **Monorepo 检测**:检查 pnpm-workspace.yaml、lerna.json、nx.json 等文件\n4. **前后端分离**:根据目录结构判断是否有前后端分离\n\n### 业务理解(重点)\n5. **业务目的**:从 CLAUDE.md、README.md、入口文件中理解项目解决什么问题、为谁服务。businessContext.purpose 应该让一个完全不了解项目的人读完就能理解项目做什么\n6. **架构分析**:从目录结构、CLAUDE.md、.mdc 规则中提取关键模块和职责划分。keyModules 应覆盖所有重要的源码目录。overview 应描述系统的整体架构而非简单罗列模块\n7. **核心数据流**:描述系统中最重要的数据流转路径,例如\"用户请求 → 控制器 → 服务层 → 数据库\"\n8. **领域概念**:从 CLAUDE.md、.mdc 规则、代码中提取业务术语(包括中英文术语),并给出在此项目上下文中的准确定义。例如 \"worktree\" 在某个项目中指 \"git worktree 隔离的独立工作目录\"\n9. **外部依赖**:识别项目依赖的外部系统和服务(不是 npm 包,而是运行时依赖的外部系统如 GitLab API、数据库、消息队列等)\n\n### Agent 知识深度分析(重点)\n10. **规则理解**:深度阅读每个 .mdc 文件和 CLAUDE.md 的完整内容。不是只提取关键词,而是理解每条规则的**目的**(为什么需要这条规则)、**适用场景**(什么时候触发)、**核心要点**(最重要的约束和指导)\n11. **开发约定提炼**:从 CLAUDE.md 和 .mdc 规则中提炼出对日常开发最重要的约定(如文件命名规范、导入规范、测试规范、提交规范等),放入 agentKnowledge.conventions\n12. **规则触发器**:阅读每个 .mdc 文件的内容,从中提取 5-15 个业务概念关键词作为触发器。关键词应包括类名、业务术语、中文概念等\n\n### 问题识别\n13. **已知问题**:识别项目中可能遇到的构建/测试问题(如已知的类型声明缺失、特定测试框架问题等)\n\n只输出 JSON,不要添加其他说明文字。`;\n}\n"],"mappings":"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","names":["logger"]}