kibi-cli 0.18.1 → 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 (539) hide show
  1. package/dist/cli-json-command.d.ts +1 -2
  2. package/dist/cli-json-command.d.ts.map +1 -1
  3. package/dist/cli-json-command.js +2 -34
  4. package/dist/cli-operation-loader.d.ts +3 -0
  5. package/dist/cli-operation-loader.d.ts.map +1 -0
  6. package/dist/cli-operation-loader.js +91 -0
  7. package/dist/cli-operation-metadata.d.ts +94 -0
  8. package/dist/cli-operation-metadata.d.ts.map +1 -0
  9. package/dist/cli-operation-metadata.js +121 -0
  10. package/dist/cli-protocol.d.ts +1 -1
  11. package/dist/cli-protocol.d.ts.map +1 -1
  12. package/dist/cli-protocol.js +42 -11
  13. package/dist/cli-register-foundation.d.ts.map +1 -1
  14. package/dist/cli-register-foundation.js +28 -19
  15. package/dist/cli-register-json.d.ts +3 -0
  16. package/dist/cli-register-json.d.ts.map +1 -0
  17. package/dist/cli-register-json.js +35 -0
  18. package/dist/cli-register-maintenance.d.ts.map +1 -1
  19. package/dist/cli-register-maintenance.js +60 -13
  20. package/dist/cli-register-reporting.d.ts.map +1 -1
  21. package/dist/cli-register-reporting.js +23 -14
  22. package/dist/cli-register-skills.d.ts.map +1 -1
  23. package/dist/cli-register-skills.js +8 -6
  24. package/dist/cli-register-verification.d.ts +3 -0
  25. package/dist/cli-register-verification.d.ts.map +1 -0
  26. package/dist/cli-register-verification.js +16 -0
  27. package/dist/cli.d.ts.map +1 -1
  28. package/dist/cli.js +3 -1
  29. package/dist/commands/aggregated-checks.d.ts +1 -2
  30. package/dist/commands/aggregated-checks.d.ts.map +1 -1
  31. package/dist/commands/aggregated-checks.js +14 -9
  32. package/dist/commands/branch.d.ts +36 -0
  33. package/dist/commands/branch.d.ts.map +1 -1
  34. package/dist/commands/branch.js +371 -40
  35. package/dist/commands/check.d.ts.map +1 -1
  36. package/dist/commands/check.js +48 -77
  37. package/dist/commands/coverage.js +1 -1
  38. package/dist/commands/discovery-shared.d.ts +2 -1
  39. package/dist/commands/discovery-shared.d.ts.map +1 -1
  40. package/dist/commands/discovery-shared.js +38 -25
  41. package/dist/commands/doctor.d.ts +4 -1
  42. package/dist/commands/doctor.d.ts.map +1 -1
  43. package/dist/commands/doctor.js +259 -24
  44. package/dist/commands/engine.d.ts +8 -0
  45. package/dist/commands/engine.d.ts.map +1 -0
  46. package/dist/commands/engine.js +103 -0
  47. package/dist/commands/gaps.js +1 -1
  48. package/dist/commands/gc.d.ts +5 -2
  49. package/dist/commands/gc.d.ts.map +1 -1
  50. package/dist/commands/gc.js +140 -71
  51. package/dist/commands/github-init.d.ts +56 -0
  52. package/dist/commands/github-init.d.ts.map +1 -0
  53. package/dist/commands/github-init.js +310 -0
  54. package/dist/commands/graph.js +1 -1
  55. package/dist/commands/init-helpers.d.ts +1 -1
  56. package/dist/commands/init-helpers.d.ts.map +1 -1
  57. package/dist/commands/init-helpers.js +73 -25
  58. package/dist/commands/init.d.ts +2 -0
  59. package/dist/commands/init.d.ts.map +1 -1
  60. package/dist/commands/init.js +79 -24
  61. package/dist/commands/legacy-storage-migration.d.ts +54 -0
  62. package/dist/commands/legacy-storage-migration.d.ts.map +1 -0
  63. package/dist/commands/legacy-storage-migration.js +277 -0
  64. package/dist/commands/migrate.d.ts +7 -0
  65. package/dist/commands/migrate.d.ts.map +1 -1
  66. package/dist/commands/migrate.js +244 -91
  67. package/dist/commands/query.d.ts.map +1 -1
  68. package/dist/commands/query.js +3 -1
  69. package/dist/commands/report.d.ts +24 -0
  70. package/dist/commands/report.d.ts.map +1 -0
  71. package/dist/commands/report.js +191 -0
  72. package/dist/commands/search.d.ts.map +1 -1
  73. package/dist/commands/search.js +3 -1
  74. package/dist/commands/status.d.ts.map +1 -1
  75. package/dist/commands/status.js +2 -1
  76. package/dist/commands/sync/cache.d.ts +26 -3
  77. package/dist/commands/sync/cache.d.ts.map +1 -1
  78. package/dist/commands/sync/cache.js +141 -5
  79. package/dist/commands/sync/discovery.d.ts +23 -2
  80. package/dist/commands/sync/discovery.d.ts.map +1 -1
  81. package/dist/commands/sync/discovery.js +196 -15
  82. package/dist/commands/sync/extraction.d.ts +8 -1
  83. package/dist/commands/sync/extraction.d.ts.map +1 -1
  84. package/dist/commands/sync/extraction.js +38 -4
  85. package/dist/commands/sync/manifest.d.ts +8 -5
  86. package/dist/commands/sync/manifest.d.ts.map +1 -1
  87. package/dist/commands/sync/manifest.js +142 -39
  88. package/dist/commands/sync/persistence.d.ts +10 -1
  89. package/dist/commands/sync/persistence.d.ts.map +1 -1
  90. package/dist/commands/sync/persistence.js +223 -44
  91. package/dist/commands/sync/staging.d.ts +10 -1
  92. package/dist/commands/sync/staging.d.ts.map +1 -1
  93. package/dist/commands/sync/staging.js +84 -1
  94. package/dist/commands/sync.d.ts +6 -0
  95. package/dist/commands/sync.d.ts.map +1 -1
  96. package/dist/commands/sync.js +710 -48
  97. package/dist/commands/verify.d.ts +10 -0
  98. package/dist/commands/verify.d.ts.map +1 -0
  99. package/dist/commands/verify.js +126 -0
  100. package/dist/diagnostics.d.ts +1 -1
  101. package/dist/diagnostics.d.ts.map +1 -1
  102. package/dist/engine-daemon.d.ts +3 -0
  103. package/dist/engine-daemon.d.ts.map +1 -0
  104. package/dist/engine-daemon.js +34 -0
  105. package/dist/engine.d.ts +156 -0
  106. package/dist/engine.d.ts.map +1 -0
  107. package/dist/engine.js +1625 -0
  108. package/dist/env.d.ts.map +1 -1
  109. package/dist/env.js +5 -6
  110. package/dist/extractors/manifest.d.ts +8 -1
  111. package/dist/extractors/manifest.d.ts.map +1 -1
  112. package/dist/extractors/manifest.js +51 -9
  113. package/dist/extractors/markdown.d.ts +2 -1
  114. package/dist/extractors/markdown.d.ts.map +1 -1
  115. package/dist/extractors/markdown.js +21 -3
  116. package/dist/extractors/playwright-cases.d.ts +24 -0
  117. package/dist/extractors/playwright-cases.d.ts.map +1 -0
  118. package/dist/extractors/playwright-cases.js +126 -0
  119. package/dist/extractors/relationships.d.ts +2 -0
  120. package/dist/extractors/relationships.d.ts.map +1 -1
  121. package/dist/extractors/relationships.js +16 -17
  122. package/dist/extractors/symbol-coordinates.d.ts +81 -3
  123. package/dist/extractors/symbol-coordinates.d.ts.map +1 -1
  124. package/dist/extractors/symbol-coordinates.js +389 -51
  125. package/dist/extractors/symbols-coordinator.js +11 -1
  126. package/dist/intent-search.d.ts +60 -0
  127. package/dist/intent-search.d.ts.map +1 -0
  128. package/dist/intent-search.js +433 -0
  129. package/dist/operations/bootstrap/activation.d.ts.map +1 -0
  130. package/dist/operations/{autopilot → bootstrap}/activation.js +48 -31
  131. package/dist/operations/{autopilot → bootstrap}/candidate-helpers.d.ts.map +1 -1
  132. package/dist/operations/bootstrap/candidates.d.ts +4 -0
  133. package/dist/operations/{autopilot → bootstrap}/candidates.d.ts.map +1 -1
  134. package/dist/operations/{autopilot → bootstrap}/candidates.js +22 -8
  135. package/dist/operations/{autopilot → bootstrap}/discovery-evidence.d.ts +2 -2
  136. package/dist/operations/{autopilot → bootstrap}/discovery-evidence.d.ts.map +1 -1
  137. package/dist/operations/{autopilot → bootstrap}/discovery-evidence.js +46 -6
  138. package/dist/operations/{autopilot → bootstrap}/discovery.d.ts +1 -1
  139. package/dist/operations/bootstrap/discovery.d.ts.map +1 -0
  140. package/dist/operations/{autopilot → bootstrap}/discovery.js +21 -14
  141. package/dist/operations/bootstrap/generate.d.ts +8 -0
  142. package/dist/operations/bootstrap/generate.d.ts.map +1 -0
  143. package/dist/operations/bootstrap/generate.js +204 -0
  144. package/dist/operations/{autopilot → bootstrap}/guidance-actions.d.ts +2 -2
  145. package/dist/operations/{autopilot → bootstrap}/guidance-actions.d.ts.map +1 -1
  146. package/dist/operations/{autopilot → bootstrap}/guidance-actions.js +4 -4
  147. package/dist/operations/{autopilot → bootstrap}/guidance.d.ts +2 -2
  148. package/dist/operations/{autopilot → bootstrap}/guidance.d.ts.map +1 -1
  149. package/dist/operations/{autopilot → bootstrap}/guidance.js +2 -0
  150. package/dist/operations/{autopilot → bootstrap}/markdown-candidates.d.ts +2 -2
  151. package/dist/operations/{autopilot → bootstrap}/markdown-candidates.d.ts.map +1 -1
  152. package/dist/operations/{autopilot → bootstrap}/markdown-candidates.js +4 -3
  153. package/dist/operations/bootstrap/presentation.d.ts +15 -0
  154. package/dist/operations/bootstrap/presentation.d.ts.map +1 -0
  155. package/dist/operations/bootstrap/presentation.js +177 -0
  156. package/dist/operations/{autopilot → bootstrap}/requirement-claims.d.ts.map +1 -1
  157. package/dist/operations/{autopilot → bootstrap}/types.d.ts +63 -21
  158. package/dist/operations/bootstrap/types.d.ts.map +1 -0
  159. package/dist/operations/bootstrap/types.js +25 -0
  160. package/dist/operations/modeling/model-requirement.d.ts.map +1 -1
  161. package/dist/operations/modeling/model-requirement.js +4 -17
  162. package/dist/operations/modeling/predicate-applicability.d.ts +16 -0
  163. package/dist/operations/modeling/predicate-applicability.d.ts.map +1 -0
  164. package/dist/operations/modeling/predicate-applicability.js +276 -0
  165. package/dist/operations/modeling/predicate-applyplan.d.ts +13 -2
  166. package/dist/operations/modeling/predicate-applyplan.d.ts.map +1 -1
  167. package/dist/operations/modeling/predicate-applyplan.js +100 -3
  168. package/dist/operations/modeling/predicate-bindings.d.ts +6 -0
  169. package/dist/operations/modeling/predicate-bindings.d.ts.map +1 -0
  170. package/dist/operations/modeling/predicate-bindings.js +122 -0
  171. package/dist/operations/modeling/predicate-catalog-4.d.ts.map +1 -1
  172. package/dist/operations/modeling/predicate-catalog-4.js +155 -0
  173. package/dist/operations/modeling/predicate-inference-1.d.ts.map +1 -1
  174. package/dist/operations/modeling/predicate-inference-1.js +8 -0
  175. package/dist/operations/modeling/predicate-inference-launcher.d.ts +10 -0
  176. package/dist/operations/modeling/predicate-inference-launcher.d.ts.map +1 -0
  177. package/dist/operations/modeling/predicate-inference-launcher.js +13 -0
  178. package/dist/operations/modeling/predicate-inference.d.ts.map +1 -1
  179. package/dist/operations/modeling/predicate-inference.js +4 -0
  180. package/dist/operations/modeling/predicate-loader.d.ts.map +1 -1
  181. package/dist/operations/modeling/predicate-loader.js +7 -0
  182. package/dist/operations/modeling/predicate-ranker.d.ts +8 -1
  183. package/dist/operations/modeling/predicate-ranker.d.ts.map +1 -1
  184. package/dist/operations/modeling/predicate-ranker.js +156 -24
  185. package/dist/operations/modeling/predicate-score-3.d.ts.map +1 -1
  186. package/dist/operations/modeling/predicate-score-3.js +6 -0
  187. package/dist/operations/modeling/predicate-types.d.ts +34 -0
  188. package/dist/operations/modeling/predicate-types.d.ts.map +1 -1
  189. package/dist/operations/modeling/predicate-usage-hints-3.d.ts.map +1 -1
  190. package/dist/operations/modeling/predicate-usage-hints-3.js +40 -0
  191. package/dist/operations/modeling/predicate-utils.d.ts.map +1 -1
  192. package/dist/operations/modeling/predicate-utils.js +2 -0
  193. package/dist/operations/modeling/suggest-predicates.d.ts +1 -1
  194. package/dist/operations/modeling/suggest-predicates.d.ts.map +1 -1
  195. package/dist/operations/modeling/suggest-predicates.js +170 -32
  196. package/dist/operations/mutation/delete.d.ts.map +1 -1
  197. package/dist/operations/mutation/delete.js +415 -19
  198. package/dist/operations/mutation/entity-projection.d.ts +11 -0
  199. package/dist/operations/mutation/entity-projection.d.ts.map +1 -0
  200. package/dist/operations/mutation/entity-projection.js +14 -0
  201. package/dist/operations/mutation/relationships.d.ts +10 -0
  202. package/dist/operations/mutation/relationships.d.ts.map +1 -1
  203. package/dist/operations/mutation/relationships.js +71 -1
  204. package/dist/operations/mutation/serialization.d.ts.map +1 -1
  205. package/dist/operations/mutation/serialization.js +1 -0
  206. package/dist/operations/mutation/source-authoring.d.ts +61 -0
  207. package/dist/operations/mutation/source-authoring.d.ts.map +1 -0
  208. package/dist/operations/mutation/source-authoring.js +543 -0
  209. package/dist/operations/mutation/symbol-compiler-lock.d.ts +51 -0
  210. package/dist/operations/mutation/symbol-compiler-lock.d.ts.map +1 -0
  211. package/dist/operations/mutation/symbol-compiler-lock.js +274 -0
  212. package/dist/operations/mutation/symbol-granularity.d.ts.map +1 -1
  213. package/dist/operations/mutation/symbol-granularity.js +34 -3
  214. package/dist/operations/mutation/symbol-refresh.d.ts +18 -1
  215. package/dist/operations/mutation/symbol-refresh.d.ts.map +1 -1
  216. package/dist/operations/mutation/symbol-refresh.js +225 -63
  217. package/dist/operations/mutation/types.d.ts +57 -1
  218. package/dist/operations/mutation/types.d.ts.map +1 -1
  219. package/dist/operations/mutation/upsert.d.ts.map +1 -1
  220. package/dist/operations/mutation/upsert.js +363 -24
  221. package/dist/operations/mutation/validation.d.ts.map +1 -1
  222. package/dist/operations/mutation/validation.js +1 -0
  223. package/dist/operations/planning/apply-plan.d.ts +117 -0
  224. package/dist/operations/planning/apply-plan.d.ts.map +1 -0
  225. package/dist/operations/planning/apply-plan.js +1437 -0
  226. package/dist/operations/planning/compile-intent.d.ts +106 -0
  227. package/dist/operations/planning/compile-intent.d.ts.map +1 -0
  228. package/dist/operations/planning/compile-intent.js +562 -0
  229. package/dist/operations/semantic-advisor/analyze-prose.d.ts.map +1 -1
  230. package/dist/operations/semantic-advisor/analyze-prose.js +6 -2
  231. package/dist/operations/semantic-advisor/clauses.d.ts.map +1 -1
  232. package/dist/operations/semantic-advisor/clauses.js +15 -2
  233. package/dist/operations/semantic-advisor/ingestion-boundary.d.ts.map +1 -1
  234. package/dist/operations/semantic-advisor/ingestion-boundary.js +7 -3
  235. package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts +51 -0
  236. package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts.map +1 -0
  237. package/dist/operations/semantic-advisor/predicate-rules-launcher.js +96 -0
  238. package/dist/operations/semantic-advisor/types.d.ts +13 -5
  239. package/dist/operations/semantic-advisor/types.d.ts.map +1 -1
  240. package/dist/operations/verification/ingest-verification.d.ts +29 -0
  241. package/dist/operations/verification/ingest-verification.d.ts.map +1 -0
  242. package/dist/operations/verification/ingest-verification.js +192 -0
  243. package/dist/prolog/codec.d.ts.map +1 -1
  244. package/dist/prolog/codec.js +2 -1
  245. package/dist/prolog.d.ts +8 -0
  246. package/dist/prolog.d.ts.map +1 -1
  247. package/dist/prolog.js +66 -16
  248. package/dist/public/branch-resolver.d.ts +1 -0
  249. package/dist/public/branch-resolver.d.ts.map +1 -1
  250. package/dist/public/branch-resolver.js +1 -0
  251. package/dist/public/check-types.d.ts +2 -2
  252. package/dist/public/check-types.d.ts.map +1 -1
  253. package/dist/public/check-types.js +16 -16
  254. package/dist/public/diagnostic-usage.d.ts.map +1 -1
  255. package/dist/public/diagnostic-usage.js +69 -1
  256. package/dist/public/distribution-parity.d.ts +1 -1
  257. package/dist/public/distribution-parity.d.ts.map +1 -1
  258. package/dist/public/distribution-parity.js +1 -0
  259. package/dist/public/ignore-policy.d.ts.map +1 -1
  260. package/dist/public/ignore-policy.js +16 -4
  261. package/dist/public/impact/coverage-depth-quality.d.ts +6 -1
  262. package/dist/public/impact/coverage-depth-quality.d.ts.map +1 -1
  263. package/dist/public/impact/coverage-depth-quality.js +21 -3
  264. package/dist/public/impact/full-kb-quality.d.ts +4 -2
  265. package/dist/public/impact/full-kb-quality.d.ts.map +1 -1
  266. package/dist/public/impact/full-kb-quality.js +61 -1
  267. package/dist/public/impact/manifest.d.ts.map +1 -1
  268. package/dist/public/impact/manifest.js +2 -5
  269. package/dist/public/operational-artifacts.d.ts.map +1 -1
  270. package/dist/public/operational-artifacts.js +7 -1
  271. package/dist/public/operations/catalog.d.ts +682 -67
  272. package/dist/public/operations/catalog.d.ts.map +1 -1
  273. package/dist/public/operations/catalog.js +126 -4
  274. package/dist/public/operations/check-executor.d.ts +2 -2
  275. package/dist/public/operations/check-executor.d.ts.map +1 -1
  276. package/dist/public/operations/check-executor.js +72 -13
  277. package/dist/public/operations/check-format-shared.d.ts +3 -0
  278. package/dist/public/operations/check-format-shared.d.ts.map +1 -1
  279. package/dist/public/operations/check-format-shared.js +3 -0
  280. package/dist/public/operations/check-helpers.d.ts +27 -2
  281. package/dist/public/operations/check-helpers.d.ts.map +1 -1
  282. package/dist/public/operations/check-helpers.js +62 -26
  283. package/dist/public/operations/contracts.d.ts +11 -0
  284. package/dist/public/operations/contracts.d.ts.map +1 -0
  285. package/dist/public/operations/contracts.js +325 -0
  286. package/dist/public/operations/discovery-entities.d.ts.map +1 -1
  287. package/dist/public/operations/discovery-entities.js +3 -2
  288. package/dist/public/operations/discovery-executors.d.ts +37 -1
  289. package/dist/public/operations/discovery-executors.d.ts.map +1 -1
  290. package/dist/public/operations/discovery-executors.js +246 -9
  291. package/dist/public/operations/index.d.ts +9 -4
  292. package/dist/public/operations/index.d.ts.map +1 -1
  293. package/dist/public/operations/index.js +8 -3
  294. package/dist/public/operations/migration-plan.d.ts +101 -0
  295. package/dist/public/operations/migration-plan.d.ts.map +1 -0
  296. package/dist/public/operations/migration-plan.js +537 -0
  297. package/dist/public/operations/node-ports.d.ts.map +1 -1
  298. package/dist/public/operations/node-ports.js +68 -8
  299. package/dist/public/operations/prolog-json.d.ts +14 -0
  300. package/dist/public/operations/prolog-json.d.ts.map +1 -1
  301. package/dist/public/operations/prolog-json.js +55 -6
  302. package/dist/public/operations/repair-plan.d.ts.map +1 -1
  303. package/dist/public/operations/repair-plan.js +1 -0
  304. package/dist/public/operations/result-envelope.d.ts +13 -0
  305. package/dist/public/operations/result-envelope.d.ts.map +1 -0
  306. package/dist/public/operations/result-envelope.js +104 -0
  307. package/dist/public/operations/runtime-types.d.ts +126 -5
  308. package/dist/public/operations/runtime-types.d.ts.map +1 -1
  309. package/dist/public/operations/source-relationship-parity.d.ts +13 -0
  310. package/dist/public/operations/source-relationship-parity.d.ts.map +1 -0
  311. package/dist/public/operations/source-relationship-parity.js +162 -0
  312. package/dist/public/operations/specs/{autopilot.d.ts → bootstrap.d.ts} +9 -9
  313. package/dist/public/operations/specs/bootstrap.d.ts.map +1 -0
  314. package/dist/public/operations/specs/{autopilot.js → bootstrap.js} +8 -7
  315. package/dist/public/operations/specs/check.d.ts +4 -4
  316. package/dist/public/operations/specs/check.d.ts.map +1 -1
  317. package/dist/public/operations/specs/check.js +4 -3
  318. package/dist/public/operations/specs/discovery.d.ts +87 -3
  319. package/dist/public/operations/specs/discovery.d.ts.map +1 -1
  320. package/dist/public/operations/specs/discovery.js +53 -3
  321. package/dist/public/operations/specs/modeling.d.ts +3 -3
  322. package/dist/public/operations/specs/modeling.js +3 -3
  323. package/dist/public/operations/specs/mutation-schemas.d.ts +190 -47
  324. package/dist/public/operations/specs/mutation-schemas.d.ts.map +1 -1
  325. package/dist/public/operations/specs/mutation-schemas.js +3 -1
  326. package/dist/public/operations/specs/mutation.d.ts +42 -2
  327. package/dist/public/operations/specs/mutation.d.ts.map +1 -1
  328. package/dist/public/operations/specs/mutation.js +26 -2
  329. package/dist/public/operations/specs/planning.d.ts +270 -0
  330. package/dist/public/operations/specs/planning.d.ts.map +1 -0
  331. package/dist/public/operations/specs/planning.js +191 -0
  332. package/dist/public/operations/specs/reporting.d.ts +4 -1
  333. package/dist/public/operations/specs/reporting.d.ts.map +1 -1
  334. package/dist/public/operations/specs/reporting.js +46 -1
  335. package/dist/public/operations/specs/upsert.d.ts +204 -47
  336. package/dist/public/operations/specs/upsert.d.ts.map +1 -1
  337. package/dist/public/operations/specs/upsert.js +9 -0
  338. package/dist/public/operations/specs/verification.d.ts +78 -0
  339. package/dist/public/operations/specs/verification.d.ts.map +1 -0
  340. package/dist/public/operations/specs/verification.js +62 -0
  341. package/dist/public/operations/symbol-repair-plan.d.ts +11 -0
  342. package/dist/public/operations/symbol-repair-plan.d.ts.map +1 -0
  343. package/dist/public/operations/symbol-repair-plan.js +123 -0
  344. package/dist/public/operations/types.d.ts +52 -1
  345. package/dist/public/operations/types.d.ts.map +1 -1
  346. package/dist/public/playwright-case-id.d.ts +8 -0
  347. package/dist/public/playwright-case-id.d.ts.map +1 -0
  348. package/dist/public/playwright-case-id.js +25 -0
  349. package/dist/public/schemas/entity.d.ts.map +1 -1
  350. package/dist/public/schemas/entity.js +4 -2
  351. package/dist/public/skills/kibi-bootstrap/SKILL.md +58 -0
  352. package/dist/public/skills/kibi-bootstrap/resources/bootstrap.md +11 -0
  353. package/dist/public/skills/kibi-bootstrap/resources/branch-lifecycle.md +7 -0
  354. package/dist/public/skills/kibi-bootstrap/resources/operation-access.md +5 -0
  355. package/dist/public/skills/kibi-bootstrap/resources/source-authoring.md +8 -0
  356. package/dist/public/skills/kibi-freshness/SKILL.md +40 -10
  357. package/dist/public/skills/kibi-freshness/resources/branch-lifecycle.md +7 -0
  358. package/dist/public/skills/kibi-freshness/resources/operation-access.md +6 -0
  359. package/dist/public/skills/kibi-freshness/resources/source-authoring.md +7 -0
  360. package/dist/public/skills/kibi-traceability/SKILL.md +47 -47
  361. package/dist/public/skills/kibi-traceability/resources/branch-lifecycle.md +7 -0
  362. package/dist/public/skills/kibi-traceability/resources/operation-access.md +5 -0
  363. package/dist/public/skills/kibi-traceability/resources/source-authoring.md +6 -0
  364. package/dist/public/skills/kibi-traceability/resources/traceability.md +8 -0
  365. package/dist/public/skills/kibi-usage/SKILL.md +115 -239
  366. package/dist/public/skills/kibi-usage/resources/branch-lifecycle.md +31 -0
  367. package/dist/public/skills/kibi-usage/resources/kb-improvement.md +38 -0
  368. package/dist/public/skills/kibi-usage/resources/operation-access.md +36 -38
  369. package/dist/public/skills/kibi-usage/resources/relationship-directions.md +3 -3
  370. package/dist/public/skills/kibi-usage/resources/source-authoring.md +31 -0
  371. package/dist/public/skills/kibi-usage/resources/workflows.md +56 -3
  372. package/dist/public/symbol-granularity.d.ts +1 -1
  373. package/dist/public/symbol-granularity.d.ts.map +1 -1
  374. package/dist/public/symbol-granularity.js +1 -0
  375. package/dist/public/telemetry-acceptance.d.ts +7 -0
  376. package/dist/public/telemetry-acceptance.d.ts.map +1 -1
  377. package/dist/public/telemetry-acceptance.js +8 -1
  378. package/dist/public/telemetry-remediation.js +1 -1
  379. package/dist/public/verification-receipt.d.ts +206 -39
  380. package/dist/public/verification-receipt.d.ts.map +1 -1
  381. package/dist/public/verification-receipt.js +171 -4
  382. package/dist/relationships/shards.d.ts +16 -0
  383. package/dist/relationships/shards.d.ts.map +1 -1
  384. package/dist/relationships/shards.js +87 -2
  385. package/dist/report/brand.d.ts +19 -0
  386. package/dist/report/brand.d.ts.map +1 -0
  387. package/dist/report/brand.js +112 -0
  388. package/dist/report/html-report.d.ts +19 -0
  389. package/dist/report/html-report.d.ts.map +1 -0
  390. package/dist/report/html-report.js +963 -0
  391. package/dist/report/relative-time.d.ts +4 -0
  392. package/dist/report/relative-time.d.ts.map +1 -0
  393. package/dist/report/relative-time.js +46 -0
  394. package/dist/report/report-view.d.ts +17 -0
  395. package/dist/report/report-view.d.ts.map +1 -0
  396. package/dist/report/report-view.js +33 -0
  397. package/dist/report/repository.d.ts +35 -0
  398. package/dist/report/repository.d.ts.map +1 -0
  399. package/dist/report/repository.js +151 -0
  400. package/dist/runtime/cli-runtime.d.ts.map +1 -1
  401. package/dist/runtime/cli-runtime.js +98 -42
  402. package/dist/schemas/entity.schema.json +1148 -273
  403. package/dist/traceability/evidence-model.d.ts +2 -2
  404. package/dist/traceability/evidence-model.d.ts.map +1 -1
  405. package/dist/traceability/evidence-model.js +2 -2
  406. package/dist/traceability/git-staged.d.ts.map +1 -1
  407. package/dist/traceability/git-staged.js +15 -40
  408. package/dist/traceability/markdown-validate.d.ts.map +1 -1
  409. package/dist/traceability/markdown-validate.js +12 -7
  410. package/dist/traceability/staged-impact-contract.d.ts +3 -3
  411. package/dist/traceability/staged-impact-contract.d.ts.map +1 -1
  412. package/dist/traceability/staged-impact-contract.js +10 -38
  413. package/dist/traceability/staged-symbols-manifest.d.ts.map +1 -1
  414. package/dist/traceability/staged-symbols-manifest.js +8 -3
  415. package/dist/traceability/temp-kb.d.ts.map +1 -1
  416. package/dist/traceability/temp-kb.js +3 -0
  417. package/dist/types/entities.d.ts +3 -0
  418. package/dist/types/entities.d.ts.map +1 -1
  419. package/dist/utils/branch-resolver.d.ts +24 -10
  420. package/dist/utils/branch-resolver.d.ts.map +1 -1
  421. package/dist/utils/branch-resolver.js +121 -38
  422. package/dist/utils/branch-store-locator.d.ts +23 -0
  423. package/dist/utils/branch-store-locator.d.ts.map +1 -0
  424. package/dist/utils/branch-store-locator.js +90 -0
  425. package/dist/utils/branch-store.d.ts +15 -0
  426. package/dist/utils/branch-store.d.ts.map +1 -0
  427. package/dist/utils/branch-store.js +130 -0
  428. package/dist/utils/config.d.ts +39 -37
  429. package/dist/utils/config.d.ts.map +1 -1
  430. package/dist/utils/config.js +107 -119
  431. package/dist/utils/kb-manifest.d.ts +35 -0
  432. package/dist/utils/kb-manifest.d.ts.map +1 -0
  433. package/dist/utils/kb-manifest.js +154 -0
  434. package/dist/utils/kb-paths.d.ts +54 -0
  435. package/dist/utils/kb-paths.d.ts.map +1 -0
  436. package/dist/utils/kb-paths.js +125 -0
  437. package/dist/utils/manifest-paths.d.ts +4 -4
  438. package/dist/utils/manifest-paths.d.ts.map +1 -1
  439. package/dist/utils/manifest-paths.js +8 -56
  440. package/dist/utils/rule-registry.d.ts +48 -20
  441. package/dist/utils/rule-registry.d.ts.map +1 -1
  442. package/dist/utils/rule-registry.js +82 -77
  443. package/dist/utils/schema-version.d.ts +5 -5
  444. package/dist/utils/schema-version.d.ts.map +1 -1
  445. package/dist/utils/schema-version.js +26 -6
  446. package/dist/utils/strict-modeling.d.ts +0 -4
  447. package/dist/utils/strict-modeling.d.ts.map +1 -1
  448. package/dist/utils/strict-modeling.js +7 -8
  449. package/dist/verification/playwright-reporter.d.ts +21 -0
  450. package/dist/verification/playwright-reporter.d.ts.map +1 -0
  451. package/dist/verification/playwright-reporter.js +114 -0
  452. package/package.json +51 -8
  453. package/schema/config.json +2 -2
  454. package/schema/manifest.json +26 -0
  455. package/src/public/branch-resolver.ts +1 -0
  456. package/src/public/check-types.ts +22 -19
  457. package/src/public/diagnostic-usage.ts +79 -1
  458. package/src/public/distribution-parity.ts +1 -0
  459. package/src/public/ignore-policy.ts +16 -10
  460. package/src/public/impact/coverage-depth-quality.ts +36 -0
  461. package/src/public/impact/full-kb-quality.ts +118 -5
  462. package/src/public/impact/manifest.ts +2 -4
  463. package/src/public/operational-artifacts.ts +9 -1
  464. package/src/public/operations/catalog.ts +146 -9
  465. package/src/public/operations/check-executor.ts +102 -15
  466. package/src/public/operations/check-format-shared.ts +6 -0
  467. package/src/public/operations/check-helpers.ts +74 -35
  468. package/src/public/operations/contracts.ts +366 -0
  469. package/src/public/operations/discovery-entities.ts +3 -2
  470. package/src/public/operations/discovery-executors.ts +343 -15
  471. package/src/public/operations/index.ts +9 -4
  472. package/src/public/operations/migration-plan.ts +740 -0
  473. package/src/public/operations/node-ports.ts +84 -10
  474. package/src/public/operations/prolog-json.ts +73 -6
  475. package/src/public/operations/repair-plan.ts +1 -0
  476. package/src/public/operations/result-envelope.ts +136 -0
  477. package/src/public/operations/runtime-types.ts +130 -5
  478. package/src/public/operations/source-relationship-parity.ts +226 -0
  479. package/src/public/operations/specs/{autopilot.ts → bootstrap.ts} +17 -16
  480. package/src/public/operations/specs/check.ts +4 -3
  481. package/src/public/operations/specs/discovery.ts +57 -3
  482. package/src/public/operations/specs/modeling.ts +3 -3
  483. package/src/public/operations/specs/mutation-schemas.ts +6 -1
  484. package/src/public/operations/specs/mutation.ts +27 -2
  485. package/src/public/operations/specs/planning.ts +234 -0
  486. package/src/public/operations/specs/reporting.ts +55 -1
  487. package/src/public/operations/specs/upsert.ts +10 -0
  488. package/src/public/operations/specs/verification.ts +78 -0
  489. package/src/public/operations/symbol-repair-plan.ts +164 -0
  490. package/src/public/operations/types.ts +62 -1
  491. package/src/public/playwright-case-id.ts +35 -0
  492. package/src/public/schemas/entity.ts +7 -2
  493. package/src/public/skills/kibi-bootstrap/SKILL.md +58 -0
  494. package/src/public/skills/kibi-bootstrap/resources/bootstrap.md +11 -0
  495. package/src/public/skills/kibi-bootstrap/resources/branch-lifecycle.md +7 -0
  496. package/src/public/skills/kibi-bootstrap/resources/operation-access.md +5 -0
  497. package/src/public/skills/kibi-bootstrap/resources/source-authoring.md +8 -0
  498. package/src/public/skills/kibi-freshness/SKILL.md +40 -10
  499. package/src/public/skills/kibi-freshness/resources/branch-lifecycle.md +7 -0
  500. package/src/public/skills/kibi-freshness/resources/operation-access.md +6 -0
  501. package/src/public/skills/kibi-freshness/resources/source-authoring.md +7 -0
  502. package/src/public/skills/kibi-traceability/SKILL.md +47 -47
  503. package/src/public/skills/kibi-traceability/resources/branch-lifecycle.md +7 -0
  504. package/src/public/skills/kibi-traceability/resources/operation-access.md +5 -0
  505. package/src/public/skills/kibi-traceability/resources/source-authoring.md +6 -0
  506. package/src/public/skills/kibi-traceability/resources/traceability.md +8 -0
  507. package/src/public/skills/kibi-usage/SKILL.md +115 -239
  508. package/src/public/skills/kibi-usage/resources/branch-lifecycle.md +31 -0
  509. package/src/public/skills/kibi-usage/resources/kb-improvement.md +38 -0
  510. package/src/public/skills/kibi-usage/resources/operation-access.md +36 -38
  511. package/src/public/skills/kibi-usage/resources/relationship-directions.md +3 -3
  512. package/src/public/skills/kibi-usage/resources/source-authoring.md +31 -0
  513. package/src/public/skills/kibi-usage/resources/workflows.md +56 -3
  514. package/src/public/symbol-granularity.ts +1 -0
  515. package/src/public/telemetry-acceptance.ts +16 -1
  516. package/src/public/telemetry-remediation.ts +1 -1
  517. package/src/public/verification-receipt.ts +248 -6
  518. package/src/schemas/entity.schema.json +1148 -273
  519. package/templates/github/kibi-badge.yml +86 -0
  520. package/templates/github/kibi-report.yml +84 -0
  521. package/dist/operations/autopilot/activation.d.ts.map +0 -1
  522. package/dist/operations/autopilot/candidates.d.ts +0 -4
  523. package/dist/operations/autopilot/discovery.d.ts.map +0 -1
  524. package/dist/operations/autopilot/generate.d.ts +0 -8
  525. package/dist/operations/autopilot/generate.d.ts.map +0 -1
  526. package/dist/operations/autopilot/generate.js +0 -112
  527. package/dist/operations/autopilot/presentation.d.ts +0 -13
  528. package/dist/operations/autopilot/presentation.d.ts.map +0 -1
  529. package/dist/operations/autopilot/presentation.js +0 -91
  530. package/dist/operations/autopilot/types.d.ts.map +0 -1
  531. package/dist/operations/autopilot/types.js +0 -8
  532. package/dist/public/operations/specs/autopilot.d.ts.map +0 -1
  533. package/dist/public/skills/init-kibi/SKILL.md +0 -62
  534. package/src/public/skills/init-kibi/SKILL.md +0 -62
  535. /package/dist/operations/{autopilot → bootstrap}/activation.d.ts +0 -0
  536. /package/dist/operations/{autopilot → bootstrap}/candidate-helpers.d.ts +0 -0
  537. /package/dist/operations/{autopilot → bootstrap}/candidate-helpers.js +0 -0
  538. /package/dist/operations/{autopilot → bootstrap}/requirement-claims.d.ts +0 -0
  539. /package/dist/operations/{autopilot → bootstrap}/requirement-claims.js +0 -0
