@mycodemap/mycodemap 0.1.1 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/CHANGELOG.md +163 -0
  2. package/README.md +241 -67
  3. package/dist/cli/commands/ci.d.ts +7 -1
  4. package/dist/cli/commands/ci.d.ts.map +1 -1
  5. package/dist/cli/commands/ci.js +38 -0
  6. package/dist/cli/commands/ci.js.map +1 -1
  7. package/dist/cli/commands/export.d.ts +6 -0
  8. package/dist/cli/commands/export.d.ts.map +1 -0
  9. package/dist/cli/commands/export.js +108 -0
  10. package/dist/cli/commands/export.js.map +1 -0
  11. package/dist/cli/commands/generate.d.ts.map +1 -1
  12. package/dist/cli/commands/generate.js +96 -0
  13. package/dist/cli/commands/generate.js.map +1 -1
  14. package/dist/cli/commands/server.d.ts +9 -0
  15. package/dist/cli/commands/server.d.ts.map +1 -0
  16. package/dist/cli/commands/server.js +68 -0
  17. package/dist/cli/commands/server.js.map +1 -0
  18. package/dist/cli/commands/ship/analyzer.d.ts +26 -0
  19. package/dist/cli/commands/ship/analyzer.d.ts.map +1 -0
  20. package/dist/cli/commands/ship/analyzer.js +143 -0
  21. package/dist/cli/commands/ship/analyzer.js.map +1 -0
  22. package/dist/cli/commands/ship/checker.d.ts +20 -0
  23. package/dist/cli/commands/ship/checker.d.ts.map +1 -0
  24. package/dist/cli/commands/ship/checker.js +86 -0
  25. package/dist/cli/commands/ship/checker.js.map +1 -0
  26. package/dist/cli/commands/ship/index.d.ts +17 -0
  27. package/dist/cli/commands/ship/index.d.ts.map +1 -0
  28. package/dist/cli/commands/ship/index.js +51 -0
  29. package/dist/cli/commands/ship/index.js.map +1 -0
  30. package/dist/cli/commands/ship/monitor.d.ts +19 -0
  31. package/dist/cli/commands/ship/monitor.d.ts.map +1 -0
  32. package/dist/cli/commands/ship/monitor.js +105 -0
  33. package/dist/cli/commands/ship/monitor.js.map +1 -0
  34. package/dist/cli/commands/ship/pipeline.d.ts +23 -0
  35. package/dist/cli/commands/ship/pipeline.d.ts.map +1 -0
  36. package/dist/cli/commands/ship/pipeline.js +146 -0
  37. package/dist/cli/commands/ship/pipeline.js.map +1 -0
  38. package/dist/cli/commands/ship/publisher.d.ts +11 -0
  39. package/dist/cli/commands/ship/publisher.d.ts.map +1 -0
  40. package/dist/cli/commands/ship/publisher.js +75 -0
  41. package/dist/cli/commands/ship/publisher.js.map +1 -0
  42. package/dist/cli/commands/ship/rules/confidence-rules.d.ts +48 -0
  43. package/dist/cli/commands/ship/rules/confidence-rules.d.ts.map +1 -0
  44. package/dist/cli/commands/ship/rules/confidence-rules.js +122 -0
  45. package/dist/cli/commands/ship/rules/confidence-rules.js.map +1 -0
  46. package/dist/cli/commands/ship/rules/quality-rules.d.ts +25 -0
  47. package/dist/cli/commands/ship/rules/quality-rules.d.ts.map +1 -0
  48. package/dist/cli/commands/ship/rules/quality-rules.js +134 -0
  49. package/dist/cli/commands/ship/rules/quality-rules.js.map +1 -0
  50. package/dist/cli/commands/ship/rules/version-rules.d.ts +24 -0
  51. package/dist/cli/commands/ship/rules/version-rules.d.ts.map +1 -0
  52. package/dist/cli/commands/ship/rules/version-rules.js +75 -0
  53. package/dist/cli/commands/ship/rules/version-rules.js.map +1 -0
  54. package/dist/cli/commands/ship/versioner.d.ts +12 -0
  55. package/dist/cli/commands/ship/versioner.d.ts.map +1 -0
  56. package/dist/cli/commands/ship/versioner.js +92 -0
  57. package/dist/cli/commands/ship/versioner.js.map +1 -0
  58. package/dist/cli/index.js +31 -1
  59. package/dist/cli/index.js.map +1 -1
  60. package/dist/cli-new/commands/export.d.ts +15 -0
  61. package/dist/cli-new/commands/export.d.ts.map +1 -0
  62. package/dist/cli-new/commands/export.js +107 -0
  63. package/dist/cli-new/commands/export.js.map +1 -0
  64. package/dist/cli-new/commands/query.d.ts +14 -0
  65. package/dist/cli-new/commands/query.d.ts.map +1 -0
  66. package/dist/cli-new/commands/query.js +120 -0
  67. package/dist/cli-new/commands/query.js.map +1 -0
  68. package/dist/cli-new/commands/server.d.ts +13 -0
  69. package/dist/cli-new/commands/server.d.ts.map +1 -0
  70. package/dist/cli-new/commands/server.js +94 -0
  71. package/dist/cli-new/commands/server.js.map +1 -0
  72. package/dist/cli-new/index.d.ts +11 -0
  73. package/dist/cli-new/index.d.ts.map +1 -0
  74. package/dist/cli-new/index.js +63 -0
  75. package/dist/cli-new/index.js.map +1 -0
  76. package/dist/cli-new/types/index.d.ts +88 -0
  77. package/dist/cli-new/types/index.d.ts.map +1 -0
  78. package/dist/cli-new/types/index.js +7 -0
  79. package/dist/cli-new/types/index.js.map +1 -0
  80. package/dist/domain/entities/CodeGraph.d.ts +134 -0
  81. package/dist/domain/entities/CodeGraph.d.ts.map +1 -0
  82. package/dist/domain/entities/CodeGraph.js +316 -0
  83. package/dist/domain/entities/CodeGraph.js.map +1 -0
  84. package/dist/domain/entities/Dependency.d.ts +78 -0
  85. package/dist/domain/entities/Dependency.d.ts.map +1 -0
  86. package/dist/domain/entities/Dependency.js +132 -0
  87. package/dist/domain/entities/Dependency.js.map +1 -0
  88. package/dist/domain/entities/Module.d.ts +75 -0
  89. package/dist/domain/entities/Module.d.ts.map +1 -0
  90. package/dist/domain/entities/Module.js +151 -0
  91. package/dist/domain/entities/Module.js.map +1 -0
  92. package/dist/domain/entities/Project.d.ts +50 -0
  93. package/dist/domain/entities/Project.d.ts.map +1 -0
  94. package/dist/domain/entities/Project.js +99 -0
  95. package/dist/domain/entities/Project.js.map +1 -0
  96. package/dist/domain/entities/Symbol.d.ts +75 -0
  97. package/dist/domain/entities/Symbol.d.ts.map +1 -0
  98. package/dist/domain/entities/Symbol.js +130 -0
  99. package/dist/domain/entities/Symbol.js.map +1 -0
  100. package/dist/domain/events/DomainEvent.d.ts +76 -0
  101. package/dist/domain/events/DomainEvent.d.ts.map +1 -0
  102. package/dist/domain/events/DomainEvent.js +153 -0
  103. package/dist/domain/events/DomainEvent.js.map +1 -0
  104. package/dist/domain/index.d.ts +10 -0
  105. package/dist/domain/index.d.ts.map +1 -0
  106. package/dist/domain/index.js +18 -0
  107. package/dist/domain/index.js.map +1 -0
  108. package/dist/domain/repositories/CodeGraphRepository.d.ts +58 -0
  109. package/dist/domain/repositories/CodeGraphRepository.d.ts.map +1 -0
  110. package/dist/domain/repositories/CodeGraphRepository.js +37 -0
  111. package/dist/domain/repositories/CodeGraphRepository.js.map +1 -0
  112. package/dist/domain/services/CodeGraphBuilder.d.ts +50 -0
  113. package/dist/domain/services/CodeGraphBuilder.d.ts.map +1 -0
  114. package/dist/domain/services/CodeGraphBuilder.js +121 -0
  115. package/dist/domain/services/CodeGraphBuilder.js.map +1 -0
  116. package/dist/infrastructure/parser/implementations/GoParser.d.ts +25 -0
  117. package/dist/infrastructure/parser/implementations/GoParser.d.ts.map +1 -0
  118. package/dist/infrastructure/parser/implementations/GoParser.js +158 -0
  119. package/dist/infrastructure/parser/implementations/GoParser.js.map +1 -0
  120. package/dist/infrastructure/parser/implementations/PythonParser.d.ts +30 -0
  121. package/dist/infrastructure/parser/implementations/PythonParser.d.ts.map +1 -0
  122. package/dist/infrastructure/parser/implementations/PythonParser.js +201 -0
  123. package/dist/infrastructure/parser/implementations/PythonParser.js.map +1 -0
  124. package/dist/infrastructure/parser/implementations/TypeScriptParser.d.ts +63 -0
  125. package/dist/infrastructure/parser/implementations/TypeScriptParser.d.ts.map +1 -0
  126. package/dist/infrastructure/parser/implementations/TypeScriptParser.js +420 -0
  127. package/dist/infrastructure/parser/implementations/TypeScriptParser.js.map +1 -0
  128. package/dist/infrastructure/parser/index.d.ts +13 -0
  129. package/dist/infrastructure/parser/index.d.ts.map +1 -0
  130. package/dist/infrastructure/parser/index.js +32 -0
  131. package/dist/infrastructure/parser/index.js.map +1 -0
  132. package/dist/infrastructure/parser/interfaces/ParserBase.d.ts +124 -0
  133. package/dist/infrastructure/parser/interfaces/ParserBase.d.ts.map +1 -0
  134. package/dist/infrastructure/parser/interfaces/ParserBase.js +200 -0
  135. package/dist/infrastructure/parser/interfaces/ParserBase.js.map +1 -0
  136. package/dist/infrastructure/parser/registry/ParserRegistry.d.ts +68 -0
  137. package/dist/infrastructure/parser/registry/ParserRegistry.d.ts.map +1 -0
  138. package/dist/infrastructure/parser/registry/ParserRegistry.js +116 -0
  139. package/dist/infrastructure/parser/registry/ParserRegistry.js.map +1 -0
  140. package/dist/infrastructure/repositories/CodeGraphRepositoryImpl.d.ts +44 -0
  141. package/dist/infrastructure/repositories/CodeGraphRepositoryImpl.d.ts.map +1 -0
  142. package/dist/infrastructure/repositories/CodeGraphRepositoryImpl.js +129 -0
  143. package/dist/infrastructure/repositories/CodeGraphRepositoryImpl.js.map +1 -0
  144. package/dist/infrastructure/repositories/index.d.ts +3 -0
  145. package/dist/infrastructure/repositories/index.d.ts.map +1 -0
  146. package/dist/infrastructure/repositories/index.js +7 -0
  147. package/dist/infrastructure/repositories/index.js.map +1 -0
  148. package/dist/infrastructure/storage/StorageFactory.d.ts +53 -0
  149. package/dist/infrastructure/storage/StorageFactory.d.ts.map +1 -0
  150. package/dist/infrastructure/storage/StorageFactory.js +150 -0
  151. package/dist/infrastructure/storage/StorageFactory.js.map +1 -0
  152. package/dist/infrastructure/storage/adapters/FileSystemStorage.d.ts +52 -0
  153. package/dist/infrastructure/storage/adapters/FileSystemStorage.d.ts.map +1 -0
  154. package/dist/infrastructure/storage/adapters/FileSystemStorage.js +315 -0
  155. package/dist/infrastructure/storage/adapters/FileSystemStorage.js.map +1 -0
  156. package/dist/infrastructure/storage/adapters/KuzuDBStorage.d.ts +52 -0
  157. package/dist/infrastructure/storage/adapters/KuzuDBStorage.d.ts.map +1 -0
  158. package/dist/infrastructure/storage/adapters/KuzuDBStorage.js +235 -0
  159. package/dist/infrastructure/storage/adapters/KuzuDBStorage.js.map +1 -0
  160. package/dist/infrastructure/storage/adapters/MemoryStorage.d.ts +37 -0
  161. package/dist/infrastructure/storage/adapters/MemoryStorage.d.ts.map +1 -0
  162. package/dist/infrastructure/storage/adapters/MemoryStorage.js +229 -0
  163. package/dist/infrastructure/storage/adapters/MemoryStorage.js.map +1 -0
  164. package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts +49 -0
  165. package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts.map +1 -0
  166. package/dist/infrastructure/storage/adapters/Neo4jStorage.js +222 -0
  167. package/dist/infrastructure/storage/adapters/Neo4jStorage.js.map +1 -0
  168. package/dist/infrastructure/storage/index.d.ts +6 -0
  169. package/dist/infrastructure/storage/index.d.ts.map +1 -0
  170. package/dist/infrastructure/storage/index.js +13 -0
  171. package/dist/infrastructure/storage/index.js.map +1 -0
  172. package/dist/infrastructure/storage/interfaces/StorageBase.d.ts +76 -0
  173. package/dist/infrastructure/storage/interfaces/StorageBase.d.ts.map +1 -0
  174. package/dist/infrastructure/storage/interfaces/StorageBase.js +116 -0
  175. package/dist/infrastructure/storage/interfaces/StorageBase.js.map +1 -0
  176. package/dist/interface/config/index.d.ts +102 -0
  177. package/dist/interface/config/index.d.ts.map +1 -0
  178. package/dist/interface/config/index.js +7 -0
  179. package/dist/interface/config/index.js.map +1 -0
  180. package/dist/interface/types/index.d.ts +425 -0
  181. package/dist/interface/types/index.d.ts.map +1 -0
  182. package/dist/interface/types/index.js +8 -0
  183. package/dist/interface/types/index.js.map +1 -0
  184. package/dist/interface/types/parser.d.ts +103 -0
  185. package/dist/interface/types/parser.d.ts.map +1 -0
  186. package/dist/interface/types/parser.js +7 -0
  187. package/dist/interface/types/parser.js.map +1 -0
  188. package/dist/interface/types/storage.d.ts +98 -0
  189. package/dist/interface/types/storage.d.ts.map +1 -0
  190. package/dist/interface/types/storage.js +7 -0
  191. package/dist/interface/types/storage.js.map +1 -0
  192. package/dist/orchestrator/test-linker.js +1 -1
  193. package/dist/orchestrator/test-linker.js.map +1 -1
  194. package/dist/server/CodeMapServer.d.ts +51 -0
  195. package/dist/server/CodeMapServer.d.ts.map +1 -0
  196. package/dist/server/CodeMapServer.js +146 -0
  197. package/dist/server/CodeMapServer.js.map +1 -0
  198. package/dist/server/handlers/AnalysisHandler.d.ts +82 -0
  199. package/dist/server/handlers/AnalysisHandler.d.ts.map +1 -0
  200. package/dist/server/handlers/AnalysisHandler.js +196 -0
  201. package/dist/server/handlers/AnalysisHandler.js.map +1 -0
  202. package/dist/server/handlers/QueryHandler.d.ts +57 -0
  203. package/dist/server/handlers/QueryHandler.d.ts.map +1 -0
  204. package/dist/server/handlers/QueryHandler.js +260 -0
  205. package/dist/server/handlers/QueryHandler.js.map +1 -0
  206. package/dist/server/index.d.ts +7 -0
  207. package/dist/server/index.d.ts.map +1 -0
  208. package/dist/server/index.js +13 -0
  209. package/dist/server/index.js.map +1 -0
  210. package/dist/server/routes/api.d.ts +8 -0
  211. package/dist/server/routes/api.d.ts.map +1 -0
  212. package/dist/server/routes/api.js +372 -0
  213. package/dist/server/routes/api.js.map +1 -0
  214. package/dist/server/types/index.d.ts +171 -0
  215. package/dist/server/types/index.d.ts.map +1 -0
  216. package/dist/server/types/index.js +7 -0
  217. package/dist/server/types/index.js.map +1 -0
  218. package/dist/types/index.d.ts +6 -372
  219. package/dist/types/index.d.ts.map +1 -1
  220. package/dist/types/index.js +9 -3
  221. package/dist/types/index.js.map +1 -1
  222. package/docs/AI_ASSISTANT_SETUP.md +68 -0
  223. package/docs/PUBLISHING.md +472 -0
  224. package/docs/README.md +37 -0
  225. package/docs/SETUP_GUIDE.md +91 -5
  226. package/docs/ai-guide/COMMANDS.md +403 -0
  227. package/docs/ai-guide/INTEGRATION.md +513 -0
  228. package/docs/ai-guide/OUTPUT.md +465 -0
  229. package/docs/ai-guide/PATTERNS.md +409 -0
  230. package/docs/ai-guide/PROMPTS.md +414 -0
  231. package/docs/ai-guide/QUICKSTART.md +114 -0
  232. package/docs/ai-guide/README.md +66 -0
  233. package/docs/archive/AI_INTEGRATION_GUIDE_ARCHIVED.md +7 -1
  234. package/docs/archive/ARCHIVE.md +39 -0
  235. package/docs/archive/MYCLAUDE_GUIDE.md +305 -0
  236. package/docs/archive/PUBLISH_NPM_DESIGN_V1.md +6 -0
  237. package/docs/archive/PUBLISH_NPM_DESIGN_V2.md +6 -0
  238. package/docs/archive/README.md +29 -0
  239. package/docs/archive/TASK_DESIGN_COVERAGE_REPORT.md +6 -0
  240. package/docs/archive/TEST_SUMMARY.md +140 -0
  241. package/docs/archive/comprehensive_test_report.md +337 -0
  242. package/docs/{CI_GATEWAY_DESIGN.md → archive/design-docs/CI_GATEWAY_DESIGN.md} +6 -0
  243. package/docs/{PUBLISH_NPM_DESIGN_FINAL.md → archive/design-docs/PUBLISH_NPM_DESIGN_FINAL.md} +7 -1
  244. package/docs/{REFACTOR_ARCHITECTURE_OVERVIEW.md → archive/design-docs/REFACTOR_ARCHITECTURE_OVERVIEW.md} +8 -2
  245. package/docs/{REFACTOR_CONFIDENCE_DESIGN.md → archive/design-docs/REFACTOR_CONFIDENCE_DESIGN.md} +6 -0
  246. package/docs/{REFACTOR_GIT_ANALYZER_DESIGN.md → archive/design-docs/REFACTOR_GIT_ANALYZER_DESIGN.md} +8 -2
  247. package/docs/{REFACTOR_ORCHESTRATOR_DESIGN.md → archive/design-docs/REFACTOR_ORCHESTRATOR_DESIGN.md} +6 -0
  248. package/docs/{REFACTOR_RESULT_FUSION_DESIGN.md → archive/design-docs/REFACTOR_RESULT_FUSION_DESIGN.md} +6 -0
  249. package/docs/{REFACTOR_TEST_LINKER_DESIGN.md → archive/design-docs/REFACTOR_TEST_LINKER_DESIGN.md} +6 -0
  250. package/docs/archive/myclaude.md +1084 -0
  251. package/docs/archive/plans/2026-03-14-go-language-support-design.md +92 -0
  252. package/docs/{REFACTOR_REQUIREMENTS.md → archive/product-specs/REFACTOR_REQUIREMENTS.md} +11 -5
  253. package/docs/archive/scenario-2-deps-analysis.md +353 -0
  254. package/docs/design-docs/README.md +26 -0
  255. package/docs/exec-plans/MVP3-IMPLEMENTATION-ROADMAP.md +524 -0
  256. package/docs/exec-plans/README.md +29 -0
  257. package/docs/exec-plans/active/.gitkeep +0 -0
  258. package/docs/exec-plans/completed/.gitkeep +0 -0
  259. package/docs/{plans/POST_TASK_PLAN.md → exec-plans/completed/2026-03-03-post-task-plan.md} +9 -3
  260. package/docs/exec-plans/completed/harness-engineering-rollout.md +184 -0
  261. package/docs/exec-plans/tech-debt/.gitkeep +0 -0
  262. package/docs/exec-plans/tech-debt/2026-03-15-lint-guardrail-gap.md +30 -0
  263. package/docs/generated/README.md +19 -0
  264. package/docs/product-specs/MVP3-ARCHITECTURE-COMPARISON.md +504 -0
  265. package/docs/product-specs/MVP3-ARCHITECTURE-REDESIGN-PRD.md +322 -0
  266. package/docs/product-specs/MVP3-ARCHITECTURE-REDESIGN-TECH-PRD.md +1374 -0
  267. package/docs/product-specs/README.md +22 -0
  268. package/docs/references/README.md +15 -0
  269. package/docs/references/tmp.md +527 -0
  270. package/docs/rules/README.md +16 -0
  271. package/docs/rules/architecture-guardrails.md +349 -0
  272. package/docs/rules/code-quality-redlines.md +321 -0
  273. package/docs/rules/deployment.md +23 -0
  274. package/docs/rules/engineering-with-codex-openai.md +202 -0
  275. package/docs/rules/pre-release-checklist.md +426 -0
  276. package/docs/rules/testing.md +73 -0
  277. package/docs/rules/validation.md +39 -0
  278. package/package.json +26 -7
  279. package/scripts/.githooks/commit-msg +31 -0
  280. package/scripts/.githooks/pre-commit +55 -0
  281. package/scripts/benchmark.ts +209 -0
  282. package/scripts/hooks/commit-msg +24 -0
  283. package/scripts/hooks/install-hooks.sh +29 -0
  284. package/scripts/hooks/pre-commit +60 -0
  285. package/scripts/pre-release-check.js +717 -0
  286. package/scripts/release.sh +142 -0
  287. package/scripts/run-benchmark.sh +29 -0
  288. package/scripts/validate-ai-docs.js +294 -0
  289. package/scripts/validate-docs.js +238 -0
  290. package/scripts/validate-pack.js +86 -0
  291. package/dist/ai/claude.d.ts +0 -38
  292. package/dist/ai/claude.d.ts.map +0 -1
  293. package/dist/ai/claude.js +0 -169
  294. package/dist/ai/claude.js.map +0 -1
  295. package/dist/ai/codex.d.ts +0 -38
  296. package/dist/ai/codex.d.ts.map +0 -1
  297. package/dist/ai/codex.js +0 -169
  298. package/dist/ai/codex.js.map +0 -1
  299. package/dist/ai/factory.d.ts +0 -48
  300. package/dist/ai/factory.d.ts.map +0 -1
  301. package/dist/ai/factory.js +0 -95
  302. package/dist/ai/factory.js.map +0 -1
  303. package/dist/ai/index.d.ts +0 -12
  304. package/dist/ai/index.d.ts.map +0 -1
  305. package/dist/ai/index.js +0 -29
  306. package/dist/ai/index.js.map +0 -1
  307. package/dist/ai/provider.d.ts +0 -70
  308. package/dist/ai/provider.d.ts.map +0 -1
  309. package/dist/ai/provider.js +0 -31
  310. package/dist/ai/provider.js.map +0 -1
  311. package/dist/ai/subagent-caller.d.ts +0 -90
  312. package/dist/ai/subagent-caller.d.ts.map +0 -1
  313. package/dist/ai/subagent-caller.js +0 -280
  314. package/dist/ai/subagent-caller.js.map +0 -1
  315. package/dist/ai/types.d.ts +0 -70
  316. package/dist/ai/types.d.ts.map +0 -1
  317. package/dist/ai/types.js +0 -5
  318. package/dist/ai/types.js.map +0 -1
  319. package/dist/generator/ai-overview.d.ts +0 -51
  320. package/dist/generator/ai-overview.d.ts.map +0 -1
  321. package/dist/generator/ai-overview.js +0 -160
  322. package/dist/generator/ai-overview.js.map +0 -1
  323. package/dist/orchestrator/ai-feed-generator.d.ts +0 -210
  324. package/dist/orchestrator/ai-feed-generator.d.ts.map +0 -1
  325. package/dist/orchestrator/ai-feed-generator.js +0 -377
  326. package/dist/orchestrator/ai-feed-generator.js.map +0 -1
  327. package/docs/OMC_TEAM_DEBUG_REPORT.md +0 -285
  328. /package/docs/{plans/archive → exec-plans/completed}/2026-03-03-deps-path-extension-fix.md +0 -0
