kibi-cli 2.1.0 → 2.3.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 (398) hide show
  1. package/dist/cli-operation-loader.d.ts.map +1 -1
  2. package/dist/cli-operation-loader.js +3 -0
  3. package/dist/cli-operation-metadata.d.ts +4 -0
  4. package/dist/cli-operation-metadata.d.ts.map +1 -1
  5. package/dist/cli-operation-metadata.js +5 -0
  6. package/dist/cli-protocol.d.ts.map +1 -1
  7. package/dist/cli-protocol.js +3 -2
  8. package/dist/cli-register-reporting.d.ts.map +1 -1
  9. package/dist/cli-register-reporting.js +4 -0
  10. package/dist/commands/aggregated-checks.d.ts +7 -0
  11. package/dist/commands/aggregated-checks.d.ts.map +1 -1
  12. package/dist/commands/aggregated-checks.js +25 -1
  13. package/dist/commands/check-diff.d.ts +5 -0
  14. package/dist/commands/check-diff.d.ts.map +1 -0
  15. package/dist/commands/check-diff.js +62 -0
  16. package/dist/commands/check-generated.d.ts.map +1 -1
  17. package/dist/commands/check-generated.js +41 -18
  18. package/dist/commands/check.d.ts.map +1 -1
  19. package/dist/commands/check.js +231 -86
  20. package/dist/commands/doctor.d.ts.map +1 -1
  21. package/dist/commands/doctor.js +168 -53
  22. package/dist/commands/github-init.d.ts +1 -1
  23. package/dist/commands/github-init.d.ts.map +1 -1
  24. package/dist/commands/github-init.js +10 -3
  25. package/dist/commands/init-helpers.d.ts +17 -2
  26. package/dist/commands/init-helpers.d.ts.map +1 -1
  27. package/dist/commands/init-helpers.js +123 -23
  28. package/dist/commands/init.d.ts.map +1 -1
  29. package/dist/commands/init.js +110 -15
  30. package/dist/commands/prove.d.ts.map +1 -1
  31. package/dist/commands/prove.js +10 -18
  32. package/dist/commands/sync/cache.d.ts +20 -1
  33. package/dist/commands/sync/cache.d.ts.map +1 -1
  34. package/dist/commands/sync/cache.js +51 -2
  35. package/dist/commands/sync/discovery.d.ts.map +1 -1
  36. package/dist/commands/sync/discovery.js +1 -1
  37. package/dist/commands/sync/manifest.d.ts.map +1 -1
  38. package/dist/commands/sync/manifest.js +3 -1
  39. package/dist/commands/sync/persistence.d.ts.map +1 -1
  40. package/dist/commands/sync/persistence.js +8 -0
  41. package/dist/commands/sync.d.ts.map +1 -1
  42. package/dist/commands/sync.js +11 -3
  43. package/dist/engine.d.ts +41 -1
  44. package/dist/engine.d.ts.map +1 -1
  45. package/dist/engine.js +377 -80
  46. package/dist/extractors/manifest.d.ts.map +1 -1
  47. package/dist/extractors/manifest.js +66 -28
  48. package/dist/extractors/markdown.d.ts +2 -0
  49. package/dist/extractors/markdown.d.ts.map +1 -1
  50. package/dist/extractors/markdown.js +14 -3
  51. package/dist/extractors/relationships.d.ts.map +1 -1
  52. package/dist/extractors/relationships.js +1 -0
  53. package/dist/extractors/symbols-coordinator.d.ts +7 -0
  54. package/dist/extractors/symbols-coordinator.d.ts.map +1 -1
  55. package/dist/extractors/symbols-coordinator.js +75 -39
  56. package/dist/intent-search.d.ts.map +1 -1
  57. package/dist/intent-search.js +68 -29
  58. package/dist/operations/bootstrap/generate.d.ts.map +1 -1
  59. package/dist/operations/bootstrap/generate.js +4 -3
  60. package/dist/operations/modeling/model-requirement.d.ts +1 -1
  61. package/dist/operations/modeling/model-requirement.d.ts.map +1 -1
  62. package/dist/operations/modeling/model-requirement.js +176 -10
  63. package/dist/operations/modeling/predicate-applyplan.d.ts.map +1 -1
  64. package/dist/operations/modeling/predicate-applyplan.js +14 -2
  65. package/dist/operations/modeling/predicate-inference-1.js +1 -1
  66. package/dist/operations/modeling/predicate-loader.d.ts.map +1 -1
  67. package/dist/operations/modeling/predicate-loader.js +24 -0
  68. package/dist/operations/modeling/predicate-types.d.ts +4 -0
  69. package/dist/operations/modeling/predicate-types.d.ts.map +1 -1
  70. package/dist/operations/modeling/predicate-vocabulary.d.ts +54 -0
  71. package/dist/operations/modeling/predicate-vocabulary.d.ts.map +1 -0
  72. package/dist/operations/modeling/predicate-vocabulary.js +169 -0
  73. package/dist/operations/modeling/requirement-types.d.ts +5 -0
  74. package/dist/operations/modeling/requirement-types.d.ts.map +1 -1
  75. package/dist/operations/modeling/vocabulary-alignment.d.ts +60 -0
  76. package/dist/operations/modeling/vocabulary-alignment.d.ts.map +1 -0
  77. package/dist/operations/modeling/vocabulary-alignment.js +178 -0
  78. package/dist/operations/mutation/contradictions.d.ts +3 -0
  79. package/dist/operations/mutation/contradictions.d.ts.map +1 -1
  80. package/dist/operations/mutation/contradictions.js +29 -0
  81. package/dist/operations/mutation/delete.d.ts.map +1 -1
  82. package/dist/operations/mutation/delete.js +33 -1
  83. package/dist/operations/mutation/predicate-vocabulary-guard.d.ts +8 -0
  84. package/dist/operations/mutation/predicate-vocabulary-guard.d.ts.map +1 -0
  85. package/dist/operations/mutation/predicate-vocabulary-guard.js +64 -0
  86. package/dist/operations/mutation/relationships.d.ts +1 -1
  87. package/dist/operations/mutation/relationships.d.ts.map +1 -1
  88. package/dist/operations/mutation/relationships.js +1 -0
  89. package/dist/operations/mutation/saga.d.ts +5 -0
  90. package/dist/operations/mutation/saga.d.ts.map +1 -1
  91. package/dist/operations/mutation/saga.js +10 -0
  92. package/dist/operations/mutation/serialization.d.ts.map +1 -1
  93. package/dist/operations/mutation/serialization.js +2 -0
  94. package/dist/operations/mutation/source-authoring.d.ts +6 -0
  95. package/dist/operations/mutation/source-authoring.d.ts.map +1 -1
  96. package/dist/operations/mutation/source-authoring.js +213 -52
  97. package/dist/operations/mutation/strict-fact.d.ts.map +1 -1
  98. package/dist/operations/mutation/strict-fact.js +5 -0
  99. package/dist/operations/mutation/types.d.ts +17 -0
  100. package/dist/operations/mutation/types.d.ts.map +1 -1
  101. package/dist/operations/mutation/upsert.d.ts +6 -0
  102. package/dist/operations/mutation/upsert.d.ts.map +1 -1
  103. package/dist/operations/mutation/upsert.js +77 -11
  104. package/dist/operations/mutation/validate-upsert.d.ts.map +1 -1
  105. package/dist/operations/mutation/validate-upsert.js +24 -1
  106. package/dist/operations/mutation/validation.d.ts.map +1 -1
  107. package/dist/operations/mutation/validation.js +16 -3
  108. package/dist/operations/planning/apply-plan.d.ts.map +1 -1
  109. package/dist/operations/planning/apply-plan.js +66 -26
  110. package/dist/operations/planning/compile-intent.d.ts.map +1 -1
  111. package/dist/operations/planning/compile-intent.js +3 -1
  112. package/dist/operations/proof/code-scope.d.ts +17 -0
  113. package/dist/operations/proof/code-scope.d.ts.map +1 -0
  114. package/dist/operations/proof/code-scope.js +60 -0
  115. package/dist/operations/proof/ingest-proof.d.ts +4 -2
  116. package/dist/operations/proof/ingest-proof.d.ts.map +1 -1
  117. package/dist/operations/proof/ingest-proof.js +208 -74
  118. package/dist/operations/proof/migrate-legacy-receipts.d.ts.map +1 -1
  119. package/dist/operations/proof/migrate-legacy-receipts.js +7 -5
  120. package/dist/operations/proof/prune-receipts.d.ts.map +1 -1
  121. package/dist/operations/proof/prune-receipts.js +7 -5
  122. package/dist/operations/semantic-advisor/analysis-receipt.d.ts.map +1 -1
  123. package/dist/operations/semantic-advisor/analysis-receipt.js +7 -1
  124. package/dist/operations/semantic-advisor/analyze-prose.d.ts.map +1 -1
  125. package/dist/operations/semantic-advisor/analyze-prose.js +26 -4
  126. package/dist/operations/semantic-advisor/clauses.d.ts +1 -0
  127. package/dist/operations/semantic-advisor/clauses.d.ts.map +1 -1
  128. package/dist/operations/semantic-advisor/clauses.js +7 -1
  129. package/dist/performance-trace.d.ts +17 -0
  130. package/dist/performance-trace.d.ts.map +1 -0
  131. package/dist/performance-trace.js +134 -0
  132. package/dist/plugins/approved-source-analyzers.d.ts +13 -0
  133. package/dist/plugins/approved-source-analyzers.d.ts.map +1 -0
  134. package/dist/plugins/approved-source-analyzers.generated.d.ts +71 -0
  135. package/dist/plugins/approved-source-analyzers.generated.d.ts.map +1 -0
  136. package/dist/plugins/approved-source-analyzers.generated.js +77 -0
  137. package/dist/plugins/approved-source-analyzers.js +3 -0
  138. package/dist/plugins/compose-semantic-classifier.d.ts +6 -1
  139. package/dist/plugins/compose-semantic-classifier.d.ts.map +1 -1
  140. package/dist/plugins/compose-semantic-classifier.js +8 -3
  141. package/dist/plugins/compose-vocabulary-alignment.d.ts +23 -0
  142. package/dist/plugins/compose-vocabulary-alignment.d.ts.map +1 -0
  143. package/dist/plugins/compose-vocabulary-alignment.js +141 -0
  144. package/dist/plugins/external-allowlist.d.ts +7 -0
  145. package/dist/plugins/external-allowlist.d.ts.map +1 -1
  146. package/dist/plugins/external-allowlist.js +13 -0
  147. package/dist/plugins/index.d.ts +2 -0
  148. package/dist/plugins/index.d.ts.map +1 -1
  149. package/dist/plugins/index.js +4 -0
  150. package/dist/plugins/maintenance-source-analysis.d.ts +14 -0
  151. package/dist/plugins/maintenance-source-analysis.d.ts.map +1 -0
  152. package/dist/plugins/maintenance-source-analysis.js +191 -0
  153. package/dist/plugins/registry.d.ts +3 -1
  154. package/dist/plugins/registry.d.ts.map +1 -1
  155. package/dist/plugins/registry.js +27 -1
  156. package/dist/plugins/source-analysis-service.d.ts +36 -1
  157. package/dist/plugins/source-analysis-service.d.ts.map +1 -1
  158. package/dist/plugins/source-analysis-service.js +184 -27
  159. package/dist/plugins/source-change-analysis.d.ts +15 -0
  160. package/dist/plugins/source-change-analysis.d.ts.map +1 -0
  161. package/dist/plugins/source-change-analysis.js +54 -0
  162. package/dist/plugins/source-classification.d.ts +41 -0
  163. package/dist/plugins/source-classification.d.ts.map +1 -0
  164. package/dist/plugins/source-classification.js +490 -0
  165. package/dist/prolog/codec.d.ts.map +1 -1
  166. package/dist/prolog/codec.js +2 -0
  167. package/dist/prolog/swipl-resolver.d.ts +88 -0
  168. package/dist/prolog/swipl-resolver.d.ts.map +1 -0
  169. package/dist/prolog/swipl-resolver.js +446 -0
  170. package/dist/prolog.d.ts +51 -1
  171. package/dist/prolog.d.ts.map +1 -1
  172. package/dist/prolog.js +145 -15
  173. package/dist/public/diagnostic-usage.d.ts.map +1 -1
  174. package/dist/public/diagnostic-usage.js +7 -25
  175. package/dist/public/impact/analyzer.d.ts.map +1 -1
  176. package/dist/public/impact/analyzer.js +56 -5
  177. package/dist/public/impact/diagnostics.d.ts.map +1 -1
  178. package/dist/public/impact/diagnostics.js +3 -1
  179. package/dist/public/impact/full-kb-quality.d.ts.map +1 -1
  180. package/dist/public/impact/full-kb-quality.js +4 -12
  181. package/dist/public/impact/manifest.d.ts.map +1 -1
  182. package/dist/public/impact/manifest.js +15 -1
  183. package/dist/public/impact/source-changes.d.ts.map +1 -1
  184. package/dist/public/impact/source-changes.js +35 -27
  185. package/dist/public/impact/types.d.ts +2 -0
  186. package/dist/public/impact/types.d.ts.map +1 -1
  187. package/dist/public/operations/catalog.d.ts +80 -7
  188. package/dist/public/operations/catalog.d.ts.map +1 -1
  189. package/dist/public/operations/catalog.js +2 -0
  190. package/dist/public/operations/check-executor.d.ts.map +1 -1
  191. package/dist/public/operations/check-executor.js +10 -2
  192. package/dist/public/operations/check-helpers.d.ts +6 -0
  193. package/dist/public/operations/check-helpers.d.ts.map +1 -1
  194. package/dist/public/operations/check-helpers.js +21 -1
  195. package/dist/public/operations/contracts.d.ts.map +1 -1
  196. package/dist/public/operations/contracts.js +325 -8
  197. package/dist/public/operations/discovery-entities.d.ts +42 -2
  198. package/dist/public/operations/discovery-entities.d.ts.map +1 -1
  199. package/dist/public/operations/discovery-entities.js +195 -22
  200. package/dist/public/operations/discovery-executors.d.ts +1 -0
  201. package/dist/public/operations/discovery-executors.d.ts.map +1 -1
  202. package/dist/public/operations/discovery-executors.js +75 -46
  203. package/dist/public/operations/impact-review-preparation.d.ts +14 -0
  204. package/dist/public/operations/impact-review-preparation.d.ts.map +1 -0
  205. package/dist/public/operations/impact-review-preparation.js +379 -0
  206. package/dist/public/operations/index.d.ts +2 -0
  207. package/dist/public/operations/index.d.ts.map +1 -1
  208. package/dist/public/operations/index.js +2 -0
  209. package/dist/public/operations/migration-plan.d.ts +2 -0
  210. package/dist/public/operations/migration-plan.d.ts.map +1 -1
  211. package/dist/public/operations/migration-plan.js +50 -0
  212. package/dist/public/operations/node-ports.d.ts.map +1 -1
  213. package/dist/public/operations/node-ports.js +1 -35
  214. package/dist/public/operations/predicate-schema-conformance.d.ts +41 -0
  215. package/dist/public/operations/predicate-schema-conformance.d.ts.map +1 -0
  216. package/dist/public/operations/predicate-schema-conformance.js +242 -0
  217. package/dist/public/operations/prolog-json.d.ts.map +1 -1
  218. package/dist/public/operations/prolog-json.js +9 -3
  219. package/dist/public/operations/proof-receipt-projection.d.ts +5 -0
  220. package/dist/public/operations/proof-receipt-projection.d.ts.map +1 -0
  221. package/dist/public/operations/proof-receipt-projection.js +36 -0
  222. package/dist/public/operations/result-envelope.d.ts +34 -1
  223. package/dist/public/operations/result-envelope.d.ts.map +1 -1
  224. package/dist/public/operations/result-envelope.js +78 -2
  225. package/dist/public/operations/runtime-types.d.ts +1 -1
  226. package/dist/public/operations/runtime-types.d.ts.map +1 -1
  227. package/dist/public/operations/specs/check-rules.generated.d.ts +1 -1
  228. package/dist/public/operations/specs/check-rules.generated.d.ts.map +1 -1
  229. package/dist/public/operations/specs/check-rules.generated.js +8 -1
  230. package/dist/public/operations/specs/check.d.ts +1 -1
  231. package/dist/public/operations/specs/discovery.d.ts +7 -1
  232. package/dist/public/operations/specs/discovery.d.ts.map +1 -1
  233. package/dist/public/operations/specs/discovery.js +7 -1
  234. package/dist/public/operations/specs/impact-review-preparation.d.ts +47 -0
  235. package/dist/public/operations/specs/impact-review-preparation.d.ts.map +1 -0
  236. package/dist/public/operations/specs/impact-review-preparation.js +43 -0
  237. package/dist/public/operations/specs/mutation-schemas.d.ts +27 -4
  238. package/dist/public/operations/specs/mutation-schemas.d.ts.map +1 -1
  239. package/dist/public/operations/specs/mutation-schemas.js +21 -3
  240. package/dist/public/operations/specs/reporting.d.ts +8 -0
  241. package/dist/public/operations/specs/reporting.d.ts.map +1 -1
  242. package/dist/public/operations/specs/reporting.js +46 -15
  243. package/dist/public/operations/specs/upsert.d.ts +28 -5
  244. package/dist/public/operations/specs/upsert.d.ts.map +1 -1
  245. package/dist/public/operations/specs/upsert.js +1 -1
  246. package/dist/public/operations/symbol-repair-plan.d.ts.map +1 -1
  247. package/dist/public/operations/symbol-repair-plan.js +8 -3
  248. package/dist/public/operations/types.d.ts +1 -1
  249. package/dist/public/operations/types.d.ts.map +1 -1
  250. package/dist/public/schemas/entity.d.ts.map +1 -1
  251. package/dist/public/schemas/entity.js +22 -0
  252. package/dist/public/schemas/relationship.d.ts.map +1 -1
  253. package/dist/public/schemas/relationship.js +1 -0
  254. package/dist/public/skills/kibi-usage/SKILL.md +7 -3
  255. package/dist/public/skills/kibi-usage/resources/fact-lanes.md +4 -0
  256. package/dist/public/skills/kibi-usage/resources/operation-access.md +1 -0
  257. package/dist/public/skills/kibi-usage/resources/relationship-directions.md +35 -17
  258. package/dist/public/skills/kibi-usage/resources/source-authoring.md +36 -0
  259. package/dist/public/skills/kibi-usage/resources/workflows.md +52 -1
  260. package/dist/public/telemetry-acceptance.d.ts.map +1 -1
  261. package/dist/public/telemetry-acceptance.js +21 -5
  262. package/dist/relationships/shards.d.ts +6 -0
  263. package/dist/relationships/shards.d.ts.map +1 -1
  264. package/dist/relationships/shards.js +26 -19
  265. package/dist/schemas/entity.schema.json +32 -0
  266. package/dist/traceability/analysis-gate.d.ts +39 -0
  267. package/dist/traceability/analysis-gate.d.ts.map +1 -0
  268. package/dist/traceability/analysis-gate.js +51 -0
  269. package/dist/traceability/git-change-snapshot.d.ts +27 -0
  270. package/dist/traceability/git-change-snapshot.d.ts.map +1 -0
  271. package/dist/traceability/git-change-snapshot.js +411 -0
  272. package/dist/traceability/git-staged.d.ts +5 -1
  273. package/dist/traceability/git-staged.d.ts.map +1 -1
  274. package/dist/traceability/git-staged.js +16 -11
  275. package/dist/traceability/impact-evaluator.d.ts +54 -0
  276. package/dist/traceability/impact-evaluator.d.ts.map +1 -0
  277. package/dist/traceability/impact-evaluator.js +270 -0
  278. package/dist/traceability/impact-git-tree.d.ts +12 -0
  279. package/dist/traceability/impact-git-tree.d.ts.map +1 -0
  280. package/dist/traceability/impact-git-tree.js +46 -0
  281. package/dist/traceability/impact-knowledge.d.ts +16 -0
  282. package/dist/traceability/impact-knowledge.d.ts.map +1 -0
  283. package/dist/traceability/impact-knowledge.js +165 -0
  284. package/dist/traceability/impact-policy.d.ts +15 -0
  285. package/dist/traceability/impact-policy.d.ts.map +1 -0
  286. package/dist/traceability/impact-policy.js +48 -0
  287. package/dist/traceability/impact-policy.v1.schema.json +48 -0
  288. package/dist/traceability/impact-pr-diff.d.ts +5 -0
  289. package/dist/traceability/impact-pr-diff.d.ts.map +1 -0
  290. package/dist/traceability/impact-pr-diff.js +83 -0
  291. package/dist/traceability/impact-record-validation.d.ts +9 -0
  292. package/dist/traceability/impact-record-validation.d.ts.map +1 -0
  293. package/dist/traceability/impact-record-validation.js +113 -0
  294. package/dist/traceability/impact-review.d.ts +148 -0
  295. package/dist/traceability/impact-review.d.ts.map +1 -0
  296. package/dist/traceability/impact-review.js +494 -0
  297. package/dist/traceability/impact-review.schema.json +365 -0
  298. package/dist/traceability/impact-side-evidence.d.ts +13 -0
  299. package/dist/traceability/impact-side-evidence.d.ts.map +1 -0
  300. package/dist/traceability/impact-side-evidence.js +240 -0
  301. package/dist/traceability/reviewed-coordinate-refresh.d.ts +10 -0
  302. package/dist/traceability/reviewed-coordinate-refresh.d.ts.map +1 -0
  303. package/dist/traceability/reviewed-coordinate-refresh.js +49 -0
  304. package/dist/traceability/snapshot-knowledge.d.ts +4 -0
  305. package/dist/traceability/snapshot-knowledge.d.ts.map +1 -0
  306. package/dist/traceability/snapshot-knowledge.js +98 -0
  307. package/dist/traceability/staged-diagnostics.d.ts +1 -1
  308. package/dist/traceability/staged-diagnostics.d.ts.map +1 -1
  309. package/dist/traceability/staged-entity-id-style.d.ts +12 -0
  310. package/dist/traceability/staged-entity-id-style.d.ts.map +1 -0
  311. package/dist/traceability/staged-entity-id-style.js +68 -0
  312. package/dist/traceability/staged-file-coverage.d.ts +23 -0
  313. package/dist/traceability/staged-file-coverage.d.ts.map +1 -1
  314. package/dist/traceability/staged-impact-contract.d.ts.map +1 -1
  315. package/dist/traceability/staged-impact-contract.js +2 -16
  316. package/dist/traceability/staged-symbols-manifest.d.ts +4 -0
  317. package/dist/traceability/staged-symbols-manifest.d.ts.map +1 -1
  318. package/dist/traceability/staged-symbols-manifest.js +17 -6
  319. package/dist/traceability/symbol-extract.d.ts +3 -5
  320. package/dist/traceability/symbol-extract.d.ts.map +1 -1
  321. package/dist/traceability/symbol-extract.js +49 -34
  322. package/dist/traceability/temp-kb.d.ts +1 -1
  323. package/dist/traceability/temp-kb.d.ts.map +1 -1
  324. package/dist/traceability/temp-kb.js +57 -13
  325. package/dist/traceability/trusted-pr-event.d.ts +13 -0
  326. package/dist/traceability/trusted-pr-event.d.ts.map +1 -0
  327. package/dist/traceability/trusted-pr-event.js +105 -0
  328. package/dist/traceability/validate.js +1 -1
  329. package/dist/types/entities.d.ts +2 -0
  330. package/dist/types/entities.d.ts.map +1 -1
  331. package/dist/types/relationships.d.ts +1 -1
  332. package/dist/types/relationships.d.ts.map +1 -1
  333. package/dist/utils/canonical-path.d.ts +3 -0
  334. package/dist/utils/canonical-path.d.ts.map +1 -0
  335. package/dist/utils/canonical-path.js +33 -0
  336. package/dist/utils/entity-id-style.d.ts +27 -0
  337. package/dist/utils/entity-id-style.d.ts.map +1 -0
  338. package/dist/utils/entity-id-style.js +81 -0
  339. package/dist/utils/git-repository-context.d.ts +50 -0
  340. package/dist/utils/git-repository-context.d.ts.map +1 -0
  341. package/dist/utils/git-repository-context.js +259 -0
  342. package/dist/utils/rule-registry.d.ts +5 -0
  343. package/dist/utils/rule-registry.d.ts.map +1 -1
  344. package/dist/utils/rule-registry.generated.d.ts +37 -0
  345. package/dist/utils/rule-registry.generated.d.ts.map +1 -1
  346. package/dist/utils/rule-registry.generated.js +44 -0
  347. package/dist/utils/strict-modeling.d.ts +7 -0
  348. package/dist/utils/strict-modeling.d.ts.map +1 -1
  349. package/dist/utils/strict-modeling.js +11 -0
  350. package/package.json +14 -5
  351. package/schema/entities.pl +60 -1
  352. package/schema/relationships.pl +17 -4
  353. package/schema/validation.pl +118 -20
  354. package/src/public/diagnostic-usage.ts +16 -24
  355. package/src/public/impact/analyzer.ts +88 -5
  356. package/src/public/impact/diagnostics.ts +7 -5
  357. package/src/public/impact/full-kb-quality.ts +4 -16
  358. package/src/public/impact/manifest.ts +14 -1
  359. package/src/public/impact/source-changes.ts +39 -34
  360. package/src/public/impact/types.ts +5 -0
  361. package/src/public/operations/catalog.ts +2 -0
  362. package/src/public/operations/check-executor.ts +12 -1
  363. package/src/public/operations/check-helpers.ts +27 -1
  364. package/src/public/operations/contracts.ts +404 -9
  365. package/src/public/operations/discovery-entities.ts +292 -23
  366. package/src/public/operations/discovery-executors.ts +91 -55
  367. package/src/public/operations/impact-review-preparation.ts +548 -0
  368. package/src/public/operations/index.ts +2 -0
  369. package/src/public/operations/migration-plan.ts +57 -0
  370. package/src/public/operations/node-ports.ts +1 -39
  371. package/src/public/operations/predicate-schema-conformance.ts +362 -0
  372. package/src/public/operations/prolog-json.ts +9 -3
  373. package/src/public/operations/proof-receipt-projection.ts +39 -0
  374. package/src/public/operations/result-envelope.ts +114 -2
  375. package/src/public/operations/runtime-types.ts +1 -1
  376. package/src/public/operations/specs/check-rules.generated.ts +8 -1
  377. package/src/public/operations/specs/discovery.ts +8 -1
  378. package/src/public/operations/specs/impact-review-preparation.ts +46 -0
  379. package/src/public/operations/specs/mutation-schemas.ts +23 -3
  380. package/src/public/operations/specs/reporting.ts +69 -22
  381. package/src/public/operations/specs/upsert.ts +1 -1
  382. package/src/public/operations/symbol-repair-plan.ts +13 -3
  383. package/src/public/operations/types.ts +1 -0
  384. package/src/public/schemas/entity.ts +22 -0
  385. package/src/public/schemas/relationship.ts +1 -0
  386. package/src/public/skills/kibi-usage/SKILL.md +7 -3
  387. package/src/public/skills/kibi-usage/resources/fact-lanes.md +4 -0
  388. package/src/public/skills/kibi-usage/resources/operation-access.md +1 -0
  389. package/src/public/skills/kibi-usage/resources/relationship-directions.md +35 -17
  390. package/src/public/skills/kibi-usage/resources/source-authoring.md +36 -0
  391. package/src/public/skills/kibi-usage/resources/workflows.md +52 -1
  392. package/src/public/telemetry-acceptance.ts +37 -6
  393. package/src/schemas/entity.schema.json +32 -0
  394. package/src/schemas/relationship.schema.json +1 -0
  395. package/src/traceability/impact-policy.v1.schema.json +48 -0
  396. package/src/traceability/impact-review.schema.json +365 -0
  397. package/templates/github/kibi-badge.yml +0 -4
  398. package/templates/github/kibi-report.yml +0 -4