@@ -15,10 +15,152 @@
15
15
  You should have received a copy of the GNU Affero General Public License
16
16
  along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
  */
18
+ import { execFile } from "node:child_process";
19
+ import { createHash } from "node:crypto";
20
+ import { existsSync, readFileSync, readdirSync, unlinkSync } from "node:fs";
18
21
  import * as path from "node:path";
22
+ import { promisify } from "node:util";
19
23
  import fg from "fast-glob";
20
24
  import { getRelationshipsDir } from "../../extractors/relationships.js";
25
+ import { CANONICAL_ENTITY_PATHS, isSymbolsManifestPath, } from "../../utils/kb-paths.js";
21
26
  const MARKDOWN_DISCOVERY_IGNORE = ["**/README.md"];
27
+ const execFileAsync = promisify(execFile);
28
+ async function gitTrackedPaths(cwd) {
29
+ const result = await execFileAsync("git", ["-C", cwd, "ls-files", "--cached", "-z", "--"], { encoding: "buffer", maxBuffer: 64 * 1024 * 1024 });
30
+ return new Set(result.stdout
31
+ .toString("utf8")
32
+ .split("\0")
33
+ .filter(Boolean)
34
+ .map((value) => value.replaceAll("\\", "/")));
35
+ }
36
+ function pendingSourcePaths(cwd, recoverMissing) {
37
+ const root = path.join(cwd, ".kb", "recovery", "pending-sources");
38
+ if (!existsSync(root)) {
39
+ return { paths: new Map(), recoveredReceipts: [] };
40
+ }
41
+ const paths = new Map();
42
+ const recoveredReceipts = [];
43
+ for (const name of readdirSync(root)) {
44
+ if (!name.endsWith(".json"))
45
+ continue;
46
+ const receiptPath = path.join(root, name);
47
+ try {
48
+ const raw = readFileSync(receiptPath, "utf8");
49
+ const receipt = JSON.parse(raw);
50
+ if (typeof receipt.path === "string" &&
51
+ receipt.path.length > 0 &&
52
+ typeof receipt.afterHash === "string" &&
53
+ /^[a-f0-9]{64}$/i.test(receipt.afterHash)) {
54
+ const relative = receipt.path.replaceAll("\\", "/");
55
+ const absolute = path.resolve(cwd, relative);
56
+ if (!absolute.startsWith(`${path.resolve(cwd)}${path.sep}`)) {
57
+ throw new Error(`Pending source receipt escapes workspace: ${relative}`);
58
+ }
59
+ if (!existsSync(absolute)) {
60
+ if (recoverMissing) {
61
+ recoveredReceipts.push({
62
+ receiptPath,
63
+ path: relative,
64
+ afterHash: receipt.afterHash,
65
+ rawHash: createHash("sha256").update(raw).digest("hex"),
66
+ });
67
+ continue;
68
+ }
69
+ throw new Error(`Pending source is missing: ${relative}`);
70
+ }
71
+ const actual = createHash("sha256")
72
+ .update(readFileSync(absolute))
73
+ .digest("hex");
74
+ if (actual !== receipt.afterHash) {
75
+ throw new Error(`Pending source hash drift blocks sync for ${relative}; expected ${receipt.afterHash}, found ${actual}`);
76
+ }
77
+ paths.set(relative, receipt.afterHash);
78
+ }
79
+ }
80
+ catch (error) {
81
+ if (error instanceof Error &&
82
+ (/Pending source/.test(error.message) ||
83
+ /Pending source receipt/.test(error.message))) {
84
+ throw error;
85
+ }
86
+ // Malformed receipts are ignored; an operator can remove or repair the
87
+ // receipt through the normal recovery operation.
88
+ }
89
+ }
90
+ return { paths, recoveredReceipts };
91
+ }
92
+ export function clearRecoveredPendingSourceReceipts(cwd, receipts) {
93
+ const root = path.resolve(cwd, ".kb", "recovery", "pending-sources");
94
+ for (const receipt of receipts) {
95
+ const absolute = path.resolve(receipt.receiptPath);
96
+ if (!absolute.startsWith(`${root}${path.sep}`)) {
97
+ throw new Error(`Pending source receipt escapes recovery root: ${absolute}`);
98
+ }
99
+ if (!existsSync(absolute))
100
+ continue;
101
+ // Compare-and-delete: a receipt may have been replaced while the
102
+ // recovery rebuild was running. Never remove the replacement merely
103
+ // because it has the same receipt filename. Failing closed here is
104
+ // important: publication may have completed, but recovery must not claim
105
+ // that pending intent was retired when a newer intent remains.
106
+ let raw;
107
+ try {
108
+ raw = readFileSync(absolute, "utf8");
109
+ }
110
+ catch (error) {
111
+ if (error !== null &&
112
+ typeof error === "object" &&
113
+ "code" in error &&
114
+ error.code === "ENOENT") {
115
+ continue;
116
+ }
117
+ throw new Error(`Failed to inspect pending source receipt for ${receipt.path}: ${error instanceof Error ? error.message : String(error)}`);
118
+ }
119
+ const rawHash = createHash("sha256").update(raw).digest("hex");
120
+ if (rawHash !== receipt.rawHash) {
121
+ throw new Error(`Pending source receipt changed during recovery for ${receipt.path}; refusing to retire newer receipt`);
122
+ }
123
+ let current;
124
+ try {
125
+ current = JSON.parse(raw);
126
+ }
127
+ catch {
128
+ throw new Error(`Pending source receipt changed during recovery for ${receipt.path}; refusing to retire newer receipt`);
129
+ }
130
+ if (current.path !== receipt.path ||
131
+ current.afterHash !== receipt.afterHash) {
132
+ throw new Error(`Pending source receipt changed during recovery for ${receipt.path}; refusing to retire newer receipt`);
133
+ }
134
+ try {
135
+ unlinkSync(absolute);
136
+ }
137
+ catch (error) {
138
+ if (error !== null &&
139
+ typeof error === "object" &&
140
+ "code" in error &&
141
+ error.code === "ENOENT") {
142
+ // Another recovery or source publication may have consumed it
143
+ // already; cleanup is idempotent for that case.
144
+ continue;
145
+ }
146
+ throw new Error(`Failed to retire pending source receipt for ${receipt.path}: ${error instanceof Error ? error.message : String(error)}`);
147
+ }
148
+ }
149
+ }
150
+ function filterTracked(cwd, files, tracked, pending) {
151
+ const retained = [];
152
+ for (const file of files) {
153
+ const relative = path.relative(cwd, file).replaceAll(path.sep, "/");
154
+ if (tracked.has(relative)) {
155
+ retained.push(file);
156
+ continue;
157
+ }
158
+ if (pending.has(relative)) {
159
+ retained.push(file);
160
+ }
161
+ }
162
+ return retained;
163
+ }
22
164
  export function normalizeMarkdownPath(pattern) {
23
165
  if (!pattern)
24
166
  return null;
@@ -26,32 +168,71 @@ export function normalizeMarkdownPath(pattern) {
26
168
  return pattern;
27
169
  return `${pattern}/**/*.md`;
28
170
  }
29
- export async function discoverSourceFiles(cwd, paths) {
171
+ export async function discoverSourceFiles(cwd, options = {}) {
30
172
  const markdownPatterns = [
31
- normalizeMarkdownPath(paths.requirements),
32
- normalizeMarkdownPath(paths.scenarios),
33
- normalizeMarkdownPath(paths.tests),
34
- normalizeMarkdownPath(paths.adr),
35
- normalizeMarkdownPath(paths.flags),
36
- normalizeMarkdownPath(paths.events),
37
- normalizeMarkdownPath(paths.facts),
173
+ normalizeMarkdownPath(CANONICAL_ENTITY_PATHS.requirements),
174
+ normalizeMarkdownPath(CANONICAL_ENTITY_PATHS.scenarios),
175
+ normalizeMarkdownPath(CANONICAL_ENTITY_PATHS.tests),
176
+ normalizeMarkdownPath(CANONICAL_ENTITY_PATHS.adr),
177
+ normalizeMarkdownPath(CANONICAL_ENTITY_PATHS.flags),
178
+ normalizeMarkdownPath(CANONICAL_ENTITY_PATHS.events),
179
+ normalizeMarkdownPath(CANONICAL_ENTITY_PATHS.facts),
38
180
  ].filter((p) => Boolean(p));
39
181
  const markdownFiles = await fg(markdownPatterns, {
40
182
  cwd,
41
183
  absolute: true,
42
184
  ignore: [...MARKDOWN_DISCOVERY_IGNORE],
43
185
  });
44
- const entityMarkdownFiles = markdownFiles.filter((file) => !file.endsWith("/README.md"));
45
- const manifestFiles = paths.symbols
46
- ? await fg(paths.symbols, {
47
- cwd,
48
- absolute: true,
49
- })
50
- : [];
186
+ let entityMarkdownFiles = markdownFiles.filter((file) => !file.endsWith("/README.md"));
187
+ let manifestFiles = await fg(CANONICAL_ENTITY_PATHS.symbols, {
188
+ cwd,
189
+ absolute: true,
190
+ });
191
+ const recoveredPendingReceiptPaths = [];
192
+ if (options.trackedOnly) {
193
+ const tracked = await gitTrackedPaths(cwd);
194
+ const pending = pendingSourcePaths(cwd, options.recoverMissingPendingSources === true);
195
+ recoveredPendingReceiptPaths.push(...pending.recoveredReceipts);
196
+ entityMarkdownFiles = filterTracked(cwd, entityMarkdownFiles, tracked, new Set(pending.paths.keys()));
197
+ manifestFiles = filterTracked(cwd, manifestFiles, tracked, new Set(pending.paths.keys()));
198
+ for (const relative of pending.paths.keys()) {
199
+ const absolute = path.resolve(cwd, relative);
200
+ if (!existsSync(absolute))
201
+ continue;
202
+ if (relative.endsWith(".md") && !entityMarkdownFiles.includes(absolute)) {
203
+ entityMarkdownFiles.push(absolute);
204
+ }
205
+ if (isSymbolsManifestPath(relative) &&
206
+ !manifestFiles.includes(absolute)) {
207
+ manifestFiles.push(absolute);
208
+ }
209
+ }
210
+ // A pending receipt is consumed as soon as Git tracks its file. This is
211
+ // deliberately best-effort metadata; the source hash remains authoritative.
212
+ const pendingRoot = path.join(cwd, ".kb", "recovery", "pending-sources");
213
+ if (options.consumeTrackedPendingReceipts !== false &&
214
+ existsSync(pendingRoot)) {
215
+ for (const name of readdirSync(pendingRoot)) {
216
+ if (!name.endsWith(".json"))
217
+ continue;
218
+ try {
219
+ const receipt = JSON.parse(readFileSync(path.join(pendingRoot, name), "utf8"));
220
+ if (typeof receipt.path === "string" &&
221
+ tracked.has(receipt.path.replaceAll("\\", "/"))) {
222
+ unlinkSync(path.join(pendingRoot, name));
223
+ }
224
+ }
225
+ catch {
226
+ // Leave malformed receipts for explicit recovery diagnostics.
227
+ }
228
+ }
229
+ }
230
+ }
51
231
  const relationshipsDir = getRelationshipsDir(path.join(cwd, ".kb"));
52
232
  return {
53
233
  markdownFiles: entityMarkdownFiles,
54
234
  manifestFiles,
55
235
  relationshipsDir,
236
+ recoveredPendingReceiptPaths,
56
237
  };
57
238
  }
@@ -7,10 +7,17 @@ export interface ExtractionOutput {
7
7
  message: string;
8
8
  }[];
9
9
  }
10
+ /**
11
+ * Authored source identities are workspace-relative POSIX paths. Code symbol
12
+ * coordinates remain a separate `sourceFile` field, but use the same stable
13
+ * relative identity so branch-local snapshots do not embed host-specific
14
+ * absolute paths.
15
+ */
16
+ export declare function normalizeExtractionSources(results: readonly ExtractionResult[], workspaceRoot: string): ExtractionResult[];
10
17
  interface ExtractionDependencies {
11
18
  extractFromMarkdown: (file: string) => ExtractionResult;
12
19
  extractFromManifest: (file: string) => ExtractionResult[];
13
20
  }
14
- export declare function processExtractions(changedMarkdownFiles: string[], changedManifestFiles: string[], validateOnly: boolean, dependencies?: ExtractionDependencies): Promise<ExtractionOutput>;
21
+ export declare function processExtractions(changedMarkdownFiles: string[], changedManifestFiles: string[], validateOnly: boolean, workspaceRoot?: string, dependencies?: ExtractionDependencies): Promise<ExtractionOutput>;
15
22
  export {};
16
23
  //# sourceMappingURL=extraction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"extraction.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/extraction.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,KAAK,gBAAgB,EAGtB,MAAM,8BAA8B,CAAC;AAGtC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7C;AAED,UAAU,sBAAsB;IAC9B,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,gBAAgB,CAAC;IACxD,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,gBAAgB,EAAE,CAAC;CAC3D;AAOD,wBAAsB,kBAAkB,CAEtC,oBAAoB,EAAE,MAAM,EAAE,EAC9B,oBAAoB,EAAE,MAAM,EAAE,EAC9B,YAAY,EAAE,OAAO,EACrB,YAAY,GAAE,sBAAwD,GACrE,OAAO,CAAC,gBAAgB,CAAC,CA4C3B"}
1
+ {"version":3,"file":"extraction.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/extraction.ts"],"names":[],"mappings":"AAuBA,OAAO,EACL,KAAK,gBAAgB,EAGtB,MAAM,8BAA8B,CAAC;AAGtC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7C;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,SAAS,gBAAgB,EAAE,EACpC,aAAa,EAAE,MAAM,GACpB,gBAAgB,EAAE,CAoBpB;AAED,UAAU,sBAAsB;IAC9B,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,gBAAgB,CAAC;IACxD,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,gBAAgB,EAAE,CAAC;CAC3D;AAOD,wBAAsB,kBAAkB,CAEtC,oBAAoB,EAAE,MAAM,EAAE,EAC9B,oBAAoB,EAAE,MAAM,EAAE,EAC9B,YAAY,EAAE,OAAO,EACrB,aAAa,SAAgB,EAC7B,YAAY,GAAE,sBAAwD,GACrE,OAAO,CAAC,gBAAgB,CAAC,CAmD3B"}
@@ -15,16 +15,45 @@
15
15
  You should have received a copy of the GNU Affero General Public License
