kibi-cli 0.19.0 → 1.0.1

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 (506) hide show
  1. package/dist/cli-operation-loader.d.ts.map +1 -1
  2. package/dist/cli-operation-loader.js +53 -20
  3. package/dist/cli-operation-metadata.d.ts +20 -8
  4. package/dist/cli-operation-metadata.d.ts.map +1 -1
  5. package/dist/cli-operation-metadata.js +23 -8
  6. package/dist/cli-protocol.d.ts.map +1 -1
  7. package/dist/cli-protocol.js +38 -8
  8. package/dist/cli-register-foundation.d.ts.map +1 -1
  9. package/dist/cli-register-foundation.js +14 -2
  10. package/dist/cli-register-maintenance.d.ts.map +1 -1
  11. package/dist/cli-register-maintenance.js +26 -4
  12. package/dist/cli-register-reporting.d.ts.map +1 -1
  13. package/dist/cli-register-reporting.js +10 -0
  14. package/dist/cli-register-verification.d.ts +3 -0
  15. package/dist/cli-register-verification.d.ts.map +1 -0
  16. package/dist/cli-register-verification.js +16 -0
  17. package/dist/cli.d.ts.map +1 -1
  18. package/dist/cli.js +2 -0
  19. package/dist/commands/aggregated-checks.d.ts +1 -2
  20. package/dist/commands/aggregated-checks.d.ts.map +1 -1
  21. package/dist/commands/aggregated-checks.js +14 -9
  22. package/dist/commands/branch.d.ts +36 -0
  23. package/dist/commands/branch.d.ts.map +1 -1
  24. package/dist/commands/branch.js +371 -40
  25. package/dist/commands/check.d.ts.map +1 -1
  26. package/dist/commands/check.js +20 -67
  27. package/dist/commands/discovery-shared.d.ts.map +1 -1
  28. package/dist/commands/discovery-shared.js +10 -19
  29. package/dist/commands/doctor.d.ts +4 -1
  30. package/dist/commands/doctor.d.ts.map +1 -1
  31. package/dist/commands/doctor.js +259 -24
  32. package/dist/commands/engine.d.ts.map +1 -1
  33. package/dist/commands/engine.js +10 -7
  34. package/dist/commands/gc.d.ts +5 -2
  35. package/dist/commands/gc.d.ts.map +1 -1
  36. package/dist/commands/gc.js +140 -71
  37. package/dist/commands/github-init.d.ts +56 -0
  38. package/dist/commands/github-init.d.ts.map +1 -0
  39. package/dist/commands/github-init.js +310 -0
  40. package/dist/commands/init-helpers.d.ts +1 -1
  41. package/dist/commands/init-helpers.d.ts.map +1 -1
  42. package/dist/commands/init-helpers.js +73 -25
  43. package/dist/commands/init.d.ts +2 -0
  44. package/dist/commands/init.d.ts.map +1 -1
  45. package/dist/commands/init.js +79 -24
  46. package/dist/commands/legacy-storage-migration.d.ts +54 -0
  47. package/dist/commands/legacy-storage-migration.d.ts.map +1 -0
  48. package/dist/commands/legacy-storage-migration.js +277 -0
  49. package/dist/commands/migrate.d.ts +7 -0
  50. package/dist/commands/migrate.d.ts.map +1 -1
  51. package/dist/commands/migrate.js +244 -91
  52. package/dist/commands/report.d.ts +24 -0
  53. package/dist/commands/report.d.ts.map +1 -0
  54. package/dist/commands/report.js +191 -0
  55. package/dist/commands/sync/cache.d.ts +16 -3
  56. package/dist/commands/sync/cache.d.ts.map +1 -1
  57. package/dist/commands/sync/cache.js +111 -4
  58. package/dist/commands/sync/discovery.d.ts +23 -2
  59. package/dist/commands/sync/discovery.d.ts.map +1 -1
  60. package/dist/commands/sync/discovery.js +196 -15
  61. package/dist/commands/sync/extraction.d.ts +8 -1
  62. package/dist/commands/sync/extraction.d.ts.map +1 -1
  63. package/dist/commands/sync/extraction.js +38 -4
  64. package/dist/commands/sync/manifest.d.ts +8 -5
  65. package/dist/commands/sync/manifest.d.ts.map +1 -1
  66. package/dist/commands/sync/manifest.js +142 -39
  67. package/dist/commands/sync/persistence.d.ts.map +1 -1
  68. package/dist/commands/sync/persistence.js +3 -0
  69. package/dist/commands/sync.d.ts +6 -0
  70. package/dist/commands/sync.d.ts.map +1 -1
  71. package/dist/commands/sync.js +304 -79
  72. package/dist/commands/verify.d.ts +10 -0
  73. package/dist/commands/verify.d.ts.map +1 -0
  74. package/dist/commands/verify.js +126 -0
  75. package/dist/diagnostics.d.ts +1 -1
  76. package/dist/diagnostics.d.ts.map +1 -1
  77. package/dist/engine.d.ts +96 -3
  78. package/dist/engine.d.ts.map +1 -1
  79. package/dist/engine.js +392 -23
  80. package/dist/env.d.ts.map +1 -1
  81. package/dist/env.js +5 -6
  82. package/dist/extractors/manifest.d.ts +8 -1
  83. package/dist/extractors/manifest.d.ts.map +1 -1
  84. package/dist/extractors/manifest.js +51 -9
  85. package/dist/extractors/markdown.d.ts +2 -1
  86. package/dist/extractors/markdown.d.ts.map +1 -1
  87. package/dist/extractors/markdown.js +21 -3
  88. package/dist/extractors/playwright-cases.d.ts +24 -0
  89. package/dist/extractors/playwright-cases.d.ts.map +1 -0
  90. package/dist/extractors/playwright-cases.js +126 -0
  91. package/dist/extractors/relationships.d.ts.map +1 -1
  92. package/dist/extractors/relationships.js +1 -0
  93. package/dist/extractors/symbol-coordinates.d.ts +81 -3
  94. package/dist/extractors/symbol-coordinates.d.ts.map +1 -1
  95. package/dist/extractors/symbol-coordinates.js +389 -51
  96. package/dist/extractors/symbols-coordinator.js +11 -1
  97. package/dist/intent-search.d.ts +60 -0
  98. package/dist/intent-search.d.ts.map +1 -0
  99. package/dist/intent-search.js +433 -0
  100. package/dist/operations/bootstrap/activation.d.ts.map +1 -0
  101. package/dist/operations/{autopilot → bootstrap}/activation.js +48 -31
  102. package/dist/operations/{autopilot → bootstrap}/candidate-helpers.d.ts.map +1 -1
  103. package/dist/operations/bootstrap/candidates.d.ts +4 -0
  104. package/dist/operations/{autopilot → bootstrap}/candidates.d.ts.map +1 -1
  105. package/dist/operations/{autopilot → bootstrap}/candidates.js +22 -8
  106. package/dist/operations/{autopilot → bootstrap}/discovery-evidence.d.ts +2 -2
  107. package/dist/operations/{autopilot → bootstrap}/discovery-evidence.d.ts.map +1 -1
  108. package/dist/operations/{autopilot → bootstrap}/discovery-evidence.js +46 -6
  109. package/dist/operations/{autopilot → bootstrap}/discovery.d.ts +1 -1
  110. package/dist/operations/bootstrap/discovery.d.ts.map +1 -0
  111. package/dist/operations/{autopilot → bootstrap}/discovery.js +21 -14
  112. package/dist/operations/bootstrap/generate.d.ts +8 -0
  113. package/dist/operations/bootstrap/generate.d.ts.map +1 -0
  114. package/dist/operations/bootstrap/generate.js +204 -0
  115. package/dist/operations/{autopilot → bootstrap}/guidance-actions.d.ts +2 -2
  116. package/dist/operations/{autopilot → bootstrap}/guidance-actions.d.ts.map +1 -1
  117. package/dist/operations/{autopilot → bootstrap}/guidance-actions.js +4 -4
  118. package/dist/operations/{autopilot → bootstrap}/guidance.d.ts +2 -2
  119. package/dist/operations/{autopilot → bootstrap}/guidance.d.ts.map +1 -1
  120. package/dist/operations/{autopilot → bootstrap}/guidance.js +2 -0
  121. package/dist/operations/{autopilot → bootstrap}/markdown-candidates.d.ts +2 -2
  122. package/dist/operations/{autopilot → bootstrap}/markdown-candidates.d.ts.map +1 -1
  123. package/dist/operations/{autopilot → bootstrap}/markdown-candidates.js +4 -3
  124. package/dist/operations/bootstrap/presentation.d.ts +15 -0
  125. package/dist/operations/bootstrap/presentation.d.ts.map +1 -0
  126. package/dist/operations/bootstrap/presentation.js +177 -0
  127. package/dist/operations/{autopilot → bootstrap}/requirement-claims.d.ts.map +1 -1
  128. package/dist/operations/{autopilot → bootstrap}/types.d.ts +63 -21
  129. package/dist/operations/bootstrap/types.d.ts.map +1 -0
  130. package/dist/operations/bootstrap/types.js +25 -0
  131. package/dist/operations/modeling/model-requirement.d.ts.map +1 -1
  132. package/dist/operations/modeling/model-requirement.js +4 -17
  133. package/dist/operations/modeling/predicate-applicability.d.ts +16 -0
  134. package/dist/operations/modeling/predicate-applicability.d.ts.map +1 -0
  135. package/dist/operations/modeling/predicate-applicability.js +276 -0
  136. package/dist/operations/modeling/predicate-applyplan.d.ts +13 -2
  137. package/dist/operations/modeling/predicate-applyplan.d.ts.map +1 -1
  138. package/dist/operations/modeling/predicate-applyplan.js +100 -3
  139. package/dist/operations/modeling/predicate-bindings.d.ts +6 -0
  140. package/dist/operations/modeling/predicate-bindings.d.ts.map +1 -0
  141. package/dist/operations/modeling/predicate-bindings.js +122 -0
  142. package/dist/operations/modeling/predicate-catalog-4.d.ts.map +1 -1
  143. package/dist/operations/modeling/predicate-catalog-4.js +155 -0
  144. package/dist/operations/modeling/predicate-inference-1.d.ts.map +1 -1
  145. package/dist/operations/modeling/predicate-inference-1.js +8 -0
  146. package/dist/operations/modeling/predicate-inference-launcher.d.ts +10 -0
  147. package/dist/operations/modeling/predicate-inference-launcher.d.ts.map +1 -0
  148. package/dist/operations/modeling/predicate-inference-launcher.js +13 -0
  149. package/dist/operations/modeling/predicate-inference.d.ts.map +1 -1
  150. package/dist/operations/modeling/predicate-inference.js +4 -0
  151. package/dist/operations/modeling/predicate-loader.d.ts.map +1 -1
  152. package/dist/operations/modeling/predicate-loader.js +7 -0
  153. package/dist/operations/modeling/predicate-ranker.d.ts +8 -1
  154. package/dist/operations/modeling/predicate-ranker.d.ts.map +1 -1
  155. package/dist/operations/modeling/predicate-ranker.js +156 -24
  156. package/dist/operations/modeling/predicate-score-3.d.ts.map +1 -1
  157. package/dist/operations/modeling/predicate-score-3.js +6 -0
  158. package/dist/operations/modeling/predicate-types.d.ts +34 -0
  159. package/dist/operations/modeling/predicate-types.d.ts.map +1 -1
  160. package/dist/operations/modeling/predicate-usage-hints-3.d.ts.map +1 -1
  161. package/dist/operations/modeling/predicate-usage-hints-3.js +40 -0
  162. package/dist/operations/modeling/predicate-utils.d.ts.map +1 -1
  163. package/dist/operations/modeling/predicate-utils.js +2 -0
  164. package/dist/operations/modeling/suggest-predicates.d.ts +1 -1
  165. package/dist/operations/modeling/suggest-predicates.d.ts.map +1 -1
  166. package/dist/operations/modeling/suggest-predicates.js +170 -32
  167. package/dist/operations/mutation/delete.d.ts.map +1 -1
  168. package/dist/operations/mutation/delete.js +415 -19
  169. package/dist/operations/mutation/entity-projection.d.ts +11 -0
  170. package/dist/operations/mutation/entity-projection.d.ts.map +1 -0
  171. package/dist/operations/mutation/entity-projection.js +14 -0
  172. package/dist/operations/mutation/relationships.d.ts +10 -0
  173. package/dist/operations/mutation/relationships.d.ts.map +1 -1
  174. package/dist/operations/mutation/relationships.js +71 -1
  175. package/dist/operations/mutation/serialization.d.ts.map +1 -1
  176. package/dist/operations/mutation/serialization.js +1 -0
  177. package/dist/operations/mutation/source-authoring.d.ts +61 -0
  178. package/dist/operations/mutation/source-authoring.d.ts.map +1 -0
  179. package/dist/operations/mutation/source-authoring.js +543 -0
  180. package/dist/operations/mutation/symbol-compiler-lock.d.ts +51 -0
  181. package/dist/operations/mutation/symbol-compiler-lock.d.ts.map +1 -0
  182. package/dist/operations/mutation/symbol-compiler-lock.js +274 -0
  183. package/dist/operations/mutation/symbol-granularity.d.ts.map +1 -1
  184. package/dist/operations/mutation/symbol-granularity.js +34 -3
  185. package/dist/operations/mutation/symbol-refresh.d.ts +18 -1
  186. package/dist/operations/mutation/symbol-refresh.d.ts.map +1 -1
  187. package/dist/operations/mutation/symbol-refresh.js +225 -63
  188. package/dist/operations/mutation/types.d.ts +57 -1
  189. package/dist/operations/mutation/types.d.ts.map +1 -1
  190. package/dist/operations/mutation/upsert.d.ts.map +1 -1
  191. package/dist/operations/mutation/upsert.js +363 -24
  192. package/dist/operations/mutation/validation.d.ts.map +1 -1
  193. package/dist/operations/mutation/validation.js +1 -0
  194. package/dist/operations/planning/apply-plan.d.ts +117 -0
  195. package/dist/operations/planning/apply-plan.d.ts.map +1 -0
  196. package/dist/operations/planning/apply-plan.js +1437 -0
  197. package/dist/operations/planning/compile-intent.d.ts +106 -0
  198. package/dist/operations/planning/compile-intent.d.ts.map +1 -0
  199. package/dist/operations/planning/compile-intent.js +562 -0
  200. package/dist/operations/semantic-advisor/analyze-prose.d.ts.map +1 -1
  201. package/dist/operations/semantic-advisor/analyze-prose.js +6 -2
  202. package/dist/operations/semantic-advisor/clauses.d.ts.map +1 -1
  203. package/dist/operations/semantic-advisor/clauses.js +15 -2
  204. package/dist/operations/semantic-advisor/ingestion-boundary.d.ts.map +1 -1
  205. package/dist/operations/semantic-advisor/ingestion-boundary.js +7 -3
  206. package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts +51 -0
  207. package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts.map +1 -0
  208. package/dist/operations/semantic-advisor/predicate-rules-launcher.js +96 -0
  209. package/dist/operations/semantic-advisor/types.d.ts +13 -5
  210. package/dist/operations/semantic-advisor/types.d.ts.map +1 -1
  211. package/dist/operations/verification/ingest-verification.d.ts +29 -0
  212. package/dist/operations/verification/ingest-verification.d.ts.map +1 -0
  213. package/dist/operations/verification/ingest-verification.js +192 -0
  214. package/dist/prolog/codec.d.ts.map +1 -1
  215. package/dist/prolog/codec.js +2 -1
  216. package/dist/prolog.d.ts.map +1 -1
  217. package/dist/prolog.js +27 -8
  218. package/dist/public/branch-resolver.d.ts +1 -0
  219. package/dist/public/branch-resolver.d.ts.map +1 -1
  220. package/dist/public/branch-resolver.js +1 -0
  221. package/dist/public/check-types.d.ts +2 -2
  222. package/dist/public/check-types.d.ts.map +1 -1
  223. package/dist/public/check-types.js +16 -16
  224. package/dist/public/diagnostic-usage.d.ts.map +1 -1
  225. package/dist/public/diagnostic-usage.js +69 -1
  226. package/dist/public/distribution-parity.d.ts +1 -1
  227. package/dist/public/distribution-parity.d.ts.map +1 -1
  228. package/dist/public/distribution-parity.js +1 -0
  229. package/dist/public/ignore-policy.d.ts.map +1 -1
  230. package/dist/public/ignore-policy.js +16 -4
  231. package/dist/public/impact/coverage-depth-quality.d.ts +6 -1
  232. package/dist/public/impact/coverage-depth-quality.d.ts.map +1 -1
  233. package/dist/public/impact/coverage-depth-quality.js +21 -3
  234. package/dist/public/impact/full-kb-quality.d.ts +4 -2
  235. package/dist/public/impact/full-kb-quality.d.ts.map +1 -1
  236. package/dist/public/impact/full-kb-quality.js +61 -1
  237. package/dist/public/impact/manifest.d.ts.map +1 -1
  238. package/dist/public/impact/manifest.js +2 -5
  239. package/dist/public/operational-artifacts.d.ts.map +1 -1
  240. package/dist/public/operational-artifacts.js +7 -1
  241. package/dist/public/operations/catalog.d.ts +682 -67
  242. package/dist/public/operations/catalog.d.ts.map +1 -1
  243. package/dist/public/operations/catalog.js +126 -4
  244. package/dist/public/operations/check-executor.d.ts +2 -2
  245. package/dist/public/operations/check-executor.d.ts.map +1 -1
  246. package/dist/public/operations/check-executor.js +72 -13
  247. package/dist/public/operations/check-format-shared.d.ts +3 -0
  248. package/dist/public/operations/check-format-shared.d.ts.map +1 -1
  249. package/dist/public/operations/check-format-shared.js +3 -0
  250. package/dist/public/operations/check-helpers.d.ts +27 -2
  251. package/dist/public/operations/check-helpers.d.ts.map +1 -1
  252. package/dist/public/operations/check-helpers.js +62 -26
  253. package/dist/public/operations/contracts.d.ts +11 -0
  254. package/dist/public/operations/contracts.d.ts.map +1 -0
  255. package/dist/public/operations/contracts.js +325 -0
  256. package/dist/public/operations/discovery-executors.d.ts +37 -1
  257. package/dist/public/operations/discovery-executors.d.ts.map +1 -1
  258. package/dist/public/operations/discovery-executors.js +206 -6
  259. package/dist/public/operations/index.d.ts +9 -4
  260. package/dist/public/operations/index.d.ts.map +1 -1
  261. package/dist/public/operations/index.js +8 -3
  262. package/dist/public/operations/migration-plan.d.ts +101 -0
  263. package/dist/public/operations/migration-plan.d.ts.map +1 -0
  264. package/dist/public/operations/migration-plan.js +537 -0
  265. package/dist/public/operations/node-ports.d.ts.map +1 -1
  266. package/dist/public/operations/node-ports.js +68 -8
  267. package/dist/public/operations/prolog-json.d.ts +14 -0
  268. package/dist/public/operations/prolog-json.d.ts.map +1 -1
  269. package/dist/public/operations/prolog-json.js +44 -5
  270. package/dist/public/operations/repair-plan.d.ts.map +1 -1
  271. package/dist/public/operations/repair-plan.js +1 -0
  272. package/dist/public/operations/result-envelope.d.ts +13 -0
  273. package/dist/public/operations/result-envelope.d.ts.map +1 -0
  274. package/dist/public/operations/result-envelope.js +104 -0
  275. package/dist/public/operations/runtime-types.d.ts +97 -7
  276. package/dist/public/operations/runtime-types.d.ts.map +1 -1
  277. package/dist/public/operations/source-relationship-parity.d.ts +13 -0
  278. package/dist/public/operations/source-relationship-parity.d.ts.map +1 -0
  279. package/dist/public/operations/source-relationship-parity.js +162 -0
  280. package/dist/public/operations/specs/{autopilot.d.ts → bootstrap.d.ts} +9 -9
  281. package/dist/public/operations/specs/bootstrap.d.ts.map +1 -0
  282. package/dist/public/operations/specs/{autopilot.js → bootstrap.js} +8 -7
  283. package/dist/public/operations/specs/check.d.ts +4 -4
  284. package/dist/public/operations/specs/check.d.ts.map +1 -1
  285. package/dist/public/operations/specs/check.js +4 -3
  286. package/dist/public/operations/specs/discovery.d.ts +87 -3
  287. package/dist/public/operations/specs/discovery.d.ts.map +1 -1
  288. package/dist/public/operations/specs/discovery.js +53 -3
  289. package/dist/public/operations/specs/modeling.d.ts +3 -3
  290. package/dist/public/operations/specs/modeling.js +3 -3
  291. package/dist/public/operations/specs/mutation-schemas.d.ts +190 -47
  292. package/dist/public/operations/specs/mutation-schemas.d.ts.map +1 -1
  293. package/dist/public/operations/specs/mutation-schemas.js +3 -1
  294. package/dist/public/operations/specs/mutation.d.ts +42 -2
  295. package/dist/public/operations/specs/mutation.d.ts.map +1 -1
  296. package/dist/public/operations/specs/mutation.js +26 -2
  297. package/dist/public/operations/specs/planning.d.ts +270 -0
  298. package/dist/public/operations/specs/planning.d.ts.map +1 -0
  299. package/dist/public/operations/specs/planning.js +191 -0
  300. package/dist/public/operations/specs/reporting.d.ts +4 -1
  301. package/dist/public/operations/specs/reporting.d.ts.map +1 -1
  302. package/dist/public/operations/specs/reporting.js +46 -1
  303. package/dist/public/operations/specs/upsert.d.ts +204 -47
  304. package/dist/public/operations/specs/upsert.d.ts.map +1 -1
  305. package/dist/public/operations/specs/upsert.js +9 -0
  306. package/dist/public/operations/specs/verification.d.ts +78 -0
  307. package/dist/public/operations/specs/verification.d.ts.map +1 -0
  308. package/dist/public/operations/specs/verification.js +62 -0
  309. package/dist/public/operations/symbol-repair-plan.d.ts +11 -0
  310. package/dist/public/operations/symbol-repair-plan.d.ts.map +1 -0
  311. package/dist/public/operations/symbol-repair-plan.js +123 -0
  312. package/dist/public/operations/types.d.ts +52 -1
  313. package/dist/public/operations/types.d.ts.map +1 -1
  314. package/dist/public/playwright-case-id.d.ts +8 -0
  315. package/dist/public/playwright-case-id.d.ts.map +1 -0
  316. package/dist/public/playwright-case-id.js +25 -0
  317. package/dist/public/schemas/entity.d.ts.map +1 -1
  318. package/dist/public/schemas/entity.js +4 -2
  319. package/dist/public/skills/kibi-bootstrap/SKILL.md +58 -0
  320. package/dist/public/skills/kibi-bootstrap/resources/bootstrap.md +11 -0
  321. package/dist/public/skills/kibi-bootstrap/resources/branch-lifecycle.md +7 -0
  322. package/dist/public/skills/kibi-bootstrap/resources/operation-access.md +5 -0
  323. package/dist/public/skills/kibi-bootstrap/resources/source-authoring.md +8 -0
  324. package/dist/public/skills/kibi-freshness/SKILL.md +39 -9
  325. package/dist/public/skills/kibi-freshness/resources/branch-lifecycle.md +7 -0
  326. package/dist/public/skills/kibi-freshness/resources/operation-access.md +6 -0
  327. package/dist/public/skills/kibi-freshness/resources/source-authoring.md +7 -0
  328. package/dist/public/skills/kibi-traceability/SKILL.md +47 -47
  329. package/dist/public/skills/kibi-traceability/resources/branch-lifecycle.md +7 -0
  330. package/dist/public/skills/kibi-traceability/resources/operation-access.md +5 -0
  331. package/dist/public/skills/kibi-traceability/resources/source-authoring.md +6 -0
  332. package/dist/public/skills/kibi-traceability/resources/traceability.md +8 -0
  333. package/dist/public/skills/kibi-usage/SKILL.md +115 -239
  334. package/dist/public/skills/kibi-usage/resources/branch-lifecycle.md +31 -0
  335. package/dist/public/skills/kibi-usage/resources/kb-improvement.md +38 -0
  336. package/dist/public/skills/kibi-usage/resources/operation-access.md +36 -38
  337. package/dist/public/skills/kibi-usage/resources/relationship-directions.md +3 -3
  338. package/dist/public/skills/kibi-usage/resources/source-authoring.md +31 -0
  339. package/dist/public/skills/kibi-usage/resources/workflows.md +56 -3
  340. package/dist/public/symbol-granularity.d.ts +1 -1
  341. package/dist/public/symbol-granularity.d.ts.map +1 -1
  342. package/dist/public/symbol-granularity.js +1 -0
  343. package/dist/public/telemetry-acceptance.d.ts +7 -0
  344. package/dist/public/telemetry-acceptance.d.ts.map +1 -1
  345. package/dist/public/telemetry-acceptance.js +8 -1
  346. package/dist/public/telemetry-remediation.js +1 -1
  347. package/dist/public/verification-receipt.d.ts +206 -39
  348. package/dist/public/verification-receipt.d.ts.map +1 -1
  349. package/dist/public/verification-receipt.js +171 -4
  350. package/dist/relationships/shards.d.ts +16 -0
  351. package/dist/relationships/shards.d.ts.map +1 -1
  352. package/dist/relationships/shards.js +87 -2
  353. package/dist/report/brand.d.ts +19 -0
  354. package/dist/report/brand.d.ts.map +1 -0
  355. package/dist/report/brand.js +112 -0
  356. package/dist/report/html-report.d.ts +19 -0
  357. package/dist/report/html-report.d.ts.map +1 -0
  358. package/dist/report/html-report.js +963 -0
  359. package/dist/report/relative-time.d.ts +4 -0
  360. package/dist/report/relative-time.d.ts.map +1 -0
  361. package/dist/report/relative-time.js +46 -0
  362. package/dist/report/report-view.d.ts +17 -0
  363. package/dist/report/report-view.d.ts.map +1 -0
  364. package/dist/report/report-view.js +33 -0
  365. package/dist/report/repository.d.ts +35 -0
  366. package/dist/report/repository.d.ts.map +1 -0
  367. package/dist/report/repository.js +151 -0
  368. package/dist/runtime/cli-runtime.d.ts.map +1 -1
  369. package/dist/runtime/cli-runtime.js +82 -22
  370. package/dist/schemas/entity.schema.json +1148 -273
  371. package/dist/traceability/evidence-model.d.ts +2 -2
  372. package/dist/traceability/evidence-model.d.ts.map +1 -1
  373. package/dist/traceability/evidence-model.js +2 -2
  374. package/dist/traceability/git-staged.d.ts.map +1 -1
  375. package/dist/traceability/git-staged.js +15 -40
  376. package/dist/traceability/markdown-validate.d.ts.map +1 -1
  377. package/dist/traceability/markdown-validate.js +12 -7
  378. package/dist/traceability/staged-impact-contract.d.ts +3 -3
  379. package/dist/traceability/staged-impact-contract.d.ts.map +1 -1
  380. package/dist/traceability/staged-impact-contract.js +10 -38
  381. package/dist/traceability/staged-symbols-manifest.d.ts.map +1 -1
  382. package/dist/traceability/staged-symbols-manifest.js +8 -3
  383. package/dist/traceability/temp-kb.d.ts.map +1 -1
  384. package/dist/traceability/temp-kb.js +3 -0
  385. package/dist/types/entities.d.ts +3 -0
  386. package/dist/types/entities.d.ts.map +1 -1
  387. package/dist/utils/branch-resolver.d.ts +24 -10
  388. package/dist/utils/branch-resolver.d.ts.map +1 -1
  389. package/dist/utils/branch-resolver.js +121 -38
  390. package/dist/utils/branch-store-locator.d.ts +23 -0
  391. package/dist/utils/branch-store-locator.d.ts.map +1 -0
  392. package/dist/utils/branch-store-locator.js +90 -0
  393. package/dist/utils/branch-store.d.ts +15 -0
  394. package/dist/utils/branch-store.d.ts.map +1 -0
  395. package/dist/utils/branch-store.js +130 -0
  396. package/dist/utils/config.d.ts +39 -37
  397. package/dist/utils/config.d.ts.map +1 -1
  398. package/dist/utils/config.js +107 -119
  399. package/dist/utils/kb-manifest.d.ts +35 -0
  400. package/dist/utils/kb-manifest.d.ts.map +1 -0
  401. package/dist/utils/kb-manifest.js +154 -0
  402. package/dist/utils/kb-paths.d.ts +54 -0
  403. package/dist/utils/kb-paths.d.ts.map +1 -0
  404. package/dist/utils/kb-paths.js +125 -0
  405. package/dist/utils/manifest-paths.d.ts +4 -4
  406. package/dist/utils/manifest-paths.d.ts.map +1 -1
  407. package/dist/utils/manifest-paths.js +8 -56
  408. package/dist/utils/rule-registry.d.ts +48 -20
  409. package/dist/utils/rule-registry.d.ts.map +1 -1
  410. package/dist/utils/rule-registry.js +82 -77
  411. package/dist/utils/schema-version.d.ts +5 -5
  412. package/dist/utils/schema-version.d.ts.map +1 -1
  413. package/dist/utils/schema-version.js +26 -6
  414. package/dist/utils/strict-modeling.d.ts +0 -4
  415. package/dist/utils/strict-modeling.d.ts.map +1 -1
  416. package/dist/utils/strict-modeling.js +7 -8
  417. package/dist/verification/playwright-reporter.d.ts +21 -0
  418. package/dist/verification/playwright-reporter.d.ts.map +1 -0
  419. package/dist/verification/playwright-reporter.js +114 -0
  420. package/package.json +46 -7
  421. package/schema/config.json +2 -2
  422. package/schema/manifest.json +26 -0
  423. package/src/public/branch-resolver.ts +1 -0
  424. package/src/public/check-types.ts +22 -19
  425. package/src/public/diagnostic-usage.ts +79 -1
  426. package/src/public/distribution-parity.ts +1 -0
  427. package/src/public/ignore-policy.ts +16 -10
  428. package/src/public/impact/coverage-depth-quality.ts +36 -0
  429. package/src/public/impact/full-kb-quality.ts +118 -5
  430. package/src/public/impact/manifest.ts +2 -4
  431. package/src/public/operational-artifacts.ts +9 -1
  432. package/src/public/operations/catalog.ts +146 -9
  433. package/src/public/operations/check-executor.ts +102 -15
  434. package/src/public/operations/check-format-shared.ts +6 -0
  435. package/src/public/operations/check-helpers.ts +74 -35
  436. package/src/public/operations/contracts.ts +366 -0
  437. package/src/public/operations/discovery-executors.ts +299 -12
  438. package/src/public/operations/index.ts +9 -4
  439. package/src/public/operations/migration-plan.ts +740 -0
  440. package/src/public/operations/node-ports.ts +84 -10
  441. package/src/public/operations/prolog-json.ts +60 -5
  442. package/src/public/operations/repair-plan.ts +1 -0
  443. package/src/public/operations/result-envelope.ts +136 -0
  444. package/src/public/operations/runtime-types.ts +91 -5
  445. package/src/public/operations/source-relationship-parity.ts +226 -0
  446. package/src/public/operations/specs/{autopilot.ts → bootstrap.ts} +17 -16
  447. package/src/public/operations/specs/check.ts +4 -3
  448. package/src/public/operations/specs/discovery.ts +57 -3
  449. package/src/public/operations/specs/modeling.ts +3 -3
  450. package/src/public/operations/specs/mutation-schemas.ts +6 -1
  451. package/src/public/operations/specs/mutation.ts +27 -2
  452. package/src/public/operations/specs/planning.ts +234 -0
  453. package/src/public/operations/specs/reporting.ts +55 -1
  454. package/src/public/operations/specs/upsert.ts +10 -0
  455. package/src/public/operations/specs/verification.ts +78 -0
  456. package/src/public/operations/symbol-repair-plan.ts +164 -0
  457. package/src/public/operations/types.ts +62 -1
  458. package/src/public/playwright-case-id.ts +35 -0
  459. package/src/public/schemas/entity.ts +7 -2
  460. package/src/public/skills/kibi-bootstrap/SKILL.md +58 -0
  461. package/src/public/skills/kibi-bootstrap/resources/bootstrap.md +11 -0
  462. package/src/public/skills/kibi-bootstrap/resources/branch-lifecycle.md +7 -0
  463. package/src/public/skills/kibi-bootstrap/resources/operation-access.md +5 -0
  464. package/src/public/skills/kibi-bootstrap/resources/source-authoring.md +8 -0
  465. package/src/public/skills/kibi-freshness/SKILL.md +39 -9
  466. package/src/public/skills/kibi-freshness/resources/branch-lifecycle.md +7 -0
  467. package/src/public/skills/kibi-freshness/resources/operation-access.md +6 -0
  468. package/src/public/skills/kibi-freshness/resources/source-authoring.md +7 -0
  469. package/src/public/skills/kibi-traceability/SKILL.md +47 -47
  470. package/src/public/skills/kibi-traceability/resources/branch-lifecycle.md +7 -0
  471. package/src/public/skills/kibi-traceability/resources/operation-access.md +5 -0
  472. package/src/public/skills/kibi-traceability/resources/source-authoring.md +6 -0
  473. package/src/public/skills/kibi-traceability/resources/traceability.md +8 -0
  474. package/src/public/skills/kibi-usage/SKILL.md +115 -239
  475. package/src/public/skills/kibi-usage/resources/branch-lifecycle.md +31 -0
  476. package/src/public/skills/kibi-usage/resources/kb-improvement.md +38 -0
  477. package/src/public/skills/kibi-usage/resources/operation-access.md +36 -38
  478. package/src/public/skills/kibi-usage/resources/relationship-directions.md +3 -3
  479. package/src/public/skills/kibi-usage/resources/source-authoring.md +31 -0
  480. package/src/public/skills/kibi-usage/resources/workflows.md +56 -3
  481. package/src/public/symbol-granularity.ts +1 -0
  482. package/src/public/telemetry-acceptance.ts +16 -1
  483. package/src/public/telemetry-remediation.ts +1 -1
  484. package/src/public/verification-receipt.ts +248 -6
  485. package/src/schemas/entity.schema.json +1148 -273
  486. package/templates/github/kibi-badge.yml +86 -0
  487. package/templates/github/kibi-report.yml +84 -0
  488. package/dist/operations/autopilot/activation.d.ts.map +0 -1
  489. package/dist/operations/autopilot/candidates.d.ts +0 -4
  490. package/dist/operations/autopilot/discovery.d.ts.map +0 -1
  491. package/dist/operations/autopilot/generate.d.ts +0 -8
  492. package/dist/operations/autopilot/generate.d.ts.map +0 -1
  493. package/dist/operations/autopilot/generate.js +0 -112
  494. package/dist/operations/autopilot/presentation.d.ts +0 -13
  495. package/dist/operations/autopilot/presentation.d.ts.map +0 -1
  496. package/dist/operations/autopilot/presentation.js +0 -91
  497. package/dist/operations/autopilot/types.d.ts.map +0 -1
  498. package/dist/operations/autopilot/types.js +0 -8
  499. package/dist/public/operations/specs/autopilot.d.ts.map +0 -1
  500. package/dist/public/skills/init-kibi/SKILL.md +0 -62
  501. package/src/public/skills/init-kibi/SKILL.md +0 -62
  502. /package/dist/operations/{autopilot → bootstrap}/activation.d.ts +0 -0
  503. /package/dist/operations/{autopilot → bootstrap}/candidate-helpers.d.ts +0 -0
  504. /package/dist/operations/{autopilot → bootstrap}/candidate-helpers.js +0 -0
  505. /package/dist/operations/{autopilot → bootstrap}/requirement-claims.d.ts +0 -0
  506. /package/dist/operations/{autopilot → bootstrap}/requirement-claims.js +0 -0
