spectra-cli 4.1.1 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. package/README.md +1 -1
  2. package/dist/adapters/go-adapter.d.ts.map +1 -1
  3. package/dist/adapters/go-adapter.js +2 -0
  4. package/dist/adapters/go-adapter.js.map +1 -1
  5. package/dist/adapters/index.d.ts +1 -1
  6. package/dist/adapters/index.d.ts.map +1 -1
  7. package/dist/adapters/java-adapter.d.ts.map +1 -1
  8. package/dist/adapters/java-adapter.js +2 -0
  9. package/dist/adapters/java-adapter.js.map +1 -1
  10. package/dist/adapters/language-adapter.d.ts +47 -9
  11. package/dist/adapters/language-adapter.d.ts.map +1 -1
  12. package/dist/adapters/python-adapter.d.ts +34 -6
  13. package/dist/adapters/python-adapter.d.ts.map +1 -1
  14. package/dist/adapters/python-adapter.js +157 -59
  15. package/dist/adapters/python-adapter.js.map +1 -1
  16. package/dist/adapters/ts-js-adapter.d.ts +13 -5
  17. package/dist/adapters/ts-js-adapter.d.ts.map +1 -1
  18. package/dist/adapters/ts-js-adapter.js +55 -14
  19. package/dist/adapters/ts-js-adapter.js.map +1 -1
  20. package/dist/batch/batch-orchestrator.d.ts +30 -4
  21. package/dist/batch/batch-orchestrator.d.ts.map +1 -1
  22. package/dist/batch/batch-orchestrator.js +284 -7
  23. package/dist/batch/batch-orchestrator.js.map +1 -1
  24. package/dist/batch/delta-regenerator.d.ts +2 -2
  25. package/dist/batch/delta-regenerator.d.ts.map +1 -1
  26. package/dist/batch/delta-regenerator.js.map +1 -1
  27. package/dist/batch/module-grouper.d.ts +2 -2
  28. package/dist/batch/module-grouper.d.ts.map +1 -1
  29. package/dist/batch/module-grouper.js +1 -1
  30. package/dist/batch/module-grouper.js.map +1 -1
  31. package/dist/cli/commands/graph.js +1 -1
  32. package/dist/cli/commands/graph.js.map +1 -1
  33. package/dist/cli/commands/index.d.ts +8 -0
  34. package/dist/cli/commands/index.d.ts.map +1 -0
  35. package/dist/cli/commands/index.js +274 -0
  36. package/dist/cli/commands/index.js.map +1 -0
  37. package/dist/cli/commands/query.d.ts.map +1 -1
  38. package/dist/cli/commands/query.js +3 -1
  39. package/dist/cli/commands/query.js.map +1 -1
  40. package/dist/cli/index.js +9 -9
  41. package/dist/cli/index.js.map +1 -1
  42. package/dist/cli/utils/parse-args.d.ts +13 -1
  43. package/dist/cli/utils/parse-args.d.ts.map +1 -1
  44. package/dist/cli/utils/parse-args.js +79 -2
  45. package/dist/cli/utils/parse-args.js.map +1 -1
  46. package/dist/core/ast-analyzer.d.ts.map +1 -1
  47. package/dist/core/ast-analyzer.js +79 -5
  48. package/dist/core/ast-analyzer.js.map +1 -1
  49. package/dist/core/import-resolver.d.ts +90 -0
  50. package/dist/core/import-resolver.d.ts.map +1 -0
  51. package/dist/core/import-resolver.js +273 -0
  52. package/dist/core/import-resolver.js.map +1 -0
  53. package/dist/core/query-mappers/base-mapper.d.ts +13 -0
  54. package/dist/core/query-mappers/base-mapper.d.ts.map +1 -1
  55. package/dist/core/query-mappers/go-mapper.d.ts +68 -0
  56. package/dist/core/query-mappers/go-mapper.d.ts.map +1 -1
  57. package/dist/core/query-mappers/go-mapper.js +421 -0
  58. package/dist/core/query-mappers/go-mapper.js.map +1 -1
  59. package/dist/core/query-mappers/java-mapper.d.ts +196 -0
  60. package/dist/core/query-mappers/java-mapper.d.ts.map +1 -1
  61. package/dist/core/query-mappers/java-mapper.js +600 -0
  62. package/dist/core/query-mappers/java-mapper.js.map +1 -1
  63. package/dist/core/query-mappers/python-mapper.d.ts +55 -0
  64. package/dist/core/query-mappers/python-mapper.d.ts.map +1 -1
  65. package/dist/core/query-mappers/python-mapper.js +273 -0
  66. package/dist/core/query-mappers/python-mapper.js.map +1 -1
  67. package/dist/core/query-mappers/typescript-mapper.d.ts +102 -0
  68. package/dist/core/query-mappers/typescript-mapper.d.ts.map +1 -1
  69. package/dist/core/query-mappers/typescript-mapper.js +470 -0
  70. package/dist/core/query-mappers/typescript-mapper.js.map +1 -1
  71. package/dist/core/single-spec-orchestrator.d.ts.map +1 -1
  72. package/dist/core/single-spec-orchestrator.js +146 -9
  73. package/dist/core/single-spec-orchestrator.js.map +1 -1
  74. package/dist/core/tree-sitter-analyzer.d.ts +6 -0
  75. package/dist/core/tree-sitter-analyzer.d.ts.map +1 -1
  76. package/dist/core/tree-sitter-analyzer.js +33 -1
  77. package/dist/core/tree-sitter-analyzer.js.map +1 -1
  78. package/dist/core/tree-sitter-fallback.d.ts +7 -4
  79. package/dist/core/tree-sitter-fallback.d.ts.map +1 -1
  80. package/dist/core/tree-sitter-fallback.js +157 -12
  81. package/dist/core/tree-sitter-fallback.js.map +1 -1
  82. package/dist/extraction/extraction-types.d.ts +25 -25
  83. package/dist/generator/index-generator.d.ts +3 -3
  84. package/dist/generator/index-generator.d.ts.map +1 -1
  85. package/dist/generator/index-generator.js +1 -1
  86. package/dist/generator/index-generator.js.map +1 -1
  87. package/dist/graph/directory-graph.d.ts +14 -4
  88. package/dist/graph/directory-graph.d.ts.map +1 -1
  89. package/dist/graph/directory-graph.js +71 -128
  90. package/dist/graph/directory-graph.js.map +1 -1
  91. package/dist/graph/mermaid-renderer.d.ts +8 -5
  92. package/dist/graph/mermaid-renderer.d.ts.map +1 -1
  93. package/dist/graph/mermaid-renderer.js +3 -3
  94. package/dist/graph/mermaid-renderer.js.map +1 -1
  95. package/dist/graph/topological-sort.d.ts +13 -6
  96. package/dist/graph/topological-sort.d.ts.map +1 -1
  97. package/dist/graph/topological-sort.js +2 -2
  98. package/dist/graph/topological-sort.js.map +1 -1
  99. package/dist/knowledge-graph/call-resolver.d.ts +64 -0
  100. package/dist/knowledge-graph/call-resolver.d.ts.map +1 -0
  101. package/dist/knowledge-graph/call-resolver.js +323 -0
  102. package/dist/knowledge-graph/call-resolver.js.map +1 -0
  103. package/dist/knowledge-graph/import-resolver.d.ts +114 -0
  104. package/dist/knowledge-graph/import-resolver.d.ts.map +1 -0
  105. package/dist/knowledge-graph/import-resolver.js +537 -0
  106. package/dist/knowledge-graph/import-resolver.js.map +1 -0
  107. package/dist/knowledge-graph/incremental.d.ts +110 -0
  108. package/dist/knowledge-graph/incremental.d.ts.map +1 -0
  109. package/dist/knowledge-graph/incremental.js +410 -0
  110. package/dist/knowledge-graph/incremental.js.map +1 -0
  111. package/dist/knowledge-graph/index.d.ts +74 -0
  112. package/dist/knowledge-graph/index.d.ts.map +1 -0
  113. package/dist/knowledge-graph/index.js +156 -0
  114. package/dist/knowledge-graph/index.js.map +1 -0
  115. package/dist/knowledge-graph/module-derivation.d.ts +238 -0
  116. package/dist/knowledge-graph/module-derivation.d.ts.map +1 -0
  117. package/dist/knowledge-graph/module-derivation.js +418 -0
  118. package/dist/knowledge-graph/module-derivation.js.map +1 -0
  119. package/dist/knowledge-graph/persistence.d.ts +270 -0
  120. package/dist/knowledge-graph/persistence.d.ts.map +1 -0
  121. package/dist/knowledge-graph/persistence.js +226 -0
  122. package/dist/knowledge-graph/persistence.js.map +1 -0
  123. package/dist/knowledge-graph/query-helpers.d.ts +164 -0
  124. package/dist/knowledge-graph/query-helpers.d.ts.map +1 -0
  125. package/dist/knowledge-graph/query-helpers.js +394 -0
  126. package/dist/knowledge-graph/query-helpers.js.map +1 -0
  127. package/dist/knowledge-graph/unified-graph.d.ts +310 -0
  128. package/dist/knowledge-graph/unified-graph.d.ts.map +1 -0
  129. package/dist/knowledge-graph/unified-graph.js +182 -0
  130. package/dist/knowledge-graph/unified-graph.js.map +1 -0
  131. package/dist/mcp/agent-context-tools.d.ts +104 -0
  132. package/dist/mcp/agent-context-tools.d.ts.map +1 -0
  133. package/dist/mcp/agent-context-tools.js +854 -0
  134. package/dist/mcp/agent-context-tools.js.map +1 -0
  135. package/dist/mcp/graph-tools.d.ts +20 -0
  136. package/dist/mcp/graph-tools.d.ts.map +1 -1
  137. package/dist/mcp/graph-tools.js +71 -11
  138. package/dist/mcp/graph-tools.js.map +1 -1
  139. package/dist/mcp/lib/response-helpers.d.ts +67 -0
  140. package/dist/mcp/lib/response-helpers.d.ts.map +1 -0
  141. package/dist/mcp/lib/response-helpers.js +103 -0
  142. package/dist/mcp/lib/response-helpers.js.map +1 -0
  143. package/dist/mcp/server.d.ts +3 -1
  144. package/dist/mcp/server.d.ts.map +1 -1
  145. package/dist/mcp/server.js +9 -10
  146. package/dist/mcp/server.js.map +1 -1
  147. package/dist/models/call-site.d.ts +68 -0
  148. package/dist/models/call-site.d.ts.map +1 -0
  149. package/dist/models/call-site.js +60 -0
  150. package/dist/models/call-site.js.map +1 -0
  151. package/dist/models/code-skeleton.d.ts +78 -6
  152. package/dist/models/code-skeleton.d.ts.map +1 -1
  153. package/dist/models/code-skeleton.js +29 -0
  154. package/dist/models/code-skeleton.js.map +1 -1
  155. package/dist/models/drift-item.d.ts +4 -4
  156. package/dist/models/module-spec.d.ts +155 -94
  157. package/dist/models/module-spec.d.ts.map +1 -1
  158. package/dist/panoramic/adr-decision-pipeline.d.ts +53 -0
  159. package/dist/panoramic/adr-decision-pipeline.d.ts.map +1 -0
  160. package/dist/panoramic/adr-decision-pipeline.js +685 -0
  161. package/dist/panoramic/adr-decision-pipeline.js.map +1 -0
  162. package/dist/panoramic/api-surface-generator.d.ts +56 -0
  163. package/dist/panoramic/api-surface-generator.d.ts.map +1 -0
  164. package/dist/panoramic/api-surface-generator.js +1671 -0
  165. package/dist/panoramic/api-surface-generator.js.map +1 -0
  166. package/dist/panoramic/architecture-ir-builder.d.ts +19 -0
  167. package/dist/panoramic/architecture-ir-builder.d.ts.map +1 -0
  168. package/dist/panoramic/architecture-ir-builder.js +561 -0
  169. package/dist/panoramic/architecture-ir-builder.js.map +1 -0
  170. package/dist/panoramic/architecture-ir-exporters.d.ts +7 -0
  171. package/dist/panoramic/architecture-ir-exporters.d.ts.map +1 -0
  172. package/dist/panoramic/architecture-ir-exporters.js +183 -0
  173. package/dist/panoramic/architecture-ir-exporters.js.map +1 -0
  174. package/dist/panoramic/architecture-ir-generator.d.ts +36 -0
  175. package/dist/panoramic/architecture-ir-generator.d.ts.map +1 -0
  176. package/dist/panoramic/architecture-ir-generator.js +51 -0
  177. package/dist/panoramic/architecture-ir-generator.js.map +1 -0
  178. package/dist/panoramic/architecture-ir-mermaid-adapter.d.ts +6 -0
  179. package/dist/panoramic/architecture-ir-mermaid-adapter.d.ts.map +1 -0
  180. package/dist/panoramic/architecture-ir-mermaid-adapter.js +98 -0
  181. package/dist/panoramic/architecture-ir-mermaid-adapter.js.map +1 -0
  182. package/dist/panoramic/architecture-ir-model.d.ts +87 -0
  183. package/dist/panoramic/architecture-ir-model.d.ts.map +1 -0
  184. package/dist/panoramic/architecture-ir-model.js +20 -0
  185. package/dist/panoramic/architecture-ir-model.js.map +1 -0
  186. package/dist/panoramic/architecture-narrative.d.ts +68 -0
  187. package/dist/panoramic/architecture-narrative.d.ts.map +1 -0
  188. package/dist/panoramic/architecture-narrative.js +401 -0
  189. package/dist/panoramic/architecture-narrative.js.map +1 -0
  190. package/dist/panoramic/architecture-overview-generator.d.ts +31 -0
  191. package/dist/panoramic/architecture-overview-generator.d.ts.map +1 -0
  192. package/dist/panoramic/architecture-overview-generator.js +454 -0
  193. package/dist/panoramic/architecture-overview-generator.js.map +1 -0
  194. package/dist/panoramic/architecture-overview-model.d.ts +77 -0
  195. package/dist/panoramic/architecture-overview-model.d.ts.map +1 -0
  196. package/dist/panoramic/architecture-overview-model.js +31 -0
  197. package/dist/panoramic/architecture-overview-model.js.map +1 -0
  198. package/dist/panoramic/batch-project-docs.d.ts.map +1 -1
  199. package/dist/panoramic/batch-project-docs.js +4 -2
  200. package/dist/panoramic/batch-project-docs.js.map +1 -1
  201. package/dist/panoramic/builders/component-view-builder.d.ts +25 -1
  202. package/dist/panoramic/builders/component-view-builder.d.ts.map +1 -1
  203. package/dist/panoramic/builders/component-view-builder.js +83 -3
  204. package/dist/panoramic/builders/component-view-builder.js.map +1 -1
  205. package/dist/panoramic/builders/doc-graph-builder.d.ts +2 -2
  206. package/dist/panoramic/builders/doc-graph-builder.d.ts.map +1 -1
  207. package/dist/panoramic/builders/doc-graph-builder.js.map +1 -1
  208. package/dist/panoramic/component-view-builder.d.ts +17 -0
  209. package/dist/panoramic/component-view-builder.d.ts.map +1 -0
  210. package/dist/panoramic/component-view-builder.js +652 -0
  211. package/dist/panoramic/component-view-builder.js.map +1 -0
  212. package/dist/panoramic/component-view-model.d.ts +127 -0
  213. package/dist/panoramic/component-view-model.d.ts.map +1 -0
  214. package/dist/panoramic/component-view-model.js +65 -0
  215. package/dist/panoramic/component-view-model.js.map +1 -0
  216. package/dist/panoramic/config-reference-generator.d.ts +78 -0
  217. package/dist/panoramic/config-reference-generator.d.ts.map +1 -0
  218. package/dist/panoramic/config-reference-generator.js +199 -0
  219. package/dist/panoramic/config-reference-generator.js.map +1 -0
  220. package/dist/panoramic/coverage-auditor.d.ts +95 -0
  221. package/dist/panoramic/coverage-auditor.d.ts.map +1 -0
  222. package/dist/panoramic/coverage-auditor.js +290 -0
  223. package/dist/panoramic/coverage-auditor.js.map +1 -0
  224. package/dist/panoramic/cross-package-analyzer.d.ts +112 -0
  225. package/dist/panoramic/cross-package-analyzer.d.ts.map +1 -0
  226. package/dist/panoramic/cross-package-analyzer.js +258 -0
  227. package/dist/panoramic/cross-package-analyzer.js.map +1 -0
  228. package/dist/panoramic/data-model-generator.d.ts +528 -0
  229. package/dist/panoramic/data-model-generator.d.ts.map +1 -0
  230. package/dist/panoramic/data-model-generator.js +647 -0
  231. package/dist/panoramic/data-model-generator.js.map +1 -0
  232. package/dist/panoramic/doc-graph-builder.d.ts +80 -0
  233. package/dist/panoramic/doc-graph-builder.d.ts.map +1 -0
  234. package/dist/panoramic/doc-graph-builder.js +352 -0
  235. package/dist/panoramic/doc-graph-builder.js.map +1 -0
  236. package/dist/panoramic/docs-bundle-manifest-reader.d.ts +26 -0
  237. package/dist/panoramic/docs-bundle-manifest-reader.d.ts.map +1 -0
  238. package/dist/panoramic/docs-bundle-manifest-reader.js +106 -0
  239. package/dist/panoramic/docs-bundle-manifest-reader.js.map +1 -0
  240. package/dist/panoramic/docs-bundle-orchestrator.d.ts +14 -0
  241. package/dist/panoramic/docs-bundle-orchestrator.d.ts.map +1 -0
  242. package/dist/panoramic/docs-bundle-orchestrator.js +538 -0
  243. package/dist/panoramic/docs-bundle-orchestrator.js.map +1 -0
  244. package/dist/panoramic/docs-bundle-profiles.d.ts +4 -0
  245. package/dist/panoramic/docs-bundle-profiles.d.ts.map +1 -0
  246. package/dist/panoramic/docs-bundle-profiles.js +82 -0
  247. package/dist/panoramic/docs-bundle-profiles.js.map +1 -0
  248. package/dist/panoramic/docs-bundle-types.d.ts +94 -0
  249. package/dist/panoramic/docs-bundle-types.d.ts.map +1 -0
  250. package/dist/panoramic/docs-bundle-types.js +10 -0
  251. package/dist/panoramic/docs-bundle-types.js.map +1 -0
  252. package/dist/panoramic/docs-quality-evaluator.d.ts +31 -0
  253. package/dist/panoramic/docs-quality-evaluator.d.ts.map +1 -0
  254. package/dist/panoramic/docs-quality-evaluator.js +941 -0
  255. package/dist/panoramic/docs-quality-evaluator.js.map +1 -0
  256. package/dist/panoramic/docs-quality-model.d.ts +125 -0
  257. package/dist/panoramic/docs-quality-model.d.ts.map +1 -0
  258. package/dist/panoramic/docs-quality-model.js +166 -0
  259. package/dist/panoramic/docs-quality-model.js.map +1 -0
  260. package/dist/panoramic/dynamic-scenarios-builder.d.ts +18 -0
  261. package/dist/panoramic/dynamic-scenarios-builder.d.ts.map +1 -0
  262. package/dist/panoramic/dynamic-scenarios-builder.js +316 -0
  263. package/dist/panoramic/dynamic-scenarios-builder.js.map +1 -0
  264. package/dist/panoramic/event-surface-generator.d.ts +52 -0
  265. package/dist/panoramic/event-surface-generator.d.ts.map +1 -0
  266. package/dist/panoramic/event-surface-generator.js +507 -0
  267. package/dist/panoramic/event-surface-generator.js.map +1 -0
  268. package/dist/panoramic/generator-registry.d.ts +1 -1
  269. package/dist/panoramic/generator-registry.d.ts.map +1 -1
  270. package/dist/panoramic/generator-registry.js +5 -2
  271. package/dist/panoramic/generator-registry.js.map +1 -1
  272. package/dist/panoramic/generators/cross-package-analyzer.d.ts +5 -5
  273. package/dist/panoramic/generators/cross-package-analyzer.d.ts.map +1 -1
  274. package/dist/panoramic/generators/cross-package-analyzer.js +1 -1
  275. package/dist/panoramic/generators/cross-package-analyzer.js.map +1 -1
  276. package/dist/panoramic/generators/data-model-generator.d.ts +27 -27
  277. package/dist/panoramic/graph/confidence-mapper.d.ts +18 -0
  278. package/dist/panoramic/graph/confidence-mapper.d.ts.map +1 -1
  279. package/dist/panoramic/graph/confidence-mapper.js +26 -0
  280. package/dist/panoramic/graph/confidence-mapper.js.map +1 -1
  281. package/dist/panoramic/graph/graph-builder.d.ts.map +1 -1
  282. package/dist/panoramic/graph/graph-builder.js +78 -0
  283. package/dist/panoramic/graph/graph-builder.js.map +1 -1
  284. package/dist/panoramic/graph/graph-paths.d.ts +8 -0
  285. package/dist/panoramic/graph/graph-paths.d.ts.map +1 -1
  286. package/dist/panoramic/graph/graph-paths.js +10 -0
  287. package/dist/panoramic/graph/graph-paths.js.map +1 -1
  288. package/dist/panoramic/graph/graph-query.d.ts +33 -2
  289. package/dist/panoramic/graph/graph-query.d.ts.map +1 -1
  290. package/dist/panoramic/graph/graph-query.js +69 -19
  291. package/dist/panoramic/graph/graph-query.js.map +1 -1
  292. package/dist/panoramic/graph/graph-types.d.ts +32 -3
  293. package/dist/panoramic/graph/graph-types.d.ts.map +1 -1
  294. package/dist/panoramic/hyperedges/schema.d.ts +6 -6
  295. package/dist/panoramic/interface-surface-generator.d.ts +50 -0
  296. package/dist/panoramic/interface-surface-generator.d.ts.map +1 -0
  297. package/dist/panoramic/interface-surface-generator.js +388 -0
  298. package/dist/panoramic/interface-surface-generator.js.map +1 -0
  299. package/dist/panoramic/interfaces.d.ts +2 -2
  300. package/dist/panoramic/mock-readme-generator.d.ts +90 -0
  301. package/dist/panoramic/mock-readme-generator.d.ts.map +1 -0
  302. package/dist/panoramic/mock-readme-generator.js +111 -0
  303. package/dist/panoramic/mock-readme-generator.js.map +1 -0
  304. package/dist/panoramic/models/component-view-model.d.ts +1 -1
  305. package/dist/panoramic/models/component-view-model.d.ts.map +1 -1
  306. package/dist/panoramic/models/component-view-model.js.map +1 -1
  307. package/dist/panoramic/narrative-provenance-adapter.d.ts +8 -0
  308. package/dist/panoramic/narrative-provenance-adapter.d.ts.map +1 -0
  309. package/dist/panoramic/narrative-provenance-adapter.js +99 -0
  310. package/dist/panoramic/narrative-provenance-adapter.js.map +1 -0
  311. package/dist/panoramic/parser-registry.d.ts +1 -1
  312. package/dist/panoramic/parser-registry.js +1 -1
  313. package/dist/panoramic/parsers/types.d.ts +6 -6
  314. package/dist/panoramic/pattern-hints-generator.d.ts +28 -0
  315. package/dist/panoramic/pattern-hints-generator.d.ts.map +1 -0
  316. package/dist/panoramic/pattern-hints-generator.js +218 -0
  317. package/dist/panoramic/pattern-hints-generator.js.map +1 -0
  318. package/dist/panoramic/pattern-hints-model.d.ts +89 -0
  319. package/dist/panoramic/pattern-hints-model.d.ts.map +1 -0
  320. package/dist/panoramic/pattern-hints-model.js +61 -0
  321. package/dist/panoramic/pattern-hints-model.js.map +1 -0
  322. package/dist/panoramic/pattern-knowledge-base.d.ts +31 -0
  323. package/dist/panoramic/pattern-knowledge-base.d.ts.map +1 -0
  324. package/dist/panoramic/pattern-knowledge-base.js +407 -0
  325. package/dist/panoramic/pattern-knowledge-base.js.map +1 -0
  326. package/dist/panoramic/pipelines/coverage-auditor.d.ts.map +1 -1
  327. package/dist/panoramic/pipelines/coverage-auditor.js +4 -2
  328. package/dist/panoramic/pipelines/coverage-auditor.js.map +1 -1
  329. package/dist/panoramic/pipelines/docs-bundle-orchestrator.js +13 -6
  330. package/dist/panoramic/pipelines/docs-bundle-orchestrator.js.map +1 -1
  331. package/dist/panoramic/pipelines/product-ux-docs.d.ts +5 -0
  332. package/dist/panoramic/pipelines/product-ux-docs.d.ts.map +1 -1
  333. package/dist/panoramic/pipelines/product-ux-docs.js +34 -6
  334. package/dist/panoramic/pipelines/product-ux-docs.js.map +1 -1
  335. package/dist/panoramic/product-ux-docs.d.ts +104 -0
  336. package/dist/panoramic/product-ux-docs.d.ts.map +1 -0
  337. package/dist/panoramic/product-ux-docs.js +817 -0
  338. package/dist/panoramic/product-ux-docs.js.map +1 -0
  339. package/dist/panoramic/qa/__tests__/citation.test.d.ts +2 -0
  340. package/dist/panoramic/qa/__tests__/citation.test.d.ts.map +1 -0
  341. package/dist/panoramic/qa/__tests__/citation.test.js +193 -0
  342. package/dist/panoramic/qa/__tests__/citation.test.js.map +1 -0
  343. package/dist/panoramic/qa/__tests__/debt-context.test.d.ts +2 -0
  344. package/dist/panoramic/qa/__tests__/debt-context.test.d.ts.map +1 -0
  345. package/dist/panoramic/qa/__tests__/debt-context.test.js +154 -0
  346. package/dist/panoramic/qa/__tests__/debt-context.test.js.map +1 -0
  347. package/dist/panoramic/qa/__tests__/graph-retriever.test.d.ts +2 -0
  348. package/dist/panoramic/qa/__tests__/graph-retriever.test.d.ts.map +1 -0
  349. package/dist/panoramic/qa/__tests__/graph-retriever.test.js +148 -0
  350. package/dist/panoramic/qa/__tests__/graph-retriever.test.js.map +1 -0
  351. package/dist/panoramic/qa/__tests__/index.test.d.ts +2 -0
  352. package/dist/panoramic/qa/__tests__/index.test.d.ts.map +1 -0
  353. package/dist/panoramic/qa/__tests__/index.test.js +246 -0
  354. package/dist/panoramic/qa/__tests__/index.test.js.map +1 -0
  355. package/dist/panoramic/qa/__tests__/llm-caller.test.d.ts +2 -0
  356. package/dist/panoramic/qa/__tests__/llm-caller.test.d.ts.map +1 -0
  357. package/dist/panoramic/qa/__tests__/llm-caller.test.js +168 -0
  358. package/dist/panoramic/qa/__tests__/llm-caller.test.js.map +1 -0
  359. package/dist/panoramic/qa/__tests__/prompt-builder.test.d.ts +2 -0
  360. package/dist/panoramic/qa/__tests__/prompt-builder.test.d.ts.map +1 -0
  361. package/dist/panoramic/qa/__tests__/prompt-builder.test.js +150 -0
  362. package/dist/panoramic/qa/__tests__/prompt-builder.test.js.map +1 -0
  363. package/dist/panoramic/qa/__tests__/qa-integration.test.d.ts +2 -0
  364. package/dist/panoramic/qa/__tests__/qa-integration.test.d.ts.map +1 -0
  365. package/dist/panoramic/qa/__tests__/qa-integration.test.js +296 -0
  366. package/dist/panoramic/qa/__tests__/qa-integration.test.js.map +1 -0
  367. package/dist/panoramic/qa/__tests__/rag-reranker.test.d.ts +2 -0
  368. package/dist/panoramic/qa/__tests__/rag-reranker.test.d.ts.map +1 -0
  369. package/dist/panoramic/qa/__tests__/rag-reranker.test.js +136 -0
  370. package/dist/panoramic/qa/__tests__/rag-reranker.test.js.map +1 -0
  371. package/dist/panoramic/qa/index.d.ts.map +1 -1
  372. package/dist/panoramic/qa/index.js +10 -3
  373. package/dist/panoramic/qa/index.js.map +1 -1
  374. package/dist/panoramic/runtime-topology-generator.d.ts +77 -0
  375. package/dist/panoramic/runtime-topology-generator.d.ts.map +1 -0
  376. package/dist/panoramic/runtime-topology-generator.js +676 -0
  377. package/dist/panoramic/runtime-topology-generator.js.map +1 -0
  378. package/dist/panoramic/runtime-topology-model.d.ts +145 -0
  379. package/dist/panoramic/runtime-topology-model.d.ts.map +1 -0
  380. package/dist/panoramic/runtime-topology-model.js +300 -0
  381. package/dist/panoramic/runtime-topology-model.js.map +1 -0
  382. package/dist/panoramic/troubleshooting-generator.d.ts +51 -0
  383. package/dist/panoramic/troubleshooting-generator.d.ts.map +1 -0
  384. package/dist/panoramic/troubleshooting-generator.js +451 -0
  385. package/dist/panoramic/troubleshooting-generator.js.map +1 -0
  386. package/dist/panoramic/utils/text-segmenter.d.ts +15 -0
  387. package/dist/panoramic/utils/text-segmenter.d.ts.map +1 -1
  388. package/dist/panoramic/utils/text-segmenter.js +38 -0
  389. package/dist/panoramic/utils/text-segmenter.js.map +1 -1
  390. package/dist/panoramic/workspace-index-generator.d.ts +148 -0
  391. package/dist/panoramic/workspace-index-generator.d.ts.map +1 -0
  392. package/dist/panoramic/workspace-index-generator.js +497 -0
  393. package/dist/panoramic/workspace-index-generator.js.map +1 -0
  394. package/dist/runtime-bootstrap.d.ts +9 -0
  395. package/dist/runtime-bootstrap.d.ts.map +1 -0
  396. package/dist/runtime-bootstrap.js +33 -0
  397. package/dist/runtime-bootstrap.js.map +1 -0
  398. package/dist/utils/file-scanner.js +1 -1
  399. package/dist/utils/file-scanner.js.map +1 -1
  400. package/package.json +12 -2
  401. package/plugins/spec-driver/.claude-plugin/plugin.json +1 -1
  402. package/plugins/spec-driver/README.md +18 -1
  403. package/plugins/spec-driver/agents/implement.md +20 -1
  404. package/plugins/spec-driver/agents/plan.md +20 -1
  405. package/plugins/spec-driver/agents/quality-review.md +20 -1
  406. package/plugins/spec-driver/agents/spec-review.md +20 -1
  407. package/plugins/spec-driver/agents/verify.md +20 -1
  408. package/plugins/spec-driver/docs/customization.md +134 -0
  409. package/plugins/spec-driver/docs/spectra-mcp-integration.md +165 -0
  410. package/plugins/spec-driver/lib/preference-rules.mjs +96 -0
  411. package/plugins/spec-driver/scripts/postinstall.sh +1 -1
  412. package/plugins/spec-driver/scripts/sync-preference-rules.mjs +148 -0
  413. package/plugins/spec-driver/skills/spec-driver-feature/SKILL.md +10 -0
  414. package/plugins/spec-driver/skills/spec-driver-fix/SKILL.md +10 -0
  415. package/plugins/spec-driver/skills/spec-driver-implement/SKILL.md +10 -0
  416. package/plugins/spec-driver/skills/spec-driver-refactor/SKILL.md +10 -0
  417. package/plugins/spec-driver/skills/spec-driver-story/SKILL.md +10 -0
  418. package/plugins/spec-driver/templates/preference-rules.md +39 -0
  419. package/plugins/spectra/.claude-plugin/plugin.json +1 -1
  420. package/plugins/spectra/README.md +48 -1
  421. package/plugins/spectra/hooks/post-commit.sh +40 -0
  422. package/templates/product-overview.hbs +1 -1
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Feature 155 — Agent-Context MCP Tools 的查询基建。
3
+ *
4
+ * 暴露给 src/mcp/agent-context-tools.ts 的工具函数:
5
+ * - bfsTraverse:反向 / 正向 BFS,遍历前 budget 截断(FR-012)
6
+ * - canonicalizeSymbolId:把用户传入的 symbol id 归一到 graph 实际 id
7
+ * - findFuzzyMatches:symbol-not-found 时返回最多 N 个候选
8
+ * - computeRiskTier:按 directCallers + transitive 判定 low / medium / high
9
+ * - getReverseAdjacency:反向邻接表 lazy 构建 + LRU 缓存
10
+ *
11
+ * 输入合同:
12
+ * query-helpers 直接消费 GraphJSON `{nodes, links}`(与 graph.json 序列化形态一致),
13
+ * 不依赖 UnifiedGraph in-memory 类型,避免与 build-time 路径耦合。
14
+ *
15
+ * 不变量:
16
+ * - 所有函数对 graphData 只读(禁止修改 nodes / links / metadata)
17
+ * - confidence 数值直接读 link.confidenceScore;缺失时尝试 link.confidence
18
+ * 通过 CONFIDENCE_SCORES 映射;仍失败 → 跳过该边并记 'missing-confidence-score' warning
19
+ * - canonicalize 控制字符 / 非 UTF-8 → 返回 null(调用方按 invalid-symbol-id 处理)
20
+ * - reverse adjacency cache key = `${graphPath}::${mtimeMs}::${sizeBytes}::${linksLength}::${relations}`
21
+ * graph.json 重生成(mtime/size 必变)→ 自动 evict
22
+ */
23
+ import type { GraphJSON, GraphEdge, GraphNode } from '../panoramic/graph/graph-types.js';
24
+ /** BFS 方向语义 */
25
+ export type BfsDirection = 'upstream' | 'downstream' | 'both';
26
+ /** BFS 遍历输入选项 */
27
+ export interface BfsTraverseOptions {
28
+ /** 遍历深度上限,0 表示不展开(仅返回 start node 自身的可达邻居计数为 0) */
29
+ depth: number;
30
+ /** 数值置信度阈值(0..1),按 link.confidenceScore >= minConfidence 过滤 */
31
+ minConfidence: number;
32
+ /** BFS 方向 */
33
+ direction: BfsDirection;
34
+ /** 输出节点上限(不含 start node),遍历前严格截断 */
35
+ budget: number;
36
+ /** 多 startId 共享 visited Set(detect_changes 跨 changedSymbol 共享),可选 */
37
+ sharedVisited?: Set<string>;
38
+ /** 用作 reverse adjacency cache key 的一部分 */
39
+ graphPath: string;
40
+ /** 用作 reverse adjacency cache key 的一部分(graph.json mtime) */
41
+ graphMtimeMs: number;
42
+ /** 用作 reverse adjacency cache key 的一部分(graph.json 字节数) */
43
+ graphSizeBytes: number;
44
+ /** 仅遍历指定 relation 的边(default ['calls']) */
45
+ relations?: ReadonlyArray<string>;
46
+ }
47
+ /** BFS 输出条目 */
48
+ export interface BfsAffected {
49
+ id: string;
50
+ depth: number;
51
+ confidence: number;
52
+ reason: string;
53
+ /** 从 start 到 self 的 ancestor 链(含 self),可选用于自动化测试 */
54
+ path: string[];
55
+ }
56
+ /** BFS 输出 */
57
+ export interface BfsTraverseResult {
58
+ affected: BfsAffected[];
59
+ warnings: string[];
60
+ }
61
+ /** 反向邻接表项 */
62
+ interface ReverseAdjEntry {
63
+ sourceId: string;
64
+ edge: GraphEdge;
65
+ }
66
+ /** 反向邻接表(target id → 进入此节点的 inbound 边列表) */
67
+ export type ReverseAdj = Map<string, ReverseAdjEntry[]>;
68
+ /** baseRef / symbol id 不可见字符快速校验 */
69
+ /**
70
+ * 解析一条边的 confidence 数值。
71
+ *
72
+ * 优先级:edge.confidenceScore(已含数字)→ edge.confidence 走 CONFIDENCE_SCORES 映射 → null。
73
+ *
74
+ * 返回 null 表示"无法判定 confidence",调用方应跳过该边并记 warning。
75
+ */
76
+ export declare function resolveEdgeConfidence(edge: GraphEdge): number | null;
77
+ /**
78
+ * 把用户输入的 target / symbolId 归一到 graph 实际 id。
79
+ *
80
+ * 归一规则(按顺序尝试,命中即返回):
81
+ * 1. graph.nodes 中存在字面相等的 id → 直接返回
82
+ * 2. 把 `./prefix` `a/` `b/` 等前缀剥掉 → 再查
83
+ * 3. 三段输入 `A::B::C` 容错为 `A::B.C` → 再查(Codex round-1 C-1 修订)
84
+ * 4. 把绝对路径 → 仓库相对路径(按 graphData.graph?.metadata 或 projectRoot 选项)→ 再查
85
+ *
86
+ * 失败返回 null,调用方按 symbol-not-found 处理(建议同时调 findFuzzyMatches 提候选)。
87
+ *
88
+ * 控制字符 / 非 UTF-8 / 空字符串段输入返回 null(调用方按 invalid-symbol-id 处理)。
89
+ */
90
+ export declare function canonicalizeSymbolId(rawTarget: string, graphData: Readonly<GraphJSON>, options?: {
91
+ projectRoot?: string;
92
+ }): {
93
+ canonicalId: string | null;
94
+ reason: 'ok' | 'not-found' | 'invalid';
95
+ };
96
+ /**
97
+ * 当 symbolId 找不到时,返回最多 limit 个相似候选。
98
+ *
99
+ * 算法(轻量、无外部依赖):
100
+ * - 把 query 拆 token(按 `::` `/` `.` `-` `_` 拆分,过滤空 token)
101
+ * - 给每个 graph node id 打分:
102
+ * * 命中 token 数 +1 / token
103
+ * * id 含 query 子串 +0.5
104
+ * - 按分数降序,取前 limit 个 id
105
+ *
106
+ * 不实现 Levenshtein(避免引入新依赖);substring + token 命中已足够给 LLM agent
107
+ * 第二次正确输入的提示。
108
+ */
109
+ export declare function findFuzzyMatches(graphData: Readonly<GraphJSON>, queryId: string, limit: number): string[];
110
+ /**
111
+ * 按 directCallers + transitive 节点数判定 risk tier。
112
+ *
113
+ * 阈值(spec FR-014):
114
+ * - directCallers ≥ 10 或 transitive ≥ 50 → high
115
+ * - directCallers ≥ 3 或 transitive ≥ 15 → medium
116
+ * - 其余 → low
117
+ */
118
+ export declare function computeRiskTier(directCallers: number, transitive: number): 'low' | 'medium' | 'high';
119
+ /**
120
+ * 获取(或构建)反向邻接表。
121
+ *
122
+ * direction 决定邻接方向:
123
+ * - upstream:target → 进入此节点的 inbound 边(callers)
124
+ * - downstream:source → 离开此节点的 outbound 边(callees)
125
+ * - both:合并 inbound + outbound
126
+ *
127
+ * 仅保留 relation 在 relations 集合内的边;其他 relation 的边不进入邻接表。
128
+ */
129
+ export declare function getReverseAdjacency(graphData: Readonly<GraphJSON>, graphPath: string, mtimeMs: number, sizeBytes: number, relations: ReadonlyArray<string>, direction: BfsDirection): ReverseAdj;
130
+ /** 测试 / debug 用:清空 reverse adjacency cache */
131
+ export declare function clearReverseAdjacencyCache(): void;
132
+ /**
133
+ * 从 startId 出发做 BFS,返回受影响的节点列表。
134
+ *
135
+ * 关键合同(FR-012):
136
+ * - budget 在**遍历前**应用:每次准备 enqueue 一个新节点之前,检查
137
+ * `affected.length + 1 > effectiveBudget`,超即停止入队并 push 'budget-truncated' warning
138
+ * - start node 不计入 budget;budget 仅约束 affected 数量
139
+ * - depth 是边数:depth=2 含 direct caller (depth=1) + 二级 caller (depth=2)
140
+ * - confidence 缺失:跳过 + 记 'missing-confidence-score' warning(不当作 0 静默通过)
141
+ * - sharedVisited 跨调用共享:detect_changes 多 changedSymbol 用同一 globalVisited
142
+ * 去重,让 affected 不重复计入同一节点
143
+ *
144
+ * 返回的 warnings 是去重的:同一类 warning 多次触发只 push 一次。
145
+ */
146
+ export declare function bfsTraverse(graphData: Readonly<GraphJSON>, startId: string, options: BfsTraverseOptions): BfsTraverseResult;
147
+ /**
148
+ * 取节点的 module file 部分。
149
+ *
150
+ * 兼容两种分隔符(同一个 graph 内可能并存):
151
+ * - Feature 151 新格式:`<file>::<symbolName>` 例 `micrograd/engine.py::Value.__add__`
152
+ * - 旧 panoramic 格式:`<file>#<symbolName>` 例 `micrograd/engine.py#Value`
153
+ *
154
+ * 模块节点本身(id 既不含 `::` 也不含 `#`)→ 返回 id 自身。
155
+ * 取最早出现的分隔符位置作为 cut 点。
156
+ */
157
+ export declare function moduleFileFromId(nodeId: string): string;
158
+ /**
159
+ * 在 graph 中找指定 node 的 GraphNode 对象。
160
+ * O(n) — 仅小规模 graph 使用,调用频率不高(仅 context handler 的 definition 字段)。
161
+ */
162
+ export declare function findNode(graphData: Readonly<GraphJSON>, id: string): GraphNode | null;
163
+ export {};
164
+ //# sourceMappingURL=query-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-helpers.d.ts","sourceRoot":"","sources":["../../src/knowledge-graph/query-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,394 @@
1
+ /**
2
+ * Feature 155 — Agent-Context MCP Tools 的查询基建。
3
+ *
4
+ * 暴露给 src/mcp/agent-context-tools.ts 的工具函数:
5
+ * - bfsTraverse:反向 / 正向 BFS,遍历前 budget 截断(FR-012)
6
+ * - canonicalizeSymbolId:把用户传入的 symbol id 归一到 graph 实际 id
7
+ * - findFuzzyMatches:symbol-not-found 时返回最多 N 个候选
8
+ * - computeRiskTier:按 directCallers + transitive 判定 low / medium / high
9
+ * - getReverseAdjacency:反向邻接表 lazy 构建 + LRU 缓存
10
+ *
11
+ * 输入合同:
12
+ * query-helpers 直接消费 GraphJSON `{nodes, links}`(与 graph.json 序列化形态一致),
13
+ * 不依赖 UnifiedGraph in-memory 类型,避免与 build-time 路径耦合。
14
+ *
15
+ * 不变量:
16
+ * - 所有函数对 graphData 只读(禁止修改 nodes / links / metadata)
17
+ * - confidence 数值直接读 link.confidenceScore;缺失时尝试 link.confidence
18
+ * 通过 CONFIDENCE_SCORES 映射;仍失败 → 跳过该边并记 'missing-confidence-score' warning
19
+ * - canonicalize 控制字符 / 非 UTF-8 → 返回 null(调用方按 invalid-symbol-id 处理)
20
+ * - reverse adjacency cache key = `${graphPath}::${mtimeMs}::${sizeBytes}::${linksLength}::${relations}`
21
+ * graph.json 重生成(mtime/size 必变)→ 自动 evict
22
+ */
23
+ import path from 'node:path';
24
+ import { CONFIDENCE_SCORES } from '../panoramic/graph/confidence-mapper.js';
25
+ // ============================================================
26
+ // 常量
27
+ // ============================================================
28
+ const DEFAULT_RELATIONS = ['calls'];
29
+ /** 控制字符正则(包含 \x00-\x1f, \x7f;保留制表符不在内是因为 git diff 路径不会含 \t) */
30
+ const CONTROL_CHAR_RE = /[\x00-\x1f\x7f]/;
31
+ /** baseRef / symbol id 不可见字符快速校验 */
32
+ // NON_PRINTABLE_RE removed - CONTROL_CHAR_RE is sufficient
33
+ // ============================================================
34
+ // confidence 数值解析
35
+ // ============================================================
36
+ /**
37
+ * 解析一条边的 confidence 数值。
38
+ *
39
+ * 优先级:edge.confidenceScore(已含数字)→ edge.confidence 走 CONFIDENCE_SCORES 映射 → null。
40
+ *
41
+ * 返回 null 表示"无法判定 confidence",调用方应跳过该边并记 warning。
42
+ */
43
+ export function resolveEdgeConfidence(edge) {
44
+ if (typeof edge.confidenceScore === 'number' && Number.isFinite(edge.confidenceScore)) {
45
+ return edge.confidenceScore;
46
+ }
47
+ const tier = edge.confidence;
48
+ if (tier !== undefined && tier in CONFIDENCE_SCORES) {
49
+ return CONFIDENCE_SCORES[tier];
50
+ }
51
+ return null;
52
+ }
53
+ // ============================================================
54
+ // canonicalize symbol id
55
+ // ============================================================
56
+ /**
57
+ * 把用户输入的 target / symbolId 归一到 graph 实际 id。
58
+ *
59
+ * 归一规则(按顺序尝试,命中即返回):
60
+ * 1. graph.nodes 中存在字面相等的 id → 直接返回
61
+ * 2. 把 `./prefix` `a/` `b/` 等前缀剥掉 → 再查
62
+ * 3. 三段输入 `A::B::C` 容错为 `A::B.C` → 再查(Codex round-1 C-1 修订)
63
+ * 4. 把绝对路径 → 仓库相对路径(按 graphData.graph?.metadata 或 projectRoot 选项)→ 再查
64
+ *
65
+ * 失败返回 null,调用方按 symbol-not-found 处理(建议同时调 findFuzzyMatches 提候选)。
66
+ *
67
+ * 控制字符 / 非 UTF-8 / 空字符串段输入返回 null(调用方按 invalid-symbol-id 处理)。
68
+ */
69
+ export function canonicalizeSymbolId(rawTarget, graphData, options = {}) {
70
+ if (typeof rawTarget !== 'string') {
71
+ return { canonicalId: null, reason: 'invalid' };
72
+ }
73
+ // 入口先 NFC normalize + trim,避免空白 / unicode 表示差异让用户输入被误判
74
+ const normalized = rawTarget.normalize('NFC').trim();
75
+ if (normalized.length === 0) {
76
+ return { canonicalId: null, reason: 'invalid' };
77
+ }
78
+ if (CONTROL_CHAR_RE.test(normalized)) {
79
+ return { canonicalId: null, reason: 'invalid' };
80
+ }
81
+ // 拒绝多 `::` 或空段
82
+ const segs = normalized.split('::');
83
+ if (segs.some((s) => s.length === 0)) {
84
+ return { canonicalId: null, reason: 'invalid' };
85
+ }
86
+ // 直接命中
87
+ if (hasNode(graphData, normalized)) {
88
+ return { canonicalId: normalized, reason: 'ok' };
89
+ }
90
+ const candidates = [];
91
+ // 剥前缀:./ a/ b/
92
+ const stripped = normalized
93
+ .replace(/^\.\//, '')
94
+ .replace(/^a\//, '')
95
+ .replace(/^b\//, '');
96
+ if (stripped !== normalized) {
97
+ candidates.push(stripped);
98
+ }
99
+ // 三段 → 两段(A::B::C → A::B.C)
100
+ if (segs.length >= 3) {
101
+ const merged = segs[0] + '::' + segs.slice(1).join('.');
102
+ candidates.push(merged);
103
+ }
104
+ // 绝对路径 → repo-relative(按 projectRoot 截断)
105
+ const projectRoot = options.projectRoot;
106
+ if (projectRoot && normalized.startsWith(projectRoot)) {
107
+ const relative = path.relative(projectRoot, normalized);
108
+ if (relative.length > 0) {
109
+ candidates.push(relative);
110
+ }
111
+ }
112
+ // repo-relative → 绝对路径(graph 实际可能用绝对 path 形态,例如 baseline 跑出的 graph.json)
113
+ if (projectRoot && !path.isAbsolute(normalized.split('::')[0] ?? '')) {
114
+ const filePart = normalized.split('::')[0] ?? '';
115
+ const symbolPart = normalized.includes('::') ? normalized.slice(filePart.length) : '';
116
+ const abs = path.join(projectRoot, filePart) + symbolPart;
117
+ candidates.push(abs);
118
+ }
119
+ for (const c of candidates) {
120
+ if (hasNode(graphData, c)) {
121
+ return { canonicalId: c, reason: 'ok' };
122
+ }
123
+ }
124
+ return { canonicalId: null, reason: 'not-found' };
125
+ }
126
+ function hasNode(graphData, id) {
127
+ for (const n of graphData.nodes) {
128
+ if (n.id === id)
129
+ return true;
130
+ }
131
+ return false;
132
+ }
133
+ // ============================================================
134
+ // fuzzy match
135
+ // ============================================================
136
+ /**
137
+ * 当 symbolId 找不到时,返回最多 limit 个相似候选。
138
+ *
139
+ * 算法(轻量、无外部依赖):
140
+ * - 把 query 拆 token(按 `::` `/` `.` `-` `_` 拆分,过滤空 token)
141
+ * - 给每个 graph node id 打分:
142
+ * * 命中 token 数 +1 / token
143
+ * * id 含 query 子串 +0.5
144
+ * - 按分数降序,取前 limit 个 id
145
+ *
146
+ * 不实现 Levenshtein(避免引入新依赖);substring + token 命中已足够给 LLM agent
147
+ * 第二次正确输入的提示。
148
+ */
149
+ export function findFuzzyMatches(graphData, queryId, limit) {
150
+ if (limit <= 0 || queryId.length === 0)
151
+ return [];
152
+ const tokens = queryId
153
+ .toLowerCase()
154
+ .split(/[:/.\-_]+/)
155
+ .filter((t) => t.length > 0);
156
+ if (tokens.length === 0)
157
+ return [];
158
+ const lowerQuery = queryId.toLowerCase();
159
+ const scored = [];
160
+ for (const node of graphData.nodes) {
161
+ const lowerId = node.id.toLowerCase();
162
+ let score = 0;
163
+ for (const t of tokens) {
164
+ if (lowerId.includes(t))
165
+ score += 1;
166
+ }
167
+ if (lowerId.includes(lowerQuery))
168
+ score += 0.5;
169
+ if (score > 0) {
170
+ scored.push({ id: node.id, score });
171
+ }
172
+ }
173
+ scored.sort((a, b) => b.score - a.score);
174
+ return scored.slice(0, limit).map((x) => x.id);
175
+ }
176
+ // ============================================================
177
+ // risk tier
178
+ // ============================================================
179
+ /**
180
+ * 按 directCallers + transitive 节点数判定 risk tier。
181
+ *
182
+ * 阈值(spec FR-014):
183
+ * - directCallers ≥ 10 或 transitive ≥ 50 → high
184
+ * - directCallers ≥ 3 或 transitive ≥ 15 → medium
185
+ * - 其余 → low
186
+ */
187
+ export function computeRiskTier(directCallers, transitive) {
188
+ if (directCallers >= 10 || transitive >= 50)
189
+ return 'high';
190
+ if (directCallers >= 3 || transitive >= 15)
191
+ return 'medium';
192
+ return 'low';
193
+ }
194
+ // ============================================================
195
+ // reverse adjacency cache(LRU ≤ 8)
196
+ // ============================================================
197
+ const ADJ_CACHE_LIMIT = 8;
198
+ /**
199
+ * 反向邻接表 cache(按 graphPath + mtime + size + linksLength + relations 建 key)。
200
+ *
201
+ * 用 Map 实现 LRU:超过 LIMIT 时按插入顺序 evict 最早条目。同 key 命中时
202
+ * delete + set 把它放到最尾,模拟 "recently used"。
203
+ */
204
+ const adjCache = new Map();
205
+ function buildAdjKey(graphPath, mtimeMs, sizeBytes, linksLength, relations, direction) {
206
+ return `${graphPath}::${mtimeMs}::${sizeBytes}::${linksLength}::${relations.join(',')}::${direction}`;
207
+ }
208
+ /**
209
+ * 获取(或构建)反向邻接表。
210
+ *
211
+ * direction 决定邻接方向:
212
+ * - upstream:target → 进入此节点的 inbound 边(callers)
213
+ * - downstream:source → 离开此节点的 outbound 边(callees)
214
+ * - both:合并 inbound + outbound
215
+ *
216
+ * 仅保留 relation 在 relations 集合内的边;其他 relation 的边不进入邻接表。
217
+ */
218
+ export function getReverseAdjacency(graphData, graphPath, mtimeMs, sizeBytes, relations, direction) {
219
+ const key = buildAdjKey(graphPath, mtimeMs, sizeBytes, graphData.links.length, relations, direction);
220
+ const cached = adjCache.get(key);
221
+ if (cached !== undefined) {
222
+ // LRU:把命中的条目挪到最尾
223
+ adjCache.delete(key);
224
+ adjCache.set(key, cached);
225
+ return cached;
226
+ }
227
+ const adj = new Map();
228
+ const allowedRelations = new Set(relations);
229
+ for (const link of graphData.links) {
230
+ if (!allowedRelations.has(link.relation))
231
+ continue;
232
+ if (direction === 'upstream' || direction === 'both') {
233
+ // target ← source
234
+ const list = adj.get(link.target) ?? [];
235
+ list.push({ sourceId: link.source, edge: link });
236
+ adj.set(link.target, list);
237
+ }
238
+ if (direction === 'downstream' || direction === 'both') {
239
+ // source → target,但反向邻接表存储到 source 的 list 上以便 BFS 统一从 currentId 找下一跳
240
+ const list = adj.get(link.source) ?? [];
241
+ list.push({ sourceId: link.target, edge: link });
242
+ adj.set(link.source, list);
243
+ }
244
+ }
245
+ // 写入 cache,超 LIMIT 时 evict 最早
246
+ if (adjCache.size >= ADJ_CACHE_LIMIT) {
247
+ const oldestKey = adjCache.keys().next().value;
248
+ if (oldestKey !== undefined)
249
+ adjCache.delete(oldestKey);
250
+ }
251
+ adjCache.set(key, adj);
252
+ return adj;
253
+ }
254
+ /** 测试 / debug 用:清空 reverse adjacency cache */
255
+ export function clearReverseAdjacencyCache() {
256
+ adjCache.clear();
257
+ }
258
+ // ============================================================
259
+ // BFS traverse(核心)
260
+ // ============================================================
261
+ /**
262
+ * 从 startId 出发做 BFS,返回受影响的节点列表。
263
+ *
264
+ * 关键合同(FR-012):
265
+ * - budget 在**遍历前**应用:每次准备 enqueue 一个新节点之前,检查
266
+ * `affected.length + 1 > effectiveBudget`,超即停止入队并 push 'budget-truncated' warning
267
+ * - start node 不计入 budget;budget 仅约束 affected 数量
268
+ * - depth 是边数:depth=2 含 direct caller (depth=1) + 二级 caller (depth=2)
269
+ * - confidence 缺失:跳过 + 记 'missing-confidence-score' warning(不当作 0 静默通过)
270
+ * - sharedVisited 跨调用共享:detect_changes 多 changedSymbol 用同一 globalVisited
271
+ * 去重,让 affected 不重复计入同一节点
272
+ *
273
+ * 返回的 warnings 是去重的:同一类 warning 多次触发只 push 一次。
274
+ */
275
+ export function bfsTraverse(graphData, startId, options) {
276
+ const effectiveDepth = Math.max(0, Math.floor(options.depth));
277
+ const effectiveBudget = Math.max(0, Math.floor(options.budget));
278
+ const minConfidence = Math.max(0, Math.min(1, options.minConfidence));
279
+ const relations = options.relations && options.relations.length > 0 ? options.relations : DEFAULT_RELATIONS;
280
+ const warnings = new Set();
281
+ const affected = [];
282
+ if (effectiveDepth === 0) {
283
+ if (options.depth !== effectiveDepth)
284
+ warnings.add('depth-clamped');
285
+ return { affected, warnings: [...warnings] };
286
+ }
287
+ if (effectiveBudget === 0) {
288
+ return { affected, warnings: ['budget-zero'] };
289
+ }
290
+ const visited = options.sharedVisited ?? new Set();
291
+ visited.add(startId);
292
+ const adj = getReverseAdjacency(graphData, options.graphPath, options.graphMtimeMs, options.graphSizeBytes, relations, options.direction);
293
+ const queue = [{ id: startId, depth: 0, path: [startId] }];
294
+ let confidenceFiltered = 0;
295
+ let truncated = false;
296
+ // BFS 主循环
297
+ while (queue.length > 0) {
298
+ if (truncated)
299
+ break;
300
+ const cur = queue.shift();
301
+ if (cur.depth >= effectiveDepth)
302
+ continue;
303
+ const neighbors = adj.get(cur.id);
304
+ if (neighbors === undefined)
305
+ continue;
306
+ for (const ne of neighbors) {
307
+ if (truncated)
308
+ break;
309
+ const conf = resolveEdgeConfidence(ne.edge);
310
+ if (conf === null) {
311
+ warnings.add('missing-confidence-score');
312
+ continue;
313
+ }
314
+ if (conf < minConfidence) {
315
+ confidenceFiltered++;
316
+ continue;
317
+ }
318
+ if (visited.has(ne.sourceId))
319
+ continue;
320
+ // budget 遍历前截断(FR-012 关键合同)
321
+ if (affected.length + 1 > effectiveBudget) {
322
+ warnings.add('budget-truncated');
323
+ truncated = true;
324
+ break;
325
+ }
326
+ visited.add(ne.sourceId);
327
+ const nextDepth = cur.depth + 1;
328
+ const nextPath = [...cur.path, ne.sourceId];
329
+ const reason = buildReason(cur.id, ne.sourceId, ne.edge);
330
+ affected.push({
331
+ id: ne.sourceId,
332
+ depth: nextDepth,
333
+ confidence: conf,
334
+ reason,
335
+ path: nextPath,
336
+ });
337
+ // 只有还能继续展开(下一深度 < effectiveDepth)才入队
338
+ if (nextDepth < effectiveDepth) {
339
+ queue.push({ id: ne.sourceId, depth: nextDepth, path: nextPath });
340
+ }
341
+ }
342
+ }
343
+ if (affected.length === 0 && confidenceFiltered > 0) {
344
+ warnings.add('confidence-filtered-all');
345
+ }
346
+ if (options.depth !== effectiveDepth || options.budget !== effectiveBudget) {
347
+ warnings.add('input-clamped');
348
+ }
349
+ return { affected, warnings: [...warnings] };
350
+ }
351
+ function buildReason(fromId, toId, edge) {
352
+ const fromLabel = labelFromId(fromId);
353
+ const toLabel = labelFromId(toId);
354
+ return `${edge.relation} via ${fromLabel} ← ${toLabel}`;
355
+ }
356
+ function labelFromId(id) {
357
+ // 取 `file::Class.method` 中最右侧 segment 作为可读 label
358
+ const idx = id.lastIndexOf('::');
359
+ return idx >= 0 ? id.slice(idx + 2) : id;
360
+ }
361
+ // ============================================================
362
+ // 节点 id → 节点 metadata 抽取(context tool 用)
363
+ // ============================================================
364
+ /**
365
+ * 取节点的 module file 部分。
366
+ *
367
+ * 兼容两种分隔符(同一个 graph 内可能并存):
368
+ * - Feature 151 新格式:`<file>::<symbolName>` 例 `micrograd/engine.py::Value.__add__`
369
+ * - 旧 panoramic 格式:`<file>#<symbolName>` 例 `micrograd/engine.py#Value`
370
+ *
371
+ * 模块节点本身(id 既不含 `::` 也不含 `#`)→ 返回 id 自身。
372
+ * 取最早出现的分隔符位置作为 cut 点。
373
+ */
374
+ export function moduleFileFromId(nodeId) {
375
+ const idxColon = nodeId.indexOf('::');
376
+ const idxHash = nodeId.indexOf('#');
377
+ const cuts = [idxColon, idxHash].filter((i) => i >= 0);
378
+ if (cuts.length === 0)
379
+ return nodeId;
380
+ const first = Math.min(...cuts);
381
+ return nodeId.slice(0, first);
382
+ }
383
+ /**
384
+ * 在 graph 中找指定 node 的 GraphNode 对象。
385
+ * O(n) — 仅小规模 graph 使用,调用频率不高(仅 context handler 的 definition 字段)。
386
+ */
387
+ export function findNode(graphData, id) {
388
+ for (const n of graphData.nodes) {
389
+ if (n.id === id)
390
+ return n;
391
+ }
392
+ return null;
393
+ }
394
+ //# sourceMappingURL=query-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-helpers.js","sourceRoot":"","sources":["../../src/knowledge-graph/query-helpers.ts"],"names":[],"mappings":"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"}