16
16
  along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
  */
18
- import { extractFromManifest } from "../../extractors/manifest.js";
18
+ import * as path from "node:path";
19
+ import { ManifestError, extractFromManifest, } from "../../extractors/manifest.js";
19
20
  import { FrontmatterError, extractFromMarkdown, } from "../../extractors/markdown.js";
20
21
  import { toCacheKey } from "./cache.js";
22
+ /**
23
+ * Authored source identities are workspace-relative POSIX paths. Code symbol
24
+ * coordinates remain a separate `sourceFile` field, but use the same stable
25
+ * relative identity so branch-local snapshots do not embed host-specific
26
+ * absolute paths.
27
+ */
28
+ export function normalizeExtractionSources(results, workspaceRoot) {
29
+ const root = path.resolve(workspaceRoot);
30
+ const normalize = (value) => {
31
+ if (/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(value))
32
+ return value;
33
+ const absolute = path.isAbsolute(value) ? path.resolve(value) : undefined;
34
+ if (absolute?.startsWith(`${root}${path.sep}`)) {
35
+ return path.relative(root, absolute).replaceAll(path.sep, "/");
36
+ }
37
+ return value.replaceAll("\\", "/");
38
+ };
39
+ return results.map((result) => ({
40
+ ...result,
41
+ entity: {
42
+ ...result.entity,
43
+ source: normalize(result.entity.source),
44
+ },
45
+ ...(result.sourceFile !== undefined
46
+ ? { sourceFile: normalize(result.sourceFile) }
47
+ : {}),
48
+ }));
49
+ }
21
50
  const DEFAULT_EXTRACTION_DEPENDENCIES = {
22
51
  extractFromMarkdown,
23
52
  extractFromManifest,
24
53
  };