@@ -16,20 +16,23 @@
16
16
  along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
  */
18
18
  import { execSync } from "node:child_process";
19
- import { existsSync, readdirSync } from "node:fs";
19
+ import { createHash } from "node:crypto";
20
+ import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, writeFileSync, } from "node:fs";
20
21
  import * as path from "node:path";
21
22
  import { branchErrorToDiagnostic, createDocsNotIndexedDiagnostic, createInvalidAuthoringDiagnostic, createKbMissingDiagnostic, formatSyncSummary, } from "../diagnostics.js";
22
- import { EngineClient, engineSocketPath, ensureJournaledBranchStoreAsync, fsyncJournaledBranchStore, } from "../engine.js";
23
+ import { EngineClient, acquireEnginePublicationLease, engineSocketPath, ensureJournaledBranchStoreAsync, fsyncJournaledBranchStore, } from "../engine.js";
23
24
  import { isCliDebugEnabled } from "../env.js";
24
25
  import { extractRelationshipShard, validateRelationships, } from "../extractors/relationships.js";
26
+ import { acquireSymbolCompilerLock, releaseSymbolCompilerLock, } from "../operations/mutation/symbol-compiler-lock.js";
25
27
  import { analyzeSemanticAdvisorInput } from "../operations/semantic-advisor/analyze-prose.js";