@@ -0,0 +1,191 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFileSync, realpathSync } from "node:fs";
3
+ import { createRequire } from "node:module";
4
+ import { dirname, isAbsolute, join, relative, resolve } from "node:path";
5
+ import { validateProjectKibiConfig, } from "kibi-plugin-sdk";
6
+ import { SYMBOL_EXTRACTOR_V2_CAPABILITY_ID } from "kibi-plugin-sdk";
7
+ import { fingerprint } from "../traceability/impact-review.js";
8
+ import { APPROVED_SOURCE_ANALYZERS, } from "./approved-source-analyzers.js";
9
+ import { readProjectKibiConfig } from "./project-config.js";
10
+ import { CapabilityRegistry } from "./registry.js";
11
+ import { resolveProjectLocalPackage } from "./resolve-package.js";
12
+ import { createSourceAnalysisService, } from "./source-analysis-service.js";
13
+ function digestFile(root, file) {
14
+ const candidate = resolve(root, file);
15
+ const rel = relative(root, candidate);
16
+ if (!rel || rel.startsWith("..") || isAbsolute(rel))
17
+ throw new Error(`Invalid approved asset path: ${file}`);
18
+ const actual = realpathSync(candidate);
19
+ const actualRel = relative(realpathSync(root), actual);
20
+ if (actualRel.startsWith("..") || isAbsolute(actualRel))
21
+ throw new Error(`Approved asset escapes its package: ${file}`);
22
+ return createHash("sha256").update(readFileSync(actual)).digest("hex");
23
+ }
24
+ function verifyFiles(root, files) {
25
+ if (Object.keys(files).length === 0)
26
+ throw new Error("An approved analyzer must pin its executable closure");
27
+ for (const [file, expected] of Object.entries(files)) {
28
+ if (digestFile(root, file) !== expected)
29
+ throw new Error(`Source analyzer integrity mismatch: ${file}`);
30
+ }
31
+ }
32
+ function dependencyRoot(importer, packageName) {
33
+ const require = createRequire(join(importer, "package.json"));
34
+ let current = dirname(require.resolve(packageName));
35
+ for (;;) {
36
+ try {
37
+ const json = JSON.parse(readFileSync(join(current, "package.json"), "utf8"));
38
+ if (json.name === packageName)
39
+ return current;
40
+ }
41
+ catch {
42
+ /* Walk through a package's dist directories. */
43
+ }
44
+ const parent = dirname(current);
45
+ if (parent === current)
46
+ throw new Error(`Cannot locate approved dependency: ${packageName}`);
47
+ current = parent;
48
+ }
49
+ }
50
+ /**
51
+ * Identify the host's first-party builtin analyzer by its published package
52
+ * identity. Content integrity of an installed release is the package
53
+ * manager's job; hashing the installed tree made the fingerprint differ
54
+ * between a workspace checkout, an npm install and a bundled runtime.
55
+ */
56
+ function builtinRuntimeIdentity() {
57
+ const manifest = createRequire(import.meta.url)("kibi-plugin-builtin/package.json");
58
+ if (manifest.name !== "kibi-plugin-builtin" ||
59
+ typeof manifest.version !== "string")
60
+ throw new Error("Builtin source analyzer identity is invalid");
61
+ return { name: manifest.name, version: manifest.version };
62
+ }
63
+ /** Hash the exact trusted source-extractor activation and its host-pinned closure. */
64
+ // implements REQ-impact-policy-stage-e-content-bound-review
65
+ export function fingerprintMaintenanceSourceSet(workspaceRoot, projectConfig) {
66
+ const sourceEntries = (projectConfig.plugins ?? [])
67
+ .map((entry) => ({
68
+ package: entry.package,
69
+ capability: entry.capabilities[SYMBOL_EXTRACTOR_V2_CAPABILITY_ID] ?? null,
70
+ }))
71
+ .filter((entry) => entry.capability !== null)
72
+ .sort((a, b) => a.package.localeCompare(b.package));
73
+ const bindings = sourceEntries.map(({ package: packageName, capability }) => {
74
+ const approval = APPROVED_SOURCE_ANALYZERS.find((item) => item.packageName === packageName);
75
+ if (!approval)
76
+ throw new Error(`Source analyzer is not approved for impact review: ${packageName}`);
77
+ const resolved = resolveProjectLocalPackage(workspaceRoot, packageName);
78
+ const entryRelative = relative(resolved.packageRoot, resolved.entryPath).replaceAll("\\", "/");
79
+ if (!approval.files[entryRelative])
80
+ throw new Error("Source analyzer entrypoint is outside its approved closure");
81
+ return {
82
+ packageName,
83
+ capability,
84
+ approvalFingerprint: verifyApprovedSourceAnalyzer(resolved.packageRoot, approval),
85
+ };
86
+ });
87
+ return fingerprint({
88
+ contractVersion: "kibi.maintenance-source-set.v2",
89
+ builtinRuntime: builtinRuntimeIdentity(),
90
+ sdkContract: SYMBOL_EXTRACTOR_V2_CAPABILITY_ID,
91
+ bindings,
92
+ });
93
+ }
94
+ /** Verify the exact host-approved closure before any plugin entrypoint executes. */
95
+ // implements REQ-capability-plugin-activation-disclosure-v1
96
+ export function verifyApprovedSourceAnalyzer(root, approval) {
97
+ verifyFiles(root, approval.files);
98
+ const manifest = JSON.parse(readFileSync(join(root, "package.json"), "utf8"));
99
+ if (manifest.name !== approval.packageName ||
100
+ manifest.version !== approval.version)
101
+ throw new Error("Source analyzer package identity does not match host approval");
102
+ for (const dependency of approval.dependencies) {
103
+ const depRoot = dependencyRoot(root, dependency.packageName);
104
+ verifyFiles(depRoot, dependency.files);
105
+ const metadata = JSON.parse(readFileSync(join(depRoot, "package.json"), "utf8"));
106
+ if (metadata.version !== dependency.version)
107
+ throw new Error(`Unapproved source runtime version: ${dependency.packageName}`);
108
+ }
109
+ return createHash("sha256").update(JSON.stringify(approval)).digest("hex");
110
+ }
111
+ /** Maintenance resolves source capabilities only; unrelated plugin code is never imported. */
112
+ // implements REQ-capability-plugin-activation-disclosure-v1
113
+ export function createMaintenanceSourceAnalysisService(workspaceRoot, projectConfig) {
114
+ const config = projectConfig ?? readProjectKibiConfig(workspaceRoot);
115
+ const fingerprints = {};
116
+ const sourceEntries = (config.plugins ?? []).filter((entry) => entry.capabilities[SYMBOL_EXTRACTOR_V2_CAPABILITY_ID]);
117
+ const registry = new CapabilityRegistry({
118
+ workspaceRoot,
119
+ projectConfig: {
120
+ plugins: sourceEntries.flatMap((entry) => {
121
+ const capability = entry.capabilities[SYMBOL_EXTRACTOR_V2_CAPABILITY_ID];
122
+ return capability
123
+ ? [
124
+ {
125
+ package: entry.package,
126
+ capabilities: {
127
+ [SYMBOL_EXTRACTOR_V2_CAPABILITY_ID]: capability,
128
+ },
129
+ },
130
+ ]
131
+ : [];
132
+ }),
133
+ },
134
+ });
135
+ return createSourceAnalysisService({
136
+ registry,
137
+ providerFingerprints: fingerprints,
138
+ resolveExtractorsV2: async () => {
139
+ for (const entry of sourceEntries) {
140
+ const approval = APPROVED_SOURCE_ANALYZERS.find((item) => item.packageName === entry.package);
141
+ if (!approval)
142
+ throw new Error(`Source analyzer is not approved for maintenance: ${entry.package}`);
143
+ const resolved = resolveProjectLocalPackage(workspaceRoot, entry.package);
144
+ const entryRelative = relative(resolved.packageRoot, resolved.entryPath).replaceAll("\\", "/");
145
+ if (!approval.files[entryRelative])
146
+ throw new Error("Source analyzer entrypoint is outside its approved closure");
147
+ fingerprints[entry.package] = verifyApprovedSourceAnalyzer(resolved.packageRoot, approval);
148
+ }
149
+ return registry.resolveSymbolExtractorsV2();
150
+ },
151
+ });
152
+ }
153
+ /** Capture activation with the same source snapshot and retain baseline analyzers for code changes. */
154
+ // implements REQ-source-analysis-v2
155
+ export function readSnapshotSourceConfig(snapshot, trustedTree) {
156
+ const readConfig = (tree) => {
157
+ const entry = snapshot
158
+ .readGit(["ls-tree", tree, "--", "package.json"])
159
+ .toString("utf8");
160
+ if (!entry)
161
+ return {};
162
+ if (!/^100(?:644|755) blob /.test(entry))
163
+ throw new Error("Source analyzer configuration must be a regular snapshot file");
164
+ return validateProjectKibiConfig(JSON.parse(snapshot.readGit(["show", `${tree}:package.json`]).toString("utf8")).kibi);
165
+ };
166
+ if (trustedTree !== undefined)
167
+ return readConfig(trustedTree);
168
+ const entries = new Map();
169
+ for (const entry of readConfig(snapshot.headTree).plugins ?? [])
170
+ entries.set(entry.package, entry);
171
+ const configurationPaths = new Set([
172
+ "package.json",
173
+ "bun.lock",
174
+ "package-lock.json",
175
+ "pnpm-lock.yaml",
176
+ "yarn.lock",
177
+ ]);
178
+ if (snapshot.inventory.some((file) => !configurationPaths.has(file.path) && !file.path.startsWith(".kb/"))) {
179
+ for (const entry of readConfig(snapshot.baseTree).plugins ?? []) {
180
+ const baseline = entry.capabilities[SYMBOL_EXTRACTOR_V2_CAPABILITY_ID];
181
+ if (!baseline || baseline.mode === "shadow")
182
+ continue;
183
+ const selected = entries.get(entry.package)?.capabilities[SYMBOL_EXTRACTOR_V2_CAPABILITY_ID];
184
+ if (selected?.mode === "shadow")
185
+ throw new Error(`Cannot downgrade active source analyzer '${entry.package}' to shadow while changing source; separate the configuration change`);
186
+ if (!selected)
187
+ entries.set(entry.package, entry);
188
+ }
189
+ }
190
+ return { plugins: [...entries.values()] };
191
+ }
@@ -1,4 +1,4 @@
1
- import { type CapabilityId, type KibiPluginV1, type OntologyPackV1, type PluginMode, type PluginPermissions, type PluginProviderStamp, type ProjectKibiConfig, type SemanticClassifierV1, type SymbolExtractorV1 } from "kibi-plugin-sdk";
1
+ import { type CapabilityId, type KibiPluginV1, type OntologyPackV1, type PluginMode, type PluginPermissions, type PluginProviderStamp, type ProjectKibiConfig, type SemanticClassifierV1, type SymbolExtractorV1, type SymbolExtractorV2, type VocabularyAlignmentV1 } from "kibi-plugin-sdk";
2
2
  import { type LoadPluginOptions, loadPluginPackage } from "./load-plugin.js";