25
54
  export async function processExtractions(
26
55
  // implements REQ-003
27
- changedMarkdownFiles, changedManifestFiles, validateOnly, dependencies = DEFAULT_EXTRACTION_DEPENDENCIES) {
56
+ changedMarkdownFiles, changedManifestFiles, validateOnly, workspaceRoot = process.cwd(), dependencies = DEFAULT_EXTRACTION_DEPENDENCIES) {
28
57
  const results = [];
29
58
  const failedCacheKeys = new Set();
30
59
  const errors = [];
@@ -45,7 +74,7 @@ changedMarkdownFiles, changedManifestFiles, validateOnly, dependencies = DEFAULT
45
74
  else {
46
75
  console.warn(`Warning: Failed to extract from ${file}: ${message}`);
47
76
  }
48
- failedCacheKeys.add(toCacheKey(file));
77
+ failedCacheKeys.add(toCacheKey(workspaceRoot, file));
49
78
  }
50
79
  }
51
80
  for (const file of changedManifestFiles) {
@@ -55,13 +84,18 @@ changedMarkdownFiles, changedManifestFiles, validateOnly, dependencies = DEFAULT
55
84
  }
56
85
  catch (error) {
57
86
  const message = error instanceof Error ? error.message : String(error);
87
+ if (error instanceof ManifestError &&
88
+ error.classification === "coordinate-artifact" &&
89
+ !validateOnly) {
90
+ throw error;
91
+ }
58
92
  if (validateOnly) {
59
93
  errors.push({ file, message });
60
94
  }
61
95
  else {
62
96
  console.warn(`Warning: Failed to extract from ${file}: ${message}`);
63
97
  }
64
- failedCacheKeys.add(toCacheKey(file));
98
+ failedCacheKeys.add(toCacheKey(workspaceRoot, file));
65
99
  }
