kibi-cli 1.0.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (450) hide show
  1. package/dist/cli-errors.d.ts +3 -1
  2. package/dist/cli-errors.d.ts.map +1 -1
  3. package/dist/cli-errors.js +4 -1
  4. package/dist/cli-json-command.d.ts +1 -0
  5. package/dist/cli-json-command.d.ts.map +1 -1
  6. package/dist/cli-json-command.js +13 -4
  7. package/dist/cli-operation-loader.js +3 -3
  8. package/dist/cli-operation-metadata.d.ts +4 -3
  9. package/dist/cli-operation-metadata.d.ts.map +1 -1
  10. package/dist/cli-operation-metadata.js +7 -5
  11. package/dist/cli-protocol.js +1 -1
  12. package/dist/cli-register-maintenance.d.ts.map +1 -1
  13. package/dist/cli-register-maintenance.js +7 -0
  14. package/dist/cli-register-proof.d.ts +3 -0
  15. package/dist/cli-register-proof.d.ts.map +1 -0
  16. package/dist/cli-register-proof.js +103 -0
  17. package/dist/cli-register-reporting.d.ts.map +1 -1
  18. package/dist/cli-register-reporting.js +1 -0
  19. package/dist/cli.d.ts +4 -0
  20. package/dist/cli.d.ts.map +1 -1
  21. package/dist/cli.js +17 -10
  22. package/dist/commands/branch.d.ts +1 -0
  23. package/dist/commands/branch.d.ts.map +1 -1
  24. package/dist/commands/branch.js +8 -4
  25. package/dist/commands/check.d.ts +14 -0
  26. package/dist/commands/check.d.ts.map +1 -1
  27. package/dist/commands/check.js +190 -44
  28. package/dist/commands/coverage.d.ts +1 -0
  29. package/dist/commands/coverage.d.ts.map +1 -1
  30. package/dist/commands/coverage.js +6 -0
  31. package/dist/commands/doctor.d.ts +22 -0
  32. package/dist/commands/doctor.d.ts.map +1 -1
  33. package/dist/commands/doctor.js +48 -22
  34. package/dist/commands/engine.d.ts +12 -0
  35. package/dist/commands/engine.d.ts.map +1 -1
  36. package/dist/commands/engine.js +40 -0
  37. package/dist/commands/github-init.d.ts +1 -0
  38. package/dist/commands/github-init.d.ts.map +1 -1
  39. package/dist/commands/github-init.js +9 -5
  40. package/dist/commands/init-helpers.d.ts.map +1 -1
  41. package/dist/commands/init-helpers.js +38 -5
  42. package/dist/commands/migrate.d.ts +4 -0
  43. package/dist/commands/migrate.d.ts.map +1 -1
  44. package/dist/commands/migrate.js +7 -7
  45. package/dist/commands/proof-migrate-legacy.d.ts +7 -0
  46. package/dist/commands/proof-migrate-legacy.d.ts.map +1 -0
  47. package/dist/commands/proof-migrate-legacy.js +45 -0
  48. package/dist/commands/proof-prune.d.ts +8 -0
  49. package/dist/commands/proof-prune.d.ts.map +1 -0
  50. package/dist/commands/proof-prune.js +53 -0
  51. package/dist/commands/prove.d.ts +37 -0
  52. package/dist/commands/prove.d.ts.map +1 -0
  53. package/dist/commands/prove.js +470 -0
  54. package/dist/commands/report.js +1 -1
  55. package/dist/commands/sync/discovery.d.ts +3 -0
  56. package/dist/commands/sync/discovery.d.ts.map +1 -1
  57. package/dist/commands/sync/discovery.js +36 -28
  58. package/dist/commands/sync/manifest.d.ts +1 -1
  59. package/dist/commands/sync/manifest.d.ts.map +1 -1
  60. package/dist/commands/sync/manifest.js +53 -21
  61. package/dist/commands/sync/persistence.d.ts +4 -1
  62. package/dist/commands/sync/persistence.d.ts.map +1 -1
  63. package/dist/commands/sync/persistence.js +25 -14
  64. package/dist/commands/sync/staging.d.ts +1 -0
  65. package/dist/commands/sync/staging.d.ts.map +1 -1
  66. package/dist/commands/sync/staging.js +5 -2
  67. package/dist/commands/sync/untracked-targets.d.ts +24 -0
  68. package/dist/commands/sync/untracked-targets.d.ts.map +1 -0
  69. package/dist/commands/sync/untracked-targets.js +108 -0
  70. package/dist/commands/sync.d.ts +11 -1
  71. package/dist/commands/sync.d.ts.map +1 -1
  72. package/dist/commands/sync.js +74 -30
  73. package/dist/engine-daemon.d.ts +3 -1
  74. package/dist/engine-daemon.d.ts.map +1 -1
  75. package/dist/engine-daemon.js +49 -20
  76. package/dist/engine.d.ts +14 -76
  77. package/dist/engine.d.ts.map +1 -1
  78. package/dist/engine.js +197 -30
  79. package/dist/extractors/manifest.d.ts +5 -0
  80. package/dist/extractors/manifest.d.ts.map +1 -1
  81. package/dist/extractors/manifest.js +46 -1
  82. package/dist/extractors/markdown.d.ts +5 -3
  83. package/dist/extractors/markdown.d.ts.map +1 -1
  84. package/dist/extractors/markdown.js +41 -24
  85. package/dist/extractors/playwright-cases.js +1 -1
  86. package/dist/extractors/relationships.d.ts +6 -0
  87. package/dist/extractors/relationships.d.ts.map +1 -1
  88. package/dist/extractors/relationships.js +1 -1
  89. package/dist/extractors/symbol-coordinates.d.ts.map +1 -1
  90. package/dist/extractors/symbols-ts.d.ts +1 -0
  91. package/dist/extractors/symbols-ts.d.ts.map +1 -1
  92. package/dist/extractors/symbols-ts.js +142 -67
  93. package/dist/intent-search.d.ts +1 -0
  94. package/dist/intent-search.d.ts.map +1 -1
  95. package/dist/intent-search.js +7 -3
  96. package/dist/logic/ir.d.ts +1 -0
  97. package/dist/logic/ir.d.ts.map +1 -1
  98. package/dist/logic/ir.js +1 -1
  99. package/dist/operations/bootstrap/activation.d.ts +2 -1
  100. package/dist/operations/bootstrap/activation.d.ts.map +1 -1
  101. package/dist/operations/bootstrap/activation.js +11 -3
  102. package/dist/operations/bootstrap/generate.d.ts +2 -1
  103. package/dist/operations/bootstrap/generate.d.ts.map +1 -1
  104. package/dist/operations/bootstrap/generate.js +6 -3
  105. package/dist/operations/bootstrap/guidance.d.ts +1 -0
  106. package/dist/operations/bootstrap/guidance.d.ts.map +1 -1
  107. package/dist/operations/bootstrap/guidance.js +1 -1
  108. package/dist/operations/modeling/model-requirement.d.ts +5 -0
  109. package/dist/operations/modeling/model-requirement.d.ts.map +1 -1
  110. package/dist/operations/modeling/model-requirement.js +53 -46
  111. package/dist/operations/modeling/predicate-applicability.d.ts.map +1 -1
  112. package/dist/operations/modeling/predicate-applicability.js +103 -4
  113. package/dist/operations/modeling/predicate-catalog-2.d.ts.map +1 -1
  114. package/dist/operations/modeling/predicate-catalog-2.js +18 -2
  115. package/dist/operations/modeling/predicate-catalog-3.d.ts.map +1 -1
  116. package/dist/operations/modeling/predicate-catalog-3.js +17 -1
  117. package/dist/operations/modeling/predicate-catalog-5.d.ts +10 -0
  118. package/dist/operations/modeling/predicate-catalog-5.d.ts.map +1 -0
  119. package/dist/operations/modeling/predicate-catalog-5.js +291 -0
  120. package/dist/operations/modeling/predicate-catalog.d.ts.map +1 -1
  121. package/dist/operations/modeling/predicate-catalog.js +4 -0
  122. package/dist/operations/modeling/predicate-loader.d.ts +1 -0
  123. package/dist/operations/modeling/predicate-loader.d.ts.map +1 -1
  124. package/dist/operations/modeling/predicate-loader.js +4 -3
  125. package/dist/operations/modeling/predicate-ranker.d.ts.map +1 -1
  126. package/dist/operations/modeling/predicate-ranker.js +4 -1
  127. package/dist/operations/modeling/predicate-types.d.ts +1 -1
  128. package/dist/operations/modeling/predicate-types.d.ts.map +1 -1
  129. package/dist/operations/modeling/predicate-usage-hints-4.d.ts +3 -0
  130. package/dist/operations/modeling/predicate-usage-hints-4.d.ts.map +1 -0
  131. package/dist/operations/modeling/predicate-usage-hints-4.js +84 -0
  132. package/dist/operations/modeling/suggest-predicates.d.ts +3 -1
  133. package/dist/operations/modeling/suggest-predicates.d.ts.map +1 -1
  134. package/dist/operations/modeling/suggest-predicates.js +52 -19
  135. package/dist/operations/mutation/contradictions.d.ts +2 -1
  136. package/dist/operations/mutation/contradictions.d.ts.map +1 -1
  137. package/dist/operations/mutation/contradictions.js +26 -5
  138. package/dist/operations/mutation/delete.d.ts +3 -0
  139. package/dist/operations/mutation/delete.d.ts.map +1 -1
  140. package/dist/operations/mutation/delete.js +100 -32
  141. package/dist/operations/mutation/relationships.d.ts +1 -0
  142. package/dist/operations/mutation/relationships.d.ts.map +1 -1
  143. package/dist/operations/mutation/relationships.js +6 -4
  144. package/dist/operations/mutation/saga.d.ts +51 -0
  145. package/dist/operations/mutation/saga.d.ts.map +1 -0
  146. package/dist/operations/mutation/saga.js +67 -0
  147. package/dist/operations/mutation/serialization.d.ts.map +1 -1
  148. package/dist/operations/mutation/serialization.js +3 -2
  149. package/dist/operations/mutation/source-authoring.d.ts +5 -1
  150. package/dist/operations/mutation/source-authoring.d.ts.map +1 -1
  151. package/dist/operations/mutation/source-authoring.js +79 -46
  152. package/dist/operations/mutation/strict-fact.d.ts +1 -0
  153. package/dist/operations/mutation/strict-fact.d.ts.map +1 -1
  154. package/dist/operations/mutation/strict-fact.js +8 -5
  155. package/dist/operations/mutation/symbol-compiler-lock.d.ts +5 -2
  156. package/dist/operations/mutation/symbol-compiler-lock.d.ts.map +1 -1
  157. package/dist/operations/mutation/symbol-compiler-lock.js +65 -2
  158. package/dist/operations/mutation/symbol-granularity.d.ts.map +1 -1
  159. package/dist/operations/mutation/symbol-granularity.js +2 -2
  160. package/dist/operations/mutation/symbol-refresh.d.ts +1 -0
  161. package/dist/operations/mutation/symbol-refresh.d.ts.map +1 -1
  162. package/dist/operations/mutation/symbol-refresh.js +10 -8
  163. package/dist/operations/mutation/upsert.d.ts +18 -2
  164. package/dist/operations/mutation/upsert.d.ts.map +1 -1
  165. package/dist/operations/mutation/upsert.js +86 -54
  166. package/dist/operations/mutation/validate-upsert.js +2 -2
  167. package/dist/operations/mutation/validation.d.ts.map +1 -1
  168. package/dist/operations/mutation/validation.js +46 -4
  169. package/dist/operations/mutation/warnings.d.ts +1 -0
  170. package/dist/operations/mutation/warnings.d.ts.map +1 -1
  171. package/dist/operations/mutation/warnings.js +7 -5
  172. package/dist/operations/mutation/workspace-mutation-lock.d.ts +60 -0
  173. package/dist/operations/mutation/workspace-mutation-lock.d.ts.map +1 -0
  174. package/dist/operations/mutation/workspace-mutation-lock.js +362 -0
  175. package/dist/operations/planning/apply-plan.d.ts +8 -106
  176. package/dist/operations/planning/apply-plan.d.ts.map +1 -1
  177. package/dist/operations/planning/apply-plan.js +113 -36
  178. package/dist/operations/planning/compile-intent.d.ts +2 -0
  179. package/dist/operations/planning/compile-intent.d.ts.map +1 -1
  180. package/dist/operations/planning/compile-intent.js +70 -14
  181. package/dist/operations/proof/ingest-proof.d.ts +34 -0
  182. package/dist/operations/proof/ingest-proof.d.ts.map +1 -0
  183. package/dist/operations/proof/ingest-proof.js +307 -0
  184. package/dist/operations/proof/migrate-legacy-receipts.d.ts +30 -0
  185. package/dist/operations/proof/migrate-legacy-receipts.d.ts.map +1 -0
  186. package/dist/operations/proof/migrate-legacy-receipts.js +88 -0
  187. package/dist/operations/proof/prune-receipts.d.ts +35 -0
  188. package/dist/operations/proof/prune-receipts.d.ts.map +1 -0
  189. package/dist/operations/proof/prune-receipts.js +91 -0
  190. package/dist/operations/proof/receipt-document.d.ts +29 -0
  191. package/dist/operations/proof/receipt-document.d.ts.map +1 -0
  192. package/dist/operations/proof/receipt-document.js +117 -0
  193. package/dist/operations/semantic-advisor/analyze-prose.d.ts +1 -0
  194. package/dist/operations/semantic-advisor/analyze-prose.d.ts.map +1 -1
  195. package/dist/operations/semantic-advisor/analyze-prose.js +46 -26
  196. package/dist/operations/semantic-advisor/clauses.d.ts.map +1 -1
  197. package/dist/operations/semantic-advisor/clauses.js +20 -7
  198. package/dist/operations/semantic-advisor/strict-count-rules.d.ts +2 -0
  199. package/dist/operations/semantic-advisor/strict-count-rules.d.ts.map +1 -1
  200. package/dist/operations/semantic-advisor/strict-count-rules.js +40 -25
  201. package/dist/prolog/codec.d.ts +13 -1
  202. package/dist/prolog/codec.d.ts.map +1 -1
  203. package/dist/prolog/codec.js +269 -154
  204. package/dist/prolog/error-terms.d.ts +47 -0
  205. package/dist/prolog/error-terms.d.ts.map +1 -0
  206. package/dist/prolog/error-terms.js +334 -0
  207. package/dist/prolog/janitor.d.ts +50 -0
  208. package/dist/prolog/janitor.d.ts.map +1 -0
  209. package/dist/prolog/janitor.js +154 -0
  210. package/dist/prolog/store-lock.d.ts +45 -0
  211. package/dist/prolog/store-lock.d.ts.map +1 -0
  212. package/dist/prolog/store-lock.js +195 -0
  213. package/dist/prolog.d.ts +7 -0
  214. package/dist/prolog.d.ts.map +1 -1
  215. package/dist/prolog.js +55 -17
  216. package/dist/proof/evaluate.d.ts +27 -0
  217. package/dist/proof/evaluate.d.ts.map +1 -0
  218. package/dist/proof/evaluate.js +151 -0
  219. package/dist/proof/inspect.d.ts +12 -0
  220. package/dist/proof/inspect.d.ts.map +1 -0
  221. package/dist/proof/inspect.js +236 -0
  222. package/dist/proof/integrations.d.ts +35 -0
  223. package/dist/proof/integrations.d.ts.map +1 -0
  224. package/dist/proof/integrations.js +123 -0
  225. package/dist/proof/producers/junit-adapter.d.ts +26 -0
  226. package/dist/proof/producers/junit-adapter.d.ts.map +1 -0
  227. package/dist/proof/producers/junit-adapter.js +186 -0
  228. package/dist/{public → proof/producers}/playwright-case-id.d.ts +1 -1
  229. package/dist/proof/producers/playwright-case-id.d.ts.map +1 -0
  230. package/dist/{public → proof/producers}/playwright-case-id.js +3 -3
  231. package/dist/proof/producers/playwright-reporter.d.ts +27 -0
  232. package/dist/proof/producers/playwright-reporter.d.ts.map +1 -0
  233. package/dist/proof/producers/playwright-reporter.js +138 -0
  234. package/dist/proof/producers/tap-adapter.d.ts +10 -0
  235. package/dist/proof/producers/tap-adapter.d.ts.map +1 -0
  236. package/dist/proof/producers/tap-adapter.js +200 -0
  237. package/dist/proof/receipt-outcome.d.ts +2 -0
  238. package/dist/proof/receipt-outcome.d.ts.map +1 -0
  239. package/dist/proof/receipt-outcome.js +1 -0
  240. package/dist/public/diagnostic-usage.js +6 -6
  241. package/dist/public/distribution-parity.d.ts +7 -1
  242. package/dist/public/distribution-parity.d.ts.map +1 -1
  243. package/dist/public/distribution-parity.js +15 -10
  244. package/dist/public/impact/coverage-depth-quality.d.ts +1 -0
  245. package/dist/public/impact/coverage-depth-quality.d.ts.map +1 -1
  246. package/dist/public/impact/coverage-depth-quality.js +1 -1
  247. package/dist/public/impact/diagnostics.d.ts.map +1 -1
  248. package/dist/public/impact/diagnostics.js +2 -2
  249. package/dist/public/impact/diff-meaning.d.ts +1 -0
  250. package/dist/public/impact/diff-meaning.d.ts.map +1 -1
  251. package/dist/public/impact/diff-meaning.js +5 -2
  252. package/dist/public/impact/full-kb-quality.d.ts +5 -2
  253. package/dist/public/impact/full-kb-quality.d.ts.map +1 -1
  254. package/dist/public/impact/full-kb-quality.js +329 -64
  255. package/dist/public/operations/catalog.d.ts +447 -196
  256. package/dist/public/operations/catalog.d.ts.map +1 -1
  257. package/dist/public/operations/catalog.js +6 -4
  258. package/dist/public/operations/check-executor.d.ts.map +1 -1
  259. package/dist/public/operations/check-executor.js +3 -7
  260. package/dist/public/operations/contracts.d.ts +7 -0
  261. package/dist/public/operations/contracts.d.ts.map +1 -1
  262. package/dist/public/operations/contracts.js +31 -22
  263. package/dist/public/operations/discovery-entities.d.ts +3 -0
  264. package/dist/public/operations/discovery-entities.d.ts.map +1 -1
  265. package/dist/public/operations/discovery-entities.js +4 -0
  266. package/dist/public/operations/discovery-executors.d.ts +9 -9
  267. package/dist/public/operations/discovery-executors.d.ts.map +1 -1
  268. package/dist/public/operations/discovery-executors.js +17 -14
  269. package/dist/public/operations/index.d.ts +1 -1
  270. package/dist/public/operations/index.d.ts.map +1 -1
  271. package/dist/public/operations/index.js +1 -1
  272. package/dist/public/operations/migration-plan.d.ts +4 -3
  273. package/dist/public/operations/migration-plan.d.ts.map +1 -1
  274. package/dist/public/operations/migration-plan.js +23 -21
  275. package/dist/public/operations/node-ports.js +6 -6
  276. package/dist/public/operations/repair-plan.d.ts +3 -3
  277. package/dist/public/operations/repair-plan.d.ts.map +1 -1
  278. package/dist/public/operations/repair-plan.js +49 -19
  279. package/dist/public/operations/result-envelope.d.ts +1 -0
  280. package/dist/public/operations/result-envelope.d.ts.map +1 -1
  281. package/dist/public/operations/result-envelope.js +12 -10
  282. package/dist/public/operations/runtime-types.d.ts +5 -0
  283. package/dist/public/operations/runtime-types.d.ts.map +1 -1
  284. package/dist/public/operations/specs/check-rules.generated.d.ts +5 -0
  285. package/dist/public/operations/specs/check-rules.generated.d.ts.map +1 -0
  286. package/dist/public/operations/specs/check-rules.generated.js +34 -0
  287. package/dist/public/operations/specs/check.d.ts +7 -2
  288. package/dist/public/operations/specs/check.d.ts.map +1 -1
  289. package/dist/public/operations/specs/check.js +8 -20
  290. package/dist/public/operations/specs/mutation-schemas.d.ts +257 -163
  291. package/dist/public/operations/specs/mutation-schemas.d.ts.map +1 -1
  292. package/dist/public/operations/specs/mutation-schemas.js +15 -7
  293. package/dist/public/operations/specs/planning.d.ts +9 -0
  294. package/dist/public/operations/specs/planning.d.ts.map +1 -1
  295. package/dist/public/operations/specs/planning.js +6 -0
  296. package/dist/public/operations/specs/proof.d.ts +212 -0
  297. package/dist/public/operations/specs/proof.d.ts.map +1 -0
  298. package/dist/public/operations/specs/proof.js +30 -0
  299. package/dist/public/operations/specs/reporting.d.ts +19 -0
  300. package/dist/public/operations/specs/reporting.d.ts.map +1 -1
  301. package/dist/public/operations/specs/reporting.js +112 -12
  302. package/dist/public/operations/specs/upsert.d.ts +257 -163
  303. package/dist/public/operations/specs/upsert.d.ts.map +1 -1
  304. package/dist/public/operations/symbol-repair-plan.d.ts +11 -0
  305. package/dist/public/operations/symbol-repair-plan.d.ts.map +1 -1
  306. package/dist/public/operations/symbol-repair-plan.js +118 -3
  307. package/dist/public/operations/types.d.ts +1 -1
  308. package/dist/public/operations/types.d.ts.map +1 -1
  309. package/dist/public/proof-fingerprint.d.ts +54 -0
  310. package/dist/public/proof-fingerprint.d.ts.map +1 -0
  311. package/dist/public/proof-fingerprint.js +141 -0
  312. package/dist/public/proof-protocol.d.ts +354 -0
  313. package/dist/public/proof-protocol.d.ts.map +1 -0
  314. package/dist/public/proof-protocol.js +454 -0
  315. package/dist/public/proof-receipt.d.ts +279 -0
  316. package/dist/public/proof-receipt.d.ts.map +1 -0
  317. package/dist/public/proof-receipt.js +377 -0
  318. package/dist/public/schemas/entity.d.ts.map +1 -1
  319. package/dist/public/schemas/entity.js +21 -7
  320. package/dist/public/skills/kibi-freshness/SKILL.md +1 -1
  321. package/dist/public/skills/kibi-usage/SKILL.md +41 -12
  322. package/dist/public/skills/kibi-usage/resources/operation-access.md +1 -1
  323. package/dist/public/skills/kibi-usage/resources/proof.md +105 -0
  324. package/dist/public/skills/kibi-usage/resources/workflows.md +6 -6
  325. package/dist/public/symbol-granularity.d.ts +3 -14
  326. package/dist/public/symbol-granularity.d.ts.map +1 -1
  327. package/dist/public/symbol-granularity.generated.d.ts +16 -0
  328. package/dist/public/symbol-granularity.generated.d.ts.map +1 -0
  329. package/dist/public/symbol-granularity.generated.js +20 -0
  330. package/dist/public/symbol-granularity.js +6 -47
  331. package/dist/public/telemetry-acceptance.d.ts +3 -77
  332. package/dist/public/telemetry-acceptance.d.ts.map +1 -1
  333. package/dist/public/telemetry-acceptance.js +4 -2
  334. package/dist/public/telemetry-remediation.js +1 -1
  335. package/dist/report/html-report.css +282 -0
  336. package/dist/report/html-report.d.ts +4 -2
  337. package/dist/report/html-report.d.ts.map +1 -1
  338. package/dist/report/html-report.js +37 -300
  339. package/dist/runtime/cli-runtime.d.ts +2 -0
  340. package/dist/runtime/cli-runtime.d.ts.map +1 -1
  341. package/dist/runtime/cli-runtime.js +14 -7
  342. package/dist/schemas/entity.schema.json +355 -215
  343. package/dist/search-ranking.d.ts +1 -0
  344. package/dist/search-ranking.d.ts.map +1 -1
  345. package/dist/search-ranking.js +3 -0
  346. package/dist/traceability/evidence-model.d.ts +28 -0
  347. package/dist/traceability/evidence-model.d.ts.map +1 -1
  348. package/dist/traceability/git-staged.d.ts +20 -0
  349. package/dist/traceability/git-staged.d.ts.map +1 -1
  350. package/dist/traceability/git-staged.js +145 -1
  351. package/dist/traceability/staged-diagnostics.d.ts +7 -0
  352. package/dist/traceability/staged-diagnostics.d.ts.map +1 -1
  353. package/dist/traceability/staged-diagnostics.js +78 -7
  354. package/dist/traceability/staged-file-coverage.d.ts +33 -0
  355. package/dist/traceability/staged-file-coverage.d.ts.map +1 -0
  356. package/dist/traceability/staged-file-coverage.js +284 -0
  357. package/dist/traceability/staged-impact-contract.js +4 -4
  358. package/dist/traceability/staged-symbols-manifest.d.ts +13 -0
  359. package/dist/traceability/staged-symbols-manifest.d.ts.map +1 -1
  360. package/dist/traceability/staged-symbols-manifest.js +138 -27
  361. package/dist/traceability/symbol-extract.d.ts +5 -0
  362. package/dist/traceability/symbol-extract.d.ts.map +1 -1
  363. package/dist/traceability/symbol-extract.js +1 -1
  364. package/dist/traceability/temp-kb.d.ts +2 -0
  365. package/dist/traceability/temp-kb.d.ts.map +1 -1
  366. package/dist/traceability/temp-kb.js +13 -4
  367. package/dist/types/entities.d.ts +5 -3
  368. package/dist/types/entities.d.ts.map +1 -1
  369. package/dist/utils/branch-resolver.d.ts +1 -0
  370. package/dist/utils/branch-resolver.d.ts.map +1 -1
  371. package/dist/utils/branch-resolver.js +7 -4
  372. package/dist/utils/branch-store.d.ts +6 -0
  373. package/dist/utils/branch-store.d.ts.map +1 -1
  374. package/dist/utils/branch-store.js +27 -0
  375. package/dist/utils/kb-paths.d.ts +1 -1
  376. package/dist/utils/kb-paths.d.ts.map +1 -1
  377. package/dist/utils/kb-paths.js +1 -1
  378. package/dist/utils/rule-registry.d.ts +1 -11
  379. package/dist/utils/rule-registry.d.ts.map +1 -1
  380. package/dist/utils/rule-registry.generated.d.ts +97 -0
  381. package/dist/utils/rule-registry.generated.d.ts.map +1 -0
  382. package/dist/utils/rule-registry.generated.js +125 -0
  383. package/dist/utils/rule-registry.js +12 -113
  384. package/dist/utils/strict-modeling.d.ts +1 -0
  385. package/dist/utils/strict-modeling.d.ts.map +1 -1
  386. package/dist/utils/strict-modeling.js +1 -1
  387. package/package.json +8 -11
  388. package/src/public/diagnostic-usage.ts +6 -6
  389. package/src/public/distribution-parity.ts +17 -10
  390. package/src/public/impact/coverage-depth-quality.ts +1 -1
  391. package/src/public/impact/diagnostics.ts +2 -1
  392. package/src/public/impact/diff-meaning.ts +11 -4
  393. package/src/public/impact/full-kb-quality.ts +463 -72
  394. package/src/public/operations/catalog.ts +10 -4
  395. package/src/public/operations/check-executor.ts +3 -7
  396. package/src/public/operations/contracts.ts +38 -22
  397. package/src/public/operations/discovery-entities.ts +7 -0
  398. package/src/public/operations/discovery-executors.ts +26 -23
  399. package/src/public/operations/index.ts +1 -1
  400. package/src/public/operations/migration-plan.ts +32 -25
  401. package/src/public/operations/node-ports.ts +6 -6
  402. package/src/public/operations/repair-plan.ts +60 -23
  403. package/src/public/operations/result-envelope.ts +15 -10
  404. package/src/public/operations/runtime-types.ts +5 -0
  405. package/src/public/operations/specs/check-rules.generated.ts +37 -0
  406. package/src/public/operations/specs/check.ts +12 -21
  407. package/src/public/operations/specs/mutation-schemas.ts +22 -9
  408. package/src/public/operations/specs/planning.ts +7 -0
  409. package/src/public/operations/specs/proof.ts +43 -0
  410. package/src/public/operations/specs/reporting.ts +140 -13
  411. package/src/public/operations/symbol-repair-plan.ts +163 -3
  412. package/src/public/operations/types.ts +1 -1
  413. package/src/public/proof-fingerprint.ts +216 -0
  414. package/src/public/proof-protocol-types.d.ts +96 -0
  415. package/src/public/proof-protocol.ts +589 -0
  416. package/src/public/proof-receipt.ts +499 -0
  417. package/src/public/schemas/entity.ts +26 -10
  418. package/src/public/skills/kibi-freshness/SKILL.md +1 -1
  419. package/src/public/skills/kibi-usage/SKILL.md +41 -12
  420. package/src/public/skills/kibi-usage/resources/operation-access.md +1 -1
  421. package/src/public/skills/kibi-usage/resources/proof.md +105 -0
  422. package/src/public/skills/kibi-usage/resources/workflows.md +6 -6
  423. package/src/public/symbol-granularity.generated.ts +41 -0
  424. package/src/public/symbol-granularity.ts +35 -60
  425. package/src/public/telemetry-acceptance-types.d.ts +98 -0
  426. package/src/public/telemetry-acceptance.ts +22 -100
  427. package/src/public/telemetry-remediation.ts +1 -1
  428. package/src/schemas/entity.schema.json +355 -215
  429. package/dist/cli-register-verification.d.ts +0 -3
  430. package/dist/cli-register-verification.d.ts.map +0 -1
  431. package/dist/cli-register-verification.js +0 -16
  432. package/dist/commands/verify.d.ts +0 -10
  433. package/dist/commands/verify.d.ts.map +0 -1
  434. package/dist/commands/verify.js +0 -126
  435. package/dist/operations/verification/ingest-verification.d.ts +0 -29
  436. package/dist/operations/verification/ingest-verification.d.ts.map +0 -1
  437. package/dist/operations/verification/ingest-verification.js +0 -192
  438. package/dist/public/operations/specs/verification.d.ts +0 -78
  439. package/dist/public/operations/specs/verification.d.ts.map +0 -1
  440. package/dist/public/operations/specs/verification.js +0 -62
  441. package/dist/public/playwright-case-id.d.ts.map +0 -1
  442. package/dist/public/verification-receipt.d.ts +0 -242
  443. package/dist/public/verification-receipt.d.ts.map +0 -1
  444. package/dist/public/verification-receipt.js +0 -296
  445. package/dist/verification/playwright-reporter.d.ts +0 -21
  446. package/dist/verification/playwright-reporter.d.ts.map +0 -1
  447. package/dist/verification/playwright-reporter.js +0 -114
  448. package/src/public/operations/specs/verification.ts +0 -78
  449. package/src/public/playwright-case-id.ts +0 -35
  450. package/src/public/verification-receipt.ts +0 -412
