@xdevops/issue-auto-finish 1.0.0

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 (161) hide show
  1. package/bin/issue-auto-finish.js +2 -0
  2. package/dist/ai-runner/AIRunner.d.ts +27 -0
  3. package/dist/ai-runner/AIRunner.d.ts.map +1 -0
  4. package/dist/ai-runner/BaseAIRunner.d.ts +19 -0
  5. package/dist/ai-runner/BaseAIRunner.d.ts.map +1 -0
  6. package/dist/ai-runner/ClaudeInternalRunner.d.ts +13 -0
  7. package/dist/ai-runner/ClaudeInternalRunner.d.ts.map +1 -0
  8. package/dist/ai-runner/CodebuddyRunner.d.ts +13 -0
  9. package/dist/ai-runner/CodebuddyRunner.d.ts.map +1 -0
  10. package/dist/ai-runner/CursorAgentRunner.d.ts +13 -0
  11. package/dist/ai-runner/CursorAgentRunner.d.ts.map +1 -0
  12. package/dist/ai-runner/index.d.ts +15 -0
  13. package/dist/ai-runner/index.d.ts.map +1 -0
  14. package/dist/chunk-HCHEFK4Z.js +80 -0
  15. package/dist/chunk-HCHEFK4Z.js.map +1 -0
  16. package/dist/chunk-I3T573SU.js +153 -0
  17. package/dist/chunk-I3T573SU.js.map +1 -0
  18. package/dist/chunk-IDUKWCC2.js +1995 -0
  19. package/dist/chunk-IDUKWCC2.js.map +1 -0
  20. package/dist/chunk-OWVT3Z34.js +770 -0
  21. package/dist/chunk-OWVT3Z34.js.map +1 -0
  22. package/dist/chunk-RIUI4ROA.js +180 -0
  23. package/dist/chunk-RIUI4ROA.js.map +1 -0
  24. package/dist/chunk-TBIEB3JY.js +3295 -0
  25. package/dist/chunk-TBIEB3JY.js.map +1 -0
  26. package/dist/cli/commands/doctor.d.ts +2 -0
  27. package/dist/cli/commands/doctor.d.ts.map +1 -0
  28. package/dist/cli/commands/init.d.ts +6 -0
  29. package/dist/cli/commands/init.d.ts.map +1 -0
  30. package/dist/cli/commands/start.d.ts +5 -0
  31. package/dist/cli/commands/start.d.ts.map +1 -0
  32. package/dist/cli/index.d.ts +3 -0
  33. package/dist/cli/index.d.ts.map +1 -0
  34. package/dist/cli/setup/ConfigGenerator.d.ts +44 -0
  35. package/dist/cli/setup/ConfigGenerator.d.ts.map +1 -0
  36. package/dist/cli/setup/DependencyChecker.d.ts +21 -0
  37. package/dist/cli/setup/DependencyChecker.d.ts.map +1 -0
  38. package/dist/cli.js +73 -0
  39. package/dist/cli.js.map +1 -0
  40. package/dist/clients/GongfengClient.d.ts +86 -0
  41. package/dist/clients/GongfengClient.d.ts.map +1 -0
  42. package/dist/config.d.ts +92 -0
  43. package/dist/config.d.ts.map +1 -0
  44. package/dist/deploy/DevServerManager.d.ts +21 -0
  45. package/dist/deploy/DevServerManager.d.ts.map +1 -0
  46. package/dist/deploy/PortAllocator.d.ts +20 -0
  47. package/dist/deploy/PortAllocator.d.ts.map +1 -0
  48. package/dist/deploy/index.d.ts +3 -0
  49. package/dist/deploy/index.d.ts.map +1 -0
  50. package/dist/doctor-B26Q6JWI.js +33 -0
  51. package/dist/doctor-B26Q6JWI.js.map +1 -0
  52. package/dist/e2e/E2eSettings.d.ts +6 -0
  53. package/dist/e2e/E2eSettings.d.ts.map +1 -0
  54. package/dist/e2e/ScreenshotCollector.d.ts +11 -0
  55. package/dist/e2e/ScreenshotCollector.d.ts.map +1 -0
  56. package/dist/e2e/ScreenshotPublisher.d.ts +16 -0
  57. package/dist/e2e/ScreenshotPublisher.d.ts.map +1 -0
  58. package/dist/events/EventBus.d.ts +14 -0
  59. package/dist/events/EventBus.d.ts.map +1 -0
  60. package/dist/git/GitOperations.d.ts +30 -0
  61. package/dist/git/GitOperations.d.ts.map +1 -0
  62. package/dist/git/WorktreeContext.d.ts +9 -0
  63. package/dist/git/WorktreeContext.d.ts.map +1 -0
  64. package/dist/i18n/index.d.ts +8 -0
  65. package/dist/i18n/index.d.ts.map +1 -0
  66. package/dist/i18n/locales/en.d.ts +2 -0
  67. package/dist/i18n/locales/en.d.ts.map +1 -0
  68. package/dist/i18n/locales/zh-CN.d.ts +2 -0
  69. package/dist/i18n/locales/zh-CN.d.ts.map +1 -0
  70. package/dist/index.d.ts +2 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +12 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/init-L3VIWCOV.js +65 -0
  75. package/dist/init-L3VIWCOV.js.map +1 -0
  76. package/dist/lib.d.ts +26 -0
  77. package/dist/lib.d.ts.map +1 -0
  78. package/dist/lib.js +50 -0
  79. package/dist/lib.js.map +1 -0
  80. package/dist/logger.d.ts +15 -0
  81. package/dist/logger.d.ts.map +1 -0
  82. package/dist/notesync/NoteSyncSettings.d.ts +12 -0
  83. package/dist/notesync/NoteSyncSettings.d.ts.map +1 -0
  84. package/dist/orchestrator/PipelineOrchestrator.d.ts +53 -0
  85. package/dist/orchestrator/PipelineOrchestrator.d.ts.map +1 -0
  86. package/dist/persistence/PlanPersistence.d.ts +37 -0
  87. package/dist/persistence/PlanPersistence.d.ts.map +1 -0
  88. package/dist/phases/AnalysisPhase.d.ts +13 -0
  89. package/dist/phases/AnalysisPhase.d.ts.map +1 -0
  90. package/dist/phases/BasePhase.d.ts +44 -0
  91. package/dist/phases/BasePhase.d.ts.map +1 -0
  92. package/dist/phases/BuildPhase.d.ts +9 -0
  93. package/dist/phases/BuildPhase.d.ts.map +1 -0
  94. package/dist/phases/DesignPhase.d.ts +13 -0
  95. package/dist/phases/DesignPhase.d.ts.map +1 -0
  96. package/dist/phases/ImplementPhase.d.ts +9 -0
  97. package/dist/phases/ImplementPhase.d.ts.map +1 -0
  98. package/dist/phases/PhaseFactory.d.ts +13 -0
  99. package/dist/phases/PhaseFactory.d.ts.map +1 -0
  100. package/dist/phases/PlanPhase.d.ts +14 -0
  101. package/dist/phases/PlanPhase.d.ts.map +1 -0
  102. package/dist/phases/VerifyPhase.d.ts +13 -0
  103. package/dist/phases/VerifyPhase.d.ts.map +1 -0
  104. package/dist/pipeline/PipelineDefinition.d.ts +40 -0
  105. package/dist/pipeline/PipelineDefinition.d.ts.map +1 -0
  106. package/dist/poller/IssuePoller.d.ts +26 -0
  107. package/dist/poller/IssuePoller.d.ts.map +1 -0
  108. package/dist/prompts/brainstorm-templates.d.ts +4 -0
  109. package/dist/prompts/brainstorm-templates.d.ts.map +1 -0
  110. package/dist/prompts/templates.d.ts +27 -0
  111. package/dist/prompts/templates.d.ts.map +1 -0
  112. package/dist/rules/RuleResolver.d.ts +13 -0
  113. package/dist/rules/RuleResolver.d.ts.map +1 -0
  114. package/dist/rules/index.d.ts +3 -0
  115. package/dist/rules/index.d.ts.map +1 -0
  116. package/dist/run.d.ts +2 -0
  117. package/dist/run.d.ts.map +1 -0
  118. package/dist/run.js +15 -0
  119. package/dist/run.js.map +1 -0
  120. package/dist/services/BrainstormService.d.ts +39 -0
  121. package/dist/services/BrainstormService.d.ts.map +1 -0
  122. package/dist/start-TVN4SS6E.js +25 -0
  123. package/dist/start-TVN4SS6E.js.map +1 -0
  124. package/dist/supplement/SupplementStore.d.ts +21 -0
  125. package/dist/supplement/SupplementStore.d.ts.map +1 -0
  126. package/dist/tracker/IssueState.d.ts +63 -0
  127. package/dist/tracker/IssueState.d.ts.map +1 -0
  128. package/dist/tracker/IssueTracker.d.ts +29 -0
  129. package/dist/tracker/IssueTracker.d.ts.map +1 -0
  130. package/dist/utils/AsyncMutex.d.ts +14 -0
  131. package/dist/utils/AsyncMutex.d.ts.map +1 -0
  132. package/dist/utils/MergeRequestHelper.d.ts +10 -0
  133. package/dist/utils/MergeRequestHelper.d.ts.map +1 -0
  134. package/dist/web/AgentLogStore.d.ts +22 -0
  135. package/dist/web/AgentLogStore.d.ts.map +1 -0
  136. package/dist/web/WebServer.d.ts +26 -0
  137. package/dist/web/WebServer.d.ts.map +1 -0
  138. package/dist/web/routes/api.d.ts +20 -0
  139. package/dist/web/routes/api.d.ts.map +1 -0
  140. package/dist/web/routes/brainstorm.d.ts +9 -0
  141. package/dist/web/routes/brainstorm.d.ts.map +1 -0
  142. package/dist/web/routes/setup.d.ts +8 -0
  143. package/dist/web/routes/setup.d.ts.map +1 -0
  144. package/dist/webhook/CommandExecutor.d.ts +45 -0
  145. package/dist/webhook/CommandExecutor.d.ts.map +1 -0
  146. package/dist/webhook/CommandParser.d.ts +24 -0
  147. package/dist/webhook/CommandParser.d.ts.map +1 -0
  148. package/dist/webhook/IntentRecognizer.d.ts +35 -0
  149. package/dist/webhook/IntentRecognizer.d.ts.map +1 -0
  150. package/dist/webhook/NoteDeduplicator.d.ts +18 -0
  151. package/dist/webhook/NoteDeduplicator.d.ts.map +1 -0
  152. package/dist/webhook/WebhookHandler.d.ts +30 -0
  153. package/dist/webhook/WebhookHandler.d.ts.map +1 -0
  154. package/dist/webhook/WebhookServer.d.ts +21 -0
  155. package/dist/webhook/WebhookServer.d.ts.map +1 -0
  156. package/dist/webhook/index.d.ts +12 -0
  157. package/dist/webhook/index.d.ts.map +1 -0
  158. package/package.json +82 -0
  159. package/src/web/frontend/dist/assets/index-CQdlU9PE.js +65 -0
  160. package/src/web/frontend/dist/assets/index-CgMEkyZJ.css +1 -0
  161. package/src/web/frontend/dist/index.html +13 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/supplement/SupplementStore.ts","../src/poller/IssuePoller.ts","../src/web/WebServer.ts","../src/web/routes/api.ts","../src/web/routes/brainstorm.ts","../src/webhook/WebhookServer.ts","../src/webhook/WebhookHandler.ts","../src/webhook/CommandParser.ts","../src/webhook/CommandExecutor.ts","../src/webhook/NoteDeduplicator.ts","../src/webhook/IntentRecognizer.ts","../src/web/AgentLogStore.ts","../src/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { logger as rootLogger } from '../logger.js';\n\nconst logger = rootLogger.child('SupplementStore');\n\nexport interface SupplementInfo {\n requirements: string;\n acceptanceCriteria: string;\n scope: string;\n constraints: string;\n references: string;\n freeText: string;\n tapdId: string;\n updatedAt: string;\n}\n\nexport class SupplementStore {\n private dir: string;\n\n constructor(dataDir: string) {\n this.dir = path.join(dataDir, 'supplements');\n }\n\n private filePath(issueIid: number): string {\n return path.join(this.dir, `${issueIid}.json`);\n }\n\n private ensureDir(): void {\n if (!fs.existsSync(this.dir)) {\n fs.mkdirSync(this.dir, { recursive: true });\n }\n }\n\n get(issueIid: number): SupplementInfo | null {\n const fp = this.filePath(issueIid);\n if (!fs.existsSync(fp)) return null;\n try {\n const raw = fs.readFileSync(fp, 'utf-8');\n return JSON.parse(raw) as SupplementInfo;\n } catch (err) {\n logger.error('Failed to read supplement', { issueIid, error: (err as Error).message });\n return null;\n }\n }\n\n save(issueIid: number, data: Omit<SupplementInfo, 'updatedAt'>): SupplementInfo {\n this.ensureDir();\n const info: SupplementInfo = {\n ...data,\n updatedAt: new Date().toISOString(),\n };\n fs.writeFileSync(this.filePath(issueIid), JSON.stringify(info, null, 2), 'utf-8');\n logger.info('Supplement saved', { issueIid });\n return info;\n }\n\n delete(issueIid: number): boolean {\n const fp = this.filePath(issueIid);\n if (!fs.existsSync(fp)) return false;\n try {\n fs.unlinkSync(fp);\n logger.info('Supplement deleted', { issueIid });\n return true;\n } catch {\n return false;\n }\n }\n\n toPromptText(issueIid: number): string {\n const info = this.get(issueIid);\n if (!info) return '';\n\n const sections: string[] = [];\n\n if (info.requirements.trim()) {\n sections.push(`### 补充需求说明\\n${info.requirements.trim()}`);\n }\n if (info.acceptanceCriteria.trim()) {\n sections.push(`### 验收标准\\n${info.acceptanceCriteria.trim()}`);\n }\n if (info.scope.trim()) {\n sections.push(`### 变更范围\\n${info.scope.trim()}`);\n }\n if (info.constraints.trim()) {\n sections.push(`### 约束条件\\n${info.constraints.trim()}`);\n }\n if (info.references.trim()) {\n sections.push(`### 参考链接\\n${info.references.trim()}`);\n }\n if (info.freeText.trim()) {\n sections.push(`### 其他补充\\n${info.freeText.trim()}`);\n }\n\n if (sections.length === 0) return '';\n return `## 补充信息\\n\\n${sections.join('\\n\\n')}`;\n }\n}\n","import { Config } from '../config.js';\nimport { GongfengClient, GongfengIssue } from '../clients/GongfengClient.js';\nimport { IssueTracker } from '../tracker/IssueTracker.js';\nimport { IssueRecord, IssueState } from '../tracker/IssueState.js';\nimport { PipelineOrchestrator } from '../orchestrator/PipelineOrchestrator.js';\nimport { eventBus } from '../events/EventBus.js';\nimport { logger as rootLogger } from '../logger.js';\nimport { t } from '../i18n/index.js';\n\nconst logger = rootLogger.child('IssuePoller');\n\nconst AUTO_FINISH_LABEL = 'auto-finish';\nconst AUTO_APPROVE_CHECK_INTERVAL_MS = 30_000;\n\nexport class IssuePoller {\n private config: Config;\n private gongfeng: GongfengClient;\n private tracker: IssueTracker;\n private orchestrator: PipelineOrchestrator;\n private discoveryTimer: ReturnType<typeof setInterval> | null = null;\n private driveTimer: ReturnType<typeof setInterval> | null = null;\n private activeIssues = new Set<number>();\n private lastAutoApproveCheckMs = 0;\n\n constructor(\n config: Config,\n gongfeng: GongfengClient,\n tracker: IssueTracker,\n orchestrator: PipelineOrchestrator,\n ) {\n this.config = config;\n this.gongfeng = gongfeng;\n this.tracker = tracker;\n this.orchestrator = orchestrator;\n }\n\n start(): void {\n const { discoveryIntervalMs, driveIntervalMs } = this.config.poll;\n logger.info('Issue poller starting', { discoveryIntervalMs, driveIntervalMs });\n\n this.discover();\n this.drive();\n\n this.discoveryTimer = setInterval(() => this.discover(), discoveryIntervalMs);\n this.driveTimer = setInterval(() => this.drive(), driveIntervalMs);\n }\n\n stop(): void {\n if (this.discoveryTimer) {\n clearInterval(this.discoveryTimer);\n this.discoveryTimer = null;\n }\n if (this.driveTimer) {\n clearInterval(this.driveTimer);\n this.driveTimer = null;\n }\n logger.info('Issue poller stopped');\n }\n\n getActiveIssueIids(): number[] {\n return [...this.activeIssues];\n }\n\n private async discover(): Promise<void> {\n try {\n logger.debug('Discovering new issues...');\n const issues = await this.gongfeng.listIssues('opened', AUTO_FINISH_LABEL);\n const newIssues = this.filterNewIssues(issues);\n\n if (newIssues.length === 0) {\n logger.debug('No new issues found');\n return;\n }\n\n logger.info('Discovered new issues', { count: newIssues.length });\n for (const issue of newIssues) {\n this.tracker.create({\n issueId: issue.id,\n issueIid: issue.iid,\n issueTitle: issue.title,\n state: IssueState.Pending,\n branchName: `${this.config.project.branchPrefix}-${issue.iid}`,\n });\n }\n } catch (err) {\n logger.error('Discovery cycle failed', { error: (err as Error).message });\n }\n }\n\n private drive(): void {\n this.maybeAutoApproveWaiting();\n\n const maxConcurrent = this.config.poll.maxConcurrent;\n const available = maxConcurrent - this.activeIssues.size;\n if (available <= 0) {\n logger.debug('Skipping drive — at concurrency limit', {\n active: this.activeIssues.size,\n max: maxConcurrent,\n });\n return;\n }\n\n const drivable = this.tracker\n .getDrivableIssues(this.config.poll.maxRetries)\n .filter((r) => !this.activeIssues.has(r.issueIid));\n\n if (drivable.length === 0) {\n return;\n }\n\n const batch = drivable.slice(0, available);\n logger.info('Driving issues', {\n batchSize: batch.length,\n active: this.activeIssues.size,\n max: maxConcurrent,\n });\n\n for (const record of batch) {\n this.activeIssues.add(record.issueIid);\n this.processInBackground(record);\n }\n }\n\n private maybeAutoApproveWaiting(): void {\n const autoLabels = this.config.review.autoApproveLabels;\n if (!autoLabels.length) return;\n\n const now = Date.now();\n if (now - this.lastAutoApproveCheckMs < AUTO_APPROVE_CHECK_INTERVAL_MS) return;\n this.lastAutoApproveCheckMs = now;\n\n const waiting = this.tracker\n .getAll()\n .filter((r) => r.state === IssueState.WaitingForReview);\n if (!waiting.length) return;\n\n this.autoApproveByLabels(waiting, autoLabels).catch((err) => {\n logger.warn('Auto-approve check failed', { error: (err as Error).message });\n });\n }\n\n private async autoApproveByLabels(\n records: IssueRecord[],\n autoLabels: string[],\n ): Promise<void> {\n for (const record of records) {\n try {\n const issue = await this.gongfeng.getIssueDetail(record.issueId);\n const matched = issue.labels.filter((l) => autoLabels.includes(l));\n if (matched.length === 0) continue;\n\n logger.info('Auto-approving waiting issue (label matched)', {\n iid: record.issueIid,\n matchedLabels: matched,\n });\n this.tracker.updateState(record.issueIid, IssueState.ReviewApproved);\n eventBus.emitTyped('review:approved', { issueIid: record.issueIid });\n\n try {\n await this.gongfeng.createIssueNote(\n record.issueId,\n t('poller.autoApproveComment', { labels: matched.join(', ') }),\n );\n } catch { /* ignore */ }\n } catch (err) {\n logger.warn('Failed to check auto-approve labels', {\n iid: record.issueIid,\n error: (err as Error).message,\n });\n }\n }\n }\n\n private async processInBackground(record: IssueRecord): Promise<void> {\n try {\n const issue = await this.resolveIssue(record.issueId);\n if (!issue) {\n logger.warn('Could not resolve issue from API, skipping', { iid: record.issueIid });\n return;\n }\n await this.orchestrator.processIssue(issue);\n } catch (err) {\n logger.error('Failed to process issue', {\n iid: record.issueIid,\n error: (err as Error).message,\n });\n } finally {\n this.activeIssues.delete(record.issueIid);\n }\n }\n\n private async resolveIssue(issueId: number): Promise<GongfengIssue | null> {\n try {\n return await this.gongfeng.getIssueDetail(issueId);\n } catch {\n return null;\n }\n }\n\n private filterNewIssues(issues: GongfengIssue[]): GongfengIssue[] {\n return issues.filter((issue) => {\n if (!issue.labels.includes(AUTO_FINISH_LABEL)) return false;\n if (issue.labels.some((l) => l === 'auto-finish:done')) return false;\n\n const record = this.tracker.get(issue.iid);\n if (record) return false;\n\n return true;\n });\n }\n}\n","import express from 'express';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { createApiRouter, ApiRouterDeps } from './routes/api.js';\nimport { createSetupRouter } from './routes/setup.js';\nimport { createBrainstormRouter } from './routes/brainstorm.js';\nimport { BrainstormService } from '../services/BrainstormService.js';\nimport { IssueTracker } from '../tracker/IssueTracker.js';\nimport { Config } from '../config.js';\nimport { AgentLogStore } from './AgentLogStore.js';\nimport { PipelineOrchestrator } from '../orchestrator/PipelineOrchestrator.js';\nimport { GitOperations } from '../git/GitOperations.js';\nimport { GongfengClient } from '../clients/GongfengClient.js';\nimport { SupplementStore } from '../supplement/SupplementStore.js';\nimport { logger as rootLogger } from '../logger.js';\nimport type { Server } from 'node:http';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst logger = rootLogger.child('WebServer');\n\nexport interface WebServerDeps {\n tracker: IssueTracker;\n config: Config;\n agentLogStore: AgentLogStore;\n orchestrator: PipelineOrchestrator;\n gongfeng: GongfengClient;\n supplementStore: SupplementStore;\n mainGit?: GitOperations;\n}\n\nexport class WebServer {\n private app: express.Application;\n private server: Server | null = null;\n private port: number;\n\n constructor(deps: WebServerDeps);\n constructor(tracker: IssueTracker, config: Config, agentLogStore: AgentLogStore, orchestrator: PipelineOrchestrator, mainGit?: GitOperations);\n constructor(\n trackerOrDeps: IssueTracker | WebServerDeps,\n config?: Config,\n agentLogStore?: AgentLogStore,\n orchestrator?: PipelineOrchestrator,\n mainGit?: GitOperations,\n ) {\n let apiDeps: ApiRouterDeps;\n\n if (trackerOrDeps instanceof IssueTracker) {\n this.port = config!.web.port;\n apiDeps = {\n tracker: trackerOrDeps,\n config: config!,\n agentLogStore: agentLogStore!,\n orchestrator: orchestrator!,\n mainGit,\n gongfeng: undefined as unknown as GongfengClient,\n supplementStore: undefined as unknown as SupplementStore,\n };\n } else {\n const deps = trackerOrDeps;\n this.port = deps.config.web.port;\n apiDeps = {\n tracker: deps.tracker,\n config: deps.config,\n agentLogStore: deps.agentLogStore,\n orchestrator: deps.orchestrator,\n mainGit: deps.mainGit,\n gongfeng: deps.gongfeng,\n supplementStore: deps.supplementStore,\n };\n }\n\n this.app = express();\n this.app.use(express.json());\n\n const setupRouter = createSetupRouter({ serviceMode: true });\n this.app.use(setupRouter);\n\n const apiRouter = createApiRouter(apiDeps);\n this.app.use(apiRouter);\n\n if (apiDeps.config.brainstorm.enabled) {\n const brainstormService = new BrainstormService(apiDeps.config);\n const brainstormRouter = createBrainstormRouter({\n brainstormService,\n gongfeng: apiDeps.gongfeng,\n });\n this.app.use(brainstormRouter);\n }\n\n const publicDir = apiDeps.config.web.frontendDistDir;\n this.app.use(express.static(publicDir));\n\n this.app.get('{*path}', (_req, res) => {\n res.sendFile(path.join(publicDir, 'index.html'));\n });\n }\n\n start(): Promise<void> {\n return new Promise((resolve) => {\n this.server = this.app.listen(this.port, () => {\n logger.info(`Web UI available at http://localhost:${this.port}`);\n resolve();\n });\n });\n }\n\n stop(): void {\n if (this.server) {\n this.server.close();\n this.server = null;\n logger.info('Web server stopped');\n }\n }\n}\n","import { Router, Request, Response } from 'express';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { marked } from 'marked';\nimport { IssueTracker } from '../../tracker/IssueTracker.js';\nimport { IssueState } from '../../tracker/IssueState.js';\nimport { Config } from '../../config.js';\nimport { AgentLogStore } from '../AgentLogStore.js';\nimport { PipelineOrchestrator } from '../../orchestrator/PipelineOrchestrator.js';\nimport { GitOperations } from '../../git/GitOperations.js';\nimport { GongfengClient } from '../../clients/GongfengClient.js';\nimport { SupplementStore } from '../../supplement/SupplementStore.js';\nimport { PlanPersistence } from '../../persistence/PlanPersistence.js';\nimport { getPipelineDef } from '../../pipeline/PipelineDefinition.js';\nimport type { PipelineDef } from '../../pipeline/PipelineDefinition.js';\nimport { eventBus, EventPayload } from '../../events/EventBus.js';\nimport {\n getNoteSyncEnabled, setNoteSyncOverride, isNoteSyncEnabledForIssue,\n} from '../../notesync/NoteSyncSettings.js';\nimport { getE2eEnabled, setE2eOverride } from '../../e2e/E2eSettings.js';\nimport { logger as rootLogger } from '../../logger.js';\nimport { t } from '../../i18n/index.js';\n\nconst logger = rootLogger.child('ApiRoutes');\n\nconst startTime = Date.now();\n\nexport interface ApiRouterDeps {\n tracker: IssueTracker;\n config: Config;\n agentLogStore: AgentLogStore;\n orchestrator: PipelineOrchestrator;\n gongfeng: GongfengClient;\n supplementStore: SupplementStore;\n mainGit?: GitOperations;\n}\n\nfunction buildPreviewInfo(iid: number, orch: PipelineOrchestrator) {\n const ports = orch.getPortAllocator().getPortsForIssue(iid);\n if (!ports) return null;\n const dsm = orch.getDevServerManager();\n const status = dsm.getStatus(iid);\n return {\n ...status,\n ports,\n previewUrl: orch.buildPreviewUrl(iid),\n host: orch.getPreviewHost(),\n };\n}\n\nexport function createApiRouter(deps: ApiRouterDeps): Router;\nexport function createApiRouter(tracker: IssueTracker, config: Config, agentLogStore: AgentLogStore, orchestrator: PipelineOrchestrator, mainGit?: GitOperations): Router;\nexport function createApiRouter(\n trackerOrDeps: IssueTracker | ApiRouterDeps,\n config?: Config,\n agentLogStore?: AgentLogStore,\n orchestrator?: PipelineOrchestrator,\n mainGit?: GitOperations,\n): Router {\n let tracker: IssueTracker;\n let cfg: Config;\n let logStore: AgentLogStore;\n let orch: PipelineOrchestrator;\n let git: GitOperations | undefined;\n let gongfeng: GongfengClient | undefined;\n let supplementStore: SupplementStore | undefined;\n\n if (config !== undefined) {\n tracker = trackerOrDeps as IssueTracker;\n cfg = config!;\n logStore = agentLogStore!;\n orch = orchestrator!;\n git = mainGit;\n } else {\n const deps = trackerOrDeps as ApiRouterDeps;\n tracker = deps.tracker;\n cfg = deps.config;\n logStore = deps.agentLogStore;\n orch = deps.orchestrator;\n git = deps.mainGit;\n gongfeng = deps.gongfeng;\n supplementStore = deps.supplementStore;\n }\n\n const router = Router();\n\n router.get('/api/issues', (_req: Request, res: Response) => {\n const issues = tracker.getAll();\n res.json(issues);\n });\n\n router.get('/api/issues/:iid', async (req: Request, res: Response) => {\n const iid = parseInt(req.params.iid, 10);\n const record = tracker.get(iid);\n if (!record) {\n res.status(404).json({ error: 'Issue not found' });\n return;\n }\n const progress = await readProgress(iid, cfg, tracker, git);\n const preview = buildPreviewInfo(iid, orch);\n res.json({ ...record, progress, preview });\n });\n\n function getIssuePipelineDef(iid: number): PipelineDef {\n const record = tracker.get(iid);\n const mode = record?.pipelineMode ?? orch.getPipelineDef().mode;\n return getPipelineDef(mode === 'plan-mode' ? 'plan-mode' : 'classic');\n }\n\n router.get('/api/issues/:iid/plans/:filename', async (req: Request, res: Response) => {\n const iid = parseInt(req.params.iid, 10);\n const filename = req.params.filename;\n const def = getIssuePipelineDef(iid);\n const allowed = [\n ...def.planFiles.map(f => f.filename),\n 'progress.json', 'issue-meta.json',\n ];\n if (!allowed.includes(filename)) {\n res.status(400).json({ error: 'Invalid filename' });\n return;\n }\n const content = await readPlanFile(iid, filename, cfg, tracker, git);\n if (content === null) {\n res.status(404).json({ error: 'Plan file not found' });\n return;\n }\n if (filename.endsWith('.json')) {\n res.json(JSON.parse(content));\n return;\n }\n if (req.query.format === 'html') {\n const html = await marked(content);\n res.type('html').send(html);\n return;\n }\n res.type('text/markdown').send(content);\n });\n\n router.post('/api/issues/:iid/retry', (req: Request, res: Response) => {\n const iid = parseInt(req.params.iid, 10);\n const ok = tracker.resetForRetry(iid);\n if (!ok) {\n res.status(400).json({ error: 'Issue is not in failed state or not found' });\n return;\n }\n res.json({ success: true, message: `Issue #${iid} reset for retry` });\n });\n\n router.post('/api/issues/:iid/cancel', (req: Request, res: Response) => {\n const iid = parseInt(req.params.iid, 10);\n const ok = tracker.delete(iid);\n if (!ok) {\n res.status(404).json({ error: 'Issue not found in tracker' });\n return;\n }\n res.json({ success: true, message: `Issue #${iid} removed from tracker` });\n });\n\n router.post('/api/issues/:iid/restart', async (req: Request, res: Response) => {\n const iid = parseInt(req.params.iid, 10);\n try {\n await orch.restartIssue(iid);\n res.json({ success: true, message: `Issue #${iid} restarted` });\n } catch (err) {\n const msg = (err as Error).message;\n logger.error('Restart failed', { iid, error: msg });\n res.status(400).json({ error: msg });\n }\n });\n\n router.post('/api/issues/:iid/retry-from-phase', (req: Request, res: Response) => {\n const iid = parseInt(req.params.iid, 10);\n const { phase } = req.body as { phase?: string };\n const def = getIssuePipelineDef(iid);\n const validPhases = def.phases.filter(p => p.kind === 'ai').map(p => p.name);\n if (!phase || !validPhases.includes(phase)) {\n res.status(400).json({ error: `Invalid phase. Must be one of: ${validPhases.join(', ')}` });\n return;\n }\n try {\n orch.retryFromPhase(iid, phase);\n res.json({ success: true, message: `Issue #${iid} reset to phase: ${phase}` });\n } catch (err) {\n const msg = (err as Error).message;\n logger.error('Retry-from-phase failed', { iid, phase, error: msg });\n res.status(400).json({ error: msg });\n }\n });\n\n router.put('/api/issues/:iid/plans/:filename', (req: Request, res: Response) => {\n const iid = parseInt(req.params.iid, 10);\n const filename = req.params.filename;\n const def = getIssuePipelineDef(iid);\n const editableFiles = def.planFiles.filter(f => f.editable).map(f => f.filename);\n if (!editableFiles.includes(filename)) {\n res.status(400).json({ error: `File not editable. Allowed: ${editableFiles.join(', ')}` });\n return;\n }\n const { content } = req.body as { content?: string };\n if (typeof content !== 'string') {\n res.status(400).json({ error: 'Request body must contain a \"content\" string field' });\n return;\n }\n const planDir = getWorktreePlanDir(iid, cfg);\n const filePath = path.join(planDir, filename);\n if (!fs.existsSync(planDir)) {\n res.status(404).json({ error: 'Plan directory not found (worktree may have been cleaned)' });\n return;\n }\n fs.writeFileSync(filePath, content, 'utf-8');\n logger.info('Plan file updated', { iid, filename });\n res.json({ success: true, message: `Plan file ${filename} saved` });\n });\n\n router.get('/api/issues/:iid/logs', (req: Request, res: Response) => {\n const iid = parseInt(req.params.iid, 10);\n const record = tracker.get(iid);\n if (!record) {\n res.status(404).json({ error: 'Issue not found' });\n return;\n }\n const logs = logStore.getLogs(iid);\n res.json(logs);\n });\n\n // --- Supplement endpoints ---\n\n router.get('/api/issues/:iid/supplement', (req: Request, res: Response) => {\n if (!supplementStore) {\n res.status(501).json({ error: 'Supplement store not available' });\n return;\n }\n const iid = parseInt(req.params.iid, 10);\n const info = supplementStore.get(iid);\n res.json(info);\n });\n\n router.put('/api/issues/:iid/supplement', (req: Request, res: Response) => {\n if (!supplementStore) {\n res.status(501).json({ error: 'Supplement store not available' });\n return;\n }\n const iid = parseInt(req.params.iid, 10);\n const body = req.body as Record<string, unknown>;\n const data = {\n requirements: String(body.requirements || ''),\n acceptanceCriteria: String(body.acceptanceCriteria || ''),\n scope: String(body.scope || ''),\n constraints: String(body.constraints || ''),\n references: String(body.references || ''),\n freeText: String(body.freeText || ''),\n tapdId: String(body.tapdId || ''),\n };\n const saved = supplementStore.save(iid, data);\n res.json({ success: true, data: saved });\n });\n\n // --- Gongfeng issue browsing ---\n\n router.get('/api/gongfeng/issues', async (req: Request, res: Response) => {\n if (!gongfeng) {\n res.status(501).json({ error: 'Gongfeng client not available' });\n return;\n }\n try {\n const search = (req.query.search as string) || '';\n const page = parseInt(req.query.page as string, 10) || 1;\n const perPage = parseInt(req.query.per_page as string, 10) || 20;\n\n const result = await gongfeng.listIssuesAdvanced({\n state: 'opened',\n search: search || undefined,\n page,\n perPage,\n });\n\n const trackedIids = new Set(tracker.getAll().map((r) => r.issueIid));\n\n res.json({\n issues: result.issues,\n total: result.total,\n trackedIids: Array.from(trackedIids),\n });\n } catch (err) {\n const msg = (err as Error).message;\n logger.error('Failed to fetch gongfeng issues', { error: msg });\n res.status(500).json({ error: msg });\n }\n });\n\n // --- Start processing an issue ---\n\n router.post('/api/issues/start', async (req: Request, res: Response) => {\n if (!gongfeng) {\n res.status(501).json({ error: 'Gongfeng client not available' });\n return;\n }\n const body = req.body as {\n issueId?: number;\n issueIid?: number;\n issueTitle?: string;\n supplement?: Record<string, string>;\n };\n if (!body.issueId || !body.issueIid || !body.issueTitle) {\n res.status(400).json({ error: 'issueId, issueIid, and issueTitle are required' });\n return;\n }\n\n const existing = tracker.get(body.issueIid);\n if (existing) {\n res.status(409).json({ error: `Issue #${body.issueIid} is already being tracked` });\n return;\n }\n\n try {\n await gongfeng.addLabel(body.issueId, 'auto-finish');\n } catch (err) {\n logger.warn('Failed to add auto-finish label', { error: (err as Error).message });\n }\n\n const branchName = `${cfg.project.branchPrefix}-${body.issueIid}`;\n const record = tracker.create({\n issueId: body.issueId,\n issueIid: body.issueIid,\n issueTitle: body.issueTitle,\n state: IssueState.Pending,\n branchName,\n });\n\n if (supplementStore && body.supplement) {\n supplementStore.save(body.issueIid, {\n requirements: String(body.supplement.requirements || ''),\n acceptanceCriteria: String(body.supplement.acceptanceCriteria || ''),\n scope: String(body.supplement.scope || ''),\n constraints: String(body.supplement.constraints || ''),\n references: String(body.supplement.references || ''),\n freeText: String(body.supplement.freeText || ''),\n tapdId: String(body.supplement.tapdId || ''),\n });\n }\n\n res.json({ success: true, record });\n });\n\n // --- Review Gate endpoints ---\n\n router.post('/api/issues/:iid/approve-plan', (req: Request, res: Response) => {\n const iid = parseInt(req.params.iid, 10);\n const record = tracker.get(iid);\n if (!record) {\n res.status(404).json({ error: 'Issue not found' });\n return;\n }\n if (record.state !== IssueState.WaitingForReview) {\n res.status(400).json({ error: `Issue is not waiting for review (current state: ${record.state})` });\n return;\n }\n tracker.updateState(iid, IssueState.ReviewApproved);\n const def = getIssuePipelineDef(iid);\n const reviewSpec = def.phases.find(p => p.kind === 'gate');\n if (reviewSpec) {\n const workDir = getWorktreeWorkDir(iid, cfg);\n const planPersistence = new PlanPersistence(workDir, iid);\n planPersistence.updatePhaseProgress(reviewSpec.name, 'completed');\n }\n eventBus.emitTyped('review:approved', { issueIid: iid });\n logger.info('Plan approved', { iid });\n res.json({ success: true, message: `Issue #${iid} plan approved, will resume on next drive cycle` });\n });\n\n router.post('/api/issues/:iid/reject-plan', (req: Request, res: Response) => {\n const iid = parseInt(req.params.iid, 10);\n const record = tracker.get(iid);\n if (!record) {\n res.status(404).json({ error: 'Issue not found' });\n return;\n }\n if (record.state !== IssueState.WaitingForReview) {\n res.status(400).json({ error: `Issue is not waiting for review (current state: ${record.state})` });\n return;\n }\n const { feedback } = req.body as { feedback?: string };\n if (!feedback || typeof feedback !== 'string') {\n res.status(400).json({ error: 'Feedback is required' });\n return;\n }\n const workDir = getWorktreeWorkDir(iid, cfg);\n if (fs.existsSync(workDir)) {\n const planPersistence = new PlanPersistence(workDir, iid);\n planPersistence.writeReviewFeedback(feedback);\n }\n tracker.updateState(iid, IssueState.BranchCreated);\n eventBus.emitTyped('review:rejected', { issueIid: iid, feedback });\n logger.info('Plan rejected', { iid, feedback: feedback.slice(0, 100) });\n\n if (gongfeng && isNoteSyncEnabledForIssue(iid, tracker, cfg)) {\n const baseUrl = cfg.issueNoteSync.webBaseUrl.replace(/\\/$/, '');\n const planFile = record.pipelineMode === 'plan-mode' ? '01-plan.md' : '02-design.md';\n const history = fs.existsSync(workDir)\n ? new PlanPersistence(workDir, iid).readReviewHistory()\n : [];\n const round = history.length;\n const note = [\n t('api.reviewFeedback', { round }),\n '',\n feedback,\n '',\n '---',\n t('api.viewPlan', { url: `${baseUrl}/doc/${iid}/${planFile}` }),\n t('api.viewDetail', { url: `${baseUrl}/?issue=${iid}` }),\n ].join('\\n');\n gongfeng.createIssueNote(record.issueId, note).catch((err) => {\n logger.warn('Failed to sync review feedback to issue', { error: (err as Error).message });\n });\n }\n\n res.json({ success: true, message: `Issue #${iid} plan rejected, will re-plan on next drive cycle` });\n });\n\n router.post('/api/issues/:iid/skip-review', (req: Request, res: Response) => {\n const iid = parseInt(req.params.iid, 10);\n const record = tracker.get(iid);\n if (!record) {\n res.status(404).json({ error: 'Issue not found' });\n return;\n }\n if (record.state !== IssueState.WaitingForReview) {\n res.status(400).json({ error: `Issue is not waiting for review (current state: ${record.state})` });\n return;\n }\n tracker.updateState(iid, IssueState.ReviewApproved);\n const def = getIssuePipelineDef(iid);\n const reviewSpec = def.phases.find(p => p.kind === 'gate');\n if (reviewSpec) {\n const workDir = getWorktreeWorkDir(iid, cfg);\n const planPersistence = new PlanPersistence(workDir, iid);\n planPersistence.updatePhaseProgress(reviewSpec.name, 'completed');\n }\n eventBus.emitTyped('review:approved', { issueIid: iid });\n logger.info('Review skipped', { iid });\n res.json({ success: true, message: `Issue #${iid} review skipped` });\n });\n\n router.get('/api/issues/:iid/review-history', (req: Request, res: Response) => {\n const iid = parseInt(req.params.iid, 10);\n const record = tracker.get(iid);\n if (!record) {\n res.status(404).json({ error: 'Issue not found' });\n return;\n }\n const workDir = getWorktreeWorkDir(iid, cfg);\n if (!fs.existsSync(workDir)) {\n res.json([]);\n return;\n }\n const planPersistence = new PlanPersistence(workDir, iid);\n res.json(planPersistence.readReviewHistory());\n });\n\n // --- Note Sync toggle endpoints ---\n\n router.put('/api/issues/:iid/note-sync', (req: Request, res: Response) => {\n const iid = parseInt(req.params.iid, 10);\n const record = tracker.get(iid);\n if (!record) {\n res.status(404).json({ error: 'Issue not found' });\n return;\n }\n const { enabled } = req.body as { enabled?: boolean | null };\n const value = enabled === null ? undefined : enabled;\n tracker.updateState(iid, record.state, { issueNoteSyncEnabled: value } as any);\n logger.info('Issue note-sync toggled', { iid, enabled: value });\n res.json({ success: true, issueNoteSyncEnabled: value ?? null });\n });\n\n router.put('/api/system/note-sync', (req: Request, res: Response) => {\n const { enabled } = req.body as { enabled?: boolean };\n if (typeof enabled !== 'boolean') {\n res.status(400).json({ error: 'enabled must be a boolean' });\n return;\n }\n setNoteSyncOverride(enabled);\n logger.info('System note-sync toggled', { enabled });\n res.json({ success: true, issueNoteSyncEnabled: enabled });\n });\n\n // --- Preview endpoints ---\n\n router.get('/api/issues/:iid/preview', (req: Request, res: Response) => {\n const iid = parseInt(req.params.iid, 10);\n const record = tracker.get(iid);\n if (!record) {\n res.status(404).json({ error: 'Issue not found' });\n return;\n }\n const preview = buildPreviewInfo(iid, orch);\n res.json(preview ?? { running: false });\n });\n\n router.post('/api/issues/:iid/stop-preview', (req: Request, res: Response) => {\n const iid = parseInt(req.params.iid, 10);\n const record = tracker.get(iid);\n if (!record) {\n res.status(404).json({ error: 'Issue not found' });\n return;\n }\n orch.stopPreviewServers(iid);\n res.json({ success: true, message: `Preview servers stopped for issue #${iid}` });\n });\n\n // --- E2E UI toggle endpoints ---\n\n router.put('/api/issues/:iid/e2e', (req: Request, res: Response) => {\n const iid = parseInt(req.params.iid, 10);\n const record = tracker.get(iid);\n if (!record) {\n res.status(404).json({ error: 'Issue not found' });\n return;\n }\n const { enabled } = req.body as { enabled?: boolean | null };\n const value = enabled === null ? undefined : enabled;\n tracker.updateState(iid, record.state, { e2eEnabled: value } as any);\n logger.info('Issue e2e toggled', { iid, enabled: value });\n res.json({ success: true, e2eEnabled: value ?? null });\n });\n\n router.put('/api/system/e2e', (req: Request, res: Response) => {\n const { enabled } = req.body as { enabled?: boolean };\n if (typeof enabled !== 'boolean') {\n res.status(400).json({ error: 'enabled must be a boolean' });\n return;\n }\n setE2eOverride(enabled);\n logger.info('System e2e toggled', { enabled });\n res.json({ success: true, e2eEnabled: enabled });\n });\n\n router.get('/api/system/status', (_req: Request, res: Response) => {\n const runningPreviews = orch.getDevServerManager().getRunningIssues();\n res.json({\n uptime: Date.now() - startTime,\n startedAt: new Date(startTime).toISOString(),\n config: {\n discoveryIntervalMs: cfg.poll.discoveryIntervalMs,\n driveIntervalMs: cfg.poll.driveIntervalMs,\n maxRetries: cfg.poll.maxRetries,\n aiMode: cfg.ai.mode,\n pipelineMode: orch.getPipelineDef().mode,\n baseBranch: cfg.project.baseBranch,\n projectPath: cfg.gongfeng.projectPath,\n gongfengBaseUrl: cfg.gongfeng.apiUrl.replace(/\\/$/, ''),\n issueNoteSyncEnabled: getNoteSyncEnabled(cfg),\n e2eEnabled: getE2eEnabled(cfg),\n previewEnabled: cfg.preview.enabled,\n locale: cfg.locale,\n },\n issues: {\n total: tracker.getAll().length,\n active: tracker.getAllActive().length,\n },\n preview: {\n runningCount: runningPreviews.length,\n runningIssues: runningPreviews,\n },\n });\n });\n\n router.get('/api/events', (req: Request, res: Response) => {\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.setHeader('X-Accel-Buffering', 'no');\n res.flushHeaders();\n\n const heartbeat = setInterval(() => {\n res.write(`event: heartbeat\\ndata: ${JSON.stringify({ time: new Date().toISOString() })}\\n\\n`);\n }, 15_000);\n\n const handler = (_eventName: string | symbol, payload: EventPayload) => {\n try {\n res.write(`event: ${payload.type}\\ndata: ${JSON.stringify(payload)}\\n\\n`);\n } catch {\n logger.warn('Failed to write SSE event');\n }\n };\n\n eventBus.on('*', handler);\n res.write(`event: connected\\ndata: ${JSON.stringify({ time: new Date().toISOString() })}\\n\\n`);\n\n req.on('close', () => {\n clearInterval(heartbeat);\n eventBus.off('*', handler);\n });\n });\n\n // --- Standalone document viewer (linked from issue notes) ---\n\n router.get('/doc/:iid/:filename', async (req: Request, res: Response) => {\n const iid = parseInt(req.params.iid, 10);\n const filename = req.params.filename;\n const record = tracker.get(iid);\n const title = record?.issueTitle ?? `Issue #${iid}`;\n\n const def = getIssuePipelineDef(iid);\n const allowed = def.planFiles.map(f => f.filename);\n if (!allowed.includes(filename)) {\n res.status(400).type('html').send(renderDocPage(iid, title, t('api.invalidFilename'), filename));\n return;\n }\n\n const content = await readPlanFile(iid, filename, cfg, tracker, git);\n if (content === null) {\n res.status(404).type('html').send(renderDocPage(iid, title, t('api.docNotGenerated'), filename));\n return;\n }\n\n const htmlBody = await marked(content);\n res.type('html').send(renderDocPage(iid, title, htmlBody, filename));\n });\n\n return router;\n}\n\nconst DOC_LABELS_FUNC = (filename: string): string => t(`docLabel.${filename}`) || filename;\n\nfunction renderDocPage(iid: number, issueTitle: string, htmlBody: string, filename: string): string {\n const docLabel = DOC_LABELS_FUNC(filename);\n return `<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Issue #${iid} — ${docLabel}</title>\n<style>\n body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica, Arial, sans-serif; margin: 0; padding: 0; color: #24292f; background: #f6f8fa; }\n .header { background: #fff; border-bottom: 1px solid #d0d7de; padding: 12px 24px; display: flex; align-items: center; gap: 12px; }\n .header .crumb { font-size: 14px; color: #57606a; }\n .header .crumb a { color: #0969da; text-decoration: none; }\n .header .crumb a:hover { text-decoration: underline; }\n .header .crumb .sep { margin: 0 4px; color: #8b949e; }\n .container { max-width: 900px; margin: 24px auto; background: #fff; border: 1px solid #d0d7de; border-radius: 6px; padding: 32px 40px; }\n .markdown-body h1 { font-size: 1.6em; border-bottom: 1px solid #d0d7de; padding-bottom: .3em; }\n .markdown-body h2 { font-size: 1.3em; border-bottom: 1px solid #d0d7de; padding-bottom: .3em; }\n .markdown-body h3 { font-size: 1.1em; }\n .markdown-body pre { background: #f6f8fa; border: 1px solid #d0d7de; border-radius: 6px; padding: 16px; overflow-x: auto; }\n .markdown-body code { background: #f6f8fa; border-radius: 3px; padding: 0.2em 0.4em; font-size: 85%; }\n .markdown-body pre code { background: none; padding: 0; }\n .markdown-body table { border-collapse: collapse; width: 100%; }\n .markdown-body th, .markdown-body td { border: 1px solid #d0d7de; padding: 6px 13px; }\n .markdown-body th { background: #f6f8fa; }\n .markdown-body blockquote { margin: 0; padding: 0 1em; color: #57606a; border-left: 3px solid #d0d7de; }\n .markdown-body ul, .markdown-body ol { padding-left: 2em; }\n .markdown-body li { margin-top: 0.25em; }\n .markdown-body p { margin: 8px 0; }\n .markdown-body a { color: #0969da; }\n</style>\n</head>\n<body>\n <div class=\"header\">\n <div class=\"crumb\">\n <a href=\"/?issue=${iid}\">Issue #${iid}</a>\n <span class=\"sep\">/</span>\n <strong>${docLabel}</strong>\n <span class=\"sep\">·</span>\n <span style=\"font-size:12px;color:#57606a\">${escapeHtml(issueTitle)}</span>\n <span class=\"sep\">·</span>\n <a href=\"/?issue=${iid}\" style=\"font-size:12px\">${t('api.viewInDashboard')}</a>\n </div>\n </div>\n <div class=\"container\">\n <div class=\"markdown-body\">${htmlBody}</div>\n </div>\n</body>\n</html>`;\n}\n\nfunction escapeHtml(text: string): string {\n return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\nfunction getWorktreeWorkDir(issueIid: number, config: Config): string {\n return path.join(\n config.project.worktreeBaseDir,\n `issue-${issueIid}`,\n config.project.projectSubDir,\n );\n}\n\nfunction getWorktreePlanDir(issueIid: number, config: Config): string {\n return path.join(getWorktreeWorkDir(issueIid, config), '.claude-plan', `issue-${issueIid}`);\n}\n\nfunction getPlanGitPath(issueIid: number, filename: string, config: Config): string {\n return path.posix.join(config.project.projectSubDir, '.claude-plan', `issue-${issueIid}`, filename);\n}\n\nasync function readPlanFileFromGit(\n issueIid: number,\n filename: string,\n config: Config,\n tracker: IssueTracker,\n mainGit?: GitOperations,\n): Promise<string | null> {\n if (!mainGit) return null;\n const record = tracker.get(issueIid);\n if (!record) return null;\n const gitPath = getPlanGitPath(issueIid, filename, config);\n return mainGit.showFile(record.branchName, gitPath);\n}\n\nconst VERIFY_REPORT_FALLBACKS: Record<string, string> = {\n '02-verify-report.md': '04-verify-report.md',\n};\n\nasync function readPlanFile(\n issueIid: number,\n filename: string,\n config: Config,\n tracker: IssueTracker,\n mainGit?: GitOperations,\n): Promise<string | null> {\n const planDir = getWorktreePlanDir(issueIid, config);\n const filePath = path.join(planDir, filename);\n if (fs.existsSync(filePath)) {\n try {\n return fs.readFileSync(filePath, 'utf-8');\n } catch {\n return null;\n }\n }\n const content = await readPlanFileFromGit(issueIid, filename, config, tracker, mainGit);\n if (content !== null) return content;\n\n const fallback = VERIFY_REPORT_FALLBACKS[filename];\n if (fallback) {\n return readPlanFile(issueIid, fallback, config, tracker, mainGit);\n }\n return null;\n}\n\nasync function readProgress(\n issueIid: number,\n config: Config,\n tracker: IssueTracker,\n mainGit?: GitOperations,\n): Promise<unknown | null> {\n const content = await readPlanFile(issueIid, 'progress.json', config, tracker, mainGit);\n if (!content) return null;\n try {\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n","import { Router, Request, Response } from 'express';\nimport { BrainstormService, type BrainstormStreamEvent } from '../../services/BrainstormService.js';\nimport { GongfengClient } from '../../clients/GongfengClient.js';\nimport { logger as rootLogger } from '../../logger.js';\n\nconst logger = rootLogger.child('BrainstormRoutes');\n\nexport interface BrainstormRouterDeps {\n brainstormService: BrainstormService;\n gongfeng: GongfengClient;\n}\n\nfunction sseWriter(res: Response) {\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.setHeader('X-Accel-Buffering', 'no');\n res.flushHeaders();\n\n return (event: BrainstormStreamEvent) => {\n try {\n res.write(`event: ${event.type}\\ndata: ${JSON.stringify(event)}\\n\\n`);\n } catch {\n logger.warn('Failed to write SSE brainstorm event');\n }\n };\n}\n\nexport function createBrainstormRouter(deps: BrainstormRouterDeps): Router {\n const router = Router();\n const { brainstormService, gongfeng } = deps;\n\n router.post('/api/brainstorm/sessions', (req: Request, res: Response) => {\n try {\n const { transcript } = req.body as { transcript?: string };\n if (!transcript?.trim()) {\n res.status(400).json({ error: 'transcript is required' });\n return;\n }\n const session = brainstormService.createSession(transcript.trim());\n res.json({ success: true, session });\n } catch (err) {\n logger.error('Failed to create brainstorm session', { error: (err as Error).message });\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n router.get('/api/brainstorm/sessions/:id', (req: Request, res: Response) => {\n const session = brainstormService.getSession(req.params.id);\n if (!session) {\n res.status(404).json({ error: 'Session not found' });\n return;\n }\n res.json({ success: true, session });\n });\n\n router.post('/api/brainstorm/sessions/:id/generate', async (req: Request, res: Response) => {\n const session = brainstormService.getSession(req.params.id);\n if (!session) {\n res.status(404).json({ error: 'Session not found' });\n return;\n }\n\n const write = sseWriter(res);\n try {\n await brainstormService.generate(req.params.id, write);\n res.write(`event: done\\ndata: ${JSON.stringify({ type: 'done' })}\\n\\n`);\n } catch (err) {\n write({ type: 'error', data: { message: (err as Error).message } });\n } finally {\n res.end();\n }\n });\n\n router.post('/api/brainstorm/sessions/:id/review', async (req: Request, res: Response) => {\n const session = brainstormService.getSession(req.params.id);\n if (!session) {\n res.status(404).json({ error: 'Session not found' });\n return;\n }\n\n const write = sseWriter(res);\n try {\n await brainstormService.review(req.params.id, write);\n res.write(`event: done\\ndata: ${JSON.stringify({ type: 'done' })}\\n\\n`);\n } catch (err) {\n write({ type: 'error', data: { message: (err as Error).message } });\n } finally {\n res.end();\n }\n });\n\n router.post('/api/brainstorm/sessions/:id/refine', async (req: Request, res: Response) => {\n const session = brainstormService.getSession(req.params.id);\n if (!session) {\n res.status(404).json({ error: 'Session not found' });\n return;\n }\n\n const write = sseWriter(res);\n try {\n await brainstormService.refine(req.params.id, write);\n res.write(`event: done\\ndata: ${JSON.stringify({ type: 'done' })}\\n\\n`);\n } catch (err) {\n write({ type: 'error', data: { message: (err as Error).message } });\n } finally {\n res.end();\n }\n });\n\n router.post('/api/brainstorm/sessions/:id/auto-refine', async (req: Request, res: Response) => {\n const session = brainstormService.getSession(req.params.id);\n if (!session) {\n res.status(404).json({ error: 'Session not found' });\n return;\n }\n\n const { rounds } = req.body as { rounds?: number };\n const write = sseWriter(res);\n try {\n await brainstormService.autoRefine(req.params.id, rounds, write);\n res.write(`event: done\\ndata: ${JSON.stringify({ type: 'done' })}\\n\\n`);\n } catch (err) {\n write({ type: 'error', data: { message: (err as Error).message } });\n } finally {\n res.end();\n }\n });\n\n router.post('/api/brainstorm/sessions/:id/create-issue', async (req: Request, res: Response) => {\n const session = brainstormService.getSession(req.params.id);\n if (!session) {\n res.status(404).json({ error: 'Session not found' });\n return;\n }\n if (!session.currentSdd) {\n res.status(400).json({ error: 'No SDD generated yet' });\n return;\n }\n\n try {\n const { title, addAutoFinishLabel } = req.body as {\n title?: string;\n addAutoFinishLabel?: boolean;\n };\n const issueTitle = title?.trim() || extractTitle(session.currentSdd);\n const labels = addAutoFinishLabel !== false ? ['auto-finish'] : [];\n const issue = await gongfeng.createIssue(issueTitle, session.currentSdd, labels);\n logger.info('Issue created from brainstorm', { issueIid: issue.iid, sessionId: session.id });\n res.json({ success: true, issue });\n } catch (err) {\n logger.error('Failed to create issue from brainstorm', { error: (err as Error).message });\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n return router;\n}\n\nfunction extractTitle(sdd: string): string {\n const firstLine = sdd.split('\\n').find(l => l.trim());\n if (firstLine) {\n return firstLine.replace(/^#+\\s*/, '').trim().slice(0, 200);\n }\n return '脑暴生成的需求';\n}\n","import express from 'express';\nimport { createWebhookRouter, WebhookHandlerDeps } from './WebhookHandler.js';\nimport { IntentRecognizer } from './IntentRecognizer.js';\nimport type { IssueTracker } from '../tracker/IssueTracker.js';\nimport type { PipelineOrchestrator } from '../orchestrator/PipelineOrchestrator.js';\nimport type { SupplementStore } from '../supplement/SupplementStore.js';\nimport type { GongfengClient } from '../clients/GongfengClient.js';\nimport type { Config } from '../config.js';\nimport { logger as rootLogger } from '../logger.js';\nimport type { Server } from 'node:http';\n\nconst logger = rootLogger.child('WebhookServer');\n\nexport interface WebhookServerDeps {\n tracker: IssueTracker;\n orchestrator: PipelineOrchestrator;\n supplementStore: SupplementStore;\n gongfeng: GongfengClient;\n config: Config;\n}\n\nexport class WebhookServer {\n private app: express.Application;\n private server: Server | null = null;\n private port: number;\n\n constructor(deps: WebhookServerDeps) {\n this.port = deps.config.webhook.port;\n\n // 使用 webhook.llmBinary(默认 claude-internal)而非 ai.binary,\n // 因为意图识别需要轻量级 CLI stdin/stdout 接口,cursor CLI 不支持此模式。\n // 详见 IntentRecognizer.ts 类注释。\n const intentRecognizer = deps.config.webhook.llmFallback\n ? new IntentRecognizer({\n binary: deps.config.webhook.llmBinary,\n nvmNodeVersion: deps.config.ai.nvmNodeVersion,\n model: deps.config.ai.model,\n })\n : undefined;\n\n const handlerDeps: WebhookHandlerDeps = {\n tracker: deps.tracker,\n orchestrator: deps.orchestrator,\n supplementStore: deps.supplementStore,\n gongfeng: deps.gongfeng,\n config: deps.config,\n intentRecognizer,\n };\n\n this.app = express();\n this.app.use(express.json());\n this.app.use(createWebhookRouter(handlerDeps));\n\n this.app.get('/health', (_req, res) => {\n res.json({ status: 'ok', service: 'webhook' });\n });\n }\n\n start(): Promise<void> {\n return new Promise((resolve) => {\n this.server = this.app.listen(this.port, () => {\n logger.info(`Webhook server listening on port ${this.port}`);\n resolve();\n });\n });\n }\n\n stop(): void {\n if (this.server) {\n this.server.close();\n this.server = null;\n logger.info('Webhook server stopped');\n }\n }\n}\n","import { Router, Request, Response } from 'express';\nimport { containsTrigger, extractCommandText, parseExact } from './CommandParser.js';\nimport { IntentRecognizer } from './IntentRecognizer.js';\nimport { CommandExecutor, CommandExecutorDeps } from './CommandExecutor.js';\nimport { NoteDeduplicator } from './NoteDeduplicator.js';\nimport type { Config } from '../config.js';\nimport { logger as rootLogger } from '../logger.js';\nimport { t } from '../i18n/index.js';\n\nconst logger = rootLogger.child('WebhookHandler');\n\nexport interface NoteEvent {\n object_kind: string;\n event_type?: string;\n user: { username: string; name: string; user_id?: number };\n object_attributes: {\n id: number;\n note: string;\n noteable_type: string;\n noteable_id: number | string;\n };\n issue?: {\n id: number | null;\n iid: number;\n title: string;\n };\n}\n\nexport interface WebhookHandlerDeps extends CommandExecutorDeps {\n config: Config;\n intentRecognizer?: IntentRecognizer;\n}\n\nexport function createWebhookRouter(deps: WebhookHandlerDeps): Router {\n const router = Router();\n const executor = new CommandExecutor(deps);\n const dedup = new NoteDeduplicator();\n const { config, intentRecognizer } = deps;\n\n const selfToken = config.gongfeng.privateToken;\n\n router.post('/webhook/gongfeng', async (req: Request, res: Response) => {\n if (!config.webhook.enabled) {\n res.status(403).json({ error: 'Webhook is disabled' });\n return;\n }\n\n if (config.webhook.secret) {\n const token = req.headers['x-gitlab-token'] as string | undefined;\n if (token !== config.webhook.secret) {\n logger.warn('Webhook token mismatch');\n res.status(401).json({ error: 'Invalid token' });\n return;\n }\n }\n\n const event = req.body as NoteEvent;\n\n if (!isNoteOnIssue(event)) {\n res.json({ ignored: true, reason: 'not a note on issue' });\n return;\n }\n\n const noteBody = event.object_attributes.note;\n if (!containsTrigger(noteBody)) {\n res.json({ ignored: true, reason: 'no @issue-auto trigger' });\n return;\n }\n\n if (isSelfNote(event, selfToken)) {\n res.json({ ignored: true, reason: 'self-posted note' });\n return;\n }\n\n const noteId = event.object_attributes.id;\n if (dedup.isDuplicate(noteId)) {\n logger.debug('Duplicate note, skipping', { noteId });\n res.json({ ignored: true, reason: 'duplicate' });\n return;\n }\n\n const issueIid = event.issue?.iid;\n const issueId = event.issue?.id;\n if (!issueIid) {\n res.status(400).json({ error: 'Missing issue iid in webhook payload' });\n return;\n }\n if (!issueId) {\n logger.info('Webhook received with null issue id (likely a test ping)', { issueIid });\n res.json({ accepted: true, noteId, issueIid, test: true });\n return;\n }\n\n res.json({ accepted: true, noteId, issueIid });\n\n processCommandAsync(\n noteBody, issueIid, issueId, executor, intentRecognizer, config,\n deps.tracker, deps.gongfeng,\n );\n });\n\n return router;\n}\n\nconst HELP_TEXT_FUNC = () => t('webhook.helpText');\n\nasync function processCommandAsync(\n noteBody: string,\n issueIid: number,\n issueId: number,\n executor: CommandExecutor,\n intentRecognizer: IntentRecognizer | undefined,\n config: Config,\n tracker: { get(iid: number): { state: string } | undefined },\n gongfeng: { createIssueNote(issueId: number, body: string): Promise<void> },\n): Promise<void> {\n try {\n const cmdText = extractCommandText(noteBody);\n if (!cmdText) return;\n\n let command = parseExact(cmdText);\n\n if (!command && intentRecognizer && config.webhook.llmFallback) {\n const record = tracker.get(issueIid);\n const state = record?.state;\n logger.info('Falling back to LLM intent recognition', { issueIid });\n command = await intentRecognizer.recognize(cmdText, state);\n }\n\n if (!command) {\n logger.info('Could not parse command from note', { issueIid, text: cmdText.slice(0, 100) });\n await gongfeng.createIssueNote(issueId, HELP_TEXT_FUNC()).catch((e) =>\n logger.warn('Failed to reply help text', { error: (e as Error).message }),\n );\n return;\n }\n\n await executor.execute(issueIid, issueId, command);\n } catch (err) {\n logger.error('Failed to process webhook command', {\n issueIid,\n error: (err as Error).message,\n });\n }\n}\n\nfunction isNoteOnIssue(event: NoteEvent): boolean {\n return (\n event.object_kind === 'note' &&\n event.object_attributes?.noteable_type?.toLowerCase() === 'issue' &&\n !!event.issue\n );\n}\n\n/**\n * Heuristic to avoid processing notes posted by the bot itself.\n * We check if the note author username matches the token owner.\n * This is imperfect but works for most setups.\n */\nfunction isSelfNote(_event: NoteEvent, _selfToken: string): boolean {\n // Gongfeng webhook payloads include user info but not a direct token mapping.\n // For now, we rely on the fact that bot-posted notes won't contain @issue-auto.\n // A more robust check can be added by comparing event.user.username against\n // a configured bot username (WEBHOOK_BOT_USERNAME env var).\n return false;\n}\n","export type CommandIntent =\n | 'retry'\n | 'retry-from'\n | 'supplement'\n | 'approve'\n | 'reject'\n | 'status'\n | 'restart'\n | 'preview'\n | 'stop-preview'\n | 'clean-notes';\n\nexport interface ParsedCommand {\n intent: CommandIntent;\n phase?: string;\n context?: string;\n feedback?: string;\n}\n\nconst TRIGGER = '@issue-auto';\n\nconst PHASE_ALIAS: Record<string, string> = {\n '分析': 'analysis', '需求分析': 'analysis',\n '设计': 'design', '系统设计': 'design',\n '实现': 'implement', '实施': 'implement', '编码': 'implement',\n '验证': 'verify', '测试': 'verify',\n '规划': 'plan', '构建': 'build',\n};\n\nfunction resolvePhase(raw: string): string {\n const lower = raw.toLowerCase();\n return PHASE_ALIAS[lower] ?? lower;\n}\n\nconst EXACT_PATTERNS: Array<{\n regex: RegExp;\n build: (match: RegExpMatchArray) => ParsedCommand;\n}> = [\n {\n regex: /retry-from\\s+(\\S+)/i,\n build: (m) => ({ intent: 'retry-from', phase: resolvePhase(m[1]) }),\n },\n {\n regex: /(?:从|回到)\\s*(\\S+?)\\s*(?:阶段)?(?:重[试来做新]|开始)/,\n build: (m) => ({ intent: 'retry-from', phase: resolvePhase(m[1]) }),\n },\n {\n regex: /retry\\b/i,\n build: () => ({ intent: 'retry' }),\n },\n {\n regex: /重试|再试/,\n build: () => ({ intent: 'retry' }),\n },\n {\n regex: /restart\\b/i,\n build: () => ({ intent: 'restart' }),\n },\n {\n regex: /(?:重新开始|从头(?:开始|来|做)|重做)/,\n build: () => ({ intent: 'restart' }),\n },\n {\n regex: /approve\\b/i,\n build: () => ({ intent: 'approve' }),\n },\n {\n regex: /(?:批准|通过|同意|LGTM)/i,\n build: () => ({ intent: 'approve' }),\n },\n {\n regex: /reject\\s+([\\s\\S]+)/i,\n build: (m) => ({ intent: 'reject', feedback: m[1].trim() }),\n },\n {\n regex: /(?:驳回|拒绝|打回)[::\\s]*([\\s\\S]+)/,\n build: (m) => ({ intent: 'reject', feedback: m[1].trim() }),\n },\n {\n regex: /supplement\\s+([\\s\\S]+)/i,\n build: (m) => ({ intent: 'supplement', context: m[1].trim() }),\n },\n {\n regex: /(?:补充)[::\\s]*([\\s\\S]+)/,\n build: (m) => ({ intent: 'supplement', context: m[1].trim() }),\n },\n {\n regex: /status\\b/i,\n build: () => ({ intent: 'status' }),\n },\n {\n regex: /(?:状态|什么状态|进度|查询)/,\n build: () => ({ intent: 'status' }),\n },\n {\n regex: /stop-preview\\b/i,\n build: () => ({ intent: 'stop-preview' }),\n },\n {\n regex: /(?:停止预览|关闭预览|停止体验)/,\n build: () => ({ intent: 'stop-preview' }),\n },\n {\n regex: /preview\\b/i,\n build: () => ({ intent: 'preview' }),\n },\n {\n regex: /(?:预览|体验|preview环境)/,\n build: () => ({ intent: 'preview' }),\n },\n {\n regex: /clean-notes\\b/i,\n build: () => ({ intent: 'clean-notes' }),\n },\n {\n regex: /(?:清理评论|清除评论|删除评论)/,\n build: () => ({ intent: 'clean-notes' }),\n },\n];\n\nexport function containsTrigger(text: string): boolean {\n return text.includes(TRIGGER);\n}\n\n/**\n * Extract the portion of text after the @issue-auto trigger.\n * Returns null if trigger is not found.\n */\nexport function extractCommandText(text: string): string | null {\n const idx = text.indexOf(TRIGGER);\n if (idx < 0) return null;\n return text.slice(idx + TRIGGER.length).trim();\n}\n\n/**\n * Try to parse an exact command from the text after the trigger.\n * Returns null if no pattern matches (caller should fall back to LLM).\n */\nexport function parseExact(commandText: string): ParsedCommand | null {\n for (const { regex, build } of EXACT_PATTERNS) {\n const match = commandText.match(regex);\n if (match) return build(match);\n }\n return null;\n}\n\n/**\n * Full parse pipeline: extract trigger text, then try exact match.\n * Returns null if trigger not found or no exact match.\n */\nexport function parseCommand(fullText: string): ParsedCommand | null {\n const commandText = extractCommandText(fullText);\n if (commandText === null) return null;\n return parseExact(commandText);\n}\n","import type { ParsedCommand } from './CommandParser.js';\nimport type { IssueTracker } from '../tracker/IssueTracker.js';\nimport type { PipelineOrchestrator } from '../orchestrator/PipelineOrchestrator.js';\nimport type { SupplementStore } from '../supplement/SupplementStore.js';\nimport type { GongfengClient } from '../clients/GongfengClient.js';\nimport type { Config } from '../config.js';\nimport { IssueState } from '../tracker/IssueState.js';\nimport { getPipelineDef, collectStateLabels } from '../pipeline/PipelineDefinition.js';\nimport { PlanPersistence } from '../persistence/PlanPersistence.js';\nimport { eventBus } from '../events/EventBus.js';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport { logger as rootLogger } from '../logger.js';\nimport { t } from '../i18n/index.js';\n\nconst logger = rootLogger.child('CommandExecutor');\n\nexport interface CommandExecutorDeps {\n tracker: IssueTracker;\n orchestrator: PipelineOrchestrator;\n supplementStore: SupplementStore;\n gongfeng: GongfengClient;\n config: Config;\n}\n\nexport interface ExecutionResult {\n success: boolean;\n message: string;\n}\n\nexport class CommandExecutor {\n private tracker: IssueTracker;\n private orchestrator: PipelineOrchestrator;\n private supplementStore: SupplementStore;\n private gongfeng: GongfengClient;\n private config: Config;\n\n constructor(deps: CommandExecutorDeps) {\n this.tracker = deps.tracker;\n this.orchestrator = deps.orchestrator;\n this.supplementStore = deps.supplementStore;\n this.gongfeng = deps.gongfeng;\n this.config = deps.config;\n }\n\n async execute(\n issueIid: number,\n issueId: number,\n command: ParsedCommand,\n ): Promise<ExecutionResult> {\n logger.info('Executing webhook command', { issueIid, command });\n\n let result: ExecutionResult;\n try {\n result = await this.dispatch(issueIid, command);\n } catch (err) {\n const msg = (err as Error).message;\n logger.error('Webhook command failed', { issueIid, error: msg });\n result = { success: false, message: msg };\n }\n\n await this.replyToIssue(issueId, result);\n return result;\n }\n\n private async dispatch(iid: number, cmd: ParsedCommand): Promise<ExecutionResult> {\n switch (cmd.intent) {\n case 'retry': return this.handleRetry(iid);\n case 'retry-from': return this.handleRetryFrom(iid, cmd.phase, cmd.context);\n case 'supplement': return this.handleSupplement(iid, cmd.context);\n case 'approve': return this.handleApprove(iid);\n case 'reject': return this.handleReject(iid, cmd.feedback);\n case 'status': return this.handleStatus(iid);\n case 'restart': return this.handleRestart(iid);\n case 'preview': return this.handlePreview(iid);\n case 'stop-preview': return this.handleStopPreview(iid);\n case 'clean-notes': return this.handleCleanNotes(iid);\n default: return { success: false, message: 'Unknown command' };\n }\n }\n\n private handleRetry(iid: number): ExecutionResult {\n const record = this.tracker.get(iid);\n if (!record) return this.notTracked(iid);\n if (record.state !== IssueState.Failed) {\n return this.fail(`Issue not in failed state (current: ${record.state})`);\n }\n const ok = this.tracker.resetForRetry(iid);\n if (!ok) return this.fail('Reset for retry failed');\n return this.ok(`Issue #${iid} has been reset and will retry on the next drive cycle.`);\n }\n\n private handleRetryFrom(iid: number, phase?: string, ctx?: string): ExecutionResult {\n if (!phase) return this.fail('Phase is required for retry-from (e.g. design, implement)');\n if (ctx) this.saveSupplement(iid, ctx);\n\n try {\n this.orchestrator.retryFromPhase(iid, phase);\n } catch (err) {\n return this.fail((err as Error).message);\n }\n\n const extra = ctx ? '\\nSupplement info recorded.' : '';\n return this.ok(`Issue #${iid} will restart from **${phase}** phase.${extra}`);\n }\n\n private handleSupplement(iid: number, ctx?: string): ExecutionResult {\n if (!ctx?.trim()) return this.fail('Supplement content cannot be empty');\n this.saveSupplement(iid, ctx);\n return this.ok('Supplement info recorded. AI will reference it on next execution.');\n }\n\n private handleApprove(iid: number): ExecutionResult {\n const record = this.tracker.get(iid);\n if (!record) return this.notTracked(iid);\n if (record.state !== IssueState.WaitingForReview) {\n return this.fail(`Issue not waiting for review (current: ${record.state})`);\n }\n\n this.tracker.updateState(iid, IssueState.ReviewApproved);\n const def = this.getIssuePipelineDef(record);\n const gate = def.phases.find((p) => p.kind === 'gate');\n if (gate) {\n const workDir = this.getWorktreeWorkDir(iid);\n if (fs.existsSync(workDir)) {\n new PlanPersistence(workDir, iid).updatePhaseProgress(gate.name, 'completed');\n }\n }\n eventBus.emitTyped('review:approved', { issueIid: iid });\n return this.ok('Plan approved. Continuing to next phases.');\n }\n\n private handleReject(iid: number, feedback?: string): ExecutionResult {\n const record = this.tracker.get(iid);\n if (!record) return this.notTracked(iid);\n if (record.state !== IssueState.WaitingForReview) {\n return this.fail(`Issue not waiting for review (current: ${record.state})`);\n }\n if (!feedback?.trim()) return this.fail('Feedback is required when rejecting');\n\n const workDir = this.getWorktreeWorkDir(iid);\n if (fs.existsSync(workDir)) {\n new PlanPersistence(workDir, iid).writeReviewFeedback(feedback);\n }\n this.tracker.updateState(iid, IssueState.BranchCreated);\n eventBus.emitTyped('review:rejected', { issueIid: iid, feedback });\n return this.ok('Plan rejected. Will re-plan based on feedback.');\n }\n\n private handleStatus(iid: number): ExecutionResult {\n const record = this.tracker.get(iid);\n if (!record) return this.notTracked(iid);\n\n const def = this.getIssuePipelineDef(record);\n const labels = collectStateLabels(def);\n const stateLabel = labels.get(record.state) ?? record.state;\n\n const lines = [\n `**Issue #${iid} Status**`,\n '',\n `- State: **${stateLabel}**`,\n `- Branch: \\`${record.branchName}\\``,\n `- Attempts: ${record.attempts}`,\n `- Pipeline: ${record.pipelineMode ?? 'N/A'}`,\n ];\n if (record.lastError) lines.push(`- Last error: ${record.lastError.slice(0, 200)}`);\n if (record.mrUrl) lines.push(`- MR: ${record.mrUrl}`);\n\n const previewUrl = this.orchestrator.buildPreviewUrl(iid);\n if (previewUrl) {\n const dsm = this.orchestrator.getDevServerManager();\n const status = dsm.getStatus(iid);\n lines.push(`- Preview: ${status.running ? `🌐 ${previewUrl}` : t('cmd.previewStopped')}`);\n }\n\n const baseUrl = this.config.issueNoteSync.webBaseUrl.replace(/\\/$/, '');\n lines.push('', `[View in dashboard](${baseUrl}/?issue=${iid})`);\n return this.ok(lines.join('\\n'));\n }\n\n private async handleRestart(iid: number): Promise<ExecutionResult> {\n try {\n await this.orchestrator.restartIssue(iid);\n } catch (err) {\n return this.fail((err as Error).message);\n }\n return this.ok(`Issue #${iid} has been fully reset and will restart from scratch.`);\n }\n\n private handlePreview(iid: number): ExecutionResult {\n const record = this.tracker.get(iid);\n if (!record) return this.notTracked(iid);\n\n const previewUrl = this.orchestrator.buildPreviewUrl(iid);\n if (!previewUrl) {\n return this.ok(\n t('cmd.previewNotStarted', { iid }),\n );\n }\n\n const dsm = this.orchestrator.getDevServerManager();\n const status = dsm.getStatus(iid);\n const ports = this.orchestrator.getPortAllocator().getPortsForIssue(iid);\n const host = this.orchestrator.getPreviewHost();\n\n const lines = [\n '🌐 **Preview Environment**',\n '',\n `| ${t('cmd.previewTable.component')} | ${t('cmd.previewTable.address')} |`,\n `|------|------|`,\n `| ${t('cmd.previewTable.frontend')} | ${previewUrl} |`,\n `| ${t('cmd.previewTable.backendApi')} | http://${host}:${ports!.backendPort}/api |`,\n '',\n `${t('cmd.previewTable.status')}: ${status.running ? t('cmd.previewRunning') : t('cmd.previewStopped')}`,\n ];\n if (status.startedAt) lines.push(`${t('cmd.previewTable.startedAt')}: ${status.startedAt}`);\n\n return this.ok(lines.join('\\n'));\n }\n\n private handleStopPreview(iid: number): ExecutionResult {\n const record = this.tracker.get(iid);\n if (!record) return this.notTracked(iid);\n\n const dsm = this.orchestrator.getDevServerManager();\n const status = dsm.getStatus(iid);\n if (!status.running) {\n return this.ok(t('cmd.noPreview', { iid }));\n }\n\n this.orchestrator.stopPreviewServers(iid);\n return this.ok(t('cmd.previewStoppedMsg', { iid }));\n }\n\n private async handleCleanNotes(iid: number): Promise<ExecutionResult> {\n const record = this.tracker.get(iid);\n if (!record) return this.notTracked(iid);\n\n try {\n const deleted = await this.gongfeng.cleanupAgentNotes(record.issueId);\n return this.ok(t('cmd.cleanNotesSuccess', { count: deleted }));\n } catch (err) {\n return this.fail((err as Error).message);\n }\n }\n\n private saveSupplement(iid: number, context: string): void {\n const existing = this.supplementStore.get(iid);\n const prev = existing?.freeText?.trim() ?? '';\n const merged = prev ? `${prev}\\n\\n---\\n${context}` : context;\n this.supplementStore.save(iid, {\n requirements: existing?.requirements ?? '',\n acceptanceCriteria: existing?.acceptanceCriteria ?? '',\n scope: existing?.scope ?? '',\n constraints: existing?.constraints ?? '',\n references: existing?.references ?? '',\n freeText: merged,\n tapdId: existing?.tapdId ?? '',\n });\n }\n\n private async replyToIssue(issueId: number, result: ExecutionResult): Promise<void> {\n try {\n const prefix = result.success ? '' : '> **Failed**\\n>\\n> ';\n await this.gongfeng.createIssueNote(issueId, `${prefix}${result.message}`);\n } catch (err) {\n logger.warn('Failed to reply', { issueId, error: (err as Error).message });\n }\n }\n\n private ok(message: string): ExecutionResult {\n return { success: true, message };\n }\n\n private fail(message: string): ExecutionResult {\n return { success: false, message };\n }\n\n private notTracked(iid: number): ExecutionResult {\n return this.fail(`Issue #${iid} is not tracked. Add the auto-finish label to start.`);\n }\n\n private getIssuePipelineDef(record: { pipelineMode?: string }) {\n const mode = record.pipelineMode === 'plan-mode' ? 'plan-mode' : 'classic';\n return getPipelineDef(mode);\n }\n\n private getWorktreeWorkDir(iid: number): string {\n return path.join(\n this.config.project.worktreeBaseDir,\n `issue-${iid}`,\n this.config.project.projectSubDir,\n );\n }\n}\n","/**\n * LRU-based deduplication for webhook note IDs.\n * Prevents the same note from being processed twice\n * (e.g. due to webhook retries or duplicate deliveries).\n */\nexport class NoteDeduplicator {\n private seen: Map<number, number>;\n private maxSize: number;\n\n constructor(maxSize: number = 1000) {\n this.seen = new Map();\n this.maxSize = maxSize;\n }\n\n /**\n * Returns true if this noteId has already been processed.\n * If not, marks it as processed and returns false.\n */\n isDuplicate(noteId: number): boolean {\n if (this.seen.has(noteId)) return true;\n this.seen.set(noteId, Date.now());\n this.evictIfNeeded();\n return false;\n }\n\n get size(): number {\n return this.seen.size;\n }\n\n private evictIfNeeded(): void {\n if (this.seen.size <= this.maxSize) return;\n const oldest = this.seen.keys().next().value;\n if (oldest !== undefined) {\n this.seen.delete(oldest);\n }\n }\n}\n","import { spawn } from 'node:child_process';\nimport type { ParsedCommand, CommandIntent } from './CommandParser.js';\nimport { logger as rootLogger } from '../logger.js';\nimport { t } from '../i18n/index.js';\n\nconst logger = rootLogger.child('IntentRecognizer');\n\nconst VALID_INTENTS: CommandIntent[] = [\n 'retry', 'retry-from', 'supplement', 'approve', 'reject', 'status', 'restart',\n];\n\nconst VALID_PHASES = [\n 'analysis', 'design', 'implement', 'verify', 'plan', 'build',\n];\n\nconst SYSTEM_PROMPT_FUNC = () => t('intent.systemPrompt');\n\nexport interface IntentRecognizerConfig {\n binary: string;\n nvmNodeVersion: string;\n model?: string;\n timeoutMs?: number;\n}\n\n/**\n * 通过 LLM 将自然语言评论解析为结构化指令。\n *\n * **为什么默认使用 claude-internal / codebuddy 而非跟随 AI_RUNNER_MODE?**\n *\n * - `cursor` CLI 不支持 `-p`(stdin prompt)、`--output-format`、`--model` 等参数,\n * 且需要连接 VS Code Server,无法在 PM2 无头进程中运行。\n * - `cursor-agent` 是面向多步骤编码任务的完整 IDE agent,对简单的意图分类来说过重。\n * - `claude-internal` 和 `codebuddy` 都提供轻量级 CLI 接口,支持 stdin 传入 prompt\n * 并返回纯文本,适合在后台服务中做短文本意图识别。\n *\n * 因此 `WEBHOOK_LLM_BINARY` 配置独立于 `AI_RUNNER_MODE`,默认值为 `claude-internal`。\n *\n * @see WebhookServer.ts — 构造 IntentRecognizer 时使用 config.webhook.llmBinary\n * @see config.ts — WEBHOOK_LLM_BINARY 环境变量定义\n */\nexport class IntentRecognizer {\n private binary: string;\n private nvmNodeVersion: string;\n private model?: string;\n private timeoutMs: number;\n\n constructor(config: IntentRecognizerConfig) {\n this.binary = config.binary;\n this.nvmNodeVersion = config.nvmNodeVersion;\n this.model = config.model;\n this.timeoutMs = config.timeoutMs ?? 30_000;\n }\n\n async recognize(userComment: string, issueState?: string): Promise<ParsedCommand | null> {\n const stateHint = issueState ? `\\n当前 Issue 状态: ${issueState}` : '';\n const userPrompt = `${SYSTEM_PROMPT_FUNC()}\\n\\n用户评论:${stateHint}\\n${userComment}`;\n\n try {\n const rawOutput = await this.runLLM(userPrompt);\n return this.parseResponse(rawOutput);\n } catch (err) {\n logger.error('Intent recognition failed', { error: (err as Error).message });\n return null;\n }\n }\n\n /** Visible for testing */\n parseResponse(raw: string): ParsedCommand | null {\n const jsonMatch = raw.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n logger.warn('No JSON found in LLM response', { raw: raw.slice(0, 200) });\n return null;\n }\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(jsonMatch[0]);\n } catch {\n logger.warn('Failed to parse JSON from LLM', { raw: jsonMatch[0].slice(0, 200) });\n return null;\n }\n\n if (parsed.intent === null || parsed.intent === 'null') return null;\n\n const intent = String(parsed.intent) as CommandIntent;\n if (!VALID_INTENTS.includes(intent)) {\n logger.warn('Invalid intent from LLM', { intent });\n return null;\n }\n\n const result: ParsedCommand = { intent };\n\n if (parsed.phase && parsed.phase !== 'null') {\n const phase = String(parsed.phase).toLowerCase();\n if (VALID_PHASES.includes(phase)) {\n result.phase = phase;\n }\n }\n\n if (parsed.context && parsed.context !== 'null') {\n result.context = String(parsed.context).trim();\n }\n\n if (parsed.feedback && parsed.feedback !== 'null') {\n result.feedback = String(parsed.feedback).trim();\n }\n\n return result;\n }\n\n private runLLM(prompt: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const args = ['-p', '-', '--output-format', 'text', '--verbose'];\n if (this.model) args.push('--model', this.model);\n\n const { CLAUDECODE, ...env } = process.env;\n const child = spawn(this.binary, args, {\n env: { ...env, NODE_VERSION: this.nvmNodeVersion },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let stdout = '';\n let stderr = '';\n\n child.stdout.on('data', (d) => { stdout += d.toString(); });\n child.stderr.on('data', (d) => { stderr += d.toString(); });\n\n const timer = setTimeout(() => {\n child.kill('SIGTERM');\n reject(new Error(`Intent recognition timed out after ${this.timeoutMs}ms`));\n }, this.timeoutMs);\n\n child.on('close', (code) => {\n clearTimeout(timer);\n if (code !== 0) {\n logger.warn('LLM process exited with non-zero code', { code, stderr: stderr.slice(0, 300) });\n }\n resolve(stdout);\n });\n\n child.on('error', (err) => {\n clearTimeout(timer);\n reject(err);\n });\n\n child.stdin.write(prompt);\n child.stdin.end();\n });\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { eventBus, EventPayload } from '../events/EventBus.js';\nimport { logger as rootLogger } from '../logger.js';\n\nconst logger = rootLogger.child('AgentLogStore');\n\nexport interface AgentLogEntry {\n type: string;\n phase?: string;\n timestamp: string;\n summary: string;\n}\n\nconst MAX_LOGS_PER_ISSUE = 20000;\n\nconst DEBUG_EVENT_TYPES = new Set([\n 'thinking', 'content_block_start', 'content_block_delta',\n 'content_block_stop', 'message_start', 'message_delta',\n 'message_stop', 'ping',\n]);\n\nexport class AgentLogStore {\n private logDir: string;\n\n constructor(dataDir: string) {\n this.logDir = path.join(dataDir, 'agent-logs');\n if (!fs.existsSync(this.logDir)) {\n fs.mkdirSync(this.logDir, { recursive: true });\n }\n }\n\n public startListening(): void {\n eventBus.on('agent:output', (payload: EventPayload) => {\n this.handleAgentOutput(payload);\n });\n\n eventBus.on('pipeline:progress', (payload: EventPayload) => {\n this.handlePipelineProgress(payload);\n });\n\n logger.info('AgentLogStore listening for events');\n }\n\n public getLogs(issueIid: number): AgentLogEntry[] {\n const filePath = this.logFilePath(issueIid);\n if (!fs.existsSync(filePath)) return [];\n\n try {\n const raw = fs.readFileSync(filePath, 'utf-8').trim();\n if (!raw) return [];\n return raw.split('\\n').map(line => JSON.parse(line) as AgentLogEntry);\n } catch (err) {\n logger.warn('Failed to read agent logs', { issueIid, error: (err as Error).message });\n return [];\n }\n }\n\n public clearLogs(issueIid: number): void {\n const filePath = this.logFilePath(issueIid);\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n }\n\n private logFilePath(issueIid: number): string {\n return path.join(this.logDir, `${issueIid}.jsonl`);\n }\n\n private appendLog(issueIid: number, entry: AgentLogEntry): void {\n const filePath = this.logFilePath(issueIid);\n try {\n fs.appendFileSync(filePath, `${JSON.stringify(entry)}\\n`, 'utf-8');\n this.trimIfNeeded(issueIid, filePath);\n } catch (err) {\n logger.warn('Failed to write agent log', { issueIid, error: (err as Error).message });\n }\n }\n\n private trimIfNeeded(issueIid: number, filePath: string): void {\n try {\n const raw = fs.readFileSync(filePath, 'utf-8').trim();\n if (!raw) return;\n const lines = raw.split('\\n');\n if (lines.length > MAX_LOGS_PER_ISSUE) {\n const trimmed = lines.slice(-MAX_LOGS_PER_ISSUE);\n fs.writeFileSync(filePath, `${trimmed.join('\\n')}\\n`, 'utf-8');\n logger.info('Agent logs trimmed', { issueIid, from: lines.length, to: trimmed.length });\n }\n } catch {\n // best-effort trimming\n }\n }\n\n private handleAgentOutput(payload: EventPayload): void {\n const d = payload.data as { issueIid?: number; phase?: string; event?: { type?: string; content?: unknown; timestamp?: string } };\n if (!d?.issueIid || !d.event) return;\n\n const eventType = d.event.type || 'raw';\n if (DEBUG_EVENT_TYPES.has(eventType)) return;\n\n const entry: AgentLogEntry = {\n type: eventType,\n phase: d.phase,\n timestamp: d.event.timestamp || payload.timestamp,\n summary: this.summarizeContent(d.event),\n };\n this.appendLog(d.issueIid, entry);\n }\n\n private handlePipelineProgress(payload: EventPayload): void {\n const d = payload.data as { issueIid?: number; step?: string; message?: string };\n if (!d?.issueIid) return;\n\n const entry: AgentLogEntry = {\n type: 'system',\n phase: d.step,\n timestamp: payload.timestamp,\n summary: d.message || '',\n };\n this.appendLog(d.issueIid, entry);\n }\n\n private summarizeContent(event: { type?: string; content?: unknown; timestamp?: string }): string {\n const { content } = event;\n if (!content || typeof content === 'string') return String(content || '');\n\n if (event.type === 'assistant') {\n return this.extractAssistantText(content);\n }\n if (event.type === 'tool_use') {\n return this.extractToolUseText(content);\n }\n if (event.type === 'tool_result') {\n const text = typeof (content as Record<string, unknown>).content === 'string'\n ? (content as Record<string, unknown>).content as string\n : JSON.stringify((content as Record<string, unknown>).content || '');\n return text.slice(0, 150);\n }\n if (event.type === 'result') {\n const r = content as Record<string, unknown>;\n return ((r.result as string) || JSON.stringify(content)).slice(0, 200);\n }\n\n return JSON.stringify(content).slice(0, 150);\n }\n\n private extractAssistantText(content: unknown): string {\n const msg = (content as Record<string, unknown>).message || content;\n if (typeof msg === 'string') return msg.slice(0, 200);\n const m = msg as Record<string, unknown>;\n if (m.text) return (m.text as string).slice(0, 200);\n if (m.content) {\n const parts = Array.isArray(m.content) ? m.content : [m.content];\n const texts = parts\n .filter((c: Record<string, unknown>) => c.type === 'text')\n .map((c: Record<string, unknown>) => c.text)\n .join(' ');\n return texts.slice(0, 200) || JSON.stringify(content).slice(0, 150);\n }\n return JSON.stringify(content).slice(0, 150);\n }\n\n private extractToolUseText(content: unknown): string {\n const c = content as Record<string, unknown>;\n const tool = c.tool as Record<string, unknown> | undefined;\n const name = tool?.name || c.name || '?';\n const input = (tool?.input || c.input || {}) as Record<string, unknown>;\n const detail = input.path || input.command || input.file_path || '';\n return name + (detail ? `: ${detail}` : '');\n }\n}\n","import { loadConfig } from './config.js';\nimport { setLocale } from './i18n/index.js';\nimport { logger } from './logger.js';\nimport { GongfengClient } from './clients/GongfengClient.js';\nimport { GitOperations } from './git/GitOperations.js';\nimport { createAIRunner } from './ai-runner/index.js';\nimport { IssueTracker } from './tracker/IssueTracker.js';\nimport { SupplementStore } from './supplement/SupplementStore.js';\nimport { PipelineOrchestrator } from './orchestrator/PipelineOrchestrator.js';\nimport { validatePhaseRegistry } from './phases/PhaseFactory.js';\nimport { CLASSIC_PIPELINE, PLAN_MODE_PIPELINE } from './pipeline/PipelineDefinition.js';\nimport { IssuePoller } from './poller/IssuePoller.js';\nimport { WebServer } from './web/WebServer.js';\nimport { WebhookServer } from './webhook/WebhookServer.js';\nimport { AgentLogStore } from './web/AgentLogStore.js';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport async function main(): Promise<void> {\n logger.info('Issue Auto-Finish service starting...');\n\n const config = loadConfig();\n setLocale(config.locale);\n\n const allAiPhaseNames = [\n ...CLASSIC_PIPELINE.phases.filter(p => p.kind === 'ai').map(p => p.name),\n ...PLAN_MODE_PIPELINE.phases.filter(p => p.kind === 'ai').map(p => p.name),\n ];\n validatePhaseRegistry([...new Set(allAiPhaseNames)]);\n\n // Initialize components\n const gongfeng = new GongfengClient(config.gongfeng);\n const git = new GitOperations(config.project.gitRootDir);\n const aiRunner = createAIRunner(config.ai);\n const dataDir = path.resolve(__dirname, '../data');\n const tracker = new IssueTracker(dataDir);\n\n const supplementStore = new SupplementStore(dataDir);\n\n const agentLogStore = new AgentLogStore(dataDir);\n agentLogStore.startListening();\n\n const orchestrator = new PipelineOrchestrator(config, gongfeng, git, aiRunner, tracker, supplementStore);\n const poller = new IssuePoller(config, gongfeng, tracker, orchestrator);\n\n let webServer: WebServer | null = null;\n if (config.web.enabled) {\n webServer = new WebServer({ tracker, config, agentLogStore, orchestrator, gongfeng, supplementStore, mainGit: git });\n await webServer.start();\n }\n\n let webhookServer: WebhookServer | null = null;\n if (config.webhook.enabled) {\n webhookServer = new WebhookServer({ tracker, config, orchestrator, gongfeng, supplementStore });\n await webhookServer.start();\n }\n\n const shutdown = (): void => {\n logger.info('Shutting down...');\n poller.stop();\n webServer?.stop();\n webhookServer?.stop();\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n // Start polling\n poller.start();\n\n logger.info('Issue Auto-Finish service started', {\n projectPath: config.gongfeng.projectPath,\n workDir: config.project.workDir,\n discoveryIntervalMs: config.poll.discoveryIntervalMs,\n driveIntervalMs: config.poll.driveIntervalMs,\n webUI: config.web.enabled ? `http://localhost:${config.web.port}` : 'disabled',\n webhook: config.webhook.enabled ? `http://localhost:${config.webhook.port}/webhook/gongfeng` : 'disabled',\n });\n}\n"],"mappings":"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","names":["logger","logger","path","fs","path","logger","path","fs","Router","logger","Router","path","logger","express","Router","path","fs","logger","fs","path","logger","Router","logger","logger","express","fs","path","logger","path","fs","path","fileURLToPath","__dirname"]}