26
28
  import { validateSemanticInventoryBoundary } from "../operations/semantic-advisor/ingestion-boundary.js";
27
29
  import { PrologProcess } from "../prolog.js";
28
- import { resolveActiveBranch, } from "../utils/branch-resolver.js";
29
- import { loadSyncConfig } from "../utils/config.js";
30
- import { SYNC_CACHE_TTL_MS, SYNC_CACHE_VERSION, hashFile, hashNormalized, readSyncCache, toCacheKey, writeSyncCache, } from "./sync/cache.js";
31
- import { discoverSourceFiles, } from "./sync/discovery.js";
32
- import { processExtractions } from "./sync/extraction.js";
30
+ import { resolveBranchAttachment } from "../utils/branch-resolver.js";
31
+ import { branchStoreManifestPath, branchStorePath, ensureBranchStoreManifest, expectedBranchStoreManifest, } from "../utils/branch-store-locator.js";
32
+ import { loadEntityPaths } from "../utils/config.js";
33
+ import { SYNC_CACHE_TTL_MS, SYNC_CACHE_VERSION, hashFile, hashManifestWithCoordinates, hashNormalized, readSyncCache, toCacheKey, writeSyncCache, } from "./sync/cache.js";
34
+ import { clearRecoveredPendingSourceReceipts, discoverSourceFiles, } from "./sync/discovery.js";
35
+ import { normalizeExtractionSources, processExtractions, } from "./sync/extraction.js";
33
36
  import { refreshManifestCoordinates } from "./sync/manifest.js";