@@ -20,7 +20,7 @@ import * as path from "node:path";
20
20
  import { dump as dumpYAML, load as parseYAML } from "js-yaml";
21
21
  import { coarseCoordinateSpan, coordinateIdentityHash, coordinateSourceHash, parseCoordinateArtifact, writeCoordinateArtifact, } from "../../extractors/symbol-coordinates.js";
22
22
  import { enrichSymbolCoordinates, } from "../../extractors/symbols-coordinator.js";
23
- import { COARSE_GRANULARITY_REASONS, isCoarseGranularityReason, } from "../../public/symbol-granularity.js";
23
+ import { COARSE_GRANULARITY_REASONS, COARSE_GRANULARITY_REASONS_PARENTHESIZED, isCoarseGranularityReason, } from "../../public/symbol-granularity.js";
24
24
  import { resolveSymbolsManifestPaths } from "../../utils/manifest-paths.js";
25
25
  function resolveDeps(overrides) {
26
26
  return {
@@ -42,17 +42,16 @@ export const SYMBOLS_MANIFEST_COMMENT_BLOCK = `# symbols.yaml
42
42
  # id, title, sourceFile, links, status, tags, owner, priority
43
43
  # Generated coordinates are stored separately in symbol-coordinates.yaml.
44
44
  # Run \`kibi sync --refresh-symbol-coordinates\` to refresh them.
45
+ #
46
+ # Coordinate refresh granularity gate:
47
+ # The AST extractor locates per-declaration spans for code files. When it
48
+ # cannot find a declaration, a title-match or whole-file coarse span is
49
+ # published ONLY for symbols that declare a coarse granularity_reason
50
+ # (${COARSE_GRANULARITY_REASONS.join(", ")}).
51
+ # A symbol without granularity_reason whose extraction misses gets no
52
+ # coordinate entry at all and is reported as failed; add symbol_role and
53
+ # granularity_reason to opt it into the coarse fallback.
45
54
  `;
46
- const SYMBOL_COORD_EXTENSIONS = new Set([
47
- ".ts",
48
- ".tsx",
49
- ".js",
50
- ".jsx",
51
- ".mts",
52
- ".cts",
53
- ".mjs",
54
- ".cjs",
55
- ]);
56
55
  const GENERATED_COORD_FIELDS = [
57
56
  "sourceLine",
58
57
  "sourceColumn",
@@ -152,6 +151,19 @@ function manifestEntryIdentity(entry) {
152
151
  : { granularity_reason: granularityReason }),
153
152
  };
154
153
  }
154
+ /**
155
+ * Typed reason an eligible (code-file) symbol still has no coordinates after
156
+ * enrichment: the AST extractor missed and the symbol either lacks a coarse
157
+ * granularity_reason (so the whole-file fallback is gated off) or the
158
+ * fallback itself produced no span.
159
+ */
160
+ function coarseAnchorFailureReason(entry) {
161
+ const reason = entry.granularity_reason;
162
+ if (!isCoarseGranularityReason(reason)) {
163
+ return `extractor produced no coordinates; add symbol_role and granularity_reason ${COARSE_GRANULARITY_REASONS_PARENTHESIZED} to enable the whole-file coarse fallback`;
164
+ }
165
+ return "extractor produced no coordinates and the whole-file coarse fallback found no span for this symbol";
166
+ }
155
167
  export async function refreshManifestCoordinates(
156
168
  // implements REQ-003
157
169
  manifestPath, workspaceRoot, deps) {
@@ -212,8 +224,8 @@ manifestPath, workspaceRoot, deps) {
212
224
  const strippedEnriched = enriched.map((current) => Object.fromEntries(Object.entries(current).filter(([field]) => !GENERATED_MANIFEST_FIELDS.has(field))));
213
225
  parsed.symbols = strippedEnriched;
214
226
  let refreshed = 0;
215
- let failed = 0;
216
227
  let unchanged = 0;
228
+ const failures = [];
217
229
  for (let i = 0; i < before.length; i++) {
218
230
  const previous = before[i] ?? {};
219
231
  const current = enriched[i] ?? previous;
@@ -231,11 +243,13 @@ manifestPath, workspaceRoot, deps) {
231
243
  ? previous.sourceFile
232
244
  : undefined, workspaceRoot, resolved);
233
245
  if (eligible && !hasAllGeneratedCoordinates(current)) {
234
- failed++;
235
- }
236
- else {
237
- unchanged++;
246
+ failures.push({
247
+ id: typeof current.id === "string" ? current.id : `#${i}`,
248
+ reason: coarseAnchorFailureReason(current),
249
+ });
250
+ continue;
238
251
  }
252
+ unchanged++;
239
253
  }
240
254
  const dumped = resolved.dumpYAML(parsed, {
241
255
  lineWidth: -1,
@@ -268,7 +282,26 @@ manifestPath, workspaceRoot, deps) {
268
282
  }
269
283
  throw error;
270
284
  }
271
- console.log(`\u2713 Refreshed symbol coordinates in ${path.relative(workspaceRoot, manifestPath)} (refreshed=${refreshed}, unchanged=${unchanged}, failed=${failed})`);
285
+ // The generated coordinates live in the artifact beside the manifest, not
286
+ // in the authored symbols.yaml this command also rewrites; naming the
287
+ // artifact keeps diff audits pointed at the file that actually changed.
288
+ const counts = `(refreshed=${refreshed}, unchanged=${unchanged}, failed=${failures.length})`;
289
+ if (coordinatesPath !== null) {
290
+ console.log(`\u2713 Refreshed symbol coordinates in ${path.relative(workspaceRoot, coordinatesPath)} ${counts}`);
291
+ }
292
+ else {
293
+ console.log(`\u2713 Normalized symbol manifest ${path.relative(workspaceRoot, manifestPath)} ${counts}`);
294
+ }
295
+ const maxReportedFailures = 10;
296
+ for (const failure of failures.slice(0, maxReportedFailures)) {
297
+ console.log(` failed ${failure.id}: ${failure.reason}`);
298
+ }
299
+ if (failures.length > maxReportedFailures) {
300
+ console.log(` ... and ${failures.length - maxReportedFailures} more failed symbol(s)`);
301
+ }
302
+ if (failures.length > 0) {
303
+ console.log(" Symbols without a published coordinate entry are dropped from coverage on the next plain sync until they succeed.");
304
+ }
272
305
  }
