maestro-flow 0.5.2 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (485) hide show
  1. package/.agents/skills/insight-challenge/SKILL.md +228 -0
  2. package/.agents/skills/insight-challenge/specs/challenge-protocol.md +154 -0
  3. package/.agents/skills/insight-challenge/specs/verdict-schema.md +239 -0
  4. package/.agents/skills/maestro/SKILL.md +6 -6
  5. package/.agents/skills/maestro-help/SKILL.md +1 -1
  6. package/.agents/skills/maestro-help/index/catalog.json +3 -2
  7. package/.agents/skills/maestro-ralph/SKILL.md +11 -10
  8. package/.agents/skills/maestro-ralph-beta/SKILL.md +11 -10
  9. package/.agents/skills/odyssey-debug/SKILL.md +475 -0
  10. package/.agents/skills/odyssey-improve/SKILL.md +507 -0
  11. package/.agents/skills/odyssey-planex/SKILL.md +603 -0
  12. package/.agents/skills/odyssey-review-test-fix/SKILL.md +429 -0
  13. package/.agents/skills/odyssey-ui/SKILL.md +464 -0
  14. package/.agy/skills/insight-challenge/SKILL.md +230 -0
  15. package/.agy/skills/insight-challenge/specs/challenge-protocol.md +154 -0
  16. package/.agy/skills/insight-challenge/specs/verdict-schema.md +239 -0
  17. package/.agy/skills/maestro/SKILL.md +6 -6
  18. package/.agy/skills/maestro-help/SKILL.md +1 -1
  19. package/.agy/skills/maestro-help/index/catalog.json +3 -2
  20. package/.agy/skills/maestro-ralph/SKILL.md +11 -10
  21. package/.agy/skills/maestro-ralph-beta/SKILL.md +11 -10
  22. package/.agy/skills/odyssey-debug/SKILL.md +475 -0
  23. package/.agy/skills/odyssey-improve/SKILL.md +507 -0
  24. package/.agy/skills/odyssey-planex/SKILL.md +603 -0
  25. package/.agy/skills/odyssey-review-test-fix/SKILL.md +429 -0
  26. package/.agy/skills/odyssey-ui/SKILL.md +464 -0
  27. package/.claude/commands/maestro-ralph-beta.md +11 -10
  28. package/.claude/commands/maestro-ralph.md +11 -10
  29. package/.claude/commands/maestro.md +6 -6
  30. package/.claude/commands/odyssey-debug.md +473 -0
  31. package/.claude/commands/odyssey-improve.md +505 -0
  32. package/.claude/commands/odyssey-planex.md +601 -0
  33. package/.claude/commands/odyssey-review-test-fix.md +427 -0
  34. package/.claude/commands/odyssey-ui.md +462 -0
  35. package/.claude/skills/insight-challenge/SKILL.md +226 -0
  36. package/.claude/skills/insight-challenge/specs/challenge-protocol.md +154 -0
  37. package/.claude/skills/insight-challenge/specs/verdict-schema.md +239 -0
  38. package/.claude/skills/maestro-help/SKILL.md +1 -1
  39. package/.claude/skills/maestro-help/index/catalog.json +3 -2
  40. package/.codex/skills/codify-to-knowhow/SKILL.md +1 -1
  41. package/.codex/skills/maestro-companion/SKILL.md +1 -1
  42. package/.codex/skills/maestro-help/SKILL.md +1 -1
  43. package/.codex/skills/maestro-impeccable/SKILL.md +1 -1
  44. package/.codex/skills/maestro-next/SKILL.md +1 -1
  45. package/.codex/skills/maestro-ralph-beta/SKILL.md +1 -1
  46. package/.codex/skills/odyssey-debug/SKILL.md +456 -0
  47. package/.codex/skills/odyssey-improve/SKILL.md +466 -0
  48. package/.codex/skills/odyssey-planex/SKILL.md +409 -0
  49. package/.codex/skills/odyssey-review-test-fix/SKILL.md +377 -0
  50. package/.codex/skills/odyssey-ui/SKILL.md +411 -0
  51. package/dashboard/dist/assets/{ArtifactsPage-BLvAqQlQ.js → ArtifactsPage-B6z23DfG.js} +2 -2
  52. package/dashboard/dist/assets/{ChatInput-DU9YGZKX.js → ChatInput-tBtGKV2i.js} +1 -1
  53. package/dashboard/dist/assets/{ChatPage-DYHfheXC.js → ChatPage-CcggDVs4.js} +2 -2
  54. package/dashboard/dist/assets/{CollabPage-CSlmvEa-.js → CollabPage-FaZeqqeS.js} +1 -1
  55. package/dashboard/dist/assets/{ExecutionPanel-RYWf0dYC.js → ExecutionPanel-DNRwYDXp.js} +1 -1
  56. package/dashboard/dist/assets/{KanbanPage-N55Iv0-X.js → KanbanPage-B2xh2s_N.js} +1 -1
  57. package/dashboard/dist/assets/{MaestroCoordinatePage-BxwZ6yy5.js → MaestroCoordinatePage-DCMGHDAL.js} +1 -1
  58. package/dashboard/dist/assets/{MarkdownRenderer-ZGtOY7Ti.js → MarkdownRenderer-C3FvTqVe.js} +1 -1
  59. package/dashboard/dist/assets/McpPage-HKaJ8cQP.js +16 -0
  60. package/dashboard/dist/assets/{MeetingRoomPage-CxHRn1xx.js → MeetingRoomPage-DGN5oUXH.js} +1 -1
  61. package/dashboard/dist/assets/{OutputPanel-DaL8c1i5.js → OutputPanel-BiCteH5k.js} +1 -1
  62. package/dashboard/dist/assets/{ProblemsPanel-BQTd5812.js → ProblemsPanel-Dk4v9tol.js} +1 -1
  63. package/dashboard/dist/assets/{RequirementBoardPage-22y9u1qh.js → RequirementBoardPage-D10A26gi.js} +1 -1
  64. package/dashboard/dist/assets/{RequirementPage-_mO743Xm.js → RequirementPage-Cs-2omLz.js} +1 -1
  65. package/dashboard/dist/assets/{RoomsPage-CExTbOGr.js → RoomsPage-tKQQhw1W.js} +1 -1
  66. package/dashboard/dist/assets/SpecsPage-LK1QCtcg.js +36 -0
  67. package/dashboard/dist/assets/{TeamsPage-BxEXLb5g.js → TeamsPage-C-bEwB8E.js} +1 -1
  68. package/dashboard/dist/assets/{TreeBrowser-CVtPF5C9.js → TreeBrowser-1YP-DfTY.js} +2 -2
  69. package/dashboard/dist/assets/{WorkflowPage-BoN18Lhs.js → WorkflowPage-dGHPsDDr.js} +2 -2
  70. package/dashboard/dist/assets/{arrow-left-C5ROg97G.js → arrow-left-BPFSEpfO.js} +1 -1
  71. package/dashboard/dist/assets/{check-Bs8PM0tQ.js → check-D5hOViiQ.js} +1 -1
  72. package/dashboard/dist/assets/{chevron-right-SmErd_1F.js → chevron-right-D9BsXrIg.js} +1 -1
  73. package/dashboard/dist/assets/{circle-CjpslL_D.js → circle-Cn5fNpmp.js} +1 -1
  74. package/dashboard/dist/assets/{circle-alert-CuzAg2fd.js → circle-alert-CZvK3B1K.js} +1 -1
  75. package/dashboard/dist/assets/{circle-check-BIkDU5D5.js → circle-check-DApOBP0J.js} +1 -1
  76. package/dashboard/dist/assets/{circle-check-big-CYctV8bK.js → circle-check-big-Cd9ztJpl.js} +1 -1
  77. package/dashboard/dist/assets/{code-DoB7rfxt.js → code-C3TuHjMs.js} +1 -1
  78. package/dashboard/dist/assets/{columns-3-Ch5KIyRa.js → columns-3-CO2SvNJb.js} +1 -1
  79. package/dashboard/dist/assets/{download-DadtG2Nr.js → download-BuKGI7KX.js} +1 -1
  80. package/dashboard/dist/assets/{en-2h6fD0j8.js → en-BmpYsIfb.js} +1 -1
  81. package/dashboard/dist/assets/folder-Chwj_P4A.js +11 -0
  82. package/dashboard/dist/assets/folder-open-S72FbKvn.js +6 -0
  83. package/dashboard/dist/assets/{index-BL4h1OKY.js → index-CN0YdC9M.js} +1 -1
  84. package/dashboard/dist/assets/{index-DQIlX2w_.js → index-Cbs79erW.js} +5 -5
  85. package/dashboard/dist/assets/{index-DaFwSmVJ.js → index-CdT1WNND.js} +1 -1
  86. package/dashboard/dist/assets/index-DEvP8cgc.css +1 -0
  87. package/dashboard/dist/assets/{list-CI-XIPZh.js → list-Dg_ojUpi.js} +1 -1
  88. package/dashboard/dist/assets/{loader-DpdMoQvh.js → loader-CMcc73C_.js} +1 -1
  89. package/dashboard/dist/assets/{minus-BVbfXGrC.js → minus-KxmVOIB7.js} +1 -1
  90. package/dashboard/dist/assets/pen-line-D1YTNDPw.js +11 -0
  91. package/dashboard/dist/assets/{pencil-I7GE0y29.js → pencil-BAjxSHuh.js} +1 -1
  92. package/dashboard/dist/assets/{proxy-CcYyZZWI.js → proxy-BewnIei6.js} +1 -1
  93. package/dashboard/dist/assets/{refresh-cw-BG9V_T4R.js → refresh-cw-Chc0RcRY.js} +1 -1
  94. package/dashboard/dist/assets/{rows-2-DP6NjQFk.js → rows-2-DWJuw8OM.js} +1 -1
  95. package/dashboard/dist/assets/{search-b78eLlw2.js → search-CPGb2sEw.js} +1 -1
  96. package/dashboard/dist/assets/{shallow-CJEesgtu.js → shallow-Dy0-7n5s.js} +1 -1
  97. package/dashboard/dist/assets/{table-B_lk-a1d.js → table-VI5scWpO.js} +1 -1
  98. package/dashboard/dist/assets/{team-types-Se7f9LfJ.js → team-types-Cu8zCPN3.js} +1 -1
  99. package/dashboard/dist/assets/{terminal-DXx4tvzq.js → terminal-Bqt5c6Ny.js} +1 -1
  100. package/dashboard/dist/assets/{trash-2-CVh9mnRj.js → trash-2-BcTVifbw.js} +1 -1
  101. package/dashboard/dist/assets/{users-Da9zGME5.js → users-BhFAHz4H.js} +1 -1
  102. package/dashboard/dist/assets/{zap-C0zaC7gJ.js → zap-BWbLhgr6.js} +1 -1
  103. package/dashboard/dist/assets/{zh-CN-r3AvxxOL.js → zh-CN-BIRiTdAD.js} +1 -1
  104. package/dashboard/dist/index.html +2 -2
  105. package/dashboard/dist-server/dashboard/src/server/routes/wiki.js +1 -0
  106. package/dashboard/dist-server/dashboard/src/server/routes/wiki.js.map +1 -1
  107. package/dashboard/dist-server/dashboard/src/server/wiki/search.d.ts +14 -14
  108. package/dashboard/dist-server/dashboard/src/server/wiki/search.js +188 -56
  109. package/dashboard/dist-server/dashboard/src/server/wiki/search.js.map +1 -1
  110. package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js +1 -0
  111. package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js.map +1 -1
  112. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.d.ts +37 -0
  113. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js +560 -22
  114. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js.map +1 -1
  115. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-types.d.ts +6 -2
  116. package/dashboard/dist-server/src/types/index.d.ts +9 -0
  117. package/dist/src/cli.js +3 -0
  118. package/dist/src/cli.js.map +1 -1
  119. package/dist/src/commands/delegate.d.ts.map +1 -1
  120. package/dist/src/commands/delegate.js +50 -8
  121. package/dist/src/commands/delegate.js.map +1 -1
  122. package/dist/src/commands/domain.d.ts +9 -0
  123. package/dist/src/commands/domain.d.ts.map +1 -0
  124. package/dist/src/commands/domain.js +445 -0
  125. package/dist/src/commands/domain.js.map +1 -0
  126. package/dist/src/commands/hooks.d.ts +10 -0
  127. package/dist/src/commands/hooks.d.ts.map +1 -1
  128. package/dist/src/commands/hooks.js +132 -22
  129. package/dist/src/commands/hooks.js.map +1 -1
  130. package/dist/src/commands/install.d.ts.map +1 -1
  131. package/dist/src/commands/install.js +82 -204
  132. package/dist/src/commands/install.js.map +1 -1
  133. package/dist/src/commands/kg.d.ts.map +1 -1
  134. package/dist/src/commands/kg.js +183 -90
  135. package/dist/src/commands/kg.js.map +1 -1
  136. package/dist/src/commands/search.d.ts +15 -8
  137. package/dist/src/commands/search.d.ts.map +1 -1
  138. package/dist/src/commands/search.js +205 -59
  139. package/dist/src/commands/search.js.map +1 -1
  140. package/dist/src/commands/spec.d.ts.map +1 -1
  141. package/dist/src/commands/spec.js +9 -1
  142. package/dist/src/commands/spec.js.map +1 -1
  143. package/dist/src/commands/update.d.ts.map +1 -1
  144. package/dist/src/commands/update.js +0 -7
  145. package/dist/src/commands/update.js.map +1 -1
  146. package/dist/src/commands/wiki.d.ts.map +1 -1
  147. package/dist/src/commands/wiki.js +8 -1
  148. package/dist/src/commands/wiki.js.map +1 -1
  149. package/dist/src/commands/workspace.d.ts +12 -0
  150. package/dist/src/commands/workspace.d.ts.map +1 -0
  151. package/dist/src/commands/workspace.js +230 -0
  152. package/dist/src/commands/workspace.js.map +1 -0
  153. package/dist/src/config/cli-tools-config.d.ts +5 -0
  154. package/dist/src/config/cli-tools-config.d.ts.map +1 -1
  155. package/dist/src/config/cli-tools-config.js +31 -0
  156. package/dist/src/config/cli-tools-config.js.map +1 -1
  157. package/dist/src/config/index.d.ts +9 -1
  158. package/dist/src/config/index.d.ts.map +1 -1
  159. package/dist/src/config/index.js +35 -1
  160. package/dist/src/config/index.js.map +1 -1
  161. package/dist/src/core/install-executor.d.ts +31 -0
  162. package/dist/src/core/install-executor.d.ts.map +1 -0
  163. package/dist/src/core/install-executor.js +231 -0
  164. package/dist/src/core/install-executor.js.map +1 -0
  165. package/dist/src/core/install-profile.d.ts +103 -0
  166. package/dist/src/core/install-profile.d.ts.map +1 -0
  167. package/dist/src/core/install-profile.js +225 -0
  168. package/dist/src/core/install-profile.js.map +1 -0
  169. package/dist/src/graph/kg/credibility.d.ts +37 -0
  170. package/dist/src/graph/kg/credibility.d.ts.map +1 -0
  171. package/dist/src/graph/kg/credibility.js +141 -0
  172. package/dist/src/graph/kg/credibility.js.map +1 -0
  173. package/dist/src/graph/kg/db/connection.d.ts +28 -0
  174. package/dist/src/graph/kg/db/connection.d.ts.map +1 -0
  175. package/dist/src/graph/kg/db/connection.js +142 -0
  176. package/dist/src/graph/kg/db/connection.js.map +1 -0
  177. package/dist/src/graph/kg/db/index.d.ts +5 -0
  178. package/dist/src/graph/kg/db/index.d.ts.map +1 -0
  179. package/dist/src/graph/kg/db/index.js +6 -0
  180. package/dist/src/graph/kg/db/index.js.map +1 -0
  181. package/dist/src/graph/kg/db/migrations.d.ts +8 -0
  182. package/dist/src/graph/kg/db/migrations.d.ts.map +1 -0
  183. package/dist/src/graph/kg/db/migrations.js +88 -0
  184. package/dist/src/graph/kg/db/migrations.js.map +1 -0
  185. package/dist/src/graph/kg/db/queries.d.ts +84 -0
  186. package/dist/src/graph/kg/db/queries.d.ts.map +1 -0
  187. package/dist/src/graph/kg/db/queries.js +471 -0
  188. package/dist/src/graph/kg/db/queries.js.map +1 -0
  189. package/dist/src/graph/kg/db/types.d.ts +123 -0
  190. package/dist/src/graph/kg/db/types.d.ts.map +1 -0
  191. package/dist/src/graph/kg/db/types.js +75 -0
  192. package/dist/src/graph/kg/db/types.js.map +1 -0
  193. package/dist/src/graph/kg/engine.d.ts +87 -0
  194. package/dist/src/graph/kg/engine.d.ts.map +1 -0
  195. package/dist/src/graph/kg/engine.js +247 -0
  196. package/dist/src/graph/kg/engine.js.map +1 -0
  197. package/dist/src/graph/kg/extraction/code/code-extractor.d.ts +40 -0
  198. package/dist/src/graph/kg/extraction/code/code-extractor.d.ts.map +1 -0
  199. package/dist/src/graph/kg/extraction/code/code-extractor.js +296 -0
  200. package/dist/src/graph/kg/extraction/code/code-extractor.js.map +1 -0
  201. package/dist/src/graph/kg/extraction/code/dfm-extractor.d.ts +3 -0
  202. package/dist/src/graph/kg/extraction/code/dfm-extractor.d.ts.map +1 -0
  203. package/dist/src/graph/kg/extraction/code/dfm-extractor.js +122 -0
  204. package/dist/src/graph/kg/extraction/code/dfm-extractor.js.map +1 -0
  205. package/dist/src/graph/kg/extraction/code/generated-detection.d.ts +14 -0
  206. package/dist/src/graph/kg/extraction/code/generated-detection.d.ts.map +1 -0
  207. package/dist/src/graph/kg/extraction/code/generated-detection.js +65 -0
  208. package/dist/src/graph/kg/extraction/code/generated-detection.js.map +1 -0
  209. package/dist/src/graph/kg/extraction/code/languages/index.d.ts +9 -0
  210. package/dist/src/graph/kg/extraction/code/languages/index.d.ts.map +1 -0
  211. package/dist/src/graph/kg/extraction/code/languages/index.js +2119 -0
  212. package/dist/src/graph/kg/extraction/code/languages/index.js.map +1 -0
  213. package/dist/src/graph/kg/extraction/code/languages/typescript.d.ts +5 -0
  214. package/dist/src/graph/kg/extraction/code/languages/typescript.d.ts.map +1 -0
  215. package/dist/src/graph/kg/extraction/code/languages/typescript.js +191 -0
  216. package/dist/src/graph/kg/extraction/code/languages/typescript.js.map +1 -0
  217. package/dist/src/graph/kg/extraction/code/liquid-extractor.d.ts +3 -0
  218. package/dist/src/graph/kg/extraction/code/liquid-extractor.d.ts.map +1 -0
  219. package/dist/src/graph/kg/extraction/code/liquid-extractor.js +117 -0
  220. package/dist/src/graph/kg/extraction/code/liquid-extractor.js.map +1 -0
  221. package/dist/src/graph/kg/extraction/code/mybatis-extractor.d.ts +3 -0
  222. package/dist/src/graph/kg/extraction/code/mybatis-extractor.d.ts.map +1 -0
  223. package/dist/src/graph/kg/extraction/code/mybatis-extractor.js +84 -0
  224. package/dist/src/graph/kg/extraction/code/mybatis-extractor.js.map +1 -0
  225. package/dist/src/graph/kg/extraction/code/svelte-extractor.d.ts +3 -0
  226. package/dist/src/graph/kg/extraction/code/svelte-extractor.d.ts.map +1 -0
  227. package/dist/src/graph/kg/extraction/code/svelte-extractor.js +92 -0
  228. package/dist/src/graph/kg/extraction/code/svelte-extractor.js.map +1 -0
  229. package/dist/src/graph/kg/extraction/code/tree-sitter-types.d.ts +61 -0
  230. package/dist/src/graph/kg/extraction/code/tree-sitter-types.d.ts.map +1 -0
  231. package/dist/src/graph/kg/extraction/code/tree-sitter-types.js +53 -0
  232. package/dist/src/graph/kg/extraction/code/tree-sitter-types.js.map +1 -0
  233. package/dist/src/graph/kg/extraction/code/tree-sitter.d.ts +55 -0
  234. package/dist/src/graph/kg/extraction/code/tree-sitter.d.ts.map +1 -0
  235. package/dist/src/graph/kg/extraction/code/tree-sitter.js +227 -0
  236. package/dist/src/graph/kg/extraction/code/tree-sitter.js.map +1 -0
  237. package/dist/src/graph/kg/extraction/code/vue-extractor.d.ts +6 -0
  238. package/dist/src/graph/kg/extraction/code/vue-extractor.d.ts.map +1 -0
  239. package/dist/src/graph/kg/extraction/code/vue-extractor.js +109 -0
  240. package/dist/src/graph/kg/extraction/code/vue-extractor.js.map +1 -0
  241. package/dist/src/graph/kg/extraction/code/wasm-stability.d.ts +44 -0
  242. package/dist/src/graph/kg/extraction/code/wasm-stability.d.ts.map +1 -0
  243. package/dist/src/graph/kg/extraction/code/wasm-stability.js +140 -0
  244. package/dist/src/graph/kg/extraction/code/wasm-stability.js.map +1 -0
  245. package/dist/src/graph/kg/extraction/knowledge/codebase-extractor.d.ts +3 -0
  246. package/dist/src/graph/kg/extraction/knowledge/codebase-extractor.d.ts.map +1 -0
  247. package/dist/src/graph/kg/extraction/knowledge/codebase-extractor.js +149 -0
  248. package/dist/src/graph/kg/extraction/knowledge/codebase-extractor.js.map +1 -0
  249. package/dist/src/graph/kg/extraction/knowledge/domain-extractor.d.ts +4 -0
  250. package/dist/src/graph/kg/extraction/knowledge/domain-extractor.d.ts.map +1 -0
  251. package/dist/src/graph/kg/extraction/knowledge/domain-extractor.js +114 -0
  252. package/dist/src/graph/kg/extraction/knowledge/domain-extractor.js.map +1 -0
  253. package/dist/src/graph/kg/extraction/knowledge/issue-extractor.d.ts +3 -0
  254. package/dist/src/graph/kg/extraction/knowledge/issue-extractor.d.ts.map +1 -0
  255. package/dist/src/graph/kg/extraction/knowledge/issue-extractor.js +84 -0
  256. package/dist/src/graph/kg/extraction/knowledge/issue-extractor.js.map +1 -0
  257. package/dist/src/graph/kg/extraction/knowledge/spec-extractor.d.ts +3 -0
  258. package/dist/src/graph/kg/extraction/knowledge/spec-extractor.d.ts.map +1 -0
  259. package/dist/src/graph/kg/extraction/knowledge/spec-extractor.js +173 -0
  260. package/dist/src/graph/kg/extraction/knowledge/spec-extractor.js.map +1 -0
  261. package/dist/src/graph/kg/extraction/knowledge/wiki-extractor.d.ts +3 -0
  262. package/dist/src/graph/kg/extraction/knowledge/wiki-extractor.d.ts.map +1 -0
  263. package/dist/src/graph/kg/extraction/knowledge/wiki-extractor.js +165 -0
  264. package/dist/src/graph/kg/extraction/knowledge/wiki-extractor.js.map +1 -0
  265. package/dist/src/graph/kg/extraction/orchestrator.d.ts +6 -0
  266. package/dist/src/graph/kg/extraction/orchestrator.d.ts.map +1 -0
  267. package/dist/src/graph/kg/extraction/orchestrator.js +208 -0
  268. package/dist/src/graph/kg/extraction/orchestrator.js.map +1 -0
  269. package/dist/src/graph/kg/index.d.ts +29 -0
  270. package/dist/src/graph/kg/index.d.ts.map +1 -0
  271. package/dist/src/graph/kg/index.js +35 -0
  272. package/dist/src/graph/kg/index.js.map +1 -0
  273. package/dist/src/graph/kg/query/context-builder.d.ts +38 -0
  274. package/dist/src/graph/kg/query/context-builder.d.ts.map +1 -0
  275. package/dist/src/graph/kg/query/context-builder.js +184 -0
  276. package/dist/src/graph/kg/query/context-builder.js.map +1 -0
  277. package/dist/src/graph/kg/query/index.d.ts +8 -0
  278. package/dist/src/graph/kg/query/index.d.ts.map +1 -0
  279. package/dist/src/graph/kg/query/index.js +6 -0
  280. package/dist/src/graph/kg/query/index.js.map +1 -0
  281. package/dist/src/graph/kg/query/scoring.d.ts +19 -0
  282. package/dist/src/graph/kg/query/scoring.d.ts.map +1 -0
  283. package/dist/src/graph/kg/query/scoring.js +158 -0
  284. package/dist/src/graph/kg/query/scoring.js.map +1 -0
  285. package/dist/src/graph/kg/query/search.d.ts +59 -0
  286. package/dist/src/graph/kg/query/search.d.ts.map +1 -0
  287. package/dist/src/graph/kg/query/search.js +158 -0
  288. package/dist/src/graph/kg/query/search.js.map +1 -0
  289. package/dist/src/graph/kg/query/traversal.d.ts +75 -0
  290. package/dist/src/graph/kg/query/traversal.d.ts.map +1 -0
  291. package/dist/src/graph/kg/query/traversal.js +420 -0
  292. package/dist/src/graph/kg/query/traversal.js.map +1 -0
  293. package/dist/src/graph/kg/resolution/callback-synthesizer.d.ts +41 -0
  294. package/dist/src/graph/kg/resolution/callback-synthesizer.d.ts.map +1 -0
  295. package/dist/src/graph/kg/resolution/callback-synthesizer.js +450 -0
  296. package/dist/src/graph/kg/resolution/callback-synthesizer.js.map +1 -0
  297. package/dist/src/graph/kg/resolution/frameworks/index.d.ts +18 -0
  298. package/dist/src/graph/kg/resolution/frameworks/index.d.ts.map +1 -0
  299. package/dist/src/graph/kg/resolution/frameworks/index.js +632 -0
  300. package/dist/src/graph/kg/resolution/frameworks/index.js.map +1 -0
  301. package/dist/src/graph/kg/resolution/import-resolver.d.ts +73 -0
  302. package/dist/src/graph/kg/resolution/import-resolver.d.ts.map +1 -0
  303. package/dist/src/graph/kg/resolution/import-resolver.js +257 -0
  304. package/dist/src/graph/kg/resolution/import-resolver.js.map +1 -0
  305. package/dist/src/graph/kg/resolution/index.d.ts +11 -0
  306. package/dist/src/graph/kg/resolution/index.d.ts.map +1 -0
  307. package/dist/src/graph/kg/resolution/index.js +7 -0
  308. package/dist/src/graph/kg/resolution/index.js.map +1 -0
  309. package/dist/src/graph/kg/resolution/knowledge-resolver.d.ts +22 -0
  310. package/dist/src/graph/kg/resolution/knowledge-resolver.d.ts.map +1 -0
  311. package/dist/src/graph/kg/resolution/knowledge-resolver.js +288 -0
  312. package/dist/src/graph/kg/resolution/knowledge-resolver.js.map +1 -0
  313. package/dist/src/graph/kg/resolution/name-matcher.d.ts +25 -0
  314. package/dist/src/graph/kg/resolution/name-matcher.d.ts.map +1 -0
  315. package/dist/src/graph/kg/resolution/name-matcher.js +162 -0
  316. package/dist/src/graph/kg/resolution/name-matcher.js.map +1 -0
  317. package/dist/src/graph/kg/schema.sql +210 -0
  318. package/dist/src/graph/kg/surface/cli.d.ts +3 -0
  319. package/dist/src/graph/kg/surface/cli.d.ts.map +1 -0
  320. package/dist/src/graph/kg/surface/cli.js +500 -0
  321. package/dist/src/graph/kg/surface/cli.js.map +1 -0
  322. package/dist/src/graph/kg/surface/hook-injector.d.ts +33 -0
  323. package/dist/src/graph/kg/surface/hook-injector.d.ts.map +1 -0
  324. package/dist/src/graph/kg/surface/hook-injector.js +172 -0
  325. package/dist/src/graph/kg/surface/hook-injector.js.map +1 -0
  326. package/dist/src/graph/kg/surface/index.d.ts +6 -0
  327. package/dist/src/graph/kg/surface/index.d.ts.map +1 -0
  328. package/dist/src/graph/kg/surface/index.js +5 -0
  329. package/dist/src/graph/kg/surface/index.js.map +1 -0
  330. package/dist/src/graph/kg/surface/mcp-tools.d.ts +20 -0
  331. package/dist/src/graph/kg/surface/mcp-tools.d.ts.map +1 -0
  332. package/dist/src/graph/kg/surface/mcp-tools.js +253 -0
  333. package/dist/src/graph/kg/surface/mcp-tools.js.map +1 -0
  334. package/dist/src/graph/kg/sync/incremental-sync.d.ts +24 -0
  335. package/dist/src/graph/kg/sync/incremental-sync.d.ts.map +1 -0
  336. package/dist/src/graph/kg/sync/incremental-sync.js +71 -0
  337. package/dist/src/graph/kg/sync/incremental-sync.js.map +1 -0
  338. package/dist/src/graph/kg/sync/index.d.ts +5 -0
  339. package/dist/src/graph/kg/sync/index.d.ts.map +1 -0
  340. package/dist/src/graph/kg/sync/index.js +4 -0
  341. package/dist/src/graph/kg/sync/index.js.map +1 -0
  342. package/dist/src/graph/kg/sync/watch-policy.d.ts +33 -0
  343. package/dist/src/graph/kg/sync/watch-policy.d.ts.map +1 -0
  344. package/dist/src/graph/kg/sync/watch-policy.js +90 -0
  345. package/dist/src/graph/kg/sync/watch-policy.js.map +1 -0
  346. package/dist/src/hooks/constants.d.ts +0 -2
  347. package/dist/src/hooks/constants.d.ts.map +1 -1
  348. package/dist/src/hooks/constants.js +0 -2
  349. package/dist/src/hooks/constants.js.map +1 -1
  350. package/dist/src/hooks/keyword-spec-injector.d.ts +6 -0
  351. package/dist/src/hooks/keyword-spec-injector.d.ts.map +1 -1
  352. package/dist/src/hooks/keyword-spec-injector.js +157 -81
  353. package/dist/src/hooks/keyword-spec-injector.js.map +1 -1
  354. package/dist/src/hooks/kg-auto-init.d.ts +13 -0
  355. package/dist/src/hooks/kg-auto-init.d.ts.map +1 -0
  356. package/dist/src/hooks/kg-auto-init.js +38 -0
  357. package/dist/src/hooks/kg-auto-init.js.map +1 -0
  358. package/dist/src/hooks/kg-context-injector.d.ts +1 -3
  359. package/dist/src/hooks/kg-context-injector.d.ts.map +1 -1
  360. package/dist/src/hooks/kg-context-injector.js +12 -17
  361. package/dist/src/hooks/kg-context-injector.js.map +1 -1
  362. package/dist/src/hooks/kg-sync-hook.d.ts +1 -9
  363. package/dist/src/hooks/kg-sync-hook.d.ts.map +1 -1
  364. package/dist/src/hooks/kg-sync-hook.js +21 -90
  365. package/dist/src/hooks/kg-sync-hook.js.map +1 -1
  366. package/dist/src/hooks/spec-analytics.d.ts +1 -0
  367. package/dist/src/hooks/spec-analytics.d.ts.map +1 -1
  368. package/dist/src/hooks/spec-analytics.js +1 -3
  369. package/dist/src/hooks/spec-analytics.js.map +1 -1
  370. package/dist/src/hooks/spec-injector.d.ts.map +1 -1
  371. package/dist/src/hooks/spec-injector.js +65 -1
  372. package/dist/src/hooks/spec-injector.js.map +1 -1
  373. package/dist/src/i18n/locales/en.d.ts.map +1 -1
  374. package/dist/src/i18n/locales/en.js +52 -9
  375. package/dist/src/i18n/locales/en.js.map +1 -1
  376. package/dist/src/i18n/locales/zh.d.ts.map +1 -1
  377. package/dist/src/i18n/locales/zh.js +52 -9
  378. package/dist/src/i18n/locales/zh.js.map +1 -1
  379. package/dist/src/i18n/types.d.ts +40 -4
  380. package/dist/src/i18n/types.d.ts.map +1 -1
  381. package/dist/src/tools/__tests__/domain-search-debug.d.ts +2 -0
  382. package/dist/src/tools/__tests__/domain-search-debug.d.ts.map +1 -0
  383. package/dist/src/tools/__tests__/domain-search-debug.js +32 -0
  384. package/dist/src/tools/__tests__/domain-search-debug.js.map +1 -0
  385. package/dist/src/tools/domain-loader.d.ts +63 -0
  386. package/dist/src/tools/domain-loader.d.ts.map +1 -0
  387. package/dist/src/tools/domain-loader.js +295 -0
  388. package/dist/src/tools/domain-loader.js.map +1 -0
  389. package/dist/src/tools/domain-matcher.d.ts +24 -0
  390. package/dist/src/tools/domain-matcher.d.ts.map +1 -0
  391. package/dist/src/tools/domain-matcher.js +117 -0
  392. package/dist/src/tools/domain-matcher.js.map +1 -0
  393. package/dist/src/tools/domain-scanner.d.ts +32 -0
  394. package/dist/src/tools/domain-scanner.d.ts.map +1 -0
  395. package/dist/src/tools/domain-scanner.js +263 -0
  396. package/dist/src/tools/domain-scanner.js.map +1 -0
  397. package/dist/src/tools/domain-schema.d.ts +18 -0
  398. package/dist/src/tools/domain-schema.d.ts.map +1 -0
  399. package/dist/src/tools/domain-schema.js +104 -0
  400. package/dist/src/tools/domain-schema.js.map +1 -0
  401. package/dist/src/tools/spec-entry-parser.d.ts +1 -0
  402. package/dist/src/tools/spec-entry-parser.d.ts.map +1 -1
  403. package/dist/src/tools/spec-entry-parser.js +1 -0
  404. package/dist/src/tools/spec-entry-parser.js.map +1 -1
  405. package/dist/src/tools/spec-loader.d.ts +5 -0
  406. package/dist/src/tools/spec-loader.d.ts.map +1 -1
  407. package/dist/src/tools/spec-loader.js +10 -2
  408. package/dist/src/tools/spec-loader.js.map +1 -1
  409. package/dist/src/tui/install-ui/ConfigPanel.d.ts.map +1 -1
  410. package/dist/src/tui/install-ui/ConfigPanel.js +9 -1
  411. package/dist/src/tui/install-ui/ConfigPanel.js.map +1 -1
  412. package/dist/src/tui/install-ui/GroupedHub.d.ts +55 -0
  413. package/dist/src/tui/install-ui/GroupedHub.d.ts.map +1 -0
  414. package/dist/src/tui/install-ui/GroupedHub.js +210 -0
  415. package/dist/src/tui/install-ui/GroupedHub.js.map +1 -0
  416. package/dist/src/tui/install-ui/HooksConfig.d.ts +10 -5
  417. package/dist/src/tui/install-ui/HooksConfig.d.ts.map +1 -1
  418. package/dist/src/tui/install-ui/HooksConfig.js +83 -18
  419. package/dist/src/tui/install-ui/HooksConfig.js.map +1 -1
  420. package/dist/src/tui/install-ui/InstallConfirm.d.ts +1 -30
  421. package/dist/src/tui/install-ui/InstallConfirm.d.ts.map +1 -1
  422. package/dist/src/tui/install-ui/InstallConfirm.js +72 -12
  423. package/dist/src/tui/install-ui/InstallConfirm.js.map +1 -1
  424. package/dist/src/tui/install-ui/InstallExecution.d.ts +4 -21
  425. package/dist/src/tui/install-ui/InstallExecution.d.ts.map +1 -1
  426. package/dist/src/tui/install-ui/InstallExecution.js +89 -260
  427. package/dist/src/tui/install-ui/InstallExecution.js.map +1 -1
  428. package/dist/src/tui/install-ui/InstallFlow.d.ts +3 -7
  429. package/dist/src/tui/install-ui/InstallFlow.d.ts.map +1 -1
  430. package/dist/src/tui/install-ui/InstallFlow.js +45 -267
  431. package/dist/src/tui/install-ui/InstallFlow.js.map +1 -1
  432. package/dist/src/tui/install-ui/InstallHub.d.ts.map +1 -1
  433. package/dist/src/tui/install-ui/InstallHub.js +2 -4
  434. package/dist/src/tui/install-ui/InstallHub.js.map +1 -1
  435. package/dist/src/tui/install-ui/InstallResult.d.ts.map +1 -1
  436. package/dist/src/tui/install-ui/InstallResult.js +1 -5
  437. package/dist/src/tui/install-ui/InstallResult.js.map +1 -1
  438. package/dist/src/tui/install-ui/index.d.ts +5 -1
  439. package/dist/src/tui/install-ui/index.d.ts.map +1 -1
  440. package/dist/src/tui/install-ui/index.js +1 -0
  441. package/dist/src/tui/install-ui/index.js.map +1 -1
  442. package/dist/src/tui/install-ui/types.d.ts +39 -0
  443. package/dist/src/tui/install-ui/types.d.ts.map +1 -1
  444. package/dist/src/tui/install-ui/types.js +1 -1
  445. package/dist/src/tui/install-ui/types.js.map +1 -1
  446. package/dist/src/tui/install-ui/useInstallFlowState.d.ts +69 -0
  447. package/dist/src/tui/install-ui/useInstallFlowState.d.ts.map +1 -0
  448. package/dist/src/tui/install-ui/useInstallFlowState.js +288 -0
  449. package/dist/src/tui/install-ui/useInstallFlowState.js.map +1 -0
  450. package/dist/src/tui/shared/components.d.ts +4 -0
  451. package/dist/src/tui/shared/components.d.ts.map +1 -1
  452. package/dist/src/tui/shared/components.js +4 -0
  453. package/dist/src/tui/shared/components.js.map +1 -1
  454. package/dist/src/tui/shared/index.d.ts +1 -1
  455. package/dist/src/tui/shared/index.d.ts.map +1 -1
  456. package/dist/src/tui/shared/index.js +1 -1
  457. package/dist/src/tui/shared/index.js.map +1 -1
  458. package/dist/src/tui/shared/tokens.d.ts +5 -5
  459. package/dist/src/tui/shared/tokens.js +5 -5
  460. package/dist/src/tui/shared/tokens.js.map +1 -1
  461. package/dist/src/types/index.d.ts +9 -0
  462. package/dist/src/types/index.d.ts.map +1 -1
  463. package/dist/src/utils/cli-format.d.ts +2 -1
  464. package/dist/src/utils/cli-format.d.ts.map +1 -1
  465. package/dist/src/utils/cli-format.js +14 -3
  466. package/dist/src/utils/cli-format.js.map +1 -1
  467. package/dist/src/utils/cooldown-guard.d.ts +17 -0
  468. package/dist/src/utils/cooldown-guard.d.ts.map +1 -0
  469. package/dist/src/utils/cooldown-guard.js +59 -0
  470. package/dist/src/utils/cooldown-guard.js.map +1 -0
  471. package/dist/src/utils/jsonl-log.d.ts.map +1 -1
  472. package/dist/src/utils/jsonl-log.js +2 -1
  473. package/dist/src/utils/jsonl-log.js.map +1 -1
  474. package/dist/src/utils/update-notices.js +17 -4
  475. package/dist/src/utils/update-notices.js.map +1 -1
  476. package/package.json +4 -5
  477. package/workflows/claude-instructions.md +23 -0
  478. package/workflows/codex-instructions.md +22 -0
  479. package/workflows/finish-work.md +25 -0
  480. package/workflows/updates/update-v3-setup.md +7 -15
  481. package/dashboard/dist/assets/McpPage-Im6s4pGR.js +0 -21
  482. package/dashboard/dist/assets/SpecsPage-gr4KX51-.js +0 -36
  483. package/dashboard/dist/assets/folder-B8ODoZfb.js +0 -16
  484. package/dashboard/dist/assets/index-6-yE5Yl9.css +0 -1
  485. package/dashboard/dist/assets/pen-line-CR8GaHt-.js +0 -6