34
37
  import { persistEntities, persistRelationships, retractEntitiesById, retractEntitiesForSources, retractEntityRelationshipsById, retractRelationships, } from "./sync/persistence.js";
35
38
  import { atomicPublish, atomicPublishGeneration, cleanupStaging, createUniqueStagingPath, prepareStagingEnvironment, } from "./sync/staging.js";
@@ -49,6 +52,111 @@ function relationshipFromKey(key) {
49
52
  }
50
53
  return { type, from, to };
51
54
  }
55
+ function assertNoUnresolvedGitConflicts(workspaceRoot) {
56
+ let conflicted = "";
57
+ try {
58
+ conflicted = execSync("git diff --name-only --diff-filter=U --", {
59
+ cwd: workspaceRoot,
60
+ encoding: "utf8",
61
+ timeout: 5000,
62
+ stdio: ["pipe", "pipe", "pipe"],
63
+ }).trim();
64
+ }
65
+ catch {
66
+ // A non-Git workspace is handled by branch resolution below. Do not turn
67
+ // a missing Git binary into a misleading conflict diagnostic.
68
+ return;
69
+ }
70
+ if (conflicted) {
71
+ throw new SyncError(`Unresolved Git conflicts block Kibi compilation; resolve these authored files first: ${conflicted.split("\n").join(", ")}`);
72
+ }
73
+ }
74
+ function trackedRelationshipFiles(workspaceRoot, relationshipsDir, recoverMissingPendingSources = false, recoveredPendingReceiptPaths = []) {
75
+ let tracked;
76
+ try {
77
+ tracked = new Set(execSync("git ls-files --cached -- .kb/relationships", {
78
+ cwd: workspaceRoot,
79
+ encoding: "utf8",
80
+ timeout: 5000,
81
+ stdio: ["pipe", "pipe", "pipe"],
82
+ })
83
+ .split("\n")
84
+ .filter(Boolean)
85
+ .map((file) => file.replaceAll("\\", "/")));
86
+ }
87
+ catch {
88
+ // A non-Git workspace has no tracked relationship inputs. The caller's
89
+ // branch resolver will produce the user-facing attachment diagnostic.
90
+ return [];
91
+ }
92
+ const pending = new Set();
93
+ const pendingRoot = path.join(workspaceRoot, ".kb", "recovery", "pending-sources");
94
+ if (existsSync(pendingRoot)) {
95
+ for (const receiptName of readdirSync(pendingRoot)) {
96
+ if (!receiptName.endsWith(".json"))
97
+ continue;
98
+ let receipt;
99
+ try {
100
+ receipt = JSON.parse(readFileSync(path.join(pendingRoot, receiptName), "utf8"));
101
+ }
102
+ catch {
103
+ // Malformed receipts are left for explicit recovery diagnostics. They
104
+ // must never make an unrelated relationship shard disappear silently.
105
+ continue;
106
+ }
107
+ if (typeof receipt.path !== "string" ||
108
+ typeof receipt.afterHash !== "string") {
109
+ continue;
110
+ }
111
+ const relative = receipt.path.replaceAll("\\", "/");
112
+ if (!relative.startsWith(".kb/relationships/"))
113
+ continue;
114
+ const absolute = path.resolve(workspaceRoot, relative);
115
+ if (!absolute.startsWith(`${path.resolve(workspaceRoot)}${path.sep}`)) {
116
+ throw new SyncError(`Pending source path escapes workspace: ${relative}`);
117
+ }
118
+ if (!existsSync(absolute)) {
119
+ if (recoverMissingPendingSources) {
120
+ const receiptPath = path.join(pendingRoot, receiptName);
121
+ if (!recoveredPendingReceiptPaths.some((candidate) => candidate.receiptPath === receiptPath)) {
122
+ recoveredPendingReceiptPaths.push({
123
+ receiptPath,
124
+ path: relative,
125
+ afterHash: receipt.afterHash,
126
+ rawHash: createHash("sha256")
127
+ .update(readFileSync(receiptPath))
128
+ .digest("hex"),
129
+ });
130
+ }
131
+ continue;
132
+ }
133
+ throw new SyncError(`Pending source is missing: ${relative}`);
134
+ }
135
+ const actual = createHash("sha256")
136
+ .update(readFileSync(absolute))
137
+ .digest("hex");
138
+ if (actual !== receipt.afterHash) {
139
+ throw new SyncError(`Pending source hash drift blocks sync for ${relative}`);
140
+ }
141
+ pending.add(relative);
142
+ }
143
+ }
144
+ try {
145
+ return readdirSync(relationshipsDir)
146
+ .filter((file) => file.endsWith(".yaml") || file.endsWith(".yml"))
147
+ .map((file) => path.join(relationshipsDir, file))
148
+ .filter((file) => {
149
+ const relative = path
150
+ .relative(workspaceRoot, file)
151
+ .replaceAll(path.sep, "/");
152
+ return tracked.has(relative) || pending.has(relative);
153
+ })
154
+ .sort();
155
+ }
156
+ catch {
157
+ return [];
158
+ }
159
+ }
52
160
  function normalizedEntityHash(result) {
53
161
  const entity = { ...result.entity };
54
162
  // Manifest defaults are generated at extraction time. They must not turn a
@@ -63,6 +171,16 @@ function normalizedEntityHash(result) {
63
171
  .sort((left, right) => left.localeCompare(right)),
64
172
  });