273
306
  export function hasAllGeneratedCoordinates(
274
307
  // implements REQ-003
@@ -287,10 +320,9 @@ sourceFile, workspaceRoot, deps) {
287
320
  const absolute = path.isAbsolute(sourceFile)
288
321
  ? sourceFile
289
322
  : path.resolve(workspaceRoot, sourceFile);
290
- if (!resolved.existsSync(absolute))
291
- return false;
292
- const ext = path.extname(absolute).toLowerCase();
293
- return SYMBOL_COORD_EXTENSIONS.has(ext);
323
+ // Non-JS/TS files also undergo coordinate extraction through the text
324
+ // heuristic. A miss there must be reported just like an AST extraction miss.
325
+ return resolved.existsSync(absolute);
294
326
  }
295
327
  function isRecord(value) {
296
328
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -18,7 +18,10 @@ export declare function persistEntities(prolog: PrologProcess, results: Extracti
18
18
  entityCount: number;
19
19
  kbModified: boolean;
20
20
  }>;
21
- export declare function persistRelationships(prolog: PrologProcess, results: ExtractionResult[], shardRelationships: ExtractedRelationship[]): Promise<{
21
+ export declare function relationshipFailureMessage(singleError: string | undefined, batchError: string | undefined): string;
22
+ export declare function persistRelationships(prolog: PrologProcess, results: ExtractionResult[], shardRelationships: ExtractedRelationship[], options?: {
23
+ workspaceRoot?: string;
24
+ }): Promise<{
22
25
  relationshipCount: number;
23
26
  kbModified: boolean;
24
27
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/persistence.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAEV,qBAAqB,EACrB,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAgHrD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;CACrB;AA8CD,iFAAiF;AACjF,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,OAAO,CAAC,MAAM,CAAC,CAkCjB;AAED,0EAA0E;AAC1E,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAED,8EAA8E;AAC9E,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,SAAS,qBAAqB,EAAE,GAC9C,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAmCD,wBAAsB,eAAe,CAEnC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,gBAAgB,EAAE,EAC3B,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,EACtB,OAAO,GAAE;IAAE,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAAO,GAChD,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC,CA4OvD;AA6BD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,gBAAgB,EAAE,EAC3B,kBAAkB,EAAE,qBAAqB,EAAE,GAC1C,OAAO,CAAC;IAAE,iBAAiB,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC,CA0N7D"}
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/persistence.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAEV,qBAAqB,EACrB,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAiHrD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;CACrB;AA8CD,iFAAiF;AACjF,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,OAAO,CAAC,MAAM,CAAC,CAkCjB;AAED,0EAA0E;AAC1E,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAED,8EAA8E;AAC9E,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,SAAS,qBAAqB,EAAE,GAC9C,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAmCD,wBAAsB,eAAe,CAEnC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,gBAAgB,EAAE,EAC3B,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,EACtB,OAAO,GAAE;IAAE,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAAO,GAChD,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC,CAiPvD;AA4BD,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,MAAM,CAER;AAGD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,gBAAgB,EAAE,EAC3B,kBAAkB,EAAE,qBAAqB,EAAE,EAC3C,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,GACvC,OAAO,CAAC;IAAE,iBAAiB,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC,CAmO7D"}
@@ -18,7 +18,8 @@
18
18
  import * as path from "node:path";
19
19
  import { toPrologAtom, toPrologString } from "../../prolog/codec.js";
20
20
  import { loadEntities } from "../../public/operations/discovery-entities.js";
21
- import { appendOnlyVerificationReceiptHistoryErrors } from "../../public/verification-receipt.js";
21
+ import { appendOnlyProofReceiptHistoryErrors } from "../../public/proof-receipt.js";
22
+ import { findUntrackedDocumentMatches } from "./untracked-targets.js";
22
23
  // Field categorization for typed fact serialization
23
24
  // NOTE: base entity fields (status, owner, priority, severity) are NOT listed here —
24
25
  // they are emitted in the base props block above. Only fact-specific atom fields go here.
@@ -285,15 +286,15 @@ prolog, results, entityIds, options = {}) {
285
286
  id: entity.id,
286
287
  type: "test",
287
288
  });
288
- const previous = Array.isArray(existing[0]?.verification_receipts)
289
- ? existing[0].verification_receipts.filter((receipt) => receipt !== null &&
289
+ const previous = Array.isArray(existing[0]?.proof_receipts)
290
+ ? existing[0].proof_receipts.filter((receipt) => receipt !== null &&
290
291
  typeof receipt === "object" &&
291
292
  !Array.isArray(receipt))
292
293
  : [];
293
- const next = Array.isArray(entity.verification_receipts)
294
- ? entity.verification_receipts
294
+ const next = Array.isArray(entity.proof_receipts)
295
+ ? entity.proof_receipts
295
296
  : undefined;
296
- const receiptErrors = appendOnlyVerificationReceiptHistoryErrors(previous, next);
297
+ const receiptErrors = appendOnlyProofReceiptHistoryErrors(previous, next);
297
298
  if (receiptErrors.length > 0) {
298
299
  throw new Error(receiptErrors.join("; "));
299
300
  }
@@ -369,11 +370,14 @@ prolog, results, entityIds, options = {}) {
369
370
  if (entity.verification_perspective !== undefined) {
370
371
  props.push(`verification_perspective=${toPrologAtom(entity.verification_perspective)}`);
371
372
  }
372
- if (entity.verification_contract !== undefined) {
373
- props.push(`verification_contract=${toPrologString(JSON.stringify(entity.verification_contract))}`);
373
+ if (entity.proof_contract !== undefined) {
374
+ props.push(`proof_contract=${toPrologString(JSON.stringify(entity.proof_contract))}`);
374
375
  }
375
- if (entity.verification_receipts !== undefined) {
376
- props.push(`verification_receipts=${toPrologString(JSON.stringify(entity.verification_receipts))}`);
376
+ if (entity.proof_bindings !== undefined) {
377
+ props.push(`proof_bindings=${toPrologString(JSON.stringify(entity.proof_bindings))}`);
378
+ }
379
+ if (entity.proof_receipts !== undefined) {
380
+ props.push(`proof_receipts=${toPrologString(JSON.stringify(entity.proof_receipts))}`);
377
381
  }
378
382
  }
379
383
  const propsList = `[${props.join(", ")}]`;
@@ -450,8 +454,11 @@ function semanticEntityContext(entity, sourceFile) {
450
454
  }
451
455
  return ` (${details.join("; ")})`;
452
456
  }
457
+ export function relationshipFailureMessage(singleError, batchError) {
458
+ return singleError || batchError || "Unknown error";
459
+ }
453
460
  // implements REQ-core-persistence
454
- export async function persistRelationships(prolog, results, shardRelationships) {
461
+ export async function persistRelationships(prolog, results, shardRelationships, options = {}) {
455
462
  let relCount = 0;
456
463
  let kbModified = false;
457
464
  // Build ID lookup for relationship resolution
@@ -525,9 +532,7 @@ export async function persistRelationships(prolog, results, shardRelationships)
525
532
  rel: item.rel,
526
533
  fromId: item.fromId,
527
534
  toId: item.toId,
528
- error: single.error ||
529
- (relationshipBatchRunner ? batch.error : undefined) ||
530
- "Unknown error",
535
+ error: relationshipFailureMessage(single.error, relationshipBatchRunner ? batch.error : undefined),
531
536
  });
532
537
  }
533
538
  }