@@ -0,0 +1,632 @@
1
+ // src/graph/kg/resolution/frameworks/index.ts
2
+ // 24 框架解析器注册表 — 从 CodeGraph 复用
3
+ // 参考: codegraph/src/resolution/frameworks/index.ts (21 文件, 24 resolver 实例)
4
+ // ---------------------------------------------------------------------------
5
+ // 框架解析器注册表
6
+ // 完整版: 逐个从 CodeGraph 移植各 resolver
7
+ // 当前: 骨架 + detect 函数 (通过 package.json / 文件特征检测)
8
+ // ---------------------------------------------------------------------------
9
+ function detectByPackageJson(files, deps) {
10
+ const pkgFiles = files.filter(f => f.endsWith('package.json'));
11
+ // 简化: 有 package.json 就假设可能命中 (完整版需读取并解析)
12
+ return pkgFiles.length > 0;
13
+ }
14
+ function detectByFilePattern(files, patterns) {
15
+ return files.some(f => patterns.some(p => p.test(f)));
16
+ }
17
+ /** 在同一目录或子目录中查找目标节点 */
18
+ function sameDir(a, b) {
19
+ const dirA = a.replace(/[/\\][^/\\]+$/, '');
20
+ const dirB = b.replace(/[/\\][^/\\]+$/, '');
21
+ return dirA === dirB;
22
+ }
23
+ /** 按文件后缀过滤节点 */
24
+ function filterByExt(nodes, exts) {
25
+ return nodes.filter(n => exts.some(e => n.filePath.endsWith(e)));
26
+ }
27
+ /** 按名称正则匹配过滤 */
28
+ function filterByName(nodes, pattern) {
29
+ return nodes.filter(n => pattern.test(n.name));
30
+ }
31
+ /** 在 nodes 中找名称匹配的目标 (排除自身) */
32
+ function findByName(nodes, name, excludeId) {
33
+ return nodes.find(n => n.name === name && n.id !== excludeId);
34
+ }
35
+ const RESOLVERS = [
36
+ // --- JavaScript/TypeScript 框架 ---
37
+ {
38
+ name: 'express',
39
+ language: 'javascript',
40
+ detect: (files) => detectByPackageJson(files, ['express']),
41
+ resolve: (nodes) => {
42
+ const edges = [];
43
+ const jsNodes = filterByExt(nodes, ['.js', '.ts', '.mjs']);
44
+ // Connect route handlers to middleware in same file
45
+ const routeHandlers = jsNodes.filter(n => /^(get|post|put|patch|delete|use|all|route)\b/i.test(n.name));
46
+ const middlewares = jsNodes.filter(n => /middleware|auth|validate|logger|cors|helmet/i.test(n.name));
47
+ for (const rh of routeHandlers) {
48
+ for (const mw of middlewares) {
49
+ if (sameDir(rh.filePath, mw.filePath)) {
50
+ edges.push({ source: rh.id, target: mw.id, kind: 'calls' });
51
+ }
52
+ }
53
+ }
54
+ return edges;
55
+ },
56
+ },
57
+ {
58
+ name: 'nestjs',
59
+ language: 'typescript',
60
+ detect: (files) => detectByPackageJson(files, ['@nestjs/core']),
61
+ resolve: (nodes) => {
62
+ const edges = [];
63
+ const tsNodes = filterByExt(nodes, ['.ts']);
64
+ const controllers = tsNodes.filter(n => /Controller$/i.test(n.name) || n.filePath.includes('.controller.'));
65
+ const services = tsNodes.filter(n => /Service$/i.test(n.name) || n.filePath.includes('.service.'));
66
+ // Connect controllers to services via constructor injection naming convention
67
+ for (const ctrl of controllers) {
68
+ const prefix = ctrl.name.replace(/Controller$/i, '');
69
+ for (const svc of services) {
70
+ if (svc.name.startsWith(prefix) || sameDir(ctrl.filePath, svc.filePath)) {
71
+ edges.push({ source: ctrl.id, target: svc.id, kind: 'calls' });
72
+ }
73
+ }
74
+ }
75
+ return edges;
76
+ },
77
+ },
78
+ {
79
+ name: 'react',
80
+ language: 'javascript',
81
+ detect: (files) => detectByPackageJson(files, ['react']),
82
+ resolve: (nodes) => {
83
+ const edges = [];
84
+ const jsxNodes = filterByExt(nodes, ['.tsx', '.jsx', '.js', '.ts']);
85
+ // Components: PascalCase names
86
+ const components = jsxNodes.filter(n => /^[A-Z][a-zA-Z0-9]+$/.test(n.name));
87
+ // Hooks: use* prefix
88
+ const hooks = jsxNodes.filter(n => /^use[A-Z]/.test(n.name));
89
+ for (const comp of components) {
90
+ // Connect component → hooks in same dir (co-located hooks)
91
+ for (const hook of hooks) {
92
+ if (sameDir(comp.filePath, hook.filePath)) {
93
+ edges.push({ source: comp.id, target: hook.id, kind: 'calls' });
94
+ }
95
+ }
96
+ // Connect component → child components in same or child dirs
97
+ for (const child of components) {
98
+ if (child.id !== comp.id && sameDir(comp.filePath, child.filePath)) {
99
+ edges.push({ source: comp.id, target: child.id, kind: 'references' });
100
+ }
101
+ }
102
+ }
103
+ return edges;
104
+ },
105
+ },
106
+ {
107
+ name: 'react-native-legacy',
108
+ language: 'javascript',
109
+ detect: (files) => detectByPackageJson(files, ['react-native']),
110
+ resolve: (nodes) => {
111
+ const edges = [];
112
+ const jsNodes = filterByExt(nodes, ['.tsx', '.jsx', '.js', '.ts']);
113
+ const nativeNodes = filterByExt(nodes, ['.java', '.kt', '.m', '.mm', '.swift']);
114
+ // Connect NativeModules references to native implementations
115
+ const nativeRefs = jsNodes.filter(n => /NativeModule|requireNativeComponent/i.test(n.name));
116
+ for (const ref of nativeRefs) {
117
+ for (const impl of nativeNodes) {
118
+ if (impl.name.toLowerCase().includes(ref.name.replace(/NativeModule/i, '').toLowerCase())) {
119
+ edges.push({ source: ref.id, target: impl.id, kind: 'references' });
120
+ }
121
+ }
122
+ }
123
+ return edges;
124
+ },
125
+ },
126
+ {
127
+ name: 'react-native-turbomodules',
128
+ language: 'javascript',
129
+ detect: (files) => detectByPackageJson(files, ['react-native']) && files.some(f => f.includes('TurboModule')),
130
+ resolve: (nodes) => {
131
+ const edges = [];
132
+ // TurboModule specs (JS/TS) → native implementations (C++/ObjC/Java)
133
+ const specNodes = nodes.filter(n => /TurboModule|NativeSpec|Spec$/i.test(n.name) && /\.(ts|js|tsx)$/.test(n.filePath));
134
+ const nativeImpls = filterByExt(nodes, ['.cpp', '.h', '.mm', '.m', '.java', '.kt']);
135
+ for (const spec of specNodes) {
136
+ const baseName = spec.name.replace(/(TurboModule|NativeSpec|Spec)$/i, '');
137
+ for (const impl of nativeImpls) {
138
+ if (impl.name.toLowerCase().includes(baseName.toLowerCase())) {
139
+ edges.push({ source: spec.id, target: impl.id, kind: 'references' });
140
+ }
141
+ }
142
+ }
143
+ return edges;
144
+ },
145
+ },
146
+ {
147
+ name: 'expo-modules',
148
+ language: 'typescript',
149
+ detect: (files) => detectByPackageJson(files, ['expo']),
150
+ resolve: (nodes) => {
151
+ const edges = [];
152
+ // Expo module definitions → handler functions
153
+ const moduleDefs = nodes.filter(n => /Module$|ExpoModule/i.test(n.name));
154
+ const handlers = nodes.filter(n => /handler|Handler|onEvent|Events/i.test(n.name));
155
+ for (const mod of moduleDefs) {
156
+ for (const handler of handlers) {
157
+ if (sameDir(mod.filePath, handler.filePath)) {
158
+ edges.push({ source: mod.id, target: handler.id, kind: 'calls' });
159
+ }
160
+ }
161
+ }
162
+ return edges;
163
+ },
164
+ },
165
+ {
166
+ name: 'svelte',
167
+ language: 'javascript',
168
+ detect: (files) => detectByFilePattern(files, [/\.svelte$/]),
169
+ resolve: (nodes) => {
170
+ const edges = [];
171
+ // Connect store subscribers to reactive declarations
172
+ const stores = nodes.filter(n => /Store$|store/i.test(n.name) && /\.(ts|js)$/.test(n.filePath));
173
+ const svelteComponents = nodes.filter(n => n.filePath.endsWith('.svelte'));
174
+ for (const comp of svelteComponents) {
175
+ for (const store of stores) {
176
+ if (sameDir(comp.filePath, store.filePath) || store.filePath.includes('/stores/')) {
177
+ edges.push({ source: comp.id, target: store.id, kind: 'references' });
178
+ }
179
+ }
180
+ }
181
+ return edges;
182
+ },
183
+ },
184
+ {
185
+ name: 'vue',
186
+ language: 'javascript',
187
+ detect: (files) => detectByFilePattern(files, [/\.vue$/]),
188
+ resolve: (nodes) => {
189
+ const edges = [];
190
+ const vueComponents = nodes.filter(n => n.filePath.endsWith('.vue'));
191
+ // Composables: use* functions in .ts files
192
+ const composables = nodes.filter(n => /^use[A-Z]/.test(n.name) && /\.(ts|js)$/.test(n.filePath));
193
+ for (const comp of vueComponents) {
194
+ // Connect setup() composables
195
+ for (const c of composables) {
196
+ if (sameDir(comp.filePath, c.filePath) || c.filePath.includes('/composables/')) {
197
+ edges.push({ source: comp.id, target: c.id, kind: 'calls' });
198
+ }
199
+ }
200
+ // Connect child components
201
+ for (const child of vueComponents) {
202
+ if (child.id !== comp.id && sameDir(comp.filePath, child.filePath)) {
203
+ edges.push({ source: comp.id, target: child.id, kind: 'references' });
204
+ }
205
+ }
206
+ }
207
+ return edges;
208
+ },
209
+ },
210
+ // --- Python 框架 ---
211
+ {
212
+ name: 'django',
213
+ language: 'python',
214
+ detect: (files) => files.some(f => f.includes('manage.py') || f.includes('settings.py')),
215
+ resolve: (nodes) => {
216
+ const edges = [];
217
+ const pyNodes = filterByExt(nodes, ['.py']);
218
+ const views = pyNodes.filter(n => n.filePath.includes('views.py') || n.filePath.includes('/views/'));
219
+ const models = pyNodes.filter(n => n.filePath.includes('models.py') || n.filePath.includes('/models/'));
220
+ const serializers = pyNodes.filter(n => n.filePath.includes('serializers.py'));
221
+ const urls = pyNodes.filter(n => n.filePath.includes('urls.py'));
222
+ // url patterns → view functions
223
+ for (const url of urls) {
224
+ for (const view of views) {
225
+ if (sameDir(url.filePath, view.filePath)) {
226
+ edges.push({ source: url.id, target: view.id, kind: 'calls' });
227
+ }
228
+ }
229
+ }
230
+ // model → serializer → view chain
231
+ for (const model of models) {
232
+ for (const ser of serializers) {
233
+ if (sameDir(model.filePath, ser.filePath)) {
234
+ edges.push({ source: ser.id, target: model.id, kind: 'references' });
235
+ }
236
+ }
237
+ }
238
+ for (const ser of serializers) {
239
+ for (const view of views) {
240
+ if (sameDir(ser.filePath, view.filePath)) {
241
+ edges.push({ source: view.id, target: ser.id, kind: 'references' });
242
+ }
243
+ }
244
+ }
245
+ return edges;
246
+ },
247
+ },
248
+ {
249
+ name: 'flask',
250
+ language: 'python',
251
+ detect: (files) => files.some(f => f.includes('app.py') || f.includes('wsgi.py')),
252
+ resolve: (nodes) => {
253
+ const edges = [];
254
+ const pyNodes = filterByExt(nodes, ['.py']);
255
+ // @app.route decorators → handler functions (route handlers typically in same module)
256
+ const routeFiles = pyNodes.filter(n => n.filePath.includes('routes') || n.filePath.includes('views') || n.filePath.includes('app.py'));
257
+ const handlers = pyNodes.filter(n => /^(get|post|put|delete|index|create|update|show|list|detail)/i.test(n.name));
258
+ for (const rf of routeFiles) {
259
+ for (const h of handlers) {
260
+ if (sameDir(rf.filePath, h.filePath) && rf.id !== h.id) {
261
+ edges.push({ source: rf.id, target: h.id, kind: 'calls' });
262
+ }
263
+ }
264
+ }
265
+ return edges;
266
+ },
267
+ },
268
+ {
269
+ name: 'fastapi',
270
+ language: 'python',
271
+ detect: (files) => files.some(f => f.includes('main.py')),
272
+ resolve: (nodes) => {
273
+ const edges = [];
274
+ const pyNodes = filterByExt(nodes, ['.py']);
275
+ // @router decorators → endpoint functions
276
+ const routers = pyNodes.filter(n => n.filePath.includes('router') || n.filePath.includes('route') || n.filePath.includes('api'));
277
+ const endpoints = pyNodes.filter(n => /^(get|post|put|patch|delete|create|read|update|list)/i.test(n.name));
278
+ for (const router of routers) {
279
+ for (const ep of endpoints) {
280
+ if (sameDir(router.filePath, ep.filePath) && router.id !== ep.id) {
281
+ edges.push({ source: router.id, target: ep.id, kind: 'calls' });
282
+ }
283
+ }
284
+ }
285
+ return edges;
286
+ },
287
+ },
288
+ // --- Ruby 框架 ---
289
+ {
290
+ name: 'rails',
291
+ language: 'ruby',
292
+ detect: (files) => files.some(f => f.includes('Gemfile') || f.includes('config/routes.rb')),
293
+ resolve: (nodes) => {
294
+ const edges = [];
295
+ const rbNodes = filterByExt(nodes, ['.rb']);
296
+ const routes = rbNodes.filter(n => n.filePath.includes('routes.rb'));
297
+ const controllers = rbNodes.filter(n => n.filePath.includes('/controllers/') || /Controller$/i.test(n.name));
298
+ const models = rbNodes.filter(n => n.filePath.includes('/models/'));
299
+ // routes → controllers
300
+ for (const route of routes) {
301
+ for (const ctrl of controllers) {
302
+ edges.push({ source: route.id, target: ctrl.id, kind: 'calls' });
303
+ }
304
+ }
305
+ // controllers → models (by naming convention: UsersController → User model)
306
+ for (const ctrl of controllers) {
307
+ const modelName = ctrl.name.replace(/Controller$/i, '').replace(/s$/, '');
308
+ for (const model of models) {
309
+ if (model.name.toLowerCase() === modelName.toLowerCase()) {
310
+ edges.push({ source: ctrl.id, target: model.id, kind: 'references' });
311
+ }
312
+ }
313
+ }
314
+ return edges;
315
+ },
316
+ },
317
+ // --- Go 框架 ---
318
+ {
319
+ name: 'gin',
320
+ language: 'go',
321
+ detect: (files) => files.some(f => f.endsWith('go.mod')),
322
+ resolve: (nodes) => {
323
+ const edges = [];
324
+ const goNodes = filterByExt(nodes, ['.go']);
325
+ // router.Group/GET/POST → handler functions
326
+ const routers = goNodes.filter(n => /router|route|Router|Route|Setup/i.test(n.name));
327
+ const handlers = goNodes.filter(n => /Handler$|handler$|Controller$|controller$/i.test(n.name)
328
+ || /^(Get|Post|Put|Delete|Create|Update|List|Show|Handle)/i.test(n.name));
329
+ for (const router of routers) {
330
+ for (const handler of handlers) {
331
+ if (sameDir(router.filePath, handler.filePath) || handler.filePath.includes('/handler')) {
332
+ edges.push({ source: router.id, target: handler.id, kind: 'calls' });
333
+ }
334
+ }
335
+ }
336
+ return edges;
337
+ },
338
+ },
339
+ {
340
+ name: 'go-standard',
341
+ language: 'go',
342
+ detect: (files) => files.some(f => f.endsWith('go.mod')),
343
+ resolve: (nodes) => {
344
+ const edges = [];
345
+ const goNodes = filterByExt(nodes, ['.go']);
346
+ // http.HandleFunc → handler functions
347
+ const mainFiles = goNodes.filter(n => n.filePath.includes('main.go') || n.filePath.includes('server.go') || /^main$|^serve/i.test(n.name));
348
+ const handlers = goNodes.filter(n => /Handler$|handler$|^Handle/i.test(n.name) || /^(serve|handle)[A-Z]/i.test(n.name));
349
+ for (const main of mainFiles) {
350
+ for (const handler of handlers) {
351
+ if (main.id !== handler.id) {
352
+ edges.push({ source: main.id, target: handler.id, kind: 'calls' });
353
+ }
354
+ }
355
+ }
356
+ return edges;
357
+ },
358
+ },
359
+ // --- Rust 框架 ---
360
+ {
361
+ name: 'actix-web',
362
+ language: 'rust',
363
+ detect: (files) => files.some(f => f.endsWith('Cargo.toml')),
364
+ resolve: (nodes) => {
365
+ const edges = [];
366
+ const rsNodes = filterByExt(nodes, ['.rs']);
367
+ // #[get/post] attribute handlers → service/model functions
368
+ const handlers = rsNodes.filter(n => /^(get|post|put|delete|create|update|index|show|list)/i.test(n.name)
369
+ || n.filePath.includes('/handlers/') || n.filePath.includes('/routes/'));
370
+ const services = rsNodes.filter(n => n.filePath.includes('/services/') || n.filePath.includes('/models/'));
371
+ for (const h of handlers) {
372
+ for (const s of services) {
373
+ if (h.id !== s.id) {
374
+ edges.push({ source: h.id, target: s.id, kind: 'calls' });
375
+ }
376
+ }
377
+ }
378
+ return edges;
379
+ },
380
+ },
381
+ {
382
+ name: 'axum',
383
+ language: 'rust',
384
+ detect: (files) => files.some(f => f.endsWith('Cargo.toml')),
385
+ resolve: (nodes) => {
386
+ const edges = [];
387
+ const rsNodes = filterByExt(nodes, ['.rs']);
388
+ // Router::new().route() → handler functions
389
+ const routerFiles = rsNodes.filter(n => n.filePath.includes('router') || n.filePath.includes('main.rs') || /^router|^app/i.test(n.name));
390
+ const handlers = rsNodes.filter(n => n.filePath.includes('/handlers/') || /handler|_handler$/i.test(n.name));
391
+ for (const router of routerFiles) {
392
+ for (const handler of handlers) {
393
+ if (router.id !== handler.id) {
394
+ edges.push({ source: router.id, target: handler.id, kind: 'calls' });
395
+ }
396
+ }
397
+ }
398
+ return edges;
399
+ },
400
+ },
401
+ // --- Java 框架 ---
402
+ {
403
+ name: 'spring',
404
+ language: 'java',
405
+ detect: (files) => files.some(f => f.includes('pom.xml') || f.includes('build.gradle')),
406
+ resolve: (nodes) => {
407
+ const edges = [];
408
+ const javaNodes = filterByExt(nodes, ['.java', '.kt']);
409
+ const controllers = javaNodes.filter(n => /Controller$/i.test(n.name));
410
+ const services = javaNodes.filter(n => /Service$/i.test(n.name) || /ServiceImpl$/i.test(n.name));
411
+ const repos = javaNodes.filter(n => /Repository$/i.test(n.name) || /Repo$/i.test(n.name));
412
+ // @RequestMapping/@GetMapping controllers → @Autowired services
413
+ for (const ctrl of controllers) {
414
+ const prefix = ctrl.name.replace(/Controller$/i, '');
415
+ for (const svc of services) {
416
+ if (svc.name.toLowerCase().includes(prefix.toLowerCase())) {
417
+ edges.push({ source: ctrl.id, target: svc.id, kind: 'calls' });
418
+ }
419
+ }
420
+ }
421
+ // services → repositories
422
+ for (const svc of services) {
423
+ const prefix = svc.name.replace(/(Service|ServiceImpl)$/i, '');
424
+ for (const repo of repos) {
425
+ if (repo.name.toLowerCase().includes(prefix.toLowerCase())) {
426
+ edges.push({ source: svc.id, target: repo.id, kind: 'calls' });
427
+ }
428
+ }
429
+ }
430
+ return edges;
431
+ },
432
+ },
433
+ {
434
+ name: 'play-framework',
435
+ language: 'java',
436
+ detect: (files) => files.some(f => f.includes('build.sbt')),
437
+ resolve: (nodes) => {
438
+ const edges = [];
439
+ const codeNodes = filterByExt(nodes, ['.java', '.scala']);
440
+ // routes file entries → controller actions
441
+ const routeNodes = nodes.filter(n => n.filePath.includes('routes') || n.filePath.includes('conf/'));
442
+ const controllers = codeNodes.filter(n => /Controller$/i.test(n.name) || n.filePath.includes('/controllers/'));
443
+ for (const route of routeNodes) {
444
+ for (const ctrl of controllers) {
445
+ edges.push({ source: route.id, target: ctrl.id, kind: 'calls' });
446
+ }
447
+ }
448
+ return edges;
449
+ },
450
+ },
451
+ // --- PHP 框架 ---
452
+ {
453
+ name: 'laravel',
454
+ language: 'php',
455
+ detect: (files) => files.some(f => f.includes('artisan')),
456
+ resolve: (nodes) => {
457
+ const edges = [];
458
+ const phpNodes = filterByExt(nodes, ['.php']);
459
+ // Route::get/post → controller methods
460
+ const routeFiles = phpNodes.filter(n => n.filePath.includes('routes/') || n.filePath.includes('web.php') || n.filePath.includes('api.php'));
461
+ const controllers = phpNodes.filter(n => /Controller$/i.test(n.name) || n.filePath.includes('/Controllers/'));
462
+ const models = phpNodes.filter(n => n.filePath.includes('/Models/'));
463
+ for (const route of routeFiles) {
464
+ for (const ctrl of controllers) {
465
+ edges.push({ source: route.id, target: ctrl.id, kind: 'calls' });
466
+ }
467
+ }
468
+ // controllers → models by naming (UserController → User model)
469
+ for (const ctrl of controllers) {
470
+ const modelName = ctrl.name.replace(/Controller$/i, '');
471
+ for (const model of models) {
472
+ if (model.name.toLowerCase() === modelName.toLowerCase()) {
473
+ edges.push({ source: ctrl.id, target: model.id, kind: 'references' });
474
+ }
475
+ }
476
+ }
477
+ return edges;
478
+ },
479
+ },
480
+ {
481
+ name: 'drupal',
482
+ language: 'php',
483
+ detect: (files) => files.some(f => f.includes('core/lib/Drupal')),
484
+ resolve: (nodes) => {
485
+ const edges = [];
486
+ const phpNodes = filterByExt(nodes, ['.php', '.module']);
487
+ // Connect hook implementations to hook definitions
488
+ const hookImpls = phpNodes.filter(n => /_hook_|^hook_/i.test(n.name) || n.filePath.endsWith('.module'));
489
+ const hookDefs = phpNodes.filter(n => n.filePath.includes('core/') || /Hook$|hook_info/i.test(n.name));
490
+ for (const impl of hookImpls) {
491
+ for (const def of hookDefs) {
492
+ if (def.id !== impl.id) {
493
+ const hookName = impl.name.replace(/^.*_hook_/i, 'hook_');
494
+ if (def.name.toLowerCase().includes(hookName.toLowerCase())) {
495
+ edges.push({ source: impl.id, target: def.id, kind: 'references' });
496
+ }
497
+ }
498
+ }
499
+ }
500
+ return edges;
501
+ },
502
+ },
503
+ // --- C# 框架 ---
504
+ {
505
+ name: 'aspnet',
506
+ language: 'csharp',
507
+ detect: (files) => files.some(f => f.endsWith('.csproj') || f.endsWith('.sln')),
508
+ resolve: (nodes) => {
509
+ const edges = [];
510
+ const csNodes = filterByExt(nodes, ['.cs']);
511
+ // [HttpGet/Post] attributes → controller actions
512
+ const controllers = csNodes.filter(n => /Controller$/i.test(n.name) || n.filePath.includes('/Controllers/'));
513
+ const services = csNodes.filter(n => /Service$/i.test(n.name) || n.filePath.includes('/Services/'));
514
+ const repos = csNodes.filter(n => /Repository$/i.test(n.name) || n.filePath.includes('/Repositories/'));
515
+ for (const ctrl of controllers) {
516
+ const prefix = ctrl.name.replace(/Controller$/i, '');
517
+ for (const svc of services) {
518
+ if (svc.name.toLowerCase().includes(prefix.toLowerCase())) {
519
+ edges.push({ source: ctrl.id, target: svc.id, kind: 'calls' });
520
+ }
521
+ }
522
+ }
523
+ for (const svc of services) {
524
+ const prefix = svc.name.replace(/Service$/i, '');
525
+ for (const repo of repos) {
526
+ if (repo.name.toLowerCase().includes(prefix.toLowerCase())) {
527
+ edges.push({ source: svc.id, target: repo.id, kind: 'calls' });
528
+ }
529
+ }
530
+ }
531
+ return edges;
532
+ },
533
+ },
534
+ // --- Swift 框架 ---
535
+ {
536
+ name: 'swiftui',
537
+ language: 'swift',
538
+ detect: (files) => detectByFilePattern(files, [/\.swift$/]),
539
+ resolve: (nodes) => {
540
+ const edges = [];
541
+ const swiftNodes = filterByExt(nodes, ['.swift']);
542
+ // @State/@Binding to View body references
543
+ const views = swiftNodes.filter(n => /View$/i.test(n.name) || n.filePath.includes('View'));
544
+ const viewModels = swiftNodes.filter(n => /ViewModel$/i.test(n.name) || /ObservableObject|StateObject/i.test(n.name));
545
+ // View → ViewModel
546
+ for (const view of views) {
547
+ const prefix = view.name.replace(/View$/i, '');
548
+ for (const vm of viewModels) {
549
+ if (vm.name.toLowerCase().includes(prefix.toLowerCase())) {
550
+ edges.push({ source: view.id, target: vm.id, kind: 'references' });
551
+ }
552
+ }
553
+ }
554
+ // View → child views in same dir
555
+ for (const parent of views) {
556
+ for (const child of views) {
557
+ if (parent.id !== child.id && sameDir(parent.filePath, child.filePath)) {
558
+ edges.push({ source: parent.id, target: child.id, kind: 'references' });
559
+ }
560
+ }
561
+ }
562
+ return edges;
563
+ },
564
+ },
565
+ {
566
+ name: 'uikit',
567
+ language: 'swift',
568
+ detect: (files) => detectByFilePattern(files, [/\.swift$/]),
569
+ resolve: (nodes) => {
570
+ const edges = [];
571
+ const swiftNodes = filterByExt(nodes, ['.swift']);
572
+ const storyboards = filterByExt(nodes, ['.storyboard', '.xib']);
573
+ // @IBAction/@IBOutlet → storyboard references
574
+ const viewControllers = swiftNodes.filter(n => /ViewController$/i.test(n.name) || n.filePath.includes('ViewController'));
575
+ const actions = swiftNodes.filter(n => /Action$|^action|^handle|^on[A-Z]/i.test(n.name));
576
+ // ViewController → storyboard
577
+ for (const vc of viewControllers) {
578
+ for (const sb of storyboards) {
579
+ if (sameDir(vc.filePath, sb.filePath)) {
580
+ edges.push({ source: vc.id, target: sb.id, kind: 'references' });
581
+ }
582
+ }
583
+ }
584
+ // ViewController → actions in same file
585
+ for (const vc of viewControllers) {
586
+ for (const action of actions) {
587
+ if (sameDir(vc.filePath, action.filePath) && vc.id !== action.id) {
588
+ edges.push({ source: vc.id, target: action.id, kind: 'calls' });
589
+ }
590
+ }
591
+ }
592
+ return edges;
593
+ },
594
+ },
595
+ {
596
+ name: 'vapor',
597
+ language: 'swift',
598
+ detect: (files) => files.some(f => f.includes('Package.swift')),
599
+ resolve: (nodes) => {
600
+ const edges = [];
601
+ const swiftNodes = filterByExt(nodes, ['.swift']);
602
+ // app.get/post route closures → handler functions
603
+ const routeFiles = swiftNodes.filter(n => n.filePath.includes('routes') || n.filePath.includes('Routes') || /^routes$|^configure$/i.test(n.name));
604
+ const controllers = swiftNodes.filter(n => /Controller$/i.test(n.name) || n.filePath.includes('/Controllers/'));
605
+ const handlers = swiftNodes.filter(n => /handler|Handler|^(get|post|create|update|delete|index|show)/i.test(n.name));
606
+ for (const route of routeFiles) {
607
+ for (const ctrl of controllers) {
608
+ edges.push({ source: route.id, target: ctrl.id, kind: 'calls' });
609
+ }
610
+ for (const handler of handlers) {
611
+ if (route.id !== handler.id && sameDir(route.filePath, handler.filePath)) {
612
+ edges.push({ source: route.id, target: handler.id, kind: 'calls' });
613
+ }
614
+ }
615
+ }
616
+ return edges;
617
+ },
618
+ },
619
+ ];
620
+ // ---------------------------------------------------------------------------
621
+ // 查询 API
622
+ // ---------------------------------------------------------------------------
623
+ export function getRegisteredFrameworks() {
624
+ return RESOLVERS;
625
+ }
626
+ export function detectFrameworks(files) {
627
+ return RESOLVERS.filter(r => r.detect(files)).map(r => r.name);
628
+ }
629
+ export function getFrameworkResolver(name) {
630
+ return RESOLVERS.find(r => r.name === name) ?? null;
631
+ }
632
+ //# sourceMappingURL=index.js.map