66
100
  }
67
101
  return { results, failedCacheKeys, errors };
@@ -1,4 +1,4 @@
1
- import { existsSync, readFileSync, writeFileSync } from "node:fs";
1
+ import { existsSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
2
2
  import { dump as dumpYAML, load as parseYAML } from "js-yaml";
3
3
  import { writeCoordinateArtifact } from "../../extractors/symbol-coordinates.js";
4
4
  import { type ManifestSymbolEntry, enrichSymbolCoordinates } from "../../extractors/symbols-coordinator.js";
@@ -10,19 +10,22 @@ interface ManifestDeps {
10
10
  existsSync: typeof existsSync;
11
11
  parseYAML: typeof parseYAML;
12
12
  readFileSync: typeof readFileSync;
13
+ renameSync: typeof renameSync;
14
+ unlinkSync: typeof unlinkSync;
13
15
  writeFileSync: typeof writeFileSync;
14
16
  writeCoordinateArtifact: typeof writeCoordinateArtifact;
15
17
  resolveSymbolsManifestPaths: typeof resolveSymbolsManifestPaths;
16
18
  }
17
19
  export declare const SYMBOLS_MANIFEST_COMMENT_BLOCK = "# symbols.yaml\n# AUTHORED fields (edit freely):\n# id, title, sourceFile, links, status, tags, owner, priority\n# Generated coordinates are stored separately in symbol-coordinates.yaml.\n# Run `kibi sync --refresh-symbol-coordinates` to refresh them.\n";
18
20
  /**
19
- * Coarse symbol anchors for which per-symbol coordinates are not expected.
21
+ * Coarse symbol anchors for which AST per-declaration coordinates are not
22
+ * expected.
20
23
  *
21
24
  * Test-suite, module-level-behavior, and config-artifact symbols represent a
22
25
  * whole file or configuration unit, and `extractor-miss` explicitly documents
23
- * that the extractor cannot locate a declaration. These entries legitimately
24
- * carry no generated coordinates, so coordinate refresh counts them as
25
- * unchanged instead of flagging them as failures.
26
+ * that the extractor cannot locate a declaration. Refresh still counts those
27
+ * entries as unchanged instead of failures, but it persists title-match or
28
+ * whole-file coordinates so proof-bearing executable symbols can resolve.
26
29
  */
27
30
  export { COARSE_GRANULARITY_REASONS };
28
31
  export declare function isCoarseGranularityAnchor(entry: ManifestSymbolEntry): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/manifest.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAElE,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAEL,uBAAuB,EACxB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,KAAK,mBAAmB,EACxB,uBAAuB,EACxB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,0BAA0B,EAE3B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAE5E,UAAU,YAAY;IACpB,QAAQ,EAAE,OAAO,QAAQ,CAAC;IAC1B,uBAAuB,EAAE,OAAO,uBAAuB,CAAC;IACxD,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,uBAAuB,EAAE,OAAO,uBAAuB,CAAC;IACxD,2BAA2B,EAAE,OAAO,2BAA2B,CAAC;CACjE;AAgBD,eAAO,MAAM,8BAA8B,oQAK1C,CAAC;AAwBF;;;;;;;;GAQG;AACH,OAAO,EAAE,0BAA0B,EAAE,CAAC;AAEtC,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAG7E;AAED,wBAAsB,0BAA0B,CAE9C,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,IAAI,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;IAAE,wBAAwB,CAAC,EAAE,OAAO,CAAA;CAAE,GACpE,OAAO,CAAC,IAAI,CAAC,CAuIf;AAED,wBAAgB,0BAA0B,CAExC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAOT;AAED,wBAAgB,8BAA8B,CAE5C,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,aAAa,EAAE,MAAM,EACrB,IAAI,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAC3B,OAAO,CAUT"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/manifest.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,UAAU,EACV,YAAY,EACZ,UAAU,EACV,UAAU,EACV,aAAa,EACd,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAML,uBAAuB,EACxB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,KAAK,mBAAmB,EACxB,uBAAuB,EACxB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,0BAA0B,EAE3B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAE5E,UAAU,YAAY;IACpB,QAAQ,EAAE,OAAO,QAAQ,CAAC;IAC1B,uBAAuB,EAAE,OAAO,uBAAuB,CAAC;IACxD,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,uBAAuB,EAAE,OAAO,uBAAuB,CAAC;IACxD,2BAA2B,EAAE,OAAO,2BAA2B,CAAC;CACjE;AAkBD,eAAO,MAAM,8BAA8B,oQAK1C,CAAC;AAwBF;;;;;;;;;GASG;AACH,OAAO,EAAE,0BAA0B,EAAE,CAAC;AAEtC,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAG7E;AAsGD,wBAAsB,0BAA0B,CAE9C,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,IAAI,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;IAAE,wBAAwB,CAAC,EAAE,OAAO,CAAA;CAAE,GACpE,OAAO,CAAC,IAAI,CAAC,CA0Kf;AAED,wBAAgB,0BAA0B,CAExC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAOT;AAED,wBAAgB,8BAA8B,CAE5C,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,aAAa,EAAE,MAAM,EACrB,IAAI,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAC3B,OAAO,CAUT"}