@@ -609,6 +614,12 @@ export async function persistRelationships(prolog, results, shardRelationships)
609
614
  const idList = [...missingIds].sort().join(", ");
610
615
  console.warn(`\nTip: ${missingEntities.length} relationship(s) reference ${missingIds.size} missing entity/ies: ${idList}.`);
611
616
  console.warn(" Create the missing docs (e.g., docs/requirements/REQ-*.md) or remove stale relationships.");
617
+ const untrackedMatches = options.workspaceRoot !== undefined
618
+ ? findUntrackedDocumentMatches(options.workspaceRoot, [...missingIds])
619
+ : new Map();
620
+ for (const [id, docPath] of untrackedMatches) {
621
+ console.warn(` Note: document for ${id} exists at ${docPath} but is untracked, so sync ignores it. Stage it with \`git add ${docPath}\` (staging is enough; no commit required) and sync again.`);
622
+ }
612
623
  }
613
624
  else if (invalidRels.length > 0) {
614
625
  console.warn("\nTip: Check that relationship types and directions match the allowed schema (e.g., implements symbol→req, verified_by req→test).");
@@ -16,6 +16,7 @@ interface StagingDeps {
16
16
  writeFileSync: typeof writeFileSync;
17
17
  }
18
18
  export declare function createUniqueStagingPath(currentBranch: string, rootDir: string, pid?: number, now?: number): string;
19
+ export declare function abandonedStagingBranch(branch: string | undefined): string | undefined;
19
20
  export declare function cleanupAbandonedStagingDirectories(stagingPath: string, deps?: Partial<StagingDeps>): Promise<void>;
20
21
  export declare function prepareStagingEnvironment(stagingPath: string, livePath: string, rebuild: boolean, deps?: Partial<StagingDeps>): Promise<void>;
21
22
  export declare function atomicPublish(stagingPath: string, livePath: string, deps?: Partial<StagingDeps>): void;
@@ -1 +1 @@
1
- {"version":3,"file":"staging.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/staging.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,UAAU,EACV,SAAS,EACT,UAAU,EACV,MAAM,EACN,aAAa,EACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,UAAU,WAAW;IACnB,iBAAiB,EAAE,OAAO,iBAAiB,CAAC;IAC5C,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,EAAE,EAAE,OAAO,EAAE,CAAC;IACd,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACzC,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,MAAM,EAAE,OAAO,MAAM,CAAC;IACtB,aAAa,EAAE,OAAO,aAAa,CAAC;CACrC;AA+BD,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,GAAG,SAAc,EACjB,GAAG,SAAa,GACf,MAAM,CAOR;AAGD,wBAAsB,kCAAkC,CACtD,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CAqDf;AAED,wBAAsB,yBAAyB,CAE7C,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CA6Cf;AA0CD,wBAAgB,aAAa,CAE3B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC1B,IAAI,CAeN;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC1B,IAAI,CA6DN;AAED,wBAAgB,cAAc,CAE5B,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC1B,IAAI,CAKN"}
1
+ {"version":3,"file":"staging.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/staging.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,UAAU,EACV,SAAS,EACT,UAAU,EACV,MAAM,EACN,aAAa,EACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,UAAU,WAAW;IACnB,iBAAiB,EAAE,OAAO,iBAAiB,CAAC;IAC5C,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,EAAE,EAAE,OAAO,EAAE,CAAC;IACd,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACzC,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,MAAM,EAAE,OAAO,MAAM,CAAC;IACtB,aAAa,EAAE,OAAO,aAAa,CAAC;CACrC;AA+BD,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,GAAG,SAAc,EACjB,GAAG,SAAa,GACf,MAAM,CAOR;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,MAAM,GAAG,SAAS,CAEpB;AAGD,wBAAsB,kCAAkC,CACtD,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CAqDf;AAED,wBAAsB,yBAAyB,CAE7C,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CA6Cf;AA0CD,wBAAgB,aAAa,CAE3B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC1B,IAAI,CAeN;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC1B,IAAI,CA6DN;AAED,wBAAgB,cAAc,CAE5B,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC1B,IAAI,CAKN"}
@@ -50,16 +50,19 @@ function resolveDeps(overrides) {
50
50
  export function createUniqueStagingPath(currentBranch, rootDir, pid = process.pid, now = Date.now()) {
51
51
  return path.join(rootDir, ".kb", "branches", `${currentBranch}.staging.${pid}.${now}`);
52
52
  }
53
+ export function abandonedStagingBranch(branch) {
54
+ return branch ? branch : undefined;
55
+ }
53
56
  // implements REQ-003
54
57
  export async function cleanupAbandonedStagingDirectories(stagingPath, deps) {
55
58
  const resolved = resolveDeps(deps);
56
59
  const stagingDir = path.dirname(stagingPath);
57
60
  const stagingBase = path.basename(stagingPath);
58
- const match = /^(?<branch>.+)\.staging\.(?<pid>\d+)\.(?<timestamp>\d+)$/.exec(stagingBase);
61
+ const match = /^(?<branch>.*)\.staging\.(?<pid>\d+)\.(?<timestamp>\d+)$/.exec(stagingBase);
59
62
  if (!match?.groups) {
60
63
  return;
61
64
  }
62
- const branch = match.groups.branch;
65
+ const branch = abandonedStagingBranch(match.groups.branch);
63
66
  if (!branch) {
64
67
  return;
65
68
  }
@@ -0,0 +1,24 @@
1
+ interface UntrackedTargetsDeps {
2
+ execFileSync: (file: string, args: readonly string[], options: {
3
+ encoding: "utf8";
4
+ maxBuffer: number;
5
+ stdio: "pipe";
6
+ }) => string;
7
+ existsSync: (path: string) => boolean;
8
+ readFileSync: (path: string, encoding: "utf8") => string;
9
+ }
10
+ /**
11
+ * Match missing relationship-target ids against untracked `.kb` documents.
12
+ *
13
+ * Sync discovery intentionally enumerates only git-tracked (or
14
+ * pending-receipt) documents, so a freshly authored but unstaged `.kb` doc is
15
+ * invisible to sync while relationships that reference it fail with a
16
+ * misleading "Target entity does not exist". This helper powers the sync
17
+ * warning that tells the author to stage the document instead.
18
+ *
19
+ * Best effort by design: any git or filesystem failure yields no matches so
20
+ * the diagnostic can never break a sync run.
21
+ */
22
+ export declare function findUntrackedDocumentMatches(workspaceRoot: string, missingIds: readonly string[], deps?: Partial<UntrackedTargetsDeps>): Map<string, string>;
23
+ export {};
24
+ //# sourceMappingURL=untracked-targets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"untracked-targets.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/untracked-targets.ts"],"names":[],"mappings":"AAsBA,UAAU,oBAAoB;IAC5B,YAAY,EAAE,CACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAC5D,MAAM,CAAC;IACZ,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;CAC1D;AAQD;;;;;;;;;;;GAWG;AAEH,wBAAgB,4BAA4B,CAC1C,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,IAAI,GAAE,OAAO,CAAC,oBAAoB,CAAM,GACvC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAiDrB"}
@@ -0,0 +1,108 @@
1
+ /*
2
+ Kibi — repo-local, per-branch, queryable long-term memory for software projects
3
+ Copyright (C) 2026 Piotr Franczyk
4
+
5
+ This program is free software: you can redistribute it and/or modify
6
+ it under the terms of the GNU Affero General Public License as published by
7
+ the Free Software Foundation, either version 3 of the License, or
8
+ (at your option) any later version.
9
+
10
+ This program is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU Affero General Public License for more details.
14
+
15
+ You should have received a copy of the GNU Affero General Public License
16
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ */
18
+ import { execFileSync } from "node:child_process";
19
+ import { existsSync, readFileSync } from "node:fs";
20
+ import * as path from "node:path";
21
+ const defaultDeps = {
22
+ execFileSync: (file, args, options) => execFileSync(file, args, options),
23
+ existsSync,
24
+ readFileSync,
25
+ };
26
+ /**
27
+ * Match missing relationship-target ids against untracked `.kb` documents.
28
+ *
29
+ * Sync discovery intentionally enumerates only git-tracked (or
30
+ * pending-receipt) documents, so a freshly authored but unstaged `.kb` doc is
31
+ * invisible to sync while relationships that reference it fail with a
32
+ * misleading "Target entity does not exist". This helper powers the sync
33
+ * warning that tells the author to stage the document instead.
34
+ *
35
+ * Best effort by design: any git or filesystem failure yields no matches so
36
+ * the diagnostic can never break a sync run.
37
+ */
38
+ // implements REQ-core-persistence
39
+ export function findUntrackedDocumentMatches(workspaceRoot, missingIds, deps = {}) {
40
+ const resolved = { ...defaultDeps, ...deps };
41
+ const matches = new Map();
42
+ if (missingIds.length === 0)
43
+ return matches;
44
+ let untracked;
45
+ try {
46
+ const output = resolved.execFileSync("git", [
47
+ "-C",
48
+ workspaceRoot,
49
+ "ls-files",
50
+ "--others",
51
+ "--exclude-standard",
52
+ "-z",
53
+ "--",
54
+ ".kb",
55
+ ], { encoding: "utf8", maxBuffer: 16 * 1024 * 1024, stdio: "pipe" });
56
+ untracked = output.split("\0").filter(Boolean);
57
+ }
58
+ catch {
59
+ return matches;
60
+ }
61
+ const remaining = new Set(missingIds);
62
+ for (const relative of untracked) {
63
+ if (remaining.size === 0)
64
+ break;
65
+ if (!relative.endsWith(".md"))
66
+ continue;
67
+ const absolute = path.resolve(workspaceRoot, relative.replaceAll("\\", "/"));
68
+ if (!resolved.existsSync(absolute))
69
+ continue;
70
+ let content;
71
+ try {
72
+ content = resolved.readFileSync(absolute, "utf8");
73
+ }
74
+ catch {
75
+ continue;
76
+ }
77
+ const id = frontmatterId(content);
78
+ if (id !== null && remaining.has(id)) {
79
+ const workspaceRelative = path
80
+ .relative(workspaceRoot, absolute)
81
+ .replaceAll("\\", "/");
82
+ matches.set(id, workspaceRelative);
83
+ remaining.delete(id);
84
+ }
85
+ }
86
+ return matches;
87
+ }
88
+ /**
89
+ * Extract `id:` from a markdown document's YAML frontmatter (the first
90
+ * `---` block). Documents whose id never appears in the frontmatter region
91
+ * are not entity candidates.
92
+ */
93
+ function frontmatterId(content) {
94
+ const lines = content.match(/[^\n]*\n|[^\n]+$/g) ?? [];
95
+ if (lines[0]?.trim() !== "---")
96
+ return null;
97
+ for (let index = 1; index < lines.length && index < 64; index++) {
98
+ const line = lines[index] ?? "";
99
+ if (line.trim() === "---")
100
+ return null;
101
+ const match = line.match(/^id:\s*(?:"([^"]+)"|'([^']+)'|(\S+))/);
102
+ if (match) {
103
+ const id = (match[1] ?? match[2] ?? match[3])?.trim();
104
+ return id && id.length > 0 ? id : null;
105
+ }
106
+ }
107
+ return null;
108
+ }
@@ -1,9 +1,11 @@
1
- import type { SyncSummary } from "../diagnostics.js";
1
+ import type { Diagnostic, SyncSummary } from "../diagnostics.js";
2
2
  import { acquireSymbolCompilerLock } from "../operations/mutation/symbol-compiler-lock.js";
3
3
  import { PrologProcess } from "../prolog.js";
4
+ import type { PendingSourceReceiptSnapshot } from "./sync/discovery.js";
4
5
  export declare class SyncError extends Error {
5
6
  constructor(message: string);
6
7
  }
8
+ export declare function trackedRelationshipFiles(workspaceRoot: string, relationshipsDir: string, recoverMissingPendingSources?: boolean, recoveredPendingReceiptPaths?: PendingSourceReceiptSnapshot[]): string[];
7
9
  export interface SyncResult extends SyncSummary {
8
10
  exitCode?: number;
9
11
  }
@@ -24,6 +26,14 @@ interface SyncCommandRuntime {
24
26
  }) => PrologProcess;
25
27
  acquireSymbolCompilerLock?: typeof acquireSymbolCompilerLock;
26
28
  }
29
+ export declare function warnFailedSourceHash(file: string, error: unknown): void;
30
+ export declare function rememberChangedSourceOrWarn(file: string, apply: () => void): void;
31
+ export declare function maybePushKbMissingDiagnostic(diagnostics: Diagnostic[], kbExists: boolean, rebuild: boolean, currentBranch: string, livePath: string): void;
32
+ export declare function assertRelationshipsCleared(result: {
33
+ success: boolean;
34
+ error?: string;
35
+ }): void;
36
+ export declare function maybePushDocsNotIndexedDiagnostic(diagnostics: Diagnostic[], performedFullReindex: boolean, markdownFileCount: number, entityCount: number): void;
27
37
  export declare function syncCommand(options?: {
28
38
  validateOnly?: boolean;
29
39
  rebuild?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAc,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAyBjE,OAAO,EAEL,yBAAyB,EAE1B,MAAM,gDAAgD,CAAC;AAGxD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AA+C7C,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,EAAE,MAAM;CAI5B;AAkMD,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,yBAAyB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,UAAU,kBAAkB;IAC1B,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3E,UAAU,CAAC,EAAE,CACX,OAAO,EAAE,yBAAyB,GAAG;QAAE,UAAU,EAAE,OAAO,CAAA;KAAE,KACzD,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,aAAa,CAAC;IAC/D,yBAAyB,CAAC,EAAE,OAAO,yBAAyB,CAAC;CAC9D;AA+DD,wBAAsB,WAAW,CAC/B,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;CACnB,EACN,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,UAAU,CAAC,CA4kCrB;AAED,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA6BjE,OAAO,EAEL,yBAAyB,EAE1B,MAAM,gDAAgD,CAAC;AAGxD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAyB7C,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAsBxE,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,EAAE,MAAM;CAI5B;AAmCD,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,EACxB,4BAA4B,UAAQ,EACpC,4BAA4B,GAAE,4BAA4B,EAAO,GAChE,MAAM,EAAE,CAqGV;AAqDD,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,yBAAyB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,UAAU,kBAAkB;IAC1B,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3E,UAAU,CAAC,EAAE,CACX,OAAO,EAAE,yBAAyB,GAAG;QAAE,UAAU,EAAE,OAAO,CAAA;KAAE,KACzD,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,aAAa,CAAC;IAC/D,yBAAyB,CAAC,EAAE,OAAO,yBAAyB,CAAC;CAC9D;AA6DD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAGvE;AAGD,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,IAAI,GAChB,IAAI,CAMN;AAED,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,UAAU,EAAE,EACzB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,IAAI,CAIN;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,IAAI,CAMP;AAED,wBAAgB,iCAAiC,CAC/C,WAAW,EAAE,UAAU,EAAE,EACzB,oBAAoB,EAAE,OAAO,EAC7B,iBAAiB,EAAE,MAAM,EACzB,WAAW,EAAE,MAAM,GAClB,IAAI,CAUN;AAGD,wBAAsB,WAAW,CAC/B,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;CACnB,EACN,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,UAAU,CAAC,CAwnCrB;AAED,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -20,7 +20,7 @@ import { createHash } from "node:crypto";
20
20
  import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, writeFileSync, } from "node:fs";
21
21
  import * as path from "node:path";
22
22
  import { branchErrorToDiagnostic, createDocsNotIndexedDiagnostic, createInvalidAuthoringDiagnostic, createKbMissingDiagnostic, formatSyncSummary, } from "../diagnostics.js";
23
- import { EngineClient, acquireEnginePublicationLease, engineSocketPath, ensureJournaledBranchStoreAsync, fsyncJournaledBranchStore, } from "../engine.js";
23
+ import { EngineClient, acquireEnginePublicationLease, engineSocketPath, ensureJournaledBranchStoreAsync, formatEngineAttachmentMismatch, fsyncJournaledBranchStore, parseEngineAttachmentIdentity, readEngineAttachmentIdentity, } from "../engine.js";
24
24
  import { isCliDebugEnabled } from "../env.js";
25
25
  import { extractRelationshipShard, validateRelationships, } from "../extractors/relationships.js";
26
26
  import { acquireSymbolCompilerLock, releaseSymbolCompilerLock, } from "../operations/mutation/symbol-compiler-lock.js";
@@ -71,7 +71,7 @@ function assertNoUnresolvedGitConflicts(workspaceRoot) {
71
71
  throw new SyncError(`Unresolved Git conflicts block Kibi compilation; resolve these authored files first: ${conflicted.split("\n").join(", ")}`);
72
72
  }
73
73
  }
74
- function trackedRelationshipFiles(workspaceRoot, relationshipsDir, recoverMissingPendingSources = false, recoveredPendingReceiptPaths = []) {
74
+ export function trackedRelationshipFiles(workspaceRoot, relationshipsDir, recoverMissingPendingSources = false, recoveredPendingReceiptPaths = []) {
75
75
  let tracked;
76
76
  try {
77
77
  tracked = new Set(execSync("git ls-files --cached -- .kb/relationships", {
@@ -226,12 +226,41 @@ function compilerCacheFilesMatch(cache, workspaceRoot, sourceFiles, relationship
226
226
  }
227
227
  for (const file of relationshipFiles) {
228
228
  if (cache.relationshipHashes?.[toCacheKey(workspaceRoot, file)] !==
229
- hashFile(workspaceRoot, file)) {
229
+ hashFile(workspaceRoot, file))
230
230
  return false;
231
- }
232
231
  }
233
232
  return true;
234
233
  }
234
+ export function warnFailedSourceHash(file, error) {
235
+ const message = error instanceof Error ? error.message : String(error);
236
+ console.warn(`Warning: Failed to hash ${file}: ${message}`);
237
+ }
238
+ // implements REQ-003, REQ-007
239
+ export function rememberChangedSourceOrWarn(file, apply) {
240
+ try {
241
+ apply();
242
+ }
243
+ catch (error) {
244
+ warnFailedSourceHash(file, error);
245
+ }
246
+ }
247
+ export function maybePushKbMissingDiagnostic(diagnostics, kbExists, rebuild, currentBranch, livePath) {
248
+ if (!kbExists && !rebuild) {
249
+ diagnostics.push(createKbMissingDiagnostic(currentBranch, livePath));
250
+ }
251
+ }
252
+ export function assertRelationshipsCleared(result) {
253
+ if (!result.success) {
254
+ throw new SyncError(`Failed to clear changed relationship shards: ${result.error || "Unknown error"}`);
255
+ }
256
+ }
257
+ export function maybePushDocsNotIndexedDiagnostic(diagnostics, performedFullReindex, markdownFileCount, entityCount) {
258
+ if (performedFullReindex &&
259
+ markdownFileCount > 0 &&
260
+ entityCount < markdownFileCount) {
261
+ diagnostics.push(createDocsNotIndexedDiagnostic(markdownFileCount, entityCount));
262
+ }
263
+ }
235
264
  // implements REQ-003, REQ-007
236
265
  export async function syncCommand(options = {}, runtime = {}) {
237
266
  const validateOnly = options.validateOnly ?? false;
@@ -470,11 +499,11 @@ export async function syncCommand(options = {}, runtime = {}) {
470
499
  const relationshipChanged = addedShardRelationships.length > 0 ||
471
500
  removedShardRelationships.length > 0;
472
501
  for (const file of sourceFiles) {
473
- try {
502
+ rememberChangedSourceOrWarn(file, () => {
474
503
  const key = toCacheKey(workspaceRoot, file);
475
504
  const hash = changedSourceHashes.get(key) ?? syncCache.hashes[key];
476
505
  if (hash === undefined)
477
- continue;
506
+ return;
478
507
  const lastSeen = syncCache.seenAt[key];
479
508
  const lastSeenMs = lastSeen ? Date.parse(lastSeen) : Number.NaN;
480
509
  const expired = !lastSeen ||
@@ -493,11 +522,7 @@ export async function syncCommand(options = {}, runtime = {}) {
493
522
  changedManifestFiles.push(file);
494
523
  }
495
524
  }
496
- }
497
- catch (error) {
498
- const message = error instanceof Error ? error.message : String(error);
499
- console.warn(`Warning: Failed to hash ${file}: ${message}`);
500
- }
525
+ });
501
526
  }
502
527
  // A v1 cache has only whole-file hashes. Perform one compiler-metadata
503
528
  // backfill so subsequent edits can be reduced to normalized entity deltas.
@@ -716,9 +741,7 @@ export async function syncCommand(options = {}, runtime = {}) {
716
741
  }
717
742
  const livePath = branchStorePath(workspaceRoot, currentBranch);
718
743
  const kbExists = existsSync(livePath);
719
- if (!kbExists && !rebuild) {
720
- diagnostics.push(createKbMissingDiagnostic(currentBranch, livePath));
721
- }
744
+ maybePushKbMissingDiagnostic(diagnostics, kbExists, rebuild, currentBranch, livePath);
722
745
  // implements REQ-core-journaled-engine-delta-sync
723
746
  // Normal syncs are compiled directly into the long-lived single-writer
724
747
  // engine. Rebuilds retain generation replacement semantics, and injected
@@ -734,6 +757,23 @@ export async function syncCommand(options = {}, runtime = {}) {
734
757
  const engineProlog = engine;
735
758
  try {
736
759
  await engine.start();
760
+ const describeAttachment = async () => {
761
+ const live = readEngineAttachmentIdentity(livePath);
762
+ try {
763
+ const status = await engine.queryStatusJson();
764
+ return {
765
+ live,
766
+ attached: parseEngineAttachmentIdentity(status.bindings.JsonString),
767
+ };
768
+ }
769
+ catch {
770
+ return { live, attached: null };
771
+ }
772
+ };
773
+ const mutationFailure = async (operation, cause) => {
774
+ const { live, attached } = await describeAttachment();
775
+ return `${cause}; ${formatEngineAttachmentMismatch(operation, live, attached)}`;
776
+ };
737
777
  const successfulChangedSources = [
738
778
  ...changedMarkdownFiles,
739
779
  ...changedManifestFiles,
@@ -754,9 +794,19 @@ export async function syncCommand(options = {}, runtime = {}) {
754
794
  await retractRelationships(engineProlog, exactRemovedEdges);
755
795
  }
756
796
  else if (relationshipChanged) {
757
- const cleared = await engine.query("kb_retract_all_relationships");
758
- if (!cleared.success) {
759
- throw new SyncError(`Failed to clear changed relationship shards: ${cleared.error || "Unknown error"}`);
797
+ const clearChangedShards = async () => {
798
+ const cleared = await engine.query("kb_retract_all_relationships");
799
+ if (!cleared.success) {
800
+ throw new SyncError(await mutationFailure("kb_retract_all_relationships", `Failed to clear changed relationship shards: ${cleared.error || "Unknown error"}`));
801
+ }
802
+ };
803
+ try {
804
+ await clearChangedShards();
805
+ }
806
+ catch {
807
+ await engine.stop().catch(() => undefined);
808
+ await engine.start();
809
+ await clearChangedShards();
760
810
  }
761
811
  }
762
812
  const entityIds = new Set();
@@ -785,9 +835,7 @@ export async function syncCommand(options = {}, runtime = {}) {
785
835
  shardDeltaByKey.set(relationshipKey(relationship), relationship);
786
836
  }
787
837
  }
788
- const { relationshipCount, kbModified: relationshipsModified } = await persistRelationships(engineProlog, results, [
789
- ...shardDeltaByKey.values(),
790
- ]);
838
+ const { relationshipCount, kbModified: relationshipsModified } = await persistRelationships(engineProlog, results, [...shardDeltaByKey.values()], { workspaceRoot });
791
839
  const kbModified = removedCount > 0 ||
792
840
  relationshipChanged ||
793
841
  entitiesModified ||
@@ -796,7 +844,7 @@ export async function syncCommand(options = {}, runtime = {}) {
796
844
  engine.invalidateCache();
797
845
  const saveResult = await engine.save();
798
846
  if (!saveResult.success) {
799
- throw new SyncError(`Failed to save journaled KB: ${saveResult.error || "Unknown error"}`);
847
+ throw new SyncError(await mutationFailure("kb_save", `Failed to save journaled KB: ${saveResult.error || "Unknown error"}`));
800
848
  }
801
849
  const evictedHashes = {};
802
850
  const evictedSeenAt = {};
@@ -887,9 +935,7 @@ export async function syncCommand(options = {}, runtime = {}) {
887
935
  ].filter((file) => !failedCacheKeys.has(toCacheKey(workspaceRoot, file))));
888
936
  if (relationshipChanged) {
889
937
  const clearRelationships = await prolog.query("kb_retract_all_relationships");
890
- if (!clearRelationships.success) {
891
- throw new SyncError(`Failed to clear changed relationship shards: ${clearRelationships.error || "Unknown error"}`);
892
- }
938
+ assertRelationshipsCleared(clearRelationships);
893
939
  }
894
940
  const { entityCount, kbModified: entitiesModified } = await persistEntities(prolog, results, entityIds);
895
941
  const validationErrors = validateRelationships(allRelationships, entityIds);
@@ -902,7 +948,9 @@ export async function syncCommand(options = {}, runtime = {}) {
902
948
  const danglingKeys = new Set(validationErrors.map(({ relationship: r }) => `${r.type}|${r.from}|${r.to}`));
903
949
  const validRelationships = allRelationships.filter((r) => !danglingKeys.has(`${r.type}|${r.from}|${r.to}`));
904
950
  // Persist relationships
905
- const { relationshipCount, kbModified: relationshipsModified } = await persistRelationships(prolog, results, validRelationships);
951
+ const { relationshipCount, kbModified: relationshipsModified } = await persistRelationships(prolog, results, validRelationships, {
952
+ workspaceRoot,
953
+ });
906
954
  const kbModified = entitiesModified || relationshipsModified;
907
955
  if (validateOnly) {
908
956
  await prolog.query("kb_detach");
@@ -1016,11 +1064,7 @@ export async function syncCommand(options = {}, runtime = {}) {
1016
1064
  semanticContracts: evictedSemanticContracts,
1017
1065
  });
1018
1066
  published = true;
1019
- if (performedFullReindex &&
1020
- markdownFiles.length > 0 &&
1021
- entityCount < markdownFiles.length) {
1022
- diagnostics.push(createDocsNotIndexedDiagnostic(markdownFiles.length, entityCount));
1023
- }
1067
+ maybePushDocsNotIndexedDiagnostic(diagnostics, performedFullReindex, markdownFiles.length, entityCount);
1024
1068
  console.log(`✓ Imported ${entityCount} entities, ${relationshipCount} relationships`);
1025
1069
  const commit = getCurrentCommit();
1026
1070
  const summary = withOptionalCommit({