65
173
  }
174
+ // implements REQ-kibi-proposition-complete-ingestion
175
+ function semanticBoundaryRelationships(result, shardRelationships) {
176
+ const relationships = new Map();
177
+ for (const relationship of [...result.relationships, ...shardRelationships]) {
178
+ if (relationship.from !== result.entity.id)
179
+ continue;
180
+ relationships.set(relationshipKey(relationship), relationship);
181
+ }
182
+ return [...relationships.values()];
183
+ }
66
184
  async function checkpointNoopSync(workspaceRoot, branch) {
67
185
  const engine = new EngineClient({
68
186
  workspaceRoot,
@@ -83,8 +201,8 @@ async function checkpointNoopSync(workspaceRoot, branch) {
83
201
  function compilerCacheHasEntityDelta(cache) {
84
202
  return (cache.entityHashes !== undefined && cache.sourceEntityIds !== undefined);
85
203
  }
86
- function compilerCacheIsFresh(cache, sourceFiles, nowMs) {
87
- const sourceKeys = sourceFiles.map(toCacheKey);
204
+ function compilerCacheIsFresh(cache, workspaceRoot, sourceFiles, nowMs) {
205
+ const sourceKeys = sourceFiles.map((file) => toCacheKey(workspaceRoot, file));
88
206
  if (Object.keys(cache.hashes).some((key) => !sourceKeys.includes(key))) {
89
207
  return false;
90
208
  }
@@ -97,17 +215,18 @@ function compilerCacheIsFresh(cache, sourceFiles, nowMs) {
97
215
  nowMs - lastSeenMs <= SYNC_CACHE_TTL_MS);
98
216
  });
99
217
  }
100
- function compilerCacheFilesMatch(cache, sourceFiles, relationshipFiles) {
218
+ function compilerCacheFilesMatch(cache, workspaceRoot, sourceFiles, relationshipFiles, sourceHashOf) {
101
219
  for (const file of sourceFiles) {
102
- if (cache.hashes[toCacheKey(file)] !== hashFile(file))
220
+ if (cache.hashes[toCacheKey(workspaceRoot, file)] !== sourceHashOf(file))
103
221
  return false;
104
222
  }
105
- const relationshipKeys = new Set(relationshipFiles.map(toCacheKey));
223
+ const relationshipKeys = new Set(relationshipFiles.map((file) => toCacheKey(workspaceRoot, file)));
106
224
  if (Object.keys(cache.relationshipHashes ?? {}).some((key) => !relationshipKeys.has(key))) {
107
225
  return false;
108
226
  }
109
227
  for (const file of relationshipFiles) {
110
- if (cache.relationshipHashes?.[toCacheKey(file)] !== hashFile(file)) {
228
+ if (cache.relationshipHashes?.[toCacheKey(workspaceRoot, file)] !==
229
+ hashFile(workspaceRoot, file)) {
111
230
  return false;
112
231
  }
113
232
  }
@@ -117,16 +236,21 @@ function compilerCacheFilesMatch(cache, sourceFiles, relationshipFiles) {
117
236
  export async function syncCommand(options = {}, runtime = {}) {
118
237
  const validateOnly = options.validateOnly ?? false;
119
238
  const rebuild = options.rebuild ?? false;
239
+ const recoveryBackupPath = options.recoveryBackupPath;
240
+ const workspaceRoot = path.resolve(options.workspaceRoot ?? process.cwd());
120
241
  const startTime = Date.now();
121
242
  const diagnostics = [];
122
243
  const entityCounts = {};
123
244
  let published = false;
124
245
  let currentBranch;
125
246
  let stagingPath;
247
+ let publicationLease;
248
+ let compilerLock;
249
+ let operationFailure;
126
250
  const getCurrentCommit = () => {
127
251
  try {
128
252
  return execSync("git rev-parse HEAD", {
129
- cwd: process.cwd(),
253
+ cwd: workspaceRoot,
130
254
  encoding: "utf8",
131
255
  timeout: 5000,
132
256
  stdio: ["pipe", "pipe", "pipe"],
@@ -138,30 +262,60 @@ export async function syncCommand(options = {}, runtime = {}) {
138
262
  };
139
263
  const withOptionalCommit = (value, commit) => commit !== undefined ? { ...value, commit } : value;
140
264
  try {
265
+ if (!validateOnly) {
266
+ compilerLock = await (runtime.acquireSymbolCompilerLock ?? acquireSymbolCompilerLock)(workspaceRoot);
267
+ }
268
+ assertNoUnresolvedGitConflicts(workspaceRoot);
141
269
  // Branch resolution
142
- const branchResult = resolveActiveBranch(process.cwd());
270
+ const branchResult = resolveBranchAttachment(workspaceRoot);
143
271
  if ("error" in branchResult) {
144
272
  const diagnostic = branchErrorToDiagnostic(branchResult.code, branchResult.error);
145
273
  diagnostics.push(diagnostic);
146
274
  console.error(`Failed to resolve active branch: ${branchResult.error}`);
147
275
  throw new SyncError(`Failed to resolve active branch: ${branchResult.error}`);
148
276
  }
149
- currentBranch = branchResult.branch;
277
+ if (branchResult.migrationRequired && !validateOnly) {
278
+ throw new SyncError(`Sync blocked: KB is attached through legacy branch storage for '${branchResult.gitBranch}'. Run 'kibi branch migrate --from ${branchResult.kbBranch} --to ${branchResult.gitBranch} --apply' first.`);
279
+ }
280
+ currentBranch = branchResult.kbBranch;
150
281
  // Cut over legacy branches before creating a staging copy. If another
151
282
  // CLI/MCP operation has an engine attached, stop that single writer so the
152
283
  // atomic publish below cannot race its RDF lock.
153
- const livePathForEngine = path.join(process.cwd(), `.kb/branches/${currentBranch}`);
154
- if (!validateOnly) {
284
+ const livePathForEngine = branchStorePath(workspaceRoot, currentBranch);
285
+ if (!validateOnly && recoveryBackupPath === undefined) {
286
+ ensureBranchStoreManifest(workspaceRoot, currentBranch);
155
287
  await ensureJournaledBranchStoreAsync(livePathForEngine);
288
+ }
289
+ const needsExclusiveGenerationPublish = !validateOnly && (rebuild || recoveryBackupPath !== undefined);
290
+ if (needsExclusiveGenerationPublish) {
291
+ // Recovery intentionally avoids attaching the broken live store. The
292
+ // clean rebuild is compiled into staging and published only after it
293
+ // can be reopened successfully.
156
294
  const existingEngine = new EngineClient({
157
- workspaceRoot: process.cwd(),
295
+ workspaceRoot,
158
296
  branch: currentBranch,
159
297
  timeout: 2_000,
298
+ allowPublicationLock: true,
160
299
  });
161
- const needsExclusiveGenerationPublish = rebuild || runtime.createProlog !== undefined;
162
- if (needsExclusiveGenerationPublish &&
163
- existsSync(engineSocketPath(process.cwd(), currentBranch))) {
164
- await existingEngine.stop(false).catch(() => undefined);
300
+ const engineSocketExists = existsSync(engineSocketPath(workspaceRoot, currentBranch));
301
+ try {
302
+ publicationLease = acquireEnginePublicationLease(workspaceRoot, currentBranch);
303
+ // This client is explicitly allowed to attach under its own lease so
304
+ // a daemon that appeared between the socket probe and lease creation
305
+ // is still stopped before publication.
306
+ if (engineSocketExists ||
307
+ existsSync(engineSocketPath(workspaceRoot, currentBranch))) {
308
+ await existingEngine.start(false);
309
+ }
310
+ if (existingEngine.isRunning()) {
311
+ await existingEngine.stop(false);
312
+ }
313
+ else if (engineSocketExists ||
314
+ existsSync(engineSocketPath(workspaceRoot, currentBranch))) {
315
+ throw new SyncError(`Kibi engine socket remains present but is not reachable: ${engineSocketPath(workspaceRoot, currentBranch)}`);
316
+ }
317
+ }
318
+ finally {
165
319
  await existingEngine.terminate();
166
320
  }
167
321
  }
@@ -169,9 +323,11 @@ export async function syncCommand(options = {}, runtime = {}) {
169
323
  // eslint-disable-next-line no-console
170
324
  console.log("[kibi-debug] currentBranch:", currentBranch);
171
325
  }
172
- const config = loadSyncConfig(process.cwd());
173
- const paths = config.paths;
174
- const { markdownFiles, manifestFiles, relationshipsDir } = await discoverSourceFiles(process.cwd(), paths);
326
+ const paths = loadEntityPaths(workspaceRoot);
327
+ const { markdownFiles, manifestFiles, relationshipsDir, recoveredPendingReceiptPaths, } = await discoverSourceFiles(workspaceRoot, {
328
+ trackedOnly: true,
329
+ recoverMissingPendingSources: recoveryBackupPath !== undefined,
330
+ });
175
331
  if (isCliDebugEnabled()) {
176
332
  // eslint-disable-next-line no-console
177
333
  console.log("[kibi-debug] markdownFiles:", markdownFiles.length);
@@ -179,28 +335,30 @@ export async function syncCommand(options = {}, runtime = {}) {
179
335
  console.log("[kibi-debug] manifestFiles:", manifestFiles.length);
180
336
  }
181
337
  const sourceFiles = [...markdownFiles, ...manifestFiles].sort();
182
- const cachePath = path.join(process.cwd(), `.kb/branches/${currentBranch}/sync-cache.json`);
338
+ const cachePath = path.join(livePathForEngine, "sync-cache.json");
183
339
  const syncCache = readSyncCache(cachePath);
184
340
  const nowIso = new Date().toISOString();
185
341
  const nowMs = Date.now();
186
- const currentSourceKeys = new Set(sourceFiles.map(toCacheKey));
342
+ const currentSourceKeys = new Set(sourceFiles.map((file) => toCacheKey(workspaceRoot, file)));
187
343
  const relationshipShardFiles = existsSync(relationshipsDir)
188
- ? readdirSync(relationshipsDir)
189
- .filter((file) => file.endsWith(".yaml") || file.endsWith(".yml"))
190
- .map((file) => path.join(relationshipsDir, file))
191
- .sort()
344
+ ? trackedRelationshipFiles(workspaceRoot, relationshipsDir, recoveryBackupPath !== undefined, recoveredPendingReceiptPaths)
192
345
  : [];
193
346
  // No-op is a first-class compiler result. Hashing the configured inputs is
194
347
  // sufficient when normalized entity/shard inventories are already fresh;
195
348
  // avoid rebuilding maps and rediscovering RDF state for the common path.
349
+ // Symbol manifests hash together with their generated coordinate artifact
350
+ // so artifact-only changes never masquerade as no-ops.
351
+ const fastPathSourceHashOf = (file) => manifestFiles.includes(file)
352
+ ? hashManifestWithCoordinates(workspaceRoot, file, path.join(path.dirname(file), "symbol-coordinates.yaml"))
353
+ : hashFile(workspaceRoot, file);
196
354
  if (!validateOnly &&
197
355
  !rebuild &&
198
356
  !options.refreshSymbolCoordinates &&
199
357
  runtime.createProlog === undefined &&
200
358
  compilerCacheHasEntityDelta(syncCache) &&
201
- compilerCacheIsFresh(syncCache, sourceFiles, nowMs) &&
202
- compilerCacheFilesMatch(syncCache, sourceFiles, relationshipShardFiles)) {
203
- await checkpointNoopSync(process.cwd(), currentBranch);
359
+ compilerCacheIsFresh(syncCache, workspaceRoot, sourceFiles, nowMs) &&
360
+ compilerCacheFilesMatch(syncCache, workspaceRoot, sourceFiles, relationshipShardFiles, fastPathSourceHashOf)) {
361
+ await checkpointNoopSync(workspaceRoot, currentBranch);
204
362
  console.log("✓ Imported 0 entities, 0 relationships (no changes)");
205
363
  return withOptionalCommit({
206
364
  branch: currentBranch,
@@ -214,10 +372,30 @@ export async function syncCommand(options = {}, runtime = {}) {
214
372
  exitCode: 0,
215
373
  }, getCurrentCommit());
216
374
  }
375
+ // Explicit coordinate refresh must precede fingerprinting so the manifest
376
+ // overlay that is persisted into RDF observes the newly generated
377
+ // coordinates. Refresh failures are fatal: cache state may never advance
378
+ // on a partially published compiler dependency.
379
+ const refreshedManifestKeys = new Set();
380
+ if (!validateOnly && options.refreshSymbolCoordinates) {
381
+ for (const file of manifestFiles) {
382
+ await refreshManifestCoordinates(file, workspaceRoot, {
383
+ refreshSymbolCoordinates: options.refreshSymbolCoordinates,
384
+ });
385
+ refreshedManifestKeys.add(toCacheKey(workspaceRoot, file));
386
+ }
387
+ }
388
+ // The generated coordinate artifact is a compiler dependency of every
389
+ // symbol manifest: its existence, emptiness, content, and deletion must
390
+ // all change the effective source hash even when authored YAML is stable.
391
+ const coordinatesPathForManifest = (manifestFile) => path.join(path.dirname(manifestFile), "symbol-coordinates.yaml");
392
+ const effectiveSourceHash = (file) => manifestFiles.includes(file)
393
+ ? hashManifestWithCoordinates(workspaceRoot, file, coordinatesPathForManifest(file))
394
+ : hashFile(workspaceRoot, file);
217
395
  const changedSourceHashes = new Map();
218
396
  for (const file of sourceFiles) {
219
- const key = toCacheKey(file);
220
- const hash = hashFile(file);
397
+ const key = toCacheKey(workspaceRoot, file);
398
+ const hash = effectiveSourceHash(file);
221
399
  if (syncCache.hashes[key] !== hash)
222
400
  changedSourceHashes.set(key, hash);
223
401
  }
@@ -243,14 +421,14 @@ export async function syncCommand(options = {}, runtime = {}) {
243
421
  // sync rather than deleting their last known-good entities.
244
422
  const deletedSourceFiles = Object.keys(syncCache.hashes)
245
423
  .filter((key) => !currentSourceKeys.has(key))
246
- .map((key) => path.resolve(process.cwd(), key));
424
+ .map((key) => path.resolve(workspaceRoot, key));
247
425
  const currentRelationshipKeys = new Set();
248
426
  for (const shardPath of relationshipShardFiles) {
249
- const key = toCacheKey(shardPath);
427
+ const key = toCacheKey(workspaceRoot, shardPath);
250
428
  currentRelationshipKeys.add(key);
251
429
  let hash;
252
430
  try {
253
- hash = hashFile(shardPath);
431
+ hash = hashFile(workspaceRoot, shardPath);
254
432
  nextRelationshipHashes[key] = hash;
255
433
  }
256
434
  catch (error) {
@@ -293,7 +471,7 @@ export async function syncCommand(options = {}, runtime = {}) {
293
471
  removedShardRelationships.length > 0;
294
472
  for (const file of sourceFiles) {
295
473
  try {
296
- const key = toCacheKey(file);
474
+ const key = toCacheKey(workspaceRoot, file);
297
475
  const hash = changedSourceHashes.get(key) ?? syncCache.hashes[key];
298
476
  if (hash === undefined)
299
477
  continue;
@@ -334,31 +512,24 @@ export async function syncCommand(options = {}, runtime = {}) {
334
512
  changedManifestFiles.push(file);
335
513
  }
336
514
  }
337
- // Coordinate refresh must precede extraction so the manifest overlay that
338
- // is persisted into RDF observes the newly generated coordinates. Force
339
- // each refreshed manifest through extraction even when its authored YAML
340
- // hash is unchanged; the generated coordinate artifact is an input too.
341
- if (!validateOnly && options.refreshSymbolCoordinates) {
342
- for (const file of manifestFiles) {
343
- try {
344
- await refreshManifestCoordinates(file, process.cwd(), {
345
- refreshSymbolCoordinates: options.refreshSymbolCoordinates,
346
- });
347
- if (!changedManifestFiles.includes(file)) {
348
- changedManifestFiles.push(file);
349
- }
350
- }
351
- catch (error) {
352
- const message = error instanceof Error ? error.message : String(error);
353
- console.warn(`Warning: Failed to refresh symbol coordinates in ${file}: ${message}`);
354
- }
515
+ // Explicitly requested refreshes force coordinate-bearing symbols through
516
+ // extraction and RDF persistence even when normalized entity hashes match
517
+ // the cached state, repairing warm-cache RDF divergence.
518
+ for (const file of manifestFiles) {
519
+ if (!refreshedManifestKeys.has(toCacheKey(workspaceRoot, file)) ||
520
+ changedManifestFiles.includes(file)) {
521
+ continue;
355
522
  }
523
+ changedManifestFiles.push(file);
524
+ }
525
+ for (const key of refreshedManifestKeys) {
526
+ forceEntitySourceKeys.add(key);
356
527
  }
357
528
  const performedFullReindex = changedMarkdownFiles.length === markdownFiles.length &&
358
529
  changedManifestFiles.length === manifestFiles.length;
359
- const extraction = await processExtractions(changedMarkdownFiles, changedManifestFiles, validateOnly);
530
+ const extraction = await processExtractions(changedMarkdownFiles, changedManifestFiles, validateOnly, workspaceRoot);
360
531
  const { failedCacheKeys, errors } = extraction;
361
- const extractedResults = extraction.results;
532
+ const extractedResults = normalizeExtractionSources(extraction.results, workspaceRoot);
362
533
  const nextEntityHashes = {
363
534
  ...(syncCache.entityHashes ?? {}),
364
535
  };
@@ -373,12 +544,20 @@ export async function syncCommand(options = {}, runtime = {}) {
373
544
  !validateOnly &&
374
545
  !rebuild &&
375
546
  runtime.createProlog === undefined;
376
- const materializeAllRelationships = !useEntityDelta || changedMarkdownFiles.length > 0;
547
+ // Re-materialize every authored shard edge whenever a source entity is
548
+ // refreshed. Entity-delta sync retracts outgoing relationships for changed
549
+ // entities before persisting their extracted relationships. Manifest
550
+ // entities commonly carry no inline links, so a manifest-only edit (for
551
+ // example, a generated coordinate refresh) would otherwise drop valid
552
+ // shard-only edges and leave the cache claiming they were already synced.
553
+ const materializeAllRelationships = !useEntityDelta ||
554
+ changedMarkdownFiles.length > 0 ||
555
+ changedManifestFiles.length > 0;
377
556
  const allRelationships = materializeAllRelationships
378
557
  ? Object.values(nextShardRelationships).flat().map(relationshipFromKey)
379
558
  : [...addedShardRelationships, ...removedShardRelationships];
380
559
  for (const deletedSource of deletedSourceFiles) {
381
- const sourceKey = toCacheKey(deletedSource);
560
+ const sourceKey = toCacheKey(workspaceRoot, deletedSource);
382
561
  for (const id of nextSourceEntityIds[sourceKey] ?? []) {
383
562
  removedEntityIds.add(id);
384
563
  delete nextEntityHashes[id];
@@ -387,7 +566,7 @@ export async function syncCommand(options = {}, runtime = {}) {
387
566
  }
388
567
  const resultsBySource = new Map();
389
568
  for (const result of extractedResults) {
390
- const sourceKey = toCacheKey(result.entity.source);
569
+ const sourceKey = toCacheKey(workspaceRoot, result.entity.source);
391
570
  const sourceResults = resultsBySource.get(sourceKey) ?? [];
392
571
  sourceResults.push(result);
393
572
  resultsBySource.set(sourceKey, sourceResults);
@@ -396,7 +575,7 @@ export async function syncCommand(options = {}, runtime = {}) {
396
575
  ...changedMarkdownFiles,
397
576
  ...changedManifestFiles,
398
577
  ]) {
399
- const sourceKey = toCacheKey(changedSource);
578
+ const sourceKey = toCacheKey(workspaceRoot, changedSource);
400
579
  if (failedCacheKeys.has(sourceKey))
401
580
  continue;
402
581
  const sourceResults = resultsBySource.get(sourceKey) ?? [];
@@ -425,15 +604,16 @@ export async function syncCommand(options = {}, runtime = {}) {
425
604
  for (const result of extractedResults) {
426
605
  if (result.entity.type !== "req")
427
606
  continue;
428
- const key = toCacheKey(result.entity.source);
607
+ const key = toCacheKey(workspaceRoot, result.entity.source);
608
+ const relationships = semanticBoundaryRelationships(result, allRelationships);
429
609
  const payload = {
430
610
  type: result.entity.type,
431
611
  id: result.entity.id,
432
612
  properties: result.entity,
433
- relationships: result.relationships,
613
+ relationships,
434
614
  };
435
615
  const semantic = analyzeSemanticAdvisorInput({ payload });
436
- const boundary = validateSemanticInventoryBoundary(payload, result.relationships, semantic.receipt);
616
+ const boundary = validateSemanticInventoryBoundary(payload, relationships, semantic.receipt);
437
617
  const previousSemanticHash = syncCache.semanticHashes[key];
438
618
  const advertisedContract = result.entity.semantic_inventory_version !== undefined ||
439
619
  result.entity.semantic_source_hash !== undefined ||
@@ -504,6 +684,12 @@ export async function syncCommand(options = {}, runtime = {}) {
504
684
  evictedSemanticContracts[key] = nextSemanticContracts[key] === true;
505
685
  }
506
686
  }
687
+ // The durable KB checkpoint must precede the cache write: if the
688
+ // checkpoint fails, cached fingerprints must stay stale so the next
689
+ // sync recompiles instead of trusting uncommitted compiler output.
690
+ if (runtime.createProlog === undefined) {
691
+ await checkpointNoopSync(workspaceRoot, currentBranch);
692
+ }
507
693
  writeSyncCache(cachePath, {
508
694
  version: SYNC_CACHE_VERSION,
509
695
  hashes: evictedHashes,
@@ -515,9 +701,6 @@ export async function syncCommand(options = {}, runtime = {}) {
515
701
  semanticHashes: evictedSemanticHashes,
516
702
  semanticContracts: evictedSemanticContracts,
517
703
  });
518
- if (runtime.createProlog === undefined) {
519
- await checkpointNoopSync(process.cwd(), currentBranch);
520
- }
521
704
  console.log("✓ Imported 0 entities, 0 relationships (no changes)");
522
705
  return withOptionalCommit({
523
706
  branch: currentBranch,
@@ -531,7 +714,7 @@ export async function syncCommand(options = {}, runtime = {}) {
531
714
  exitCode: 0,
532
715
  }, getCurrentCommit());
533
716
  }
534
- const livePath = path.join(process.cwd(), `.kb/branches/${currentBranch}`);
717
+ const livePath = branchStorePath(workspaceRoot, currentBranch);
535
718
  const kbExists = existsSync(livePath);
536
719
  if (!kbExists && !rebuild) {
537
720
  diagnostics.push(createKbMissingDiagnostic(currentBranch, livePath));
@@ -544,7 +727,7 @@ export async function syncCommand(options = {}, runtime = {}) {
544
727
  // for a one-symbol or relationship-only change.
545
728
  if (!validateOnly && !rebuild && runtime.createProlog === undefined) {
546
729
  const engine = new EngineClient({
547
- workspaceRoot: process.cwd(),
730
+ workspaceRoot,
548
731
  branch: currentBranch,
549
732
  timeout: 120_000,
550
733
  });
@@ -554,7 +737,7 @@ export async function syncCommand(options = {}, runtime = {}) {
554
737
  const successfulChangedSources = [
555
738
  ...changedMarkdownFiles,
556
739
  ...changedManifestFiles,
557
- ].filter((file) => !failedCacheKeys.has(toCacheKey(file)));
740
+ ].filter((file) => !failedCacheKeys.has(toCacheKey(workspaceRoot, file)));
558
741
  const removedCount = useEntityDelta
559
742
  ? await retractEntitiesById(engineProlog, [...removedEntityIds])
560
743
  : await retractEntitiesForSources(engineProlog, [
@@ -591,7 +774,7 @@ export async function syncCommand(options = {}, runtime = {}) {
591
774
  }
592
775
  const danglingKeys = new Set(validationErrors.map(({ relationship }) => `${relationship.type}|${relationship.from}|${relationship.to}`));
593
776
  const shardDeltaByKey = new Map();
594
- const shardCandidates = useEntityDelta
777
+ const shardCandidates = useEntityDelta && !materializeAllRelationships
595
778
  ? [
596
779
  ...addedShardRelationships,
597
780
  ...allRelationships.filter((relationship) => changedEntityIds.has(relationship.from)),
@@ -665,7 +848,7 @@ export async function syncCommand(options = {}, runtime = {}) {
665
848
  await engine.terminate();
666
849
  }
667
850
  }
668
- stagingPath = createUniqueStagingPath(currentBranch, process.cwd());
851
+ stagingPath = createUniqueStagingPath(currentBranch, workspaceRoot);
669
852
  const runtimeContext = {
670
853
  currentBranch,
671
854
  livePath,
@@ -674,6 +857,12 @@ export async function syncCommand(options = {}, runtime = {}) {
674
857
  validateOnly,
675
858
  };
676
859
  await prepareStagingEnvironment(stagingPath, livePath, rebuild);
860
+ // Staging is a new compiled artifact, so install the exact identity fence
861
+ // before the engine attaches. The manifest is published with the staged
862
+ // store during the atomic swap.
863
+ if (!existsSync(branchStoreManifestPath(stagingPath))) {
864
+ writeFileSync(branchStoreManifestPath(stagingPath), `${JSON.stringify(expectedBranchStoreManifest(currentBranch), null, 2)}\n`, { mode: 0o600 });
865
+ }
677
866
  try {
678
867
  const prolog = runtime.createProlog?.({ timeout: 120000 }) ??
679
868
  new PrologProcess({ timeout: 120000 });
@@ -695,7 +884,7 @@ export async function syncCommand(options = {}, runtime = {}) {
695
884
  ...changedMarkdownFiles,
696
885
  ...changedManifestFiles,
697
886
  ...deletedSourceFiles,
698
- ].filter((file) => !failedCacheKeys.has(toCacheKey(file))));
887
+ ].filter((file) => !failedCacheKeys.has(toCacheKey(workspaceRoot, file))));
699
888
  if (relationshipChanged) {
700
889
  const clearRelationships = await prolog.query("kb_retract_all_relationships");
701
890
  if (!clearRelationships.success) {
@@ -760,14 +949,45 @@ export async function syncCommand(options = {}, runtime = {}) {
760
949
  await prolog.query("kb_detach");
761
950
  await prolog.terminate();
762
951
  const journaledLive = existsSync(path.join(livePath, "storage.json"));
763
- if (rebuild && journaledLive) {
952
+ if (recoveryBackupPath !== undefined) {
953
+ if (!existsSync(livePath)) {
954
+ throw new SyncError(`Recovery target disappeared before publication: ${livePath}`);
955
+ }
956
+ if (existsSync(recoveryBackupPath)) {
957
+ throw new SyncError(`Recovery backup path already exists: ${recoveryBackupPath}`);
958
+ }
959
+ mkdirSync(path.dirname(recoveryBackupPath), { recursive: true });
960
+ // Same-filesystem renames give us a recoverable two-step publication:
961
+ // the original bytes stay at the reported backup path if anything
962
+ // later needs forensic inspection.
963
+ renameSync(livePath, recoveryBackupPath);
964
+ try {
965
+ renameSync(stagingPath, livePath);
966
+ }
967
+ catch (error) {
968
+ renameSync(recoveryBackupPath, livePath);
969
+ throw error;
970
+ }
971
+ }
972
+ else if (rebuild && journaledLive) {
764
973
  atomicPublishGeneration(stagingPath, livePath);
765
974
  }
766
975
  else {
767
976
  atomicPublish(stagingPath, livePath);
768
977
  }
769
978
  fsyncJournaledBranchStore(livePath);
770
- cleanupStaging(stagingPath);
979
+ try {
980
+ if (recoveryBackupPath !== undefined &&
981
+ recoveredPendingReceiptPaths.length > 0) {
982
+ clearRecoveredPendingSourceReceipts(workspaceRoot, recoveredPendingReceiptPaths);
983
+ }
984
+ }
985
+ finally {
986
+ // Receipt compare-and-delete can fail closed after publication when a
987
+ // newer receipt wins a race. Staging bytes are still disposable;
988
+ // leave the published store and surface the pending intent error.
989
+ cleanupStaging(stagingPath);
990
+ }
771
991
  const evictedHashes = {};
772
992
  const evictedSeenAt = {};
773
993
  const evictedSemanticHashes = {};
@@ -822,6 +1042,7 @@ export async function syncCommand(options = {}, runtime = {}) {
822
1042
  }
823
1043
  }
824
1044
  catch (error) {
1045
+ operationFailure = { error };
825
1046
  if (stagingPath) {
826
1047
  cleanupStaging(stagingPath);
827
1048
  }
@@ -846,5 +1067,9 @@ export async function syncCommand(options = {}, runtime = {}) {
846
1067
  }
847
1068
  throw error;
848
1069
  }
1070
+ finally {
1071
+ publicationLease?.release();
1072
+ releaseSymbolCompilerLock(compilerLock, operationFailure);
1073
+ }
849
1074
  }
850
1075
  export { normalizeMarkdownPath } from "./sync/discovery.js";