@@ -15,10 +15,10 @@
15
15
  You should have received a copy of the GNU Affero General Public License
16
16
  along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
  */
18
- import { existsSync, readFileSync, writeFileSync } from "node:fs";
18
+ import { existsSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "node:fs";
19
19
  import * as path from "node:path";
20
20
  import { dump as dumpYAML, load as parseYAML } from "js-yaml";
21
- import { writeCoordinateArtifact, } from "../../extractors/symbol-coordinates.js";
21
+ import { coarseCoordinateSpan, coordinateIdentityHash, coordinateSourceHash, parseCoordinateArtifact, writeCoordinateArtifact, } from "../../extractors/symbol-coordinates.js";
22
22
  import { enrichSymbolCoordinates, } from "../../extractors/symbols-coordinator.js";
23
23
  import { COARSE_GRANULARITY_REASONS, isCoarseGranularityReason, } from "../../public/symbol-granularity.js";
24
24
  import { resolveSymbolsManifestPaths } from "../../utils/manifest-paths.js";
@@ -29,6 +29,8 @@ function resolveDeps(overrides) {
29
29
  existsSync,
30
30
  parseYAML,
31
31
  readFileSync,
32
+ renameSync,
33
+ unlinkSync,
32
34
  writeFileSync,
33
35
  writeCoordinateArtifact,
34
36
  resolveSymbolsManifestPaths,
@@ -62,19 +64,94 @@ const GENERATED_MANIFEST_FIELDS = new Set([
62
64
  "coordinatesGeneratedAt",
63
65
  ]);
64
66
  /**
65
- * Coarse symbol anchors for which per-symbol coordinates are not expected.
67
+ * Coarse symbol anchors for which AST per-declaration coordinates are not
68
+ * expected.
66
69
  *
67
70
  * Test-suite, module-level-behavior, and config-artifact symbols represent a
68
71
  * whole file or configuration unit, and `extractor-miss` explicitly documents
69
- * that the extractor cannot locate a declaration. These entries legitimately
70
- * carry no generated coordinates, so coordinate refresh counts them as
71
- * unchanged instead of flagging them as failures.
72
+ * that the extractor cannot locate a declaration. Refresh still counts those
73
+ * entries as unchanged instead of failures, but it persists title-match or
74
+ * whole-file coordinates so proof-bearing executable symbols can resolve.
72
75
  */
73
76
  export { COARSE_GRANULARITY_REASONS };
74
77
  export function isCoarseGranularityAnchor(entry) {
75
78
  const reason = entry.granularity_reason;
76
79
  return isCoarseGranularityReason(reason);
77
80
  }
81
+ function extractedCoordinates(entry) {
82
+ const { sourceFile, sourceLine, sourceColumn, sourceEndLine, sourceEndColumn, } = entry;
83
+ return typeof sourceFile === "string" &&
84
+ typeof sourceLine === "number" &&
85
+ typeof sourceColumn === "number" &&
86
+ typeof sourceEndLine === "number" &&
87
+ typeof sourceEndColumn === "number"
88
+ ? {
89
+ sourceFile,
90
+ sourceLine,
91
+ sourceColumn,
92
+ sourceEndLine,
93
+ sourceEndColumn,
94
+ }
95
+ : null;
96
+ }
97
+ function readSourceText(sourceFile, workspaceRoot, deps) {
98
+ const absolute = path.isAbsolute(sourceFile)
99
+ ? sourceFile
100
+ : path.resolve(workspaceRoot, sourceFile);
101
+ if (!deps.existsSync(absolute))
102
+ return null;
103
+ try {
104
+ const content = deps.readFileSync(absolute, "utf8");
105
+ return typeof content === "string" ? content : null;
106
+ }
107
+ catch {
108
+ return null;
109
+ }
110
+ }
111
+ function fallbackCoarseCoordinates(entry, workspaceRoot, deps) {
112
+ if (!isCoarseGranularityAnchor(entry))
113
+ return null;
114
+ const sourceFile = typeof entry.sourceFile === "string" ? entry.sourceFile : undefined;
115
+ const title = typeof entry.title === "string" ? entry.title : "";
116
+ if (sourceFile === undefined)
117
+ return null;
118
+ const content = readSourceText(sourceFile, workspaceRoot, deps);
119
+ if (content === null)
120
+ return null;
121
+ return coarseCoordinateSpan(sourceFile, title, content);
122
+ }
123
+ /** Atomically replace `targetPath` with `content` via temp file + rename. */
124
+ function publishAtomically(targetPath, content, deps) {
125
+ const temporary = `${targetPath}.kibi-tmp-${process.pid}`;
126
+ try {
127
+ deps.writeFileSync(temporary, content, "utf8");
128
+ deps.renameSync(temporary, targetPath);
129
+ }
130
+ catch (error) {
131
+ try {
132
+ deps.unlinkSync(temporary);
133
+ }
134
+ catch {
135
+ // Temp cleanup is best effort; the original failure propagates.
136
+ }
137
+ throw error;
138
+ }
139
+ }
140
+ function manifestEntryIdentity(entry) {
141
+ const title = typeof entry.title === "string" ? entry.title : undefined;
142
+ const sourceFile = typeof entry.sourceFile === "string" ? entry.sourceFile : undefined;
143
+ const granularityReason = typeof entry.granularity_reason === "string"
144
+ ? entry.granularity_reason
145
+ : undefined;
146
+ return {
147
+ id: String(entry.id),
148
+ ...(title === undefined ? {} : { title }),
149
+ ...(sourceFile === undefined ? {} : { sourceFile }),
150
+ ...(granularityReason === undefined
151
+ ? {}
152
+ : { granularity_reason: granularityReason }),
153
+ };
154
+ }
78
155
  export async function refreshManifestCoordinates(
79
156
  // implements REQ-003
80
157
  manifestPath, workspaceRoot, deps) {
@@ -83,48 +160,52 @@ manifestPath, workspaceRoot, deps) {
83
160
  const rawContent = resolved.readFileSync(manifestPath, "utf8");
84
161
  const parsed = resolved.parseYAML(rawContent);
85
162
  if (!isRecord(parsed)) {
86
- console.warn(`Warning: symbols manifest ${manifestPath} is not a YAML object; skipping coordinate refresh`);
87
- return;
163
+ throw new Error(`symbols manifest ${manifestPath} is not a YAML object; refusing coordinate refresh`);
88
164
  }
89
165
  const rawSymbols = parsed.symbols;
90
166
  if (!Array.isArray(rawSymbols)) {
91
- console.warn(`Warning: symbols manifest ${manifestPath} has no symbols array; skipping coordinate refresh`);
92
- return;
167
+ throw new Error(`symbols manifest ${manifestPath} has no symbols array; refusing coordinate refresh`);
93
168
  }
94
169
  const before = rawSymbols.map((entry) => isRecord(entry)
95
170
  ? { ...entry }
96
171
  : {});
97
- const enriched = await resolved.enrichSymbolCoordinates(before, workspaceRoot);
98
- // Build coordinates map keyed by symbol id
99
- const coordinatesMap = {};
100
- for (const entry of enriched) {
101
- const id = typeof entry?.id === "string" ? entry.id : undefined;
102
- if (!id)
103
- continue;
104
- if (typeof entry.sourceFile === "string" &&
105
- typeof entry.sourceLine === "number" &&
106
- typeof entry.sourceColumn === "number" &&
107
- typeof entry.sourceEndLine === "number" &&
108
- typeof entry.sourceEndColumn === "number") {
109
- coordinatesMap[id] = {
110
- sourceFile: entry.sourceFile,
111
- sourceLine: entry.sourceLine,
112
- sourceColumn: entry.sourceColumn,
113
- sourceEndLine: entry.sourceEndLine,
114
- sourceEndColumn: entry.sourceEndColumn,
115
- };
172
+ let coordinatesPath = null;
173
+ if (shouldRefreshCoordinates) {
174
+ coordinatesPath =
175
+ resolved.resolveSymbolsManifestPaths(workspaceRoot).coordinatesPath;
176
+ if (resolved.existsSync(coordinatesPath)) {
177
+ const existing = parseCoordinateArtifact(String(resolved.readFileSync(coordinatesPath, "utf8")));
178
+ if (existing.status === "invalid") {
179
+ throw new Error(`Failed to parse coordinate artifact ${coordinatesPath}: ${existing.reason}`);
180
+ }
116
181
  }
117
182
  }
118
- // Optionally write the coordinate artifact to the coordinates path when explicitly requested
183
+ const enriched = await resolved.enrichSymbolCoordinates(before, workspaceRoot);
184
+ // Publish the generated coordinate artifact when explicitly requested.
185
+ // Parse and I/O failures are fatal so sync never advances cache state on a
186
+ // partially published compiler dependency. Symbols without extractable
187
+ // coordinates stay absent from the artifact; coverage keeps their gap visible.
188
+ let refreshedArtifactBytes = null;
119
189
  if (shouldRefreshCoordinates) {
120
- try {
121
- const coordinatesPath = resolved.resolveSymbolsManifestPaths(workspaceRoot).coordinatesPath;
122
- const artifactContent = resolved.writeCoordinateArtifact(coordinatesMap);
123
- resolved.writeFileSync(coordinatesPath, artifactContent, "utf8");
124
- }
125
- catch (err) {
126
- console.warn(`Warning: Failed to write symbol-coordinates artifact: ${String(err)}`);
190
+ const boundEntries = {};
191
+ for (const entry of enriched) {
192
+ const id = typeof entry?.id === "string" ? entry.id : undefined;
193
+ if (!id)
194
+ continue;
195
+ const span = extractedCoordinates(entry) ??
196
+ fallbackCoarseCoordinates(entry, workspaceRoot, resolved);
197
+ if (span === null)
198
+ continue;
199
+ const sourceText = readSourceText(span.sourceFile, workspaceRoot, resolved);
200
+ if (sourceText === null)
201
+ continue;
202
+ boundEntries[id] = {
203
+ ...span,
204
+ identityHash: coordinateIdentityHash(manifestEntryIdentity(entry)),
205
+ sourceHash: coordinateSourceHash(sourceText),
206
+ };
127
207
  }
208
+ refreshedArtifactBytes = resolved.writeCoordinateArtifact(boundEntries);
128
209
  }
129
210
  // Coordinates belong exclusively to the generated artifact. Always strip
130
211
  // them from the authored manifest so consecutive refreshes are idempotent.
@@ -162,8 +243,30 @@ manifestPath, workspaceRoot, deps) {
162
243
  sortKeys: false,
163
244
  });
164
245
  const nextContent = `${SYMBOLS_MANIFEST_COMMENT_BLOCK}${dumped}`;
165
- if (rawContent !== nextContent) {
166
- resolved.writeFileSync(manifestPath, nextContent, "utf8");
246
+ let manifestPublished = false;
247
+ try {
248
+ if (rawContent !== nextContent) {
249
+ publishAtomically(manifestPath, nextContent, resolved);
250
+ manifestPublished = true;
251
+ }
252
+ if (refreshedArtifactBytes !== null && coordinatesPath !== null) {
253
+ publishAtomically(coordinatesPath, refreshedArtifactBytes, resolved);
254
+ }
255
+ }
256
+ catch (error) {
257
+ if (manifestPublished) {
258
+ try {
259
+ const current = resolved.readFileSync(manifestPath, "utf8");
260
+ if (current !== nextContent) {
261
+ throw new Error(`symbol manifest changed after publication; refusing rollback: ${manifestPath}`);
262
+ }
263
+ publishAtomically(manifestPath, rawContent, resolved);
264
+ }
265
+ catch (rollbackError) {
266
+ throw new AggregateError([error, rollbackError], `Coordinate artifact publication failed and manifest rollback failed: ${manifestPath}`);
267
+ }
268
+ }
269
+ throw error;
167
270
  }
168
271
  console.log(`\u2713 Refreshed symbol coordinates in ${path.relative(workspaceRoot, manifestPath)} (refreshed=${refreshed}, unchanged=${unchanged}, failed=${failed})`);
169
272
  }
@@ -5,7 +5,16 @@ export interface PersistenceResult {
5
5
  relationshipCount: number;
6
6
  kbModified: boolean;
7
7
  }
8
- export declare function persistEntities(prolog: PrologProcess, results: ExtractionResult[], entityIds: Set<string>): Promise<{
8
+ /** Remove entities owned by changed/deleted source files before re-upserting. */
9
+ export declare function retractEntitiesForSources(prolog: PrologProcess, sourceFiles: readonly string[]): Promise<number>;
10
+ /** Remove an exact entity delta without scanning every indexed source. */
11
+ export declare function retractEntitiesById(prolog: PrologProcess, entityIds: readonly string[]): Promise<number>;
12
+ /** Clear outgoing inline relationships for entities whose payload changed. */
13
+ export declare function retractEntityRelationshipsById(prolog: PrologProcess, entityIds: readonly string[]): Promise<void>;
14
+ export declare function retractRelationships(prolog: PrologProcess, relationships: readonly ExtractedRelationship[]): Promise<number>;
15
+ export declare function persistEntities(prolog: PrologProcess, results: ExtractionResult[], entityIds: Set<string>, options?: {
16
+ loadExistingEntityIds?: boolean;
17
+ }): Promise<{
9
18
  entityCount: number;
10
19
  kbModified: boolean;
11
20
  }>;
@@ -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;AAmCD,wBAAsB,eAAe,CAEnC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,gBAAgB,EAAE,EAC3B,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GACrB,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC,CAwKvD;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,CA+K7D"}
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"}