@@ -1,377 +0,0 @@
1
- // [META] since:2026-03-02 | owner:orchestrator-team | stable:true
2
- // [WHY] AI feed generator with date format alignment for JSON serialization
3
- /**
4
- * AI Feed Generator
5
- * Generates structured data for AI consumption (ai-feed.txt)
6
- * Provides code metadata, dependency complexity, modification heat, etc.
7
- */
8
- import * as fs from 'fs';
9
- import * as path from 'path';
10
- import { globby } from 'globby';
11
- /**
12
- * File header comment scanner
13
- * Scans [META]/[WHY]/[DEPS] comments at the top of files
14
- */
15
- export class FileHeaderScanner {
16
- /**
17
- * Scan file header comments
18
- * Only reads first 10 lines of the file
19
- *
20
- * @param filePath - Full file path
21
- * @returns FileMeta parsing result
22
- */
23
- scan(filePath) {
24
- try {
25
- const content = fs.readFileSync(filePath, 'utf-8');
26
- const lines = content.split('\n').slice(0, 10);
27
- const header = lines.join('\n');
28
- return this.parseHeader(header);
29
- }
30
- catch {
31
- // Return empty object on read failure
32
- return {};
33
- }
34
- }
35
- /**
36
- * Parse file header content string (public for testing)
37
- * Alias for parseHeaderContent for backward compatibility
38
- *
39
- * @param header - File header content (first 10 lines as string)
40
- * @returns FileMeta parsing result with flat structure
41
- */
42
- parseHeader(header) {
43
- return this.parseHeaderContent(header);
44
- }
45
- /**
46
- * Parse file header content (public for testing)
47
- * Returns nested structure for backward compatibility with tests
48
- *
49
- * @param header - File header content (first 10 lines)
50
- * @returns FileHeader parsing result with nested meta
51
- */
52
- parseHeaderContent(header) {
53
- const result = {};
54
- // Parse [META]
55
- const metaMatch = header.match(/\/\/\s*\[META\]\s*(.+)/);
56
- if (metaMatch) {
57
- const metaStr = metaMatch[1];
58
- result.meta = {
59
- since: metaStr.match(/since:(\S+)/)?.[1],
60
- owner: metaStr.match(/owner:(\S+)/)?.[1],
61
- stable: metaStr.includes('stable:true')
62
- };
63
- // Also set flat properties for compatibility
64
- result.since = result.meta.since;
65
- result.owner = result.meta.owner;
66
- result.stable = result.meta.stable;
67
- }
68
- // Parse [WHY]
69
- const whyMatch = header.match(/\/\/\s*\[WHY\]\s*(.+)/);
70
- if (whyMatch) {
71
- result.why = whyMatch[1].trim();
72
- }
73
- // Parse [DEPS]
74
- const depsMatch = header.match(/\/\/\s*\[DEPS\]\s*(.+)/);
75
- if (depsMatch) {
76
- result.deps = depsMatch[1]
77
- .split(',')
78
- .map(d => d.trim())
79
- .filter(d => d.length > 0);
80
- }
81
- return result;
82
- }
83
- /**
84
- * Validate file header completeness
85
- * Used by CI gateway
86
- *
87
- * @param filePath - File path
88
- * @returns Validation result
89
- */
90
- validate(filePath) {
91
- const meta = this.scan(filePath);
92
- const missing = [];
93
- if (!meta.since) {
94
- missing.push('[META] since');
95
- }
96
- if (!meta.why) {
97
- missing.push('[WHY]');
98
- }
99
- return {
100
- valid: missing.length === 0,
101
- missing
102
- };
103
- }
104
- }
105
- /**
106
- * AI Feed Generator class
107
- * Generates structured data for AI consumption
108
- */
109
- export class AIFeedGenerator {
110
- gitAnalyzer;
111
- headerScanner;
112
- /**
113
- * Constructor
114
- *
115
- * @param gitAnalyzer - GitAnalyzer instance
116
- */
117
- constructor(gitAnalyzer) {
118
- this.gitAnalyzer = gitAnalyzer;
119
- this.headerScanner = new FileHeaderScanner();
120
- }
121
- /**
122
- * Generate AI feed
123
- * Integrated into codemap generate command
124
- *
125
- * @param projectRoot - Project root directory
126
- * @param options - Generation options
127
- * @param options.includeGitHistory - Whether to include Git history analysis (default: false)
128
- * @returns AIFeed[] feed list (sorted by gravity descending)
129
- */
130
- async generate(projectRoot, options) {
131
- const includeGitHistory = options?.includeGitHistory ?? false;
132
- // 1. Get all TypeScript files
133
- const files = await globby(['src/**/*.ts'], {
134
- cwd: projectRoot,
135
- ignore: ['**/*.d.ts', '**/node_modules/**', '**/dist/**']
136
- });
137
- const feed = [];
138
- // 2. First pass: collect basic info
139
- for (const file of files) {
140
- const fullPath = path.join(projectRoot, file);
141
- // Skip non-existent files (globby may return deleted files)
142
- if (!fs.existsSync(fullPath)) {
143
- continue;
144
- }
145
- const header = this.headerScanner.scan(fullPath);
146
- // Only scan Git history if explicitly enabled
147
- const heat = includeGitHistory
148
- ? await this.scanGitHistory(file, projectRoot)
149
- : { freq30d: 0, lastType: 'unknown', lastDate: null, stability: true };
150
- feed.push({
151
- file,
152
- gravity: 0, // Will be calculated in second pass
153
- heat,
154
- meta: {
155
- since: header.since,
156
- owner: header.owner,
157
- stable: header.stable,
158
- why: header.why
159
- },
160
- deps: header.deps ?? [],
161
- dependents: []
162
- });
163
- }
164
- // 3. Second pass: calculate dependencies
165
- this.calculateDependencies(feed, projectRoot);
166
- // 4. Sort by gravity descending
167
- return feed.sort((a, b) => b.gravity - a.gravity);
168
- }
169
- /**
170
- * Output AI feed file
171
- *
172
- * @param feed - AI feed list
173
- * @param outputPath - Output file path
174
- */
175
- writeFeedFile(feed, outputPath) {
176
- const lines = [
177
- '# CODEMAP AI FEED',
178
- `# Generated: ${new Date().toISOString()}`,
179
- ''
180
- ];
181
- for (const f of feed) {
182
- const lastDateStr = f.heat.lastDate ?? 'never';
183
- lines.push(`FILE: ${f.file}`);
184
- lines.push(`GRAVITY: ${f.gravity} | HEAT: ${f.heat.freq30d}/${f.heat.lastType}/${lastDateStr}`);
185
- lines.push(`META: since=${f.meta.since ?? 'unknown'} stable=${f.meta.stable ?? 'unknown'} why=${f.meta.why ?? 'none'}`);
186
- lines.push(`IMPACT: ${f.dependents.length} files depend on this`);
187
- lines.push(`DEPS: ${f.deps.join(', ') || 'none'}`);
188
- lines.push('---');
189
- lines.push('');
190
- }
191
- // Ensure directory exists
192
- const outputDir = path.dirname(outputPath);
193
- if (!fs.existsSync(outputDir)) {
194
- fs.mkdirSync(outputDir, { recursive: true });
195
- }
196
- fs.writeFileSync(outputPath, lines.join('\n'), 'utf-8');
197
- }
198
- /**
199
- * Scan Git history for heat score
200
- *
201
- * @param filePath - File path (relative to projectRoot)
202
- * @param projectRoot - Project root directory
203
- * @returns HeatScore heat score
204
- */
205
- async scanGitHistory(filePath, projectRoot) {
206
- return this.gitAnalyzer.analyzeFileHeat(filePath, projectRoot);
207
- }
208
- /**
209
- * Calculate dependencies
210
- * Scan import statements, build dependency graph
211
- *
212
- * @param feed - AI feed list
213
- * @param projectRoot - Project root directory
214
- */
215
- calculateDependencies(feed, projectRoot) {
216
- const fileMap = new Map();
217
- // Build file map
218
- for (const item of feed) {
219
- fileMap.set(item.file, item);
220
- }
221
- // Scan import statements for each file
222
- for (const item of feed) {
223
- const fullPath = path.join(projectRoot, item.file);
224
- try {
225
- const content = fs.readFileSync(fullPath, 'utf-8');
226
- // Scan import statements, match relative path imports
227
- // Match: import ... from './path' or import ... from '../path'
228
- const importMatches = [...content.matchAll(/from\s+['"](\.\.?\/[^'"]+)['"]/g)];
229
- for (const match of importMatches) {
230
- const importPath = match[1];
231
- if (!importPath)
232
- continue;
233
- // Resolve import path to path relative to src
234
- const resolvedPath = this.resolveImportPath(item.file, importPath);
235
- if (resolvedPath) {
236
- // Normalize path: convert .js to .ts, or add .ts if no extension
237
- let normalizedPath;
238
- if (resolvedPath.endsWith('.ts')) {
239
- normalizedPath = resolvedPath;
240
- }
241
- else if (resolvedPath.endsWith('.js')) {
242
- normalizedPath = resolvedPath.slice(0, -3) + '.ts';
243
- }
244
- else {
245
- normalizedPath = resolvedPath + '.ts';
246
- }
247
- if (!item.deps.includes(normalizedPath)) {
248
- item.deps.push(normalizedPath);
249
- }
250
- // Check if target file exists in feed and add to dependents
251
- const possiblePaths = [
252
- resolvedPath,
253
- resolvedPath.endsWith('.js') ? resolvedPath.slice(0, -3) + '.ts' : resolvedPath + '.ts',
254
- resolvedPath + '/index.ts'
255
- ];
256
- for (const possiblePath of possiblePaths) {
257
- if (fileMap.has(possiblePath)) {
258
- // Add to target file's dependents
259
- const target = fileMap.get(possiblePath);
260
- if (target && !target.dependents.includes(item.file)) {
261
- target.dependents.push(item.file);
262
- }
263
- break;
264
- }
265
- }
266
- }
267
- }
268
- }
269
- catch {
270
- // Skip on read failure
271
- }
272
- }
273
- // Recalculate gravity (out-degree + in-degree)
274
- for (const item of feed) {
275
- item.gravity = item.deps.length + item.dependents.length;
276
- }
277
- }
278
- /**
279
- * Resolve import path to path relative to project root
280
- *
281
- * @param currentFile - Current file path
282
- * @param importPath - Import path from import statement
283
- * @returns Resolved path, or null if cannot resolve
284
- */
285
- resolveImportPath(currentFile, importPath) {
286
- // Get current file's directory
287
- const currentDir = path.dirname(currentFile);
288
- // Resolve relative path
289
- const resolved = path.normalize(path.join(currentDir, importPath));
290
- // Ensure path is under src directory
291
- if (!resolved.startsWith('src/')) {
292
- return null;
293
- }
294
- return resolved;
295
- }
296
- /**
297
- * Scan file header (convenience method)
298
- * Delegates to FileHeaderScanner
299
- *
300
- * @param filePath - File path
301
- * @returns FileMeta file metadata
302
- */
303
- scanFileHeader(filePath) {
304
- return this.headerScanner.scan(filePath);
305
- }
306
- /**
307
- * Calculate scores for a single feed item
308
- * Returns normalized scores
309
- *
310
- * @param feed - AI feed item
311
- * @param maxGravity - Maximum gravity value for normalization
312
- * @param maxImpact - Maximum impact value for normalization
313
- * @returns Object with gravity, impact, heat scores
314
- */
315
- calculateScores(feed, maxGravity = 20, maxImpact = 50) {
316
- const gravity = feed.deps.length + feed.dependents.length;
317
- const impact = feed.dependents.length;
318
- const heat = feed.heat.freq30d;
319
- return {
320
- gravity: Math.min(gravity / (maxGravity || 1), 1),
321
- impact: Math.min(impact / (maxImpact || 1), 1),
322
- heat: Math.min(heat / 10, 1)
323
- };
324
- }
325
- /**
326
- * Calculate file risk level
327
- * Based on REQUIREMENTS section 8.6 risk scoring formula
328
- *
329
- * @param feed - Single file AI feed
330
- * @returns Risk level: 'high' | 'medium' | 'low'
331
- */
332
- calculateRisk(feed) {
333
- const gravity = feed.gravity;
334
- const heat = feed.heat;
335
- const impact = feed.dependents.length;
336
- const stable = feed.meta.stable ?? true;
337
- return this.gitAnalyzer.calculateRiskLevel(gravity, heat, impact, stable);
338
- }
339
- /**
340
- * Batch calculate risk levels
341
- *
342
- * @param feedList - AI feed list
343
- * @returns Map<file path, risk level>
344
- */
345
- calculateRisks(feedList) {
346
- const result = new Map();
347
- for (const feed of feedList) {
348
- result.set(feed.file, this.calculateRisk(feed));
349
- }
350
- return result;
351
- }
352
- /**
353
- * Get high risk file list
354
- *
355
- * @param feedList - AI feed list
356
- * @returns High risk file list
357
- */
358
- getHighRiskFiles(feedList) {
359
- return feedList.filter(f => this.calculateRisk(f) === 'high');
360
- }
361
- /**
362
- * Generate JSON format AI feed
363
- * For programmatic processing
364
- *
365
- * @param feed - AI feed list
366
- * @param outputPath - Output file path
367
- */
368
- writeFeedFileJson(feed, outputPath) {
369
- // Ensure directory exists
370
- const outputDir = path.dirname(outputPath);
371
- if (!fs.existsSync(outputDir)) {
372
- fs.mkdirSync(outputDir, { recursive: true });
373
- }
374
- fs.writeFileSync(outputPath, JSON.stringify(feed, null, 2), 'utf-8');
375
- }
376
- }
377
- //# sourceMappingURL=ai-feed-generator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ai-feed-generator.js","sourceRoot":"","sources":["../../src/orchestrator/ai-feed-generator.ts"],"names":[],"mappings":"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"}
@@ -1,285 +0,0 @@
1
- # OMC Team 模式与 Claude Code 不兼容问题分析报告
2
-
3
- > 生成时间:2026-03-07
4
- > 分析范围:OMC team 模式 + Claude Code 集成
5
-
6
- ---
7
-
8
- ## 1. 问题现象
9
-
10
- ### 1.1 观察到的症状
11
-
12
- 从 trace 数据显示:
13
- - **worker-1**: spawn 了 **11 次**
14
- - **worker-2**: spawn 了 **3 次**
15
- - 主 session 在 16:08 结束,reason: "other"
16
-
17
- ### 1.2 影响
18
-
19
- - 资源快速耗尽(内存、进程)
20
- - Claude Code 主进程可能因资源压力退出
21
- - 任务完成状态不稳定
22
-
23
- ---
24
-
25
- ## 2. 根本原因分析
26
-
27
- ### 2.1 架构问题:V1 Runtime 的 Watchdog 循环
28
-
29
- **问题位置**: `runtime.ts:518-647` (watchdogCliWorkers 函数)
30
-
31
- **问题描述**:
32
- ```
33
- watchdog tick 循环逻辑:
34
- 1. 检查 workers 的 done.json 信号
35
- 2. 如果有信号 -> markTaskFromDone -> killWorkerPane -> spawnWorkerForTask (如果有 pending 任务)
36
- 3. 如果 worker 死了 -> applyDeadPaneTransition -> requeue -> spawnWorkerForTask
37
- ```
38
-
39
- **Bug**: 当任务完成后,watchdog 会立即 spawn 新的 worker 来执行其他 pending 任务。这导致:
40
- - Worker 刚完成就被 kill
41
- - 立即创建新 worker
42
- - 如果任务列表只有 1 个任务,也会反复创建同一个 worker
43
-
44
- ### 2.2 状态同步问题
45
-
46
- **问题**: `markTaskFromDone()` 更新任务状态为 completed,但可能存在:
47
- - 文件系统写入延迟
48
- - 状态读取不一致
49
- - 导致 `allTasksTerminal()` 错误判断
50
-
51
- ### 2.3 Session 管理问题
52
-
53
- **观察**:
54
- - Session 在 16:08 结束 (reason: "other")
55
- - Workers 在 16:07 完成后反复重建
56
- - 主 session 可能因资源压力或错误退出
57
-
58
- ### 2.4 Claude Code 原生 team 集成问题
59
-
60
- 从 config.json 可见:
61
- - Workers 使用 `in-process` backend (`"backendType": "in-process"`)
62
- - 这意味着 workers 运行在同一个 Claude Code 进程内
63
- - 当 worker 完成后返回结果时,可能触发主进程重新 spawn
64
-
65
- ---
66
-
67
- ## 3. 具体问题点
68
-
69
- ### 问题 1: Watchdog 立即重新分配任务
70
-
71
- **代码位置**: `runtime.ts:559-565`
72
- ```typescript
73
- if (signal) {
74
- // ... 处理完成信号
75
- await killWorkerPane(runtime, wName, active.paneId);
76
- if (!(await allTasksTerminal(runtime))) {
77
- const nextTaskIndexValue = await nextPendingTaskIndex(runtime);
78
- if (nextTaskIndexValue != null) {
79
- await spawnWorkerForTask(runtime, wName, nextTaskIndexValue); // 立即 spawn!
80
- }
81
- }
82
- }
83
- ```
84
-
85
- **问题**: 任务完成后立即 spawn 新 worker,没有给主 session 任何喘息机会
86
-
87
- ### 问题 2: Worker 复用逻辑缺失
88
-
89
- **代码位置**: `runtime.ts:421-426`
90
- ```typescript
91
- const maxConcurrentWorkers = agentTypes.length;
92
- for (let i = 0; i < maxConcurrentWorkers; i++) {
93
- const taskIndex = await nextPendingTaskIndex(runtime);
94
- if (taskIndex == null) break;
95
- await spawnWorkerForTask(runtime, workerName(i), taskIndex);
96
- }
97
- ```
98
-
99
- **问题**: 每次都创建新的 workerName,而不是复用已有的 worker
100
-
101
- ### 问题 3: In-Process Workers 的状态管理
102
-
103
- **代码位置**: config.json
104
- ```json
105
- {
106
- "backendType": "in-process"
107
- }
108
- ```
109
-
110
- **问题**: in-process workers 完成后会返回结果给主 agent,这可能触发某种重新调度的 hook,导致反复 spawn
111
-
112
- ### 问题 4: 缺乏资源限制
113
-
114
- **问题**: 没有机制限制:
115
- - 单个 worker 的最大执行时间
116
- - 总 worker spawn 次数
117
- - 内存使用上限
118
-
119
- ---
120
-
121
- ## 4. 修复方案
122
-
123
- ### 4.1 方案 A: 启用 V2 Runtime (推荐)
124
-
125
- **原理**: V2 runtime 使用事件驱动架构,避免轮询问题
126
-
127
- **操作**:
128
- ```bash
129
- export OMC_RUNTIME_V2=1
130
- # 然后重新运行 team
131
- ```
132
-
133
- **预期效果**:
134
- - 更稳定的任务状态管理
135
- - 事件驱动而非轮询
136
- - 减少不必要的 worker 重建
137
-
138
- ### 4.2 方案 B: 修复 V1 Runtime
139
-
140
- #### B.1 添加冷却期
141
-
142
- **修改位置**: `runtime.ts:559-565`
143
-
144
- ```typescript
145
- // 在 killWorkerPane 后添加延迟
146
- await killWorkerPane(runtime, wName, active.paneId);
147
-
148
- // 添加冷却期,避免立即重新 spawn
149
- await new Promise(resolve => setTimeout(resolve, 2000));
150
-
151
- if (!(await allTasksTerminal(runtime))) {
152
- // ... existing logic
153
- }
154
- ```
155
-
156
- #### B.2 添加 Worker 池机制
157
-
158
- **修改位置**: `runtime.ts` - 新增 worker 池状态
159
-
160
- ```typescript
161
- interface WorkerPool {
162
- availableWorkers: string[]; // 可复用的 worker 名称
163
- activeWorkers: Map<string, ActiveWorkerState>;
164
- }
165
-
166
- // 在 spawnWorkerForTask 中复用
167
- async function spawnWorkerForTask(...) {
168
- // 先检查池中是否有可用 worker
169
- if (runtime.workerPool.availableWorkers.length > 0) {
170
- const reusableWorkerName = runtime.workerPool.availableWorkers.pop();
171
- // 复用该 worker
172
- }
173
- // 否则创建新 worker
174
- }
175
- ```
176
-
177
- #### B.3 添加资源限制
178
-
179
- **修改位置**: `runtime.ts` - 新增限制配置
180
-
181
- ```typescript
182
- const MAX_WORKER_SPAWNS = 20; // 最多 spawn 次数
183
- const WORKER_COOLDOWN_MS = 3000; // 冷却期
184
-
185
- // 在 watchdog 中跟踪 spawn 次数
186
- let workerSpawnCount = 0;
187
-
188
- async function spawnWorkerForTask(...) {
189
- if (workerSpawnCount >= MAX_WORKER_SPAWNS) {
190
- console.warn('[watchdog] Max worker spawn limit reached');
191
- return '';
192
- }
193
- workerSpawnCount++;
194
- // ... existing logic
195
- }
196
- ```
197
-
198
- ### 4.3 方案 C: 修复 Claude Code 集成
199
-
200
- #### C.1 修改 worker hook 逻辑
201
-
202
- **修改位置**: `src/hooks/team-worker-hook.ts`
203
-
204
- 确保 worker 完成后:
205
- 1. 写入 done.json
206
- 2. **不自动退出** (等待主 session 指示)
207
- 3. 进入空闲状态等待新任务
208
-
209
- #### C.2 添加状态一致性检查
210
-
211
- **修改位置**: `runtime.ts:allTasksTerminal()`
212
-
213
- ```typescript
214
- export async function allTasksTerminal(runtime: TeamRuntime): Promise<boolean> {
215
- const root = stateRoot(runtime.cwd, runtime.teamName);
216
-
217
- // 多次重试读取确保一致性
218
- for (let retry = 0; retry < 3; retry++) {
219
- let allTerminal = true;
220
- for (let i = 0; i < runtime.config.tasks.length; i++) {
221
- const task = await readTask(root, String(i + 1));
222
- if (!task) return false; // 任务文件不存在
223
- if (task.status !== 'completed' && task.status !== 'failed') {
224
- allTerminal = false;
225
- }
226
- }
227
- if (allTerminal) return true;
228
- await new Promise(r => setTimeout(r, 100)); // 等待状态稳定
229
- }
230
- return false;
231
- }
232
- ```
233
-
234
- ---
235
-
236
- ## 5. 实施建议
237
-
238
- ### 优先级
239
-
240
- | 优先级 | 修复项 | 难度 | 预期效果 |
241
- |--------|--------|------|----------|
242
- | P0 | 启用 V2 Runtime | 低 | 立即改善 |
243
- | P1 | 添加冷却期 | 中 | 减少频繁重建 |
244
- | P2 | Worker 池机制 | 高 | 根本解决 |
245
- | P3 | 资源限制 | 中 | 防止资源耗尽 |
246
-
247
- ### 验证方法
248
-
249
- ```bash
250
- # 1. 检查 OMC_RUNTIME_V2 是否启用
251
- echo $OMC_RUNTIME_V2
252
-
253
- # 2. 运行 team 并监控 spawn 次数
254
- /team 3:executor "test task"
255
-
256
- # 3. 观察日志中 worker spawn 次数
257
- # 修复前: worker-1 spawn 11 次
258
- # 修复后: worker-1 spawn 1-2 次
259
- ```
260
-
261
- ---
262
-
263
- ## 6. 附录:相关代码位置
264
-
265
- | 文件 | 说明 |
266
- |------|------|
267
- | `src/team/runtime.ts` | V1 runtime 核心逻辑 |
268
- | `src/team/runtime-v2.ts` | V2 runtime (事件驱动) |
269
- | `src/hooks/team-worker-hook.ts` | Worker 生命周期 hook |
270
- | `src/hooks/team-leader-nudge-hook.ts` | 主 session 状态 hook |
271
- | `src/team/tmux-session.ts` | tmux 会话管理 |
272
- | `src/team/task-file-ops.ts` | 任务文件操作 |
273
-
274
- ---
275
-
276
- ## 7. 结论
277
-
278
- OMC team 模式与 Claude Code 不兼容的主要原因是:
279
-
280
- 1. **V1 runtime 的 watchdog 逻辑缺陷** - 任务完成后立即重新 spawn worker
281
- 2. **缺乏 worker 复用机制** - 每次都创建新 worker
282
- 3. **资源限制缺失** - 没有防止无限 spawn 的保护
283
- 4. **In-process workers 状态同步问题** - 主进程可能因资源压力退出
284
-
285
- **推荐优先尝试方案 A (启用 V2 Runtime)**,这是最简单且最可能立即见效的方案。