3
3
  export type BuiltinPluginFactory = () => KibiPluginV1 | Promise<KibiPluginV1>;
4
4
  export type CapabilityProviderBinding<T> = Readonly<{
@@ -59,6 +59,8 @@ export declare class CapabilityRegistry {
59
59
  resolveSemanticClassifiers(): Promise<CapabilityModeResolution<SemanticClassifierV1>>;
60
60
  resolveOntologyPacks(): Promise<CapabilityModeResolution<OntologyPackV1>>;
61
61
  resolveSymbolExtractors(): Promise<CapabilityModeResolution<SymbolExtractorV1>>;
62
+ resolveSymbolExtractorsV2(): Promise<CapabilityModeResolution<SymbolExtractorV2>>;
63
+ resolveVocabularyAlignment(): Promise<CapabilityModeResolution<VocabularyAlignmentV1>>;
62
64
  resolveCapability(capabilityId: CapabilityId): Promise<CapabilityModeResolution<unknown>>;
63
65
  /**
64
66
  * Canonical providers only (builtin + optional replace + augment).
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/plugins/registry.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,YAAY,EAEjB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EAItB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EAGvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,KAAK,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAK7E,MAAM,MAAM,oBAAoB,GAAG,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AAG9E,MAAM,MAAM,yBAAyB,CAAC,CAAC,IAAI,QAAQ,CAAC;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7B,WAAW,EAAE,iBAAiB,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,CAAC,CAAC;IACd,KAAK,EAAE,mBAAmB,CAAC;CAC5B,CAAC,CAAC;AAGH,MAAM,MAAM,wBAAwB,CAAC,CAAC,IAAI,QAAQ,CAAC;IACjD,OAAO,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC;IACtC,wDAAwD;IACxD,OAAO,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC7C,0DAA0D;IAC1D,OAAO,EAAE,SAAS,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,+DAA+D;IAC/D,MAAM,EAAE,SAAS,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;CACjD,CAAC,CAAC;AAGH,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,sEAAsE;IACtE,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,kDAAkD;IAClD,UAAU,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,iBAAiB,CAAC;IAC1D,0CAA0C;IAC1C,UAAU,CAAC,EAAE,CACX,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,iBAAiB,KACxB,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC5D,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC,CAAC,CAAC;AAUH;;;GAGG;AAEH,wBAAgB,uBAAuB,IAAI,YAAY,CAuCtD;AAqGD;;;;GAIG;AAEH,qBAAa,kBAAkB;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuB;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+C;IAC1E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAEzB;IACF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAgC;IAClE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgC;IAE/D,OAAO,CAAC,oBAAoB,CAAoC;IAChE,OAAO,CAAC,aAAa,CAAyC;IAC9D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAG3B;IACJ,OAAO,CAAC,QAAQ,CAAC,eAAe,CAG5B;gBAEQ,OAAO,EAAE,yBAAyB;IASxC,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC;IAOzC,gBAAgB,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAQ9C,0BAA0B,IAAI,OAAO,CACzC,wBAAwB,CAAC,oBAAoB,CAAC,CAC/C;IAMK,oBAAoB,IAAI,OAAO,CACnC,wBAAwB,CAAC,cAAc,CAAC,CACzC;IAMK,uBAAuB,IAAI,OAAO,CACtC,wBAAwB,CAAC,iBAAiB,CAAC,CAC5C;IAMK,iBAAiB,CACrB,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAc7C;;;OAGG;IACH,kBAAkB,CAAC,CAAC,EAClB,UAAU,EAAE,wBAAwB,CAAC,CAAC,CAAC,GACtC,SAAS,yBAAyB,CAAC,CAAC,CAAC,EAAE;YAO5B,yBAAyB;YAyFzB,mBAAmB;CAsBlC;AAED;;GAEG;AAEH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyC;IAEpE,GAAG,CAAC,aAAa,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAI1D,WAAW,CACT,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,IAAI,CAAC,yBAAyB,EAAE,eAAe,CAAC,GACzD,kBAAkB;IAWrB,GAAG,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAI9D,KAAK,IAAI,IAAI;CAGd;AAGD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,yBAAyB,GACjC,kBAAkB,CAEpB;AAGD,wBAAgB,6BAA6B,IAAI,uBAAuB,CAEvE;AAGD,MAAM,MAAM,+BAA+B,GAAG,yBAAyB,GAAG;IACxE,QAAQ,CAAC,KAAK,CAAC,EAAE,uBAAuB,CAAC;CAC1C,CAAC;AAEF;;;GAGG;AAEH,wBAAgB,wBAAwB,CACtC,sBAAsB,EAAE,MAAM,GAAG,+BAA+B,EAChE,OAAO,CAAC,EAAE,IAAI,CAAC,yBAAyB,EAAE,eAAe,CAAC,GAAG;IAC3D,QAAQ,CAAC,KAAK,CAAC,EAAE,uBAAuB,CAAC;CAC1C,GACA,kBAAkB,CAoBpB"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/plugins/registry.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,7 @@
15
15
  You should have received a copy of the GNU Affero General Public License
16
16
  along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
  */
18
- import { KIBI_PLUGIN_API_VERSION, ONTOLOGY_PACK_CAPABILITY_ID, SEMANTIC_CLASSIFIER_CAPABILITY_ID, SYMBOL_EXTRACTOR_CAPABILITY_ID, defineKibiPlugin, validateKibiPlugin, } from "kibi-plugin-sdk";
18
+ import { KIBI_PLUGIN_API_VERSION, ONTOLOGY_PACK_CAPABILITY_ID, SEMANTIC_CLASSIFIER_CAPABILITY_ID, SYMBOL_EXTRACTOR_CAPABILITY_ID, SYMBOL_EXTRACTOR_V2_CAPABILITY_ID, VOCABULARY_ALIGNMENT_CAPABILITY_ID, defineKibiPlugin, validateKibiPlugin, } from "kibi-plugin-sdk";
19
19
  import { loadPluginPackage } from "./load-plugin.js";
20
20
  import { readProjectKibiConfig } from "./project-config.js";
21
21
  import { PluginResolutionError } from "./resolve-package.js";
@@ -23,6 +23,8 @@ const CAPABILITY_SLOT = {
23
23
  [SEMANTIC_CLASSIFIER_CAPABILITY_ID]: "semanticClassifier",
24
24
  [ONTOLOGY_PACK_CAPABILITY_ID]: "ontologyPack",
25
25
  [SYMBOL_EXTRACTOR_CAPABILITY_ID]: "symbolExtractor",
26
+ [SYMBOL_EXTRACTOR_V2_CAPABILITY_ID]: "symbolExtractorV2",
27
+ [VOCABULARY_ALIGNMENT_CAPABILITY_ID]: "vocabularyAlignment",
26
28
  };
27
29
  /**
28
30
  * Minimal builtin used when no factory is injected and the builtin package is
@@ -64,6 +66,23 @@ export function createStubBuiltinPlugin() {
64
66
  symbols: [],
65
67
  }),
66
68
  },
69
+ vocabularyAlignment: {
70
+ id: "kibi-plugin-builtin-stub.vocabulary",
71
+ rankSubjects: (input) => ({
72
+ decisions: input.clauses.map((clause) => ({
73
+ claimKey: clause.claimKey,
74
+ choice: "new_subject",
75
+ confidence: 0,
76
+ })),
77
+ }),
78
+ compareClaims: (input) => ({
79
+ judgments: input.pairs.map((pair) => ({
80
+ pairKey: pair.pairKey,
81
+ sameObligation: false,
82
+ confidence: 0,
83
+ })),
84
+ }),
85
+ },
67
86
  },
68
87
  }));
69
88
  }
@@ -179,6 +198,13 @@ export class CapabilityRegistry {
179
198
  async resolveSymbolExtractors() {
180
199
  return this.resolveCapability(SYMBOL_EXTRACTOR_CAPABILITY_ID);
181
200
  }
201
+ // implements REQ-capability-plugin-activation-disclosure-v1
202
+ async resolveSymbolExtractorsV2() {
203
+ return this.resolveCapability(SYMBOL_EXTRACTOR_V2_CAPABILITY_ID);
204
+ }
205
+ async resolveVocabularyAlignment() {
206
+ return this.resolveCapability(VOCABULARY_ALIGNMENT_CAPABILITY_ID);
207
+ }
182
208
  async resolveCapability(capabilityId) {
183
209
  const cached = this.capabilityCache.get(capabilityId);
184
210
  if (cached)
@@ -1,4 +1,4 @@
1
- import { type PluginProviderStamp, type SourceAnalysisResult, type SymbolExtractorV1 } from "kibi-plugin-sdk";
1
+ import { type PluginProviderStamp, type SourceAnalysisResult, type SourceAnalysisResultV2, type SymbolExtractorV1, type SymbolExtractorV2 } from "kibi-plugin-sdk";
2
2
  import type { CapabilityModeResolution, CapabilityRegistry } from "./registry.js";
3
3
  export type HostSourceAnalysisShadowComparison = Readonly<{
4
4
  pluginId: string;
@@ -18,9 +18,21 @@ export type HostSourceAnalysisResult = SourceAnalysisResult & Readonly<{
18
18
  }>;
19
19
  export type SourceAnalysisServiceOptions = Readonly<{
20
20
  registry: CapabilityRegistry;
21
+ /** Explicit v2 resolution; maintenance callers supply only approved providers. */
22
+ resolveExtractorsV2?: () => Promise<CapabilityModeResolution<SymbolExtractorV2>>;
23
+ /** Wall-clock deadline for async providers; CPU-bound plugins need their own terminable worker. */
24
+ analysisTimeoutMs?: number;
25
+ /** Host-verified package/asset fingerprint, never accepted from result data. */
26
+ providerFingerprints?: Readonly<Record<string, string>>;
21
27
  /** Injectable resolution for tests. */
22
28
  resolveExtractors?: () => Promise<CapabilityModeResolution<SymbolExtractorV1>>;
23
29
  }>;
30
+ /**
31
+ * The host owns the analysis deadline. Providers get a slightly smaller budget
32
+ * so a cooperative provider reports its own timeout diagnostic before the host
33
+ * abandons the call.
34
+ */
35
+ export declare function providerBudgetMs(hostTimeoutMs: number): number;
24
36
  export declare function createConservativeFallbackAnalysis(filePath: string, fallbackReason: string): HostSourceAnalysisResult;
25
37
  /**
26
38
  * Host-validated symbol analysis over registry providers with conservative
@@ -32,8 +44,23 @@ export declare function createConservativeFallbackAnalysis(filePath: string, fal
32
44
  */
33
45
  export declare class SourceAnalysisService {
34
46
  private readonly registry;
47
+ private readonly options;
35
48
  private readonly resolveExtractors;
36
49
  constructor(options: SourceAnalysisServiceOptions);
50
+ /**
51
+ * Analyze supplied snapshot bytes with explicit completeness and host provenance.
52
+ * An explicit language hint selects an ambiguous extension only when it agrees
53
+ * with any shebang; conflicting signals return unsupported without dispatch.
54
+ *
55
+ * Classify, bound the input, resolve providers, take the first claiming
56
+ * provider's result as canonical, then record shadow comparisons.
57
+ */
58
+ analyzeTextV2(filePath: string, content: string, explicitLanguageHint?: string): Promise<HostSourceAnalysisResultV2>;
59
+ /**
60
+ * Run one provider under the host-owned deadline. Returns null when the
61
+ * provider does not claim the input; a claimed failure is a failed result.
62
+ */
63
+ private runV2Extractor;
37
64
  analyzeText(filePath: string, content: string): Promise<HostSourceAnalysisResult>;
38
65
  }
39
66
  /**
@@ -41,4 +68,12 @@ export declare class SourceAnalysisService {
41
68
  */
42
69
  export declare function analyzeWithResolution(resolution: CapabilityModeResolution<SymbolExtractorV1>, filePath: string, content: string): Promise<HostSourceAnalysisResult>;
43
70
  export declare function createSourceAnalysisService(options: SourceAnalysisServiceOptions): SourceAnalysisService;
71
+ /** V2 results preserve failure/completeness; provenance is always assigned by the host. */
72
+ export type HostSourceAnalysisResultV2 = SourceAnalysisResultV2 & Readonly<{
73
+ providerId: string | null;
74
+ stamp: PluginProviderStamp | null;
75
+ inputFingerprint: string;
76
+ providerFingerprint: string | null;
77
+ shadowComparisons: readonly HostSourceAnalysisShadowComparison[];
78
+ }>;
44
79
  //# sourceMappingURL=source-analysis-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"source-analysis-service.d.ts","sourceRoot":"","sources":["../../src/plugins/source-analysis-service.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EAGvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EACV,wBAAwB,EACxB,kBAAkB,EACnB,MAAM,eAAe,CAAC;AA4BvB,MAAM,MAAM,kCAAkC,GAAG,QAAQ,CAAC;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAGH,MAAM,MAAM,wBAAwB,GAAG,oBAAoB,GACzD,QAAQ,CAAC;IACP,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAClC,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,oEAAoE;IACpE,iBAAiB,EAAE,SAAS,kCAAkC,EAAE,CAAC;CAClE,CAAC,CAAC;AAGL,MAAM,MAAM,4BAA4B,GAAG,QAAQ,CAAC;IAClD,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,uCAAuC;IACvC,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAC/B,wBAAwB,CAAC,iBAAiB,CAAC,CAC5C,CAAC;CACH,CAAC,CAAC;AAgBH,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,GACrB,wBAAwB,CAkB1B;AAuBD;;;;;;;GAOG;AAEH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAEhC;gBAEU,OAAO,EAAE,4BAA4B;IAO3C,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,wBAAwB,CAAC;CAiIrC;AAED;;GAEG;AAEH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,wBAAwB,CAAC,iBAAiB,CAAC,EACvD,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,wBAAwB,CAAC,CAQnC;AAGD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,4BAA4B,GACpC,qBAAqB,CAEvB"}
1
+ {"version":3,"file":"source-analysis-service.d.ts","sourceRoot":"","sources":["../../src/plugins/source-analysis-service.ts"],"names":[],"mappings":"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"}
@@ -15,35 +15,73 @@
15
15
  You should have received a copy of the GNU Affero General Public License
16
16
  along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
  */
18
+ import { createHash } from "node:crypto";
18
19
  import * as path from "node:path";
19
- import { toSourceAnalysisProvider, validateSourceAnalysisResultForPath, } from "kibi-plugin-sdk";
20
- const SOURCE_LANGUAGE_EXTENSIONS = {
21
- ".c": "c",
22
- ".cc": "cpp",
23
- ".cjs": "javascript",
24
- ".cpp": "cpp",
25
- ".cs": "csharp",
26
- ".cts": "typescript",
27
- ".go": "go",
28
- ".h": "c",
29
- ".hpp": "cpp",
30
- ".java": "java",
31
- ".js": "javascript",
32
- ".jsx": "javascript",
33
- ".kt": "kotlin",
34
- ".mjs": "javascript",
35
- ".mts": "typescript",
36
- ".php": "php",
37
- ".py": "python",
38
- ".rb": "ruby",
39
- ".rs": "rust",
40
- ".swift": "swift",
41
- ".ts": "typescript",
42
- ".tsx": "typescript",
43
- };
20
+ import { SOURCE_ANALYSIS_V2_MAX_INPUT_CODE_UNITS, SYMBOL_EXTRACTOR_V2_CAPABILITY_ID, toSourceAnalysisProvider, validateSourceAnalysisResultForPath, validateSourceAnalysisResultV2, } from "kibi-plugin-sdk";
21
+ import { classifySource, extensionLanguage } from "./source-classification.js";
44
22
  function detectSourceLanguage(filePath) {
45
- return (SOURCE_LANGUAGE_EXTENSIONS[path.extname(filePath).toLowerCase()] ??
46
- "unknown");
23
+ return extensionLanguage(filePath);
24
+ }
25
+ /** Classify once and bind every result for this input to one fingerprint. */
26
+ function createV2Request(filePath, content, explicitLanguageHint) {
27
+ const classification = classifySource(filePath, content, explicitLanguageHint);
28
+ const language = classification.language;
29
+ const inputFingerprint = createHash("sha256")
30
+ .update(filePath)
31
+ .update("\0")
32
+ .update(content)
33
+ .update("\0")
34
+ .update(classification.kind)
35
+ .update("\0")
36
+ .update(classification.language)
37
+ .update("\0")
38
+ .update(explicitLanguageHint?.trim().toLowerCase() ?? "")
39
+ .digest("hex");
40
+ return {
41
+ classification,
42
+ input: {
43
+ path: filePath,
44
+ content,
45
+ ...(classification.kind === "language"
46
+ ? { language: classification.language }
47
+ : {}),
48
+ },
49
+ inputFingerprint,
50
+ fallback: (status, code, message) => ({
51
+ contractVersion: SYMBOL_EXTRACTOR_V2_CAPABILITY_ID,
52
+ status,
53
+ sourceFile: filePath,
54
+ language,
55
+ module: {
56
+ title: inferModuleTitle(filePath),
57
+ language,
58
+ analysisMode: "fallback",
59
+ fallbackReason: code,
60
+ },
61
+ symbols: [],
62
+ diagnostics: [{ code, message }],
63
+ uncoveredRanges: [],
64
+ providerId: null,
65
+ stamp: null,
66
+ inputFingerprint,
67
+ providerFingerprint: null,
68
+ shadowComparisons: [],
69
+ }),
70
+ };
71
+ }
72
+ function hostDeadlineMs(requested) {
73
+ const value = requested ?? 10000;
74
+ return Number.isFinite(value) && value > 0 ? Math.min(value, 60000) : 10000;
75
+ }
76
+ /**
77
+ * The host owns the analysis deadline. Providers get a slightly smaller budget
78
+ * so a cooperative provider reports its own timeout diagnostic before the host
79
+ * abandons the call.
80
+ */
81
+ // implements REQ-source-analysis-v2
82
+ export function providerBudgetMs(hostTimeoutMs) {
83
+ const grace = Math.min(1000, Math.floor(hostTimeoutMs / 10));
84
+ return Math.max(1, hostTimeoutMs - grace);
47
85
  }
48
86
  function inferModuleTitle(filePath) {
49
87
  const extension = path.extname(filePath);
@@ -100,13 +138,132 @@ function dedupeSymbols(symbols) {
100
138
  // implements REQ-capability-plugin-activation-disclosure-v1
101
139
  export class SourceAnalysisService {
102
140
  registry;
141
+ options;
103
142
  resolveExtractors;
104
143
  constructor(options) {
105
144
  this.registry = options.registry;
145
+ this.options = options;
106
146
  this.resolveExtractors =
107
147
  options.resolveExtractors ??
108
148
  (() => this.registry.resolveSymbolExtractors());
109
149
  }
150
+ /**
151
+ * Analyze supplied snapshot bytes with explicit completeness and host provenance.
152
+ * An explicit language hint selects an ambiguous extension only when it agrees
153
+ * with any shebang; conflicting signals return unsupported without dispatch.
154
+ *
155
+ * Classify, bound the input, resolve providers, take the first claiming
156
+ * provider's result as canonical, then record shadow comparisons.
157
+ */
158
+ // implements REQ-capability-plugin-activation-disclosure-v1
159
+ async analyzeTextV2(filePath, content, explicitLanguageHint) {
160
+ const request = createV2Request(filePath, content, explicitLanguageHint);
161
+ const { classification } = request;
162
+ if (content.length > SOURCE_ANALYSIS_V2_MAX_INPUT_CODE_UNITS ||
163
+ Buffer.byteLength(content, "utf8") > 8 * 1024 * 1024)
164
+ return request.fallback("failed", "input_limit", `Source input exceeds the ${SOURCE_ANALYSIS_V2_MAX_INPUT_CODE_UNITS} UTF-16 code unit or 8 MiB UTF-8 analysis limit`);
165
+ let resolution;
166
+ try {
167
+ resolution = await (this.options.resolveExtractorsV2?.() ??
168
+ this.registry.resolveSymbolExtractorsV2());
169
+ }
170
+ catch (error) {
171
+ return request.fallback("failed", "provider_resolution_failed", String(error));
172
+ }
173
+ if (classification.kind !== "language" &&
174
+ classification.kind !== "unknown") {
175
+ const code = classification.kind === "ambiguous"
176
+ ? "source_language_ambiguous"
177
+ : classification.kind === "conflict"
178
+ ? "source_classification_conflict"
179
+ : classification.kind === "file-level"
180
+ ? "source_file_level_only"
181
+ : "unsupported_language";
182
+ return request.fallback("unsupported", code, classification.reason);
183
+ }
184
+ const entries = resolution.replace
185
+ ? [resolution.replace, resolution.builtin, ...resolution.augment]
186
+ : [resolution.builtin, ...resolution.augment];
187
+ let canonical = null;
188
+ for (const entry of entries) {
189
+ const result = await this.runV2Extractor(entry, request);
190
+ if (result === null)
191
+ continue;
192
+ // A claimed file's incomplete/failed result is authoritative uncertainty.
193
+ // Never turn a required provider failure into empty symbols or success.
194
+ canonical = result;
195
+ break;
196
+ }
197
+ canonical ??= request.fallback("unsupported", "unsupported_language", "No configured source analyzer claims this file; file-level review remains required.");
198
+ const shadowComparisons = [];
199
+ for (const entry of resolution.shadow) {
200
+ const result = await this.runV2Extractor(entry, request);
201
+ if (!result)
202
+ continue;
203
+ shadowComparisons.push({
204
+ pluginId: entry.pluginId,
205
+ stamp: entry.stamp,
206
+ symbolCount: result.symbols.length,
207
+ language: result.language,
208
+ ok: result.status === "ok",
209
+ ...(result.status !== "ok"
210
+ ? { error: result.diagnostics.map((d) => d.message).join("; ") }
211
+ : {}),
212
+ });
213
+ }
214
+ return { ...canonical, shadowComparisons };
215
+ }
216
+ /**
217
+ * Run one provider under the host-owned deadline. Returns null when the
218
+ * provider does not claim the input; a claimed failure is a failed result.
219
+ */
220
+ async runV2Extractor(entry, request) {
221
+ const { classification, input } = request;
222
+ try {
223
+ const supportsInput = classification.kind === "language"
224
+ ? { path: input.path, language: classification.language }
225
+ : { path: input.path };
226
+ if (!entry.capability.supports(supportsInput))
227
+ return null;
228
+ const timeout = hostDeadlineMs(this.options.analysisTimeoutMs);
229
+ let timer;
230
+ let raw;
231
+ try {
232
+ raw = await Promise.race([
233
+ entry.capability.analyze({
234
+ ...input,
235
+ timeoutMs: providerBudgetMs(timeout),
236
+ }),
237
+ new Promise((_, reject) => {
238
+ timer = setTimeout(() => reject(new Error("Source analysis deadline exceeded")), timeout);
239
+ }),
240
+ ]);
241
+ }
242
+ finally {
243
+ if (timer !== undefined)
244
+ clearTimeout(timer);
245
+ }
246
+ const validated = validateSourceAnalysisResultV2(raw, input);
247
+ return {
248
+ ...validated,
249
+ providerId: entry.capability.id,
250
+ stamp: entry.stamp,
251
+ inputFingerprint: request.inputFingerprint,
252
+ providerFingerprint: this.options.providerFingerprints?.[entry.pluginId] ??
253
+ createHash("sha256")
254
+ .update(`${entry.pluginId}\0${entry.pluginVersion}\0${entry.stamp.capability}`)
255
+ .digest("hex"),
256
+ shadowComparisons: [],
257
+ };
258
+ }
259
+ catch (error) {
260
+ return {
261
+ ...request.fallback("failed", "provider_failed", `Extractor '${entry.capability.id}' failed: ${String(error)}`),
262
+ providerId: entry.capability.id,
263
+ stamp: entry.stamp,
264
+ };
265
+ }
266
+ }
110
267
  async analyzeText(filePath, content) {
111
268
  const resolution = await this.resolveExtractors();
112
269
  const diagnostics = [];
@@ -0,0 +1,15 @@
1
+ import { type GateAnalysis } from "../traceability/analysis-gate.js";
2
+ import type { StagedPath } from "../traceability/git-staged.js";
3
+ import type { HostSourceAnalysisResultV2, SourceAnalysisService } from "./source-analysis-service.js";
4
+ export interface SourceChangeAnalysis {
5
+ path: string;
6
+ before: HostSourceAnalysisResultV2 | null;
7
+ after: HostSourceAnalysisResultV2 | null;
8
+ }
9
+ /** Analyze both versions without changing the complete inventory or assigning proof. */
10
+ export declare function analyzeSourceChanges(inventory: readonly StagedPath[], service: SourceAnalysisService): Promise<Map<string, SourceChangeAnalysis>>;
11
+ /** Adapt a host result to the shared analysis gate. */
12
+ export declare function gateAnalysis(result: HostSourceAnalysisResultV2 | null): GateAnalysis<HostSourceAnalysisResultV2["uncoveredRanges"][number]> | null;
13
+ /** Enforce the shared analysis gate when no impact policy accepts reviews. */
14
+ export declare function assertSourceAnalysisGate(inventory: readonly StagedPath[], analyses: ReadonlyMap<string, SourceChangeAnalysis>): void;
15
+ //# sourceMappingURL=source-change-analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-change-analysis.d.ts","sourceRoot":"","sources":["../../src/plugins/source-change-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EAElB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EACV,0BAA0B,EAC1B,qBAAqB,EACtB,MAAM,8BAA8B,CAAC;AAGtC,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAC1C,KAAK,EAAE,0BAA0B,GAAG,IAAI,CAAC;CAC1C;AAKD,wFAAwF;AAExF,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,SAAS,UAAU,EAAE,EAChC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAgC5C;AAED,uDAAuD;AAEvD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,0BAA0B,GAAG,IAAI,GACxC,YAAY,CAAC,0BAA0B,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAQ5E;AAED,8EAA8E;AAE9E,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,SAAS,UAAU,EAAE,EAChC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,oBAAoB,CAAC,GAClD,IAAI,CAkBN"}