@cleocode/core 2026.9.20 → 2026.9.22

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 (961) hide show
  1. package/dist/adapters/discovery.d.ts.map +1 -1
  2. package/dist/adapters/discovery.js +3 -10
  3. package/dist/adapters/discovery.js.map +1 -1
  4. package/dist/adrs/link-pipeline.js +2 -2
  5. package/dist/adrs/link-pipeline.js.map +1 -1
  6. package/dist/adrs/parse.js +3 -3
  7. package/dist/adrs/parse.js.map +1 -1
  8. package/dist/agents/invoke-meta-agent.d.ts.map +1 -1
  9. package/dist/agents/invoke-meta-agent.js +8 -4
  10. package/dist/agents/invoke-meta-agent.js.map +1 -1
  11. package/dist/agents/scaffold.d.ts.map +1 -1
  12. package/dist/agents/scaffold.js +0 -1
  13. package/dist/agents/scaffold.js.map +1 -1
  14. package/dist/bootstrap.d.ts +5 -1
  15. package/dist/bootstrap.d.ts.map +1 -1
  16. package/dist/bootstrap.js +45 -21
  17. package/dist/bootstrap.js.map +1 -1
  18. package/dist/cloud/crypto.d.ts +47 -0
  19. package/dist/cloud/crypto.d.ts.map +1 -0
  20. package/dist/cloud/crypto.js +223 -0
  21. package/dist/cloud/crypto.js.map +1 -0
  22. package/dist/cloud/http.d.ts +52 -0
  23. package/dist/cloud/http.d.ts.map +1 -0
  24. package/dist/cloud/http.js +98 -0
  25. package/dist/cloud/http.js.map +1 -0
  26. package/dist/cloud/index.d.ts +19 -0
  27. package/dist/cloud/index.d.ts.map +1 -0
  28. package/dist/cloud/index.js +19 -0
  29. package/dist/cloud/index.js.map +1 -0
  30. package/dist/cloud/journal.d.ts +169 -0
  31. package/dist/cloud/journal.d.ts.map +1 -0
  32. package/dist/cloud/journal.js +428 -0
  33. package/dist/cloud/journal.js.map +1 -0
  34. package/dist/cloud/keys.d.ts +213 -0
  35. package/dist/cloud/keys.d.ts.map +1 -0
  36. package/dist/cloud/keys.js +362 -0
  37. package/dist/cloud/keys.js.map +1 -0
  38. package/dist/cloud/manifest-check.d.ts +36 -0
  39. package/dist/cloud/manifest-check.d.ts.map +1 -0
  40. package/dist/cloud/manifest-check.js +70 -0
  41. package/dist/cloud/manifest-check.js.map +1 -0
  42. package/dist/cloud/projects.d.ts +13 -0
  43. package/dist/cloud/projects.d.ts.map +1 -0
  44. package/dist/cloud/projects.js +11 -0
  45. package/dist/cloud/projects.js.map +1 -0
  46. package/dist/cloud/signing.d.ts +105 -0
  47. package/dist/cloud/signing.d.ts.map +1 -0
  48. package/dist/cloud/signing.js +117 -0
  49. package/dist/cloud/signing.js.map +1 -0
  50. package/dist/cloud/streams.d.ts +6 -0
  51. package/dist/cloud/streams.d.ts.map +1 -0
  52. package/dist/cloud/streams.js +5 -0
  53. package/dist/cloud/streams.js.map +1 -0
  54. package/dist/decide/audit.d.ts +131 -0
  55. package/dist/decide/audit.d.ts.map +1 -0
  56. package/dist/decide/audit.js +98 -0
  57. package/dist/decide/audit.js.map +1 -0
  58. package/dist/decide/budget.d.ts +91 -0
  59. package/dist/decide/budget.d.ts.map +1 -0
  60. package/dist/decide/budget.js +194 -0
  61. package/dist/decide/budget.js.map +1 -0
  62. package/dist/decide/cache.d.ts +49 -0
  63. package/dist/decide/cache.d.ts.map +1 -0
  64. package/dist/decide/cache.js +87 -0
  65. package/dist/decide/cache.js.map +1 -0
  66. package/dist/decide/client.d.ts +103 -0
  67. package/dist/decide/client.d.ts.map +1 -0
  68. package/dist/decide/client.js +262 -0
  69. package/dist/decide/client.js.map +1 -0
  70. package/dist/decide/credentials.d.ts +159 -0
  71. package/dist/decide/credentials.d.ts.map +1 -0
  72. package/dist/decide/credentials.js +383 -0
  73. package/dist/decide/credentials.js.map +1 -0
  74. package/dist/decide/index.d.ts +18 -0
  75. package/dist/decide/index.d.ts.map +1 -0
  76. package/dist/decide/index.js +18 -0
  77. package/dist/decide/index.js.map +1 -0
  78. package/dist/decide/jev-wire.d.ts +155 -0
  79. package/dist/decide/jev-wire.d.ts.map +1 -0
  80. package/dist/decide/jev-wire.js +420 -0
  81. package/dist/decide/jev-wire.js.map +1 -0
  82. package/dist/decide/operations.d.ts +152 -0
  83. package/dist/decide/operations.d.ts.map +1 -0
  84. package/dist/decide/operations.js +199 -0
  85. package/dist/decide/operations.js.map +1 -0
  86. package/dist/decide/provider.d.ts +90 -0
  87. package/dist/decide/provider.d.ts.map +1 -0
  88. package/dist/decide/provider.js +43 -0
  89. package/dist/decide/provider.js.map +1 -0
  90. package/dist/decide/site.d.ts +148 -0
  91. package/dist/decide/site.d.ts.map +1 -0
  92. package/dist/decide/site.js +181 -0
  93. package/dist/decide/site.js.map +1 -0
  94. package/dist/decide/transport.d.ts +67 -0
  95. package/dist/decide/transport.d.ts.map +1 -0
  96. package/dist/decide/transport.js +350 -0
  97. package/dist/decide/transport.js.map +1 -0
  98. package/dist/dispatch/mutate-projection.d.ts.map +1 -1
  99. package/dist/dispatch/mutate-projection.js +5 -0
  100. package/dist/dispatch/mutate-projection.js.map +1 -1
  101. package/dist/docs/docs-update.d.ts.map +1 -1
  102. package/dist/docs/docs-update.js +25 -9
  103. package/dist/docs/docs-update.js.map +1 -1
  104. package/dist/docs/export-document.js +5963 -2406
  105. package/dist/docs/export-document.js.map +3 -3
  106. package/dist/docs/index.d.ts +2 -2
  107. package/dist/docs/index.d.ts.map +1 -1
  108. package/dist/docs/index.js +1 -1
  109. package/dist/docs/index.js.map +1 -1
  110. package/dist/docs/projection.d.ts.map +1 -1
  111. package/dist/docs/projection.js +2 -3
  112. package/dist/docs/projection.js.map +1 -1
  113. package/dist/docs/publish-pr.d.ts +69 -1
  114. package/dist/docs/publish-pr.d.ts.map +1 -1
  115. package/dist/docs/publish-pr.js +112 -10
  116. package/dist/docs/publish-pr.js.map +1 -1
  117. package/dist/doctor/db-substrate.d.ts +13 -8
  118. package/dist/doctor/db-substrate.d.ts.map +1 -1
  119. package/dist/doctor/db-substrate.js +39 -26
  120. package/dist/doctor/db-substrate.js.map +1 -1
  121. package/dist/doctor/index.d.ts +2 -0
  122. package/dist/doctor/index.d.ts.map +1 -1
  123. package/dist/doctor/index.js +1 -0
  124. package/dist/doctor/index.js.map +1 -1
  125. package/dist/doctor/knowledge.d.ts +16 -1
  126. package/dist/doctor/knowledge.d.ts.map +1 -1
  127. package/dist/doctor/knowledge.js +58 -32
  128. package/dist/doctor/knowledge.js.map +1 -1
  129. package/dist/doctor/nexus-schema-residency.d.ts +1 -1
  130. package/dist/doctor/nexus-schema-residency.d.ts.map +1 -1
  131. package/dist/doctor/nexus-schema-residency.js +3 -0
  132. package/dist/doctor/nexus-schema-residency.js.map +1 -1
  133. package/dist/doctor/project-identity.d.ts +44 -1
  134. package/dist/doctor/project-identity.d.ts.map +1 -1
  135. package/dist/doctor/project-identity.js +237 -10
  136. package/dist/doctor/project-identity.js.map +1 -1
  137. package/dist/doctor/projects.d.ts +170 -0
  138. package/dist/doctor/projects.d.ts.map +1 -0
  139. package/dist/doctor/projects.js +1075 -0
  140. package/dist/doctor/projects.js.map +1 -0
  141. package/dist/doctor/twin-collapse.d.ts +97 -0
  142. package/dist/doctor/twin-collapse.d.ts.map +1 -0
  143. package/dist/doctor/twin-collapse.js +168 -0
  144. package/dist/doctor/twin-collapse.js.map +1 -0
  145. package/dist/doctor/worktree-orphans.d.ts.map +1 -1
  146. package/dist/doctor/worktree-orphans.js +13 -29
  147. package/dist/doctor/worktree-orphans.js.map +1 -1
  148. package/dist/doctor/worktree-stores.d.ts +128 -0
  149. package/dist/doctor/worktree-stores.d.ts.map +1 -0
  150. package/dist/doctor/worktree-stores.js +374 -0
  151. package/dist/doctor/worktree-stores.js.map +1 -0
  152. package/dist/engine/engine-ops.d.ts +36 -6
  153. package/dist/engine/engine-ops.d.ts.map +1 -1
  154. package/dist/engine/engine-ops.js +115 -14
  155. package/dist/engine/engine-ops.js.map +1 -1
  156. package/dist/error-catalog.d.ts.map +1 -1
  157. package/dist/error-catalog.js +21 -0
  158. package/dist/error-catalog.js.map +1 -1
  159. package/dist/error-registry.d.ts.map +1 -1
  160. package/dist/error-registry.js +40 -0
  161. package/dist/error-registry.js.map +1 -1
  162. package/dist/gateway-client/generated/types.gen.d.ts +1 -1
  163. package/dist/gc/cleanup.d.ts.map +1 -1
  164. package/dist/gc/cleanup.js +32 -19
  165. package/dist/gc/cleanup.js.map +1 -1
  166. package/dist/git/bounded-git.d.ts +170 -0
  167. package/dist/git/bounded-git.d.ts.map +1 -0
  168. package/dist/git/bounded-git.js +371 -0
  169. package/dist/git/bounded-git.js.map +1 -0
  170. package/dist/git/work-tree.d.ts +20 -0
  171. package/dist/git/work-tree.d.ts.map +1 -1
  172. package/dist/git/work-tree.js +20 -2
  173. package/dist/git/work-tree.js.map +1 -1
  174. package/dist/hooks/handlers/session-hooks.d.ts +11 -26
  175. package/dist/hooks/handlers/session-hooks.d.ts.map +1 -1
  176. package/dist/hooks/handlers/session-hooks.js +18 -47
  177. package/dist/hooks/handlers/session-hooks.js.map +1 -1
  178. package/dist/hooks/payload-schemas.d.ts +2 -2
  179. package/dist/index.d.ts +8 -5
  180. package/dist/index.d.ts.map +1 -1
  181. package/dist/index.js +6 -3
  182. package/dist/index.js.map +1 -1
  183. package/dist/init/engine-ops.d.ts.map +1 -1
  184. package/dist/init/engine-ops.js +23 -1
  185. package/dist/init/engine-ops.js.map +1 -1
  186. package/dist/init.d.ts +158 -1
  187. package/dist/init.d.ts.map +1 -1
  188. package/dist/init.js +578 -53
  189. package/dist/init.js.map +1 -1
  190. package/dist/inject/index.d.ts.map +1 -1
  191. package/dist/inject/index.js +8 -3
  192. package/dist/inject/index.js.map +1 -1
  193. package/dist/injection.d.ts +55 -0
  194. package/dist/injection.d.ts.map +1 -1
  195. package/dist/injection.js +102 -6
  196. package/dist/injection.js.map +1 -1
  197. package/dist/internal.d.ts +11 -7
  198. package/dist/internal.d.ts.map +1 -1
  199. package/dist/internal.js +9 -5
  200. package/dist/internal.js.map +1 -1
  201. package/dist/issue/diagnostics.d.ts.map +1 -1
  202. package/dist/issue/diagnostics.js +2 -1
  203. package/dist/issue/diagnostics.js.map +1 -1
  204. package/dist/lib/concurrency.d.ts +25 -0
  205. package/dist/lib/concurrency.d.ts.map +1 -0
  206. package/dist/lib/concurrency.js +43 -0
  207. package/dist/lib/concurrency.js.map +1 -0
  208. package/dist/lib/index.d.ts +1 -0
  209. package/dist/lib/index.d.ts.map +1 -1
  210. package/dist/lib/index.js +1 -0
  211. package/dist/lib/index.js.map +1 -1
  212. package/dist/lifecycle/engine-ops.d.ts.map +1 -1
  213. package/dist/lifecycle/engine-ops.js +4 -2
  214. package/dist/lifecycle/engine-ops.js.map +1 -1
  215. package/dist/lifecycle/stage-guidance.d.ts +5 -0
  216. package/dist/lifecycle/stage-guidance.d.ts.map +1 -1
  217. package/dist/lifecycle/stage-guidance.js +14 -4
  218. package/dist/lifecycle/stage-guidance.js.map +1 -1
  219. package/dist/llm/catalog-cache.d.ts +3 -2
  220. package/dist/llm/catalog-cache.d.ts.map +1 -1
  221. package/dist/llm/catalog-cache.js +5 -5
  222. package/dist/llm/catalog-cache.js.map +1 -1
  223. package/dist/llm/credentials.d.ts +4 -4
  224. package/dist/llm/credentials.js +6 -6
  225. package/dist/llm/credentials.js.map +1 -1
  226. package/dist/llm/plugin-facade.js +4400 -1801
  227. package/dist/llm/plugin-facade.js.map +3 -3
  228. package/dist/llm/stable-device-id.d.ts.map +1 -1
  229. package/dist/llm/stable-device-id.js +3 -5
  230. package/dist/llm/stable-device-id.js.map +1 -1
  231. package/dist/memory/attention.js +31 -31
  232. package/dist/memory/attention.js.map +1 -1
  233. package/dist/memory/decision-contradiction.d.ts +152 -0
  234. package/dist/memory/decision-contradiction.d.ts.map +1 -0
  235. package/dist/memory/decision-contradiction.js +273 -0
  236. package/dist/memory/decision-contradiction.js.map +1 -0
  237. package/dist/memory/decisions.d.ts +42 -11
  238. package/dist/memory/decisions.d.ts.map +1 -1
  239. package/dist/memory/decisions.js +153 -56
  240. package/dist/memory/decisions.js.map +1 -1
  241. package/dist/memory/dialectic-evaluator.d.ts +7 -0
  242. package/dist/memory/dialectic-evaluator.d.ts.map +1 -1
  243. package/dist/memory/dialectic-evaluator.js +23 -8
  244. package/dist/memory/dialectic-evaluator.js.map +1 -1
  245. package/dist/memory/dispatch-trace-format.d.ts +39 -0
  246. package/dist/memory/dispatch-trace-format.d.ts.map +1 -0
  247. package/dist/memory/dispatch-trace-format.js +54 -0
  248. package/dist/memory/dispatch-trace-format.js.map +1 -0
  249. package/dist/memory/dispatch-trace.d.ts.map +1 -1
  250. package/dist/memory/dispatch-trace.js +1 -27
  251. package/dist/memory/dispatch-trace.js.map +1 -1
  252. package/dist/memory/engine-compat.d.ts +2 -0
  253. package/dist/memory/engine-compat.d.ts.map +1 -1
  254. package/dist/memory/engine-compat.js +1 -0
  255. package/dist/memory/engine-compat.js.map +1 -1
  256. package/dist/memory/import-from-provider.js +3 -3
  257. package/dist/memory/import-from-provider.js.map +1 -1
  258. package/dist/memory/learnings.d.ts +2 -2
  259. package/dist/memory/observation-type-decision.d.ts +96 -0
  260. package/dist/memory/observation-type-decision.d.ts.map +1 -0
  261. package/dist/memory/observation-type-decision.js +218 -0
  262. package/dist/memory/observation-type-decision.js.map +1 -0
  263. package/dist/memory/redaction.js +2 -0
  264. package/dist/memory/redaction.js.map +1 -1
  265. package/dist/memory/retrieval/build-retrieval-bundle.d.ts +9 -2
  266. package/dist/memory/retrieval/build-retrieval-bundle.d.ts.map +1 -1
  267. package/dist/memory/retrieval/build-retrieval-bundle.js +42 -11
  268. package/dist/memory/retrieval/build-retrieval-bundle.js.map +1 -1
  269. package/dist/memory/retrieval/get-current-session-id.d.ts +5 -0
  270. package/dist/memory/retrieval/get-current-session-id.d.ts.map +1 -1
  271. package/dist/memory/retrieval/get-current-session-id.js +7 -2
  272. package/dist/memory/retrieval/get-current-session-id.js.map +1 -1
  273. package/dist/memory/retrieval/observe.d.ts.map +1 -1
  274. package/dist/memory/retrieval/observe.js +30 -29
  275. package/dist/memory/retrieval/observe.js.map +1 -1
  276. package/dist/nexus/analyze-orchestrator.d.ts +38 -0
  277. package/dist/nexus/analyze-orchestrator.d.ts.map +1 -1
  278. package/dist/nexus/analyze-orchestrator.js +136 -48
  279. package/dist/nexus/analyze-orchestrator.js.map +1 -1
  280. package/dist/nexus/assessment-projection.d.ts +76 -0
  281. package/dist/nexus/assessment-projection.d.ts.map +1 -0
  282. package/dist/nexus/assessment-projection.js +143 -0
  283. package/dist/nexus/assessment-projection.js.map +1 -0
  284. package/dist/nexus/assessment-store.d.ts +14 -2
  285. package/dist/nexus/assessment-store.d.ts.map +1 -1
  286. package/dist/nexus/assessment-store.js +21 -3
  287. package/dist/nexus/assessment-store.js.map +1 -1
  288. package/dist/nexus/checkout-nonce.d.ts +48 -0
  289. package/dist/nexus/checkout-nonce.d.ts.map +1 -0
  290. package/dist/nexus/checkout-nonce.js +84 -0
  291. package/dist/nexus/checkout-nonce.js.map +1 -0
  292. package/dist/nexus/devices.d.ts +93 -0
  293. package/dist/nexus/devices.d.ts.map +1 -0
  294. package/dist/nexus/devices.js +141 -0
  295. package/dist/nexus/devices.js.map +1 -0
  296. package/dist/nexus/freshness.d.ts.map +1 -1
  297. package/dist/nexus/freshness.js +25 -6
  298. package/dist/nexus/freshness.js.map +1 -1
  299. package/dist/nexus/git-state.d.ts +225 -0
  300. package/dist/nexus/git-state.d.ts.map +1 -0
  301. package/dist/nexus/git-state.js +677 -0
  302. package/dist/nexus/git-state.js.map +1 -0
  303. package/dist/nexus/graph-manifest.d.ts +20 -4
  304. package/dist/nexus/graph-manifest.d.ts.map +1 -1
  305. package/dist/nexus/graph-manifest.js +40 -5
  306. package/dist/nexus/graph-manifest.js.map +1 -1
  307. package/dist/nexus/identity.d.ts +68 -23
  308. package/dist/nexus/identity.d.ts.map +1 -1
  309. package/dist/nexus/identity.js +99 -22
  310. package/dist/nexus/identity.js.map +1 -1
  311. package/dist/nexus/index.d.ts +5 -2
  312. package/dist/nexus/index.d.ts.map +1 -1
  313. package/dist/nexus/index.js +10 -4
  314. package/dist/nexus/index.js.map +1 -1
  315. package/dist/nexus/knowledge.d.ts +5 -0
  316. package/dist/nexus/knowledge.d.ts.map +1 -1
  317. package/dist/nexus/knowledge.js +40 -5
  318. package/dist/nexus/knowledge.js.map +1 -1
  319. package/dist/nexus/legacy-alias.d.ts +60 -0
  320. package/dist/nexus/legacy-alias.d.ts.map +1 -0
  321. package/dist/nexus/legacy-alias.js +68 -0
  322. package/dist/nexus/legacy-alias.js.map +1 -0
  323. package/dist/nexus/migrate-json-to-sqlite.js +2 -2
  324. package/dist/nexus/migrate-json-to-sqlite.js.map +1 -1
  325. package/dist/nexus/ops.d.ts +1 -0
  326. package/dist/nexus/ops.d.ts.map +1 -1
  327. package/dist/nexus/path-map.d.ts +264 -20
  328. package/dist/nexus/path-map.d.ts.map +1 -1
  329. package/dist/nexus/path-map.js +580 -44
  330. package/dist/nexus/path-map.js.map +1 -1
  331. package/dist/nexus/projects-clean.d.ts +9 -1
  332. package/dist/nexus/projects-clean.d.ts.map +1 -1
  333. package/dist/nexus/projects-clean.js +126 -14
  334. package/dist/nexus/projects-clean.js.map +1 -1
  335. package/dist/nexus/projects-scan.d.ts +56 -1
  336. package/dist/nexus/projects-scan.d.ts.map +1 -1
  337. package/dist/nexus/projects-scan.js +144 -3
  338. package/dist/nexus/projects-scan.js.map +1 -1
  339. package/dist/nexus/registry-hygiene.d.ts +18 -2
  340. package/dist/nexus/registry-hygiene.d.ts.map +1 -1
  341. package/dist/nexus/registry-hygiene.js +37 -11
  342. package/dist/nexus/registry-hygiene.js.map +1 -1
  343. package/dist/nexus/registry-roots.d.ts +47 -0
  344. package/dist/nexus/registry-roots.d.ts.map +1 -0
  345. package/dist/nexus/registry-roots.js +79 -0
  346. package/dist/nexus/registry-roots.js.map +1 -0
  347. package/dist/nexus/registry.d.ts +50 -9
  348. package/dist/nexus/registry.d.ts.map +1 -1
  349. package/dist/nexus/registry.js +311 -156
  350. package/dist/nexus/registry.js.map +1 -1
  351. package/dist/nexus/stored-roots.d.ts +171 -0
  352. package/dist/nexus/stored-roots.d.ts.map +1 -0
  353. package/dist/nexus/stored-roots.js +253 -0
  354. package/dist/nexus/stored-roots.js.map +1 -0
  355. package/dist/nexus/transfer.d.ts.map +1 -1
  356. package/dist/nexus/transfer.js +3 -0
  357. package/dist/nexus/transfer.js.map +1 -1
  358. package/dist/nexus/user-profile-hygiene.d.ts +168 -0
  359. package/dist/nexus/user-profile-hygiene.d.ts.map +1 -0
  360. package/dist/nexus/user-profile-hygiene.js +305 -0
  361. package/dist/nexus/user-profile-hygiene.js.map +1 -0
  362. package/dist/nexus/user-profile.d.ts +53 -2
  363. package/dist/nexus/user-profile.d.ts.map +1 -1
  364. package/dist/nexus/user-profile.js +106 -4
  365. package/dist/nexus/user-profile.js.map +1 -1
  366. package/dist/orchestrate/lifecycle-ops.d.ts.map +1 -1
  367. package/dist/orchestrate/lifecycle-ops.js +4 -1
  368. package/dist/orchestrate/lifecycle-ops.js.map +1 -1
  369. package/dist/orchestrate/pivot.d.ts.map +1 -1
  370. package/dist/orchestrate/pivot.js +5 -1
  371. package/dist/orchestrate/pivot.js.map +1 -1
  372. package/dist/orchestrate/plan.d.ts.map +1 -1
  373. package/dist/orchestrate/plan.js +5 -2
  374. package/dist/orchestrate/plan.js.map +1 -1
  375. package/dist/orchestrate/query-ops.d.ts +7 -2
  376. package/dist/orchestrate/query-ops.d.ts.map +1 -1
  377. package/dist/orchestrate/query-ops.js +17 -6
  378. package/dist/orchestrate/query-ops.js.map +1 -1
  379. package/dist/orchestrate/spawn-ops.d.ts +12 -0
  380. package/dist/orchestrate/spawn-ops.d.ts.map +1 -1
  381. package/dist/orchestrate/spawn-ops.js +157 -71
  382. package/dist/orchestrate/spawn-ops.js.map +1 -1
  383. package/dist/orchestration/bootstrap.d.ts.map +1 -1
  384. package/dist/orchestration/bootstrap.js +4 -2
  385. package/dist/orchestration/bootstrap.js.map +1 -1
  386. package/dist/orchestration/classify-readiness.d.ts +37 -1
  387. package/dist/orchestration/classify-readiness.d.ts.map +1 -1
  388. package/dist/orchestration/classify-readiness.js +48 -19
  389. package/dist/orchestration/classify-readiness.js.map +1 -1
  390. package/dist/orchestration/index.d.ts +4 -2
  391. package/dist/orchestration/index.d.ts.map +1 -1
  392. package/dist/orchestration/index.js +6 -4
  393. package/dist/orchestration/index.js.map +1 -1
  394. package/dist/orchestration/lead-rollup.d.ts +8 -5
  395. package/dist/orchestration/lead-rollup.d.ts.map +1 -1
  396. package/dist/orchestration/lead-rollup.js +32 -15
  397. package/dist/orchestration/lead-rollup.js.map +1 -1
  398. package/dist/orchestration/owner-decision-readiness.d.ts +88 -0
  399. package/dist/orchestration/owner-decision-readiness.d.ts.map +1 -0
  400. package/dist/orchestration/owner-decision-readiness.js +152 -0
  401. package/dist/orchestration/owner-decision-readiness.js.map +1 -0
  402. package/dist/orchestration/parallel.d.ts.map +1 -1
  403. package/dist/orchestration/parallel.js +10 -17
  404. package/dist/orchestration/parallel.js.map +1 -1
  405. package/dist/orchestration/psyche-memory-budget.d.ts +105 -0
  406. package/dist/orchestration/psyche-memory-budget.d.ts.map +1 -0
  407. package/dist/orchestration/psyche-memory-budget.js +383 -0
  408. package/dist/orchestration/psyche-memory-budget.js.map +1 -0
  409. package/dist/orchestration/spawn-prompt.d.ts +16 -2
  410. package/dist/orchestration/spawn-prompt.d.ts.map +1 -1
  411. package/dist/orchestration/spawn-prompt.js +144 -181
  412. package/dist/orchestration/spawn-prompt.js.map +1 -1
  413. package/dist/orchestration/spawn.d.ts +7 -0
  414. package/dist/orchestration/spawn.d.ts.map +1 -1
  415. package/dist/orchestration/spawn.js +1 -0
  416. package/dist/orchestration/spawn.js.map +1 -1
  417. package/dist/orchestration/status.d.ts +8 -3
  418. package/dist/orchestration/status.d.ts.map +1 -1
  419. package/dist/orchestration/status.js +9 -6
  420. package/dist/orchestration/status.js.map +1 -1
  421. package/dist/orchestration/wave-topic.d.ts +54 -0
  422. package/dist/orchestration/wave-topic.d.ts.map +1 -0
  423. package/dist/orchestration/wave-topic.js +68 -0
  424. package/dist/orchestration/wave-topic.js.map +1 -0
  425. package/dist/orchestration/waves.d.ts +47 -8
  426. package/dist/orchestration/waves.d.ts.map +1 -1
  427. package/dist/orchestration/waves.js +152 -43
  428. package/dist/orchestration/waves.js.map +1 -1
  429. package/dist/paths.d.ts +24 -8
  430. package/dist/paths.d.ts.map +1 -1
  431. package/dist/paths.js +135 -71
  432. package/dist/paths.js.map +1 -1
  433. package/dist/phases/index.d.ts.map +1 -1
  434. package/dist/phases/index.js +6 -2
  435. package/dist/phases/index.js.map +1 -1
  436. package/dist/platform.d.ts +6 -1
  437. package/dist/platform.d.ts.map +1 -1
  438. package/dist/platform.js +8 -19
  439. package/dist/platform.js.map +1 -1
  440. package/dist/project-info.d.ts +18 -0
  441. package/dist/project-info.d.ts.map +1 -1
  442. package/dist/project-info.js +29 -1
  443. package/dist/project-info.js.map +1 -1
  444. package/dist/project-lifecycle.d.ts +91 -32
  445. package/dist/project-lifecycle.d.ts.map +1 -1
  446. package/dist/project-lifecycle.js +639 -75
  447. package/dist/project-lifecycle.js.map +1 -1
  448. package/dist/project-scope.d.ts +104 -4
  449. package/dist/project-scope.d.ts.map +1 -1
  450. package/dist/project-scope.js +263 -13
  451. package/dist/project-scope.js.map +1 -1
  452. package/dist/project-tombstone.d.ts +111 -0
  453. package/dist/project-tombstone.d.ts.map +1 -0
  454. package/dist/project-tombstone.js +220 -0
  455. package/dist/project-tombstone.js.map +1 -0
  456. package/dist/release/artifacts.d.ts.map +1 -1
  457. package/dist/release/artifacts.js +14 -9
  458. package/dist/release/artifacts.js.map +1 -1
  459. package/dist/release/ci-evidence.d.ts +233 -0
  460. package/dist/release/ci-evidence.d.ts.map +1 -0
  461. package/dist/release/ci-evidence.js +668 -0
  462. package/dist/release/ci-evidence.js.map +1 -0
  463. package/dist/release/engine-ops.d.ts.map +1 -1
  464. package/dist/release/engine-ops.js +3 -3
  465. package/dist/release/engine-ops.js.map +1 -1
  466. package/dist/release/github-pr.d.ts +30 -0
  467. package/dist/release/github-pr.d.ts.map +1 -1
  468. package/dist/release/github-pr.js +40 -0
  469. package/dist/release/github-pr.js.map +1 -1
  470. package/dist/release/plan.d.ts.map +1 -1
  471. package/dist/release/plan.js +11 -7
  472. package/dist/release/plan.js.map +1 -1
  473. package/dist/release/pr-evidence.d.ts +38 -0
  474. package/dist/release/pr-evidence.d.ts.map +1 -1
  475. package/dist/release/pr-evidence.js +79 -15
  476. package/dist/release/pr-evidence.js.map +1 -1
  477. package/dist/release/reconcile.d.ts.map +1 -1
  478. package/dist/release/reconcile.js +3 -2
  479. package/dist/release/reconcile.js.map +1 -1
  480. package/dist/release/release-manifest.d.ts +2 -1
  481. package/dist/release/release-manifest.d.ts.map +1 -1
  482. package/dist/release/release-manifest.js +6 -5
  483. package/dist/release/release-manifest.js.map +1 -1
  484. package/dist/render/nexus/graph/index.d.ts +4 -0
  485. package/dist/render/nexus/graph/index.d.ts.map +1 -1
  486. package/dist/render/nexus/graph/index.js +57 -0
  487. package/dist/render/nexus/graph/index.js.map +1 -1
  488. package/dist/resources/spawn-wrapper.d.ts +8 -1
  489. package/dist/resources/spawn-wrapper.d.ts.map +1 -1
  490. package/dist/resources/spawn-wrapper.js +42 -5
  491. package/dist/resources/spawn-wrapper.js.map +1 -1
  492. package/dist/routing/build-command-groups.d.ts.map +1 -1
  493. package/dist/routing/build-command-groups.js +1 -0
  494. package/dist/routing/build-command-groups.js.map +1 -1
  495. package/dist/sagas/index.d.ts +1 -1
  496. package/dist/sagas/index.d.ts.map +1 -1
  497. package/dist/sagas/index.js +1 -1
  498. package/dist/sagas/index.js.map +1 -1
  499. package/dist/sagas/reconcile.d.ts +24 -4
  500. package/dist/sagas/reconcile.d.ts.map +1 -1
  501. package/dist/sagas/reconcile.js +226 -100
  502. package/dist/sagas/reconcile.js.map +1 -1
  503. package/dist/scaffold/ensure-config.d.ts.map +1 -1
  504. package/dist/scaffold/ensure-config.js +31 -1
  505. package/dist/scaffold/ensure-config.js.map +1 -1
  506. package/dist/scaffold/project-identity.d.ts +2 -8
  507. package/dist/scaffold/project-identity.d.ts.map +1 -1
  508. package/dist/scaffold/project-identity.js +5 -21
  509. package/dist/scaffold/project-identity.js.map +1 -1
  510. package/dist/security/input-sanitization.d.ts +9 -1
  511. package/dist/security/input-sanitization.d.ts.map +1 -1
  512. package/dist/security/input-sanitization.js +20 -3
  513. package/dist/security/input-sanitization.js.map +1 -1
  514. package/dist/selfimprove/fix-gen.js +4409 -1810
  515. package/dist/selfimprove/fix-gen.js.map +3 -3
  516. package/dist/sentient/propose-tick.d.ts.map +1 -1
  517. package/dist/sentient/propose-tick.js +4 -2
  518. package/dist/sentient/propose-tick.js.map +1 -1
  519. package/dist/sequence/index.d.ts.map +1 -1
  520. package/dist/sequence/index.js +6 -23
  521. package/dist/sequence/index.js.map +1 -1
  522. package/dist/session/engine-ops.d.ts +15 -0
  523. package/dist/session/engine-ops.d.ts.map +1 -1
  524. package/dist/session/engine-ops.js +146 -22
  525. package/dist/session/engine-ops.js.map +1 -1
  526. package/dist/sessions/assumptions.d.ts.map +1 -1
  527. package/dist/sessions/assumptions.js +7 -4
  528. package/dist/sessions/assumptions.js.map +1 -1
  529. package/dist/sessions/briefing.d.ts +23 -0
  530. package/dist/sessions/briefing.d.ts.map +1 -1
  531. package/dist/sessions/briefing.js +59 -9
  532. package/dist/sessions/briefing.js.map +1 -1
  533. package/dist/sessions/decisions.d.ts +38 -3
  534. package/dist/sessions/decisions.d.ts.map +1 -1
  535. package/dist/sessions/decisions.js +235 -21
  536. package/dist/sessions/decisions.js.map +1 -1
  537. package/dist/sessions/drift-watchdog.d.ts.map +1 -1
  538. package/dist/sessions/drift-watchdog.js +8 -5
  539. package/dist/sessions/drift-watchdog.js.map +1 -1
  540. package/dist/sessions/focus-state-store.d.ts +89 -1
  541. package/dist/sessions/focus-state-store.d.ts.map +1 -1
  542. package/dist/sessions/focus-state-store.js +97 -1
  543. package/dist/sessions/focus-state-store.js.map +1 -1
  544. package/dist/sessions/index.d.ts +2 -2
  545. package/dist/sessions/index.d.ts.map +1 -1
  546. package/dist/sessions/index.js +34 -5
  547. package/dist/sessions/index.js.map +1 -1
  548. package/dist/sessions/session-drift.d.ts.map +1 -1
  549. package/dist/sessions/session-drift.js +4 -3
  550. package/dist/sessions/session-drift.js.map +1 -1
  551. package/dist/sessions/session-end-snapshot-entry.d.ts +26 -0
  552. package/dist/sessions/session-end-snapshot-entry.d.ts.map +1 -0
  553. package/dist/sessions/session-end-snapshot-entry.js +59 -0
  554. package/dist/sessions/session-end-snapshot-entry.js.map +1 -0
  555. package/dist/sessions/session-end-snapshot.d.ts +114 -0
  556. package/dist/sessions/session-end-snapshot.d.ts.map +1 -0
  557. package/dist/sessions/session-end-snapshot.js +446 -0
  558. package/dist/sessions/session-end-snapshot.js.map +1 -0
  559. package/dist/sessions/session-manifest-mirror.d.ts.map +1 -1
  560. package/dist/sessions/session-manifest-mirror.js +10 -17
  561. package/dist/sessions/session-manifest-mirror.js.map +1 -1
  562. package/dist/sessions/session-switch.d.ts.map +1 -1
  563. package/dist/sessions/session-switch.js +5 -3
  564. package/dist/sessions/session-switch.js.map +1 -1
  565. package/dist/sessions/snapshot.d.ts.map +1 -1
  566. package/dist/sessions/snapshot.js +5 -4
  567. package/dist/sessions/snapshot.js.map +1 -1
  568. package/dist/sessions/terminal-identity.d.ts +169 -0
  569. package/dist/sessions/terminal-identity.d.ts.map +1 -0
  570. package/dist/sessions/terminal-identity.js +273 -0
  571. package/dist/sessions/terminal-identity.js.map +1 -0
  572. package/dist/setup/sections/verification.d.ts +1 -1
  573. package/dist/setup/sections/verification.d.ts.map +1 -1
  574. package/dist/setup/sections/verification.js +11 -15
  575. package/dist/setup/sections/verification.js.map +1 -1
  576. package/dist/skills/discovery.d.ts +20 -3
  577. package/dist/skills/discovery.d.ts.map +1 -1
  578. package/dist/skills/discovery.js +41 -4
  579. package/dist/skills/discovery.js.map +1 -1
  580. package/dist/skills/dispatch.d.ts +5 -2
  581. package/dist/skills/dispatch.d.ts.map +1 -1
  582. package/dist/skills/dispatch.js +5 -2
  583. package/dist/skills/dispatch.js.map +1 -1
  584. package/dist/skills/doctor.d.ts.map +1 -1
  585. package/dist/skills/doctor.js +5 -1
  586. package/dist/skills/doctor.js.map +1 -1
  587. package/dist/skills/federated-search.js +2 -2
  588. package/dist/skills/federated-search.js.map +1 -1
  589. package/dist/skills/index.d.ts +3 -3
  590. package/dist/skills/index.d.ts.map +1 -1
  591. package/dist/skills/index.js +1 -1
  592. package/dist/skills/index.js.map +1 -1
  593. package/dist/skills/migration.d.ts +5 -5
  594. package/dist/skills/migration.d.ts.map +1 -1
  595. package/dist/skills/migration.js +7 -9
  596. package/dist/skills/migration.js.map +1 -1
  597. package/dist/skills/orchestrator/startup.d.ts.map +1 -1
  598. package/dist/skills/orchestrator/startup.js +14 -7
  599. package/dist/skills/orchestrator/startup.js.map +1 -1
  600. package/dist/skills/prune-bundled.d.ts +267 -0
  601. package/dist/skills/prune-bundled.d.ts.map +1 -0
  602. package/dist/skills/prune-bundled.js +536 -0
  603. package/dist/skills/prune-bundled.js.map +1 -0
  604. package/dist/skills/skill-paths.d.ts +30 -3
  605. package/dist/skills/skill-paths.d.ts.map +1 -1
  606. package/dist/skills/skill-paths.js +28 -9
  607. package/dist/skills/skill-paths.js.map +1 -1
  608. package/dist/skills/skill-root.d.ts +60 -11
  609. package/dist/skills/skill-root.d.ts.map +1 -1
  610. package/dist/skills/skill-root.js +100 -14
  611. package/dist/skills/skill-root.js.map +1 -1
  612. package/dist/skills/skills-guard.js +5 -5
  613. package/dist/skills/skills-guard.js.map +1 -1
  614. package/dist/skills/types.d.ts +32 -1
  615. package/dist/skills/types.d.ts.map +1 -1
  616. package/dist/skills/types.js +17 -34
  617. package/dist/skills/types.js.map +1 -1
  618. package/dist/spawn/agent-identity.d.ts +51 -2
  619. package/dist/spawn/agent-identity.d.ts.map +1 -1
  620. package/dist/spawn/agent-identity.js +89 -26
  621. package/dist/spawn/agent-identity.js.map +1 -1
  622. package/dist/spawn/branch-lock.d.ts.map +1 -1
  623. package/dist/spawn/branch-lock.js +80 -79
  624. package/dist/spawn/branch-lock.js.map +1 -1
  625. package/dist/spawn/index.d.ts +2 -2
  626. package/dist/spawn/index.d.ts.map +1 -1
  627. package/dist/spawn/index.js +1 -1
  628. package/dist/spawn/index.js.map +1 -1
  629. package/dist/spawn/worktree-lock-holder.d.ts +37 -0
  630. package/dist/spawn/worktree-lock-holder.d.ts.map +1 -0
  631. package/dist/spawn/worktree-lock-holder.js +41 -0
  632. package/dist/spawn/worktree-lock-holder.js.map +1 -0
  633. package/dist/stats/index.d.ts.map +1 -1
  634. package/dist/stats/index.js +4 -2
  635. package/dist/stats/index.js.map +1 -1
  636. package/dist/sticky/convert.d.ts.map +1 -1
  637. package/dist/sticky/convert.js +16 -4
  638. package/dist/sticky/convert.js.map +1 -1
  639. package/dist/store/attachment-store.d.ts +14 -0
  640. package/dist/store/attachment-store.d.ts.map +1 -1
  641. package/dist/store/attachment-store.js +11 -1
  642. package/dist/store/attachment-store.js.map +1 -1
  643. package/dist/store/backup-inspect.d.ts +7 -3
  644. package/dist/store/backup-inspect.d.ts.map +1 -1
  645. package/dist/store/backup-inspect.js +18 -7
  646. package/dist/store/backup-inspect.js.map +1 -1
  647. package/dist/store/backup-sidecar.d.ts +60 -0
  648. package/dist/store/backup-sidecar.d.ts.map +1 -0
  649. package/dist/store/backup-sidecar.js +96 -0
  650. package/dist/store/backup-sidecar.js.map +1 -0
  651. package/dist/store/data-accessor.d.ts +1 -1
  652. package/dist/store/data-accessor.d.ts.map +1 -1
  653. package/dist/store/data-accessor.js +6 -6
  654. package/dist/store/data-accessor.js.map +1 -1
  655. package/dist/store/data-safety-central.d.ts +13 -4
  656. package/dist/store/data-safety-central.d.ts.map +1 -1
  657. package/dist/store/data-safety-central.js +31 -4
  658. package/dist/store/data-safety-central.js.map +1 -1
  659. package/dist/store/dual-scope-db.d.ts.map +1 -1
  660. package/dist/store/dual-scope-db.js +10 -0
  661. package/dist/store/dual-scope-db.js.map +1 -1
  662. package/dist/store/exodus/__fixtures__/representative-fixture.d.ts.map +1 -1
  663. package/dist/store/exodus/__fixtures__/representative-fixture.js +4 -0
  664. package/dist/store/exodus/__fixtures__/representative-fixture.js.map +1 -1
  665. package/dist/store/exodus/migrate.js +1 -1
  666. package/dist/store/exodus/migrate.js.map +1 -1
  667. package/dist/store/exodus/reconcile.js +1 -1
  668. package/dist/store/exodus/reconcile.js.map +1 -1
  669. package/dist/store/exodus/runtime-targets.d.ts +4 -3
  670. package/dist/store/exodus/runtime-targets.d.ts.map +1 -1
  671. package/dist/store/exodus/runtime-targets.js +4 -3
  672. package/dist/store/exodus/runtime-targets.js.map +1 -1
  673. package/dist/store/import-logging.d.ts.map +1 -1
  674. package/dist/store/import-logging.js +5 -4
  675. package/dist/store/import-logging.js.map +1 -1
  676. package/dist/store/legacy-tasks-lineage.d.ts.map +1 -1
  677. package/dist/store/legacy-tasks-lineage.js +2 -7
  678. package/dist/store/legacy-tasks-lineage.js.map +1 -1
  679. package/dist/store/lock.d.ts +1 -0
  680. package/dist/store/lock.d.ts.map +1 -1
  681. package/dist/store/lock.js +1 -0
  682. package/dist/store/lock.js.map +1 -1
  683. package/dist/store/memory-accessor.d.ts +8 -3
  684. package/dist/store/memory-accessor.d.ts.map +1 -1
  685. package/dist/store/memory-accessor.js +29 -13
  686. package/dist/store/memory-accessor.js.map +1 -1
  687. package/dist/store/memory-sqlite.d.ts.map +1 -1
  688. package/dist/store/memory-sqlite.js +5 -0
  689. package/dist/store/memory-sqlite.js.map +1 -1
  690. package/dist/store/open-cleo-db.d.ts.map +1 -1
  691. package/dist/store/open-cleo-db.js +11 -6
  692. package/dist/store/open-cleo-db.js.map +1 -1
  693. package/dist/store/portable-bundle-relocate.d.ts +13 -8
  694. package/dist/store/portable-bundle-relocate.d.ts.map +1 -1
  695. package/dist/store/portable-bundle-relocate.js +75 -31
  696. package/dist/store/portable-bundle-relocate.js.map +1 -1
  697. package/dist/store/portable-bundle-scan.d.ts.map +1 -1
  698. package/dist/store/portable-bundle-scan.js +2 -1
  699. package/dist/store/portable-bundle-scan.js.map +1 -1
  700. package/dist/store/portable-bundle.d.ts.map +1 -1
  701. package/dist/store/portable-bundle.js +7 -3
  702. package/dist/store/portable-bundle.js.map +1 -1
  703. package/dist/store/pre-repair-snapshot.d.ts +77 -0
  704. package/dist/store/pre-repair-snapshot.d.ts.map +1 -0
  705. package/dist/store/pre-repair-snapshot.js +122 -0
  706. package/dist/store/pre-repair-snapshot.js.map +1 -0
  707. package/dist/store/regenerators.d.ts +2 -1
  708. package/dist/store/regenerators.d.ts.map +1 -1
  709. package/dist/store/regenerators.js +17 -3
  710. package/dist/store/regenerators.js.map +1 -1
  711. package/dist/store/relocated-store-guard.d.ts +71 -0
  712. package/dist/store/relocated-store-guard.d.ts.map +1 -0
  713. package/dist/store/relocated-store-guard.js +138 -0
  714. package/dist/store/relocated-store-guard.js.map +1 -0
  715. package/dist/store/safety-data-accessor.d.ts +2 -2
  716. package/dist/store/safety-data-accessor.d.ts.map +1 -1
  717. package/dist/store/safety-data-accessor.js +2 -2
  718. package/dist/store/safety-data-accessor.js.map +1 -1
  719. package/dist/store/schema/attachments.d.ts +2 -2
  720. package/dist/store/schema/audit.d.ts +5 -5
  721. package/dist/store/schema/background-jobs.d.ts +1 -1
  722. package/dist/store/schema/cleo-global/models-catalog.d.ts +1 -1
  723. package/dist/store/schema/cleo-global/nexus.d.ts +686 -0
  724. package/dist/store/schema/cleo-global/nexus.d.ts.map +1 -1
  725. package/dist/store/schema/cleo-global/nexus.js +175 -7
  726. package/dist/store/schema/cleo-global/nexus.js.map +1 -1
  727. package/dist/store/schema/cleo-global/skills.d.ts +2 -2
  728. package/dist/store/schema/cleo-project/audit.d.ts +5 -5
  729. package/dist/store/schema/cleo-project/docs.d.ts +3 -3
  730. package/dist/store/schema/cleo-project/lifecycle.d.ts +3 -3
  731. package/dist/store/schema/cleo-project/provenance-commits.d.ts +2 -2
  732. package/dist/store/schema/cleo-project/provenance-rest.d.ts +3 -3
  733. package/dist/store/schema/cleo-project/tasks-core-batch2.d.ts +1 -1
  734. package/dist/store/schema/cleo-project/tasks-core.d.ts +6 -6
  735. package/dist/store/schema/cleo-shared/brain.d.ts +26 -26
  736. package/dist/store/schema/lifecycle.d.ts +3 -3
  737. package/dist/store/schema/manifest.d.ts +1 -1
  738. package/dist/store/schema/memory-schema.d.ts +26 -26
  739. package/dist/store/schema/nexus-schema.d.ts +696 -2
  740. package/dist/store/schema/nexus-schema.d.ts.map +1 -1
  741. package/dist/store/schema/nexus-schema.js +175 -19
  742. package/dist/store/schema/nexus-schema.js.map +1 -1
  743. package/dist/store/schema/provenance/releases.d.ts +1 -1
  744. package/dist/store/schema/skills-schema.d.ts +2 -2
  745. package/dist/store/schema/tasks.d.ts +5 -5
  746. package/dist/store/session-binding-schema.d.ts +132 -0
  747. package/dist/store/session-binding-schema.d.ts.map +1 -0
  748. package/dist/store/session-binding-schema.js +53 -0
  749. package/dist/store/session-binding-schema.js.map +1 -0
  750. package/dist/store/session-store.d.ts +262 -4
  751. package/dist/store/session-store.d.ts.map +1 -1
  752. package/dist/store/session-store.js +486 -26
  753. package/dist/store/session-store.js.map +1 -1
  754. package/dist/store/skills-db.d.ts +17 -0
  755. package/dist/store/skills-db.d.ts.map +1 -1
  756. package/dist/store/skills-db.js +30 -0
  757. package/dist/store/skills-db.js.map +1 -1
  758. package/dist/store/snapshot-gate.d.ts +239 -0
  759. package/dist/store/snapshot-gate.d.ts.map +1 -0
  760. package/dist/store/snapshot-gate.js +401 -0
  761. package/dist/store/snapshot-gate.js.map +1 -0
  762. package/dist/store/split-brain-import.js +2 -2
  763. package/dist/store/split-brain-import.js.map +1 -1
  764. package/dist/store/sqlite-backup.d.ts +55 -13
  765. package/dist/store/sqlite-backup.d.ts.map +1 -1
  766. package/dist/store/sqlite-backup.js +414 -106
  767. package/dist/store/sqlite-backup.js.map +1 -1
  768. package/dist/store/sqlite-data-accessor.d.ts +15 -0
  769. package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
  770. package/dist/store/sqlite-data-accessor.js +73 -4
  771. package/dist/store/sqlite-data-accessor.js.map +1 -1
  772. package/dist/store/sqlite.d.ts +15 -1
  773. package/dist/store/sqlite.d.ts.map +1 -1
  774. package/dist/store/sqlite.js +75 -5
  775. package/dist/store/sqlite.js.map +1 -1
  776. package/dist/store/store-write-guard.d.ts +28 -0
  777. package/dist/store/store-write-guard.d.ts.map +1 -0
  778. package/dist/store/store-write-guard.js +50 -0
  779. package/dist/store/store-write-guard.js.map +1 -0
  780. package/dist/store/table-classification.d.ts +143 -0
  781. package/dist/store/table-classification.d.ts.map +1 -0
  782. package/dist/store/table-classification.js +1866 -0
  783. package/dist/store/table-classification.js.map +1 -0
  784. package/dist/store/task-version.d.ts +72 -0
  785. package/dist/store/task-version.d.ts.map +1 -0
  786. package/dist/store/task-version.js +93 -0
  787. package/dist/store/task-version.js.map +1 -0
  788. package/dist/store/tasks-schema.d.ts +1 -0
  789. package/dist/store/tasks-schema.d.ts.map +1 -1
  790. package/dist/store/tasks-schema.js +13 -0
  791. package/dist/store/tasks-schema.js.map +1 -1
  792. package/dist/store/tasks-sqlite.d.ts +10 -3
  793. package/dist/store/tasks-sqlite.d.ts.map +1 -1
  794. package/dist/store/tasks-sqlite.js +12 -3
  795. package/dist/store/tasks-sqlite.js.map +1 -1
  796. package/dist/store/twin-collapse.d.ts +320 -0
  797. package/dist/store/twin-collapse.d.ts.map +1 -0
  798. package/dist/store/twin-collapse.js +931 -0
  799. package/dist/store/twin-collapse.js.map +1 -0
  800. package/dist/store/umbrella-data-accessor.d.ts +2 -2
  801. package/dist/store/umbrella-data-accessor.d.ts.map +1 -1
  802. package/dist/store/umbrella-data-accessor.js +2 -2
  803. package/dist/store/umbrella-data-accessor.js.map +1 -1
  804. package/dist/store/validation-schemas.d.ts +63 -63
  805. package/dist/store/worktree-isolation-guard.d.ts +46 -24
  806. package/dist/store/worktree-isolation-guard.d.ts.map +1 -1
  807. package/dist/store/worktree-isolation-guard.js +71 -50
  808. package/dist/store/worktree-isolation-guard.js.map +1 -1
  809. package/dist/system/backup.d.ts.map +1 -1
  810. package/dist/system/backup.js +3 -67
  811. package/dist/system/backup.js.map +1 -1
  812. package/dist/system/cleo-link.d.ts +163 -0
  813. package/dist/system/cleo-link.d.ts.map +1 -0
  814. package/dist/system/cleo-link.js +246 -0
  815. package/dist/system/cleo-link.js.map +1 -0
  816. package/dist/system/dependencies.d.ts.map +1 -1
  817. package/dist/system/dependencies.js +3 -6
  818. package/dist/system/dependencies.js.map +1 -1
  819. package/dist/system/global-delivery.d.ts +205 -0
  820. package/dist/system/global-delivery.d.ts.map +1 -0
  821. package/dist/system/global-delivery.js +320 -0
  822. package/dist/system/global-delivery.js.map +1 -0
  823. package/dist/system/health.d.ts.map +1 -1
  824. package/dist/system/health.js +29 -6
  825. package/dist/system/health.js.map +1 -1
  826. package/dist/system/inject-generate.d.ts.map +1 -1
  827. package/dist/system/inject-generate.js +4 -4
  828. package/dist/system/inject-generate.js.map +1 -1
  829. package/dist/system/project-health.d.ts.map +1 -1
  830. package/dist/system/project-health.js +1 -20
  831. package/dist/system/project-health.js.map +1 -1
  832. package/dist/system/runtime.d.ts.map +1 -1
  833. package/dist/system/runtime.js +2 -12
  834. package/dist/system/runtime.js.map +1 -1
  835. package/dist/system/safestop.d.ts.map +1 -1
  836. package/dist/system/safestop.js +5 -2
  837. package/dist/system/safestop.js.map +1 -1
  838. package/dist/system/skill-fixtures.d.ts +200 -0
  839. package/dist/system/skill-fixtures.d.ts.map +1 -0
  840. package/dist/system/skill-fixtures.js +331 -0
  841. package/dist/system/skill-fixtures.js.map +1 -0
  842. package/dist/task-work/index.d.ts +6 -0
  843. package/dist/task-work/index.d.ts.map +1 -1
  844. package/dist/task-work/index.js +6 -3
  845. package/dist/task-work/index.js.map +1 -1
  846. package/dist/tasks/add.d.ts.map +1 -1
  847. package/dist/tasks/add.js +4 -2
  848. package/dist/tasks/add.js.map +1 -1
  849. package/dist/tasks/affected-packages.d.ts +218 -0
  850. package/dist/tasks/affected-packages.d.ts.map +1 -0
  851. package/dist/tasks/affected-packages.js +496 -0
  852. package/dist/tasks/affected-packages.js.map +1 -0
  853. package/dist/tasks/affected-scope.d.ts +59 -0
  854. package/dist/tasks/affected-scope.d.ts.map +1 -0
  855. package/dist/tasks/affected-scope.js +81 -0
  856. package/dist/tasks/affected-scope.js.map +1 -0
  857. package/dist/tasks/analyze.d.ts.map +1 -1
  858. package/dist/tasks/analyze.js +7 -2
  859. package/dist/tasks/analyze.js.map +1 -1
  860. package/dist/tasks/change-set.d.ts +175 -0
  861. package/dist/tasks/change-set.d.ts.map +1 -0
  862. package/dist/tasks/change-set.js +753 -0
  863. package/dist/tasks/change-set.js.map +1 -0
  864. package/dist/tasks/complete.d.ts +10 -0
  865. package/dist/tasks/complete.d.ts.map +1 -1
  866. package/dist/tasks/complete.js +59 -5
  867. package/dist/tasks/complete.js.map +1 -1
  868. package/dist/tasks/component-pr.d.ts +106 -0
  869. package/dist/tasks/component-pr.d.ts.map +1 -0
  870. package/dist/tasks/component-pr.js +190 -0
  871. package/dist/tasks/component-pr.js.map +1 -0
  872. package/dist/tasks/done-plan.d.ts +123 -0
  873. package/dist/tasks/done-plan.d.ts.map +1 -0
  874. package/dist/tasks/done-plan.js +696 -0
  875. package/dist/tasks/done-plan.js.map +1 -0
  876. package/dist/tasks/done-record.d.ts +127 -0
  877. package/dist/tasks/done-record.d.ts.map +1 -0
  878. package/dist/tasks/done-record.js +302 -0
  879. package/dist/tasks/done-record.js.map +1 -0
  880. package/dist/tasks/duplicate-detector.d.ts +68 -11
  881. package/dist/tasks/duplicate-detector.d.ts.map +1 -1
  882. package/dist/tasks/duplicate-detector.js +314 -58
  883. package/dist/tasks/duplicate-detector.js.map +1 -1
  884. package/dist/tasks/evidence-paths.d.ts +78 -0
  885. package/dist/tasks/evidence-paths.d.ts.map +1 -0
  886. package/dist/tasks/evidence-paths.js +150 -0
  887. package/dist/tasks/evidence-paths.js.map +1 -0
  888. package/dist/tasks/evidence.d.ts +101 -1
  889. package/dist/tasks/evidence.d.ts.map +1 -1
  890. package/dist/tasks/evidence.js +278 -31
  891. package/dist/tasks/evidence.js.map +1 -1
  892. package/dist/tasks/gate-preview.d.ts +5 -0
  893. package/dist/tasks/gate-preview.d.ts.map +1 -1
  894. package/dist/tasks/gate-preview.js +25 -21
  895. package/dist/tasks/gate-preview.js.map +1 -1
  896. package/dist/tasks/gate-result-cache.d.ts +205 -0
  897. package/dist/tasks/gate-result-cache.d.ts.map +1 -0
  898. package/dist/tasks/gate-result-cache.js +285 -0
  899. package/dist/tasks/gate-result-cache.js.map +1 -0
  900. package/dist/tasks/gate-runner.d.ts +126 -3
  901. package/dist/tasks/gate-runner.d.ts.map +1 -1
  902. package/dist/tasks/gate-runner.js +483 -28
  903. package/dist/tasks/gate-runner.js.map +1 -1
  904. package/dist/tasks/session-scope.d.ts +3 -1
  905. package/dist/tasks/session-scope.d.ts.map +1 -1
  906. package/dist/tasks/session-scope.js +18 -3
  907. package/dist/tasks/session-scope.js.map +1 -1
  908. package/dist/tasks/task-next.d.ts +4 -0
  909. package/dist/tasks/task-next.d.ts.map +1 -1
  910. package/dist/tasks/task-next.js +32 -28
  911. package/dist/tasks/task-next.js.map +1 -1
  912. package/dist/tasks/tool-resolver.d.ts +23 -6
  913. package/dist/tasks/tool-resolver.d.ts.map +1 -1
  914. package/dist/tasks/tool-resolver.js +146 -8
  915. package/dist/tasks/tool-resolver.js.map +1 -1
  916. package/dist/tasks/tool-vacuity.d.ts +71 -0
  917. package/dist/tasks/tool-vacuity.d.ts.map +1 -0
  918. package/dist/tasks/tool-vacuity.js +334 -0
  919. package/dist/tasks/tool-vacuity.js.map +1 -0
  920. package/dist/tasks/update.d.ts +8 -0
  921. package/dist/tasks/update.d.ts.map +1 -1
  922. package/dist/tasks/update.js +159 -78
  923. package/dist/tasks/update.js.map +1 -1
  924. package/dist/upgrade.d.ts.map +1 -1
  925. package/dist/upgrade.js +18 -2
  926. package/dist/upgrade.js.map +1 -1
  927. package/dist/validation/doctor/checks.d.ts +20 -2
  928. package/dist/validation/doctor/checks.d.ts.map +1 -1
  929. package/dist/validation/doctor/checks.js +64 -4
  930. package/dist/validation/doctor/checks.js.map +1 -1
  931. package/dist/validation/doctor/index.d.ts +1 -1
  932. package/dist/validation/doctor/index.d.ts.map +1 -1
  933. package/dist/validation/doctor/index.js +1 -1
  934. package/dist/validation/doctor/index.js.map +1 -1
  935. package/dist/validation/doctor/utils.d.ts.map +1 -1
  936. package/dist/validation/doctor/utils.js +7 -2
  937. package/dist/validation/doctor/utils.js.map +1 -1
  938. package/dist/validation/engine-ops.d.ts +24 -1
  939. package/dist/validation/engine-ops.d.ts.map +1 -1
  940. package/dist/validation/engine-ops.js +272 -98
  941. package/dist/validation/engine-ops.js.map +1 -1
  942. package/dist/validation/validate-ops.d.ts.map +1 -1
  943. package/dist/validation/validate-ops.js +9 -3
  944. package/dist/validation/validate-ops.js.map +1 -1
  945. package/dist/worktree/worktree-adopt.d.ts.map +1 -1
  946. package/dist/worktree/worktree-adopt.js +5 -2
  947. package/dist/worktree/worktree-adopt.js.map +1 -1
  948. package/migrations/drizzle-cleo-global/20260927000000_t12469-project-locations/migration.sql +121 -0
  949. package/migrations/drizzle-cleo-global/20260927010000_t12543-user-profile-project-scope/migration.sql +23 -0
  950. package/migrations/drizzle-cleo-global/20260928010000_t12470-location-candidates/migration.sql +72 -0
  951. package/migrations/drizzle-cleo-global/20260928020000_t12510-nexus-devices/migration.sql +34 -0
  952. package/migrations/drizzle-cleo-global/20260928030000_t12511-project-git-state/migration.sql +62 -0
  953. package/migrations/drizzle-cleo-project/20260927000000_t12499-session-terminal-bindings/migration.sql +34 -0
  954. package/migrations/drizzle-cleo-project/20260928000000_t12500-binding-provider-flag/migration.sql +15 -0
  955. package/package.json +23 -13
  956. package/schemas/config.schema.json +54 -0
  957. package/schemas/project-context.schema.json +51 -3
  958. package/schemas/project-info.schema.json +28 -1
  959. package/templates/CLEO-INJECTION.md +40 -332
  960. package/templates/CLEO-REFERENCE.md +303 -0
  961. package/templates/workflows/README.md +36 -14
@@ -11,12 +11,13 @@
11
11
  * @epic T4540
12
12
  */
13
13
  import { randomUUID } from 'node:crypto';
14
+ import { existsSync } from 'node:fs';
14
15
  import { mkdir, readFile, realpath, stat } from 'node:fs/promises';
15
16
  import { basename, join, resolve } from 'node:path';
16
17
  import { ExitCode, } from '@cleocode/contracts';
17
18
  import { pushWarning } from '@cleocode/lafs';
18
19
  import { readPortableProjectId } from '@cleocode/paths';
19
- import { eq, or } from 'drizzle-orm';
20
+ import { desc, eq, inArray } from 'drizzle-orm';
20
21
  import { z } from 'zod';
21
22
  import { engineError, engineSuccess } from '../engine-result.js';
22
23
  import { CleoError } from '../errors.js';
@@ -26,11 +27,14 @@ import { getCleoHome, worktreeScope } from '../paths.js';
26
27
  import { getTaskAccessor } from '../store/data-accessor.js';
27
28
  // Re-export only: resetNexusDbState used by tests and index barrel.
28
29
  import { resetNexusDbState } from '../store/nexus-sqlite.js';
29
- import { nexusAuditLog, projectIdAliases, projectPaths, projectRegistry, } from '../store/schema/nexus-schema.js';
30
+ import { nexusAuditLog, projectGitState, projectIdAliases, projectLocations, projectPaths, projectRegistry, } from '../store/schema/nexus-schema.js';
31
+ import { ensureCheckoutNonce } from './checkout-nonce.js';
32
+ import { listNexusDevices } from './devices.js';
30
33
  import { generateProjectHash } from './hash.js';
31
- import { canonicalProjectId, legacyProjectId } from './identity.js';
32
- import { recordProjectCheckout } from './path-map.js';
33
- import { normalizeRegistryStorePath, registryStorePath } from './registry-hygiene.js';
34
+ import { collectCheckoutEvidence, legacyProjectId, projectPathFingerprint } from './identity.js';
35
+ import { registryAliasClaimants, resolveProjectAlias } from './legacy-alias.js';
36
+ import { isSupersededRegistryPath, recordCandidateLocation, recordProjectCheckout, } from './path-map.js';
37
+ import { registryStorePath } from './registry-hygiene.js';
34
38
  // ── Path helpers ─────────────────────────────────────────────────────
35
39
  /** Get path to the NEXUS home directory (cache, etc.). */
36
40
  export function getNexusHome() {
@@ -82,9 +86,14 @@ function rowToProject(row) {
82
86
  lastSync: row.lastSync,
83
87
  taskCount: row.taskCount,
84
88
  labels,
85
- // T12324: rows written before the fix still name the pre-E6 relics.
86
- brainDbPath: normalizeRegistryStorePath(row.brainDbPath ?? null),
87
- tasksDbPath: normalizeRegistryStorePath(row.tasksDbPath ?? null),
89
+ // T12469: derived from the path at runtime; the stored columns are a
90
+ // legacy mirror for older binaries and are never read.
91
+ brainDbPath: isSupersededRegistryPath(row.projectPath)
92
+ ? null
93
+ : registryStorePath(row.projectPath),
94
+ tasksDbPath: isSupersededRegistryPath(row.projectPath)
95
+ ? null
96
+ : registryStorePath(row.projectPath),
88
97
  lastIndexed: row.lastIndexed ?? null,
89
98
  stats,
90
99
  };
@@ -236,6 +245,10 @@ async function readProjectId(projectPath) {
236
245
  const read = readPortableProjectId(projectPath);
237
246
  return read.status === 'valid' ? read.projectId : '';
238
247
  };
248
+ // T12470: the tracked `.cleo/project-id` outranks project-info.json.
249
+ const trackedId = tracked();
250
+ if (trackedId)
251
+ return trackedId;
239
252
  try {
240
253
  return (z
241
254
  .object({ projectId: z.string().min(1).optional() })
@@ -247,14 +260,29 @@ async function readProjectId(projectPath) {
247
260
  throw new CleoError(ExitCode.CONFIG_ERROR, `Cannot read project identity at ${infoPath}: ${error instanceof Error ? error.message : String(error)}`);
248
261
  }
249
262
  }
250
- /** Reject path/hash/immutable-identity disagreement before encounter side effects or writes. */
251
- function validateRegistrationOwner(rows, projectPath, projectHash, declaredId) {
252
- if (rows.some((row) => row.projectPath !== projectPath ||
253
- row.projectHash !== projectHash ||
254
- (declaredId && row.projectId !== declaredId))) {
255
- throw new CleoError(ExitCode.NEXUS_PROJECT_EXISTS, `Conflicting project identity or path ownership: ${projectPath}`);
256
- }
257
- return rows[0];
263
+ /**
264
+ * Return the id a project root declares, adopting one first when it declares
265
+ * none (T12470).
266
+ *
267
+ * A path — or any hash of it — is never a project identity. A root with
268
+ * neither `.cleo/project-id` nor a `project-info.json` id gets one the same
269
+ * way `cleo init` does: re-linked from the registry when exactly one
270
+ * registered identity matches, otherwise freshly minted — and recorded
271
+ * write-once in `.cleo/project-id`, so every later resolution returns it.
272
+ *
273
+ * @throws {CleoError} `CONFIG_ERROR` when no identity can be recorded.
274
+ */
275
+ async function adoptDeclaredProjectId(projectPath) {
276
+ const declaredId = await readProjectId(projectPath);
277
+ if (declaredId)
278
+ return declaredId;
279
+ const { decideProjectIdentity, ensurePortableProjectId } = await import('../scaffold/project-identity.js');
280
+ const decision = await decideProjectIdentity(projectPath, undefined);
281
+ await ensurePortableProjectId(projectPath, decision.projectId);
282
+ const recorded = await readProjectId(projectPath);
283
+ if (recorded)
284
+ return recorded;
285
+ throw new CleoError(ExitCode.CONFIG_ERROR, `Project at ${projectPath} declares no identity and none could be recorded in .cleo/project-id; refusing to derive one from its path`, { fix: `Run \`cleo init\` in ${projectPath} to record the project's identity` });
258
286
  }
259
287
  /** Record alternate project identity tokens as aliases for registry lookup. */
260
288
  async function recordProjectIdAliases(projectId, aliases, createdAt) {
@@ -264,6 +292,9 @@ async function recordProjectIdAliases(projectId, aliases, createdAt) {
264
292
  if (!legacyId)
265
293
  continue;
266
294
  try {
295
+ // T12589: never record a key another project also claims.
296
+ if (registryAliasClaimants(db, legacyId).some((id) => id !== projectId))
297
+ continue;
267
298
  await db
268
299
  .insert(projectIdAliases)
269
300
  .values({ legacyId, canonicalId: projectId, createdAt })
@@ -308,13 +339,15 @@ export async function nexusRegister(projectRootOrPath, paramsOrName, permissions
308
339
  if (!(await stat(join(resolvedPath, '.cleo'))).isDirectory()) {
309
340
  throw new CleoError(ExitCode.NOT_FOUND, `Path missing .cleo directory: ${resolvedPath}`);
310
341
  }
311
- const declaredId = await readProjectId(resolvedPath);
312
- const canonicalIdentity = await canonicalProjectId(resolvedPath);
342
+ const declaredId = await adoptDeclaredProjectId(resolvedPath);
343
+ const pathFingerprint = await projectPathFingerprint(resolvedPath);
344
+ const evidence = await collectCheckoutEvidence(resolvedPath);
313
345
  await nexusInit();
314
346
  const { getNexusDb } = await import('../store/nexus-sqlite.js');
315
- const ownershipFilter = or(eq(projectRegistry.projectPath, resolvedPath), eq(projectRegistry.projectHash, projectHash), eq(projectRegistry.projectId, declaredId || canonicalIdentity.id));
316
- const before = await getNexusDb();
317
- validateRegistrationOwner(before.select().from(projectRegistry).where(ownershipFilter).all(), resolvedPath, projectHash, declaredId);
347
+ // T12469 · T12470: ownership is the DECLARED id alone — never the path or
348
+ // a hash of it. The path fingerprint is recorded below only as an alias.
349
+ const ownerId = declaredId;
350
+ const ownershipFilter = eq(projectRegistry.projectId, ownerId);
318
351
  // The accessor may auto-register this path. Never carry an absence observation
319
352
  // across this await into the write transaction.
320
353
  const meta = await readProjectMeta(resolvedPath);
@@ -326,8 +359,9 @@ export async function nexusRegister(projectRootOrPath, paramsOrName, permissions
326
359
  const legacyAlias = legacyProjectId(resolvedPath);
327
360
  const skippedAliases = [];
328
361
  const projectId = db.transaction((tx) => {
329
- const existing = validateRegistrationOwner(tx.select().from(projectRegistry).where(ownershipFilter).all(), resolvedPath, projectHash, declaredId);
330
- const immutableId = declaredId || existing?.projectId || canonicalIdentity.id;
362
+ // Keyed by the primary key, so at most one row: no owner conflict exists.
363
+ const existing = tx.select().from(projectRegistry).where(ownershipFilter).get();
364
+ const immutableId = ownerId;
331
365
  const projectName = name || existing?.name || basename(resolvedPath) || 'unnamed';
332
366
  const nameOwner = tx
333
367
  .select()
@@ -344,6 +378,9 @@ export async function nexusRegister(projectRootOrPath, paramsOrName, permissions
344
378
  taskCount: meta.taskCount,
345
379
  labelsJson: JSON.stringify(meta.labels),
346
380
  lastSeen: now,
381
+ // The row names the checkout encountered most recently (T12469).
382
+ projectPath: resolvedPath,
383
+ projectHash,
347
384
  brainDbPath: registryStorePath(resolvedPath),
348
385
  tasksDbPath: registryStorePath(resolvedPath),
349
386
  };
@@ -357,21 +394,21 @@ export async function nexusRegister(projectRootOrPath, paramsOrName, permissions
357
394
  .values({
358
395
  ...metadata,
359
396
  projectId: immutableId,
360
- projectHash,
361
- projectPath: resolvedPath,
362
397
  registeredAt: now,
363
398
  healthStatus: 'unknown',
364
399
  statsJson: '{}',
365
400
  })
366
401
  .run();
367
- // T12354: record this checkout in the device-local path map.
402
+ // T12354 · T12469: record this checkout as a live location.
368
403
  recordProjectCheckout(tx, {
369
404
  projectId: immutableId,
370
405
  projectPath: resolvedPath,
371
406
  projectHash,
372
407
  now,
408
+ evidence,
409
+ checkoutNonce: ensureCheckoutNonce(resolvedPath),
373
410
  });
374
- for (const alias of new Set([canonicalIdentity.id, legacyAlias])) {
411
+ for (const alias of new Set([pathFingerprint.id, legacyAlias])) {
375
412
  if (alias === immutableId)
376
413
  continue;
377
414
  const aliasOwner = tx
@@ -379,6 +416,11 @@ export async function nexusRegister(projectRootOrPath, paramsOrName, permissions
379
416
  .from(projectIdAliases)
380
417
  .where(eq(projectIdAliases.legacyId, alias))
381
418
  .get();
419
+ // T12589: a legacy key shared by several projects names none of them;
420
+ // it is not recorded again and is not a conflict worth reporting.
421
+ if (alias === legacyAlias &&
422
+ registryAliasClaimants(tx, alias, aliasOwner?.canonicalId).some((id) => id !== immutableId))
423
+ continue;
382
424
  const directOwner = tx
383
425
  .select()
384
426
  .from(projectRegistry)
@@ -386,13 +428,12 @@ export async function nexusRegister(projectRootOrPath, paramsOrName, permissions
386
428
  .get();
387
429
  if ((aliasOwner && aliasOwner.canonicalId !== immutableId) ||
388
430
  (directOwner && directOwner.projectId !== immutableId)) {
389
- // The old truncated path token is lossy. Preserve its owner and disclose
390
- // the omitted compatibility alias, never redirect another project.
391
- if (alias === legacyAlias) {
392
- skippedAliases.push(alias);
393
- continue;
394
- }
395
- throw new CleoError(ExitCode.NEXUS_PROJECT_EXISTS, `Project identity alias already belongs to another project: ${alias}`);
431
+ // Both aliases are derived from the PATH (base64url path, git-root
432
+ // hash), so another owner means the path changed hands, not an
433
+ // identity conflict (T12469). Preserve its owner and disclose the
434
+ // omitted compatibility alias; never redirect another project.
435
+ skippedAliases.push(alias);
436
+ continue;
396
437
  }
397
438
  tx.insert(projectIdAliases)
398
439
  .values({ legacyId: alias, canonicalId: immutableId, createdAt: now })
@@ -430,8 +471,13 @@ export async function nexusUnregister(projectRootOrNameOrHash, paramsOrUndefined
430
471
  const { getNexusDb } = await import('../store/nexus-sqlite.js');
431
472
  const { eq } = await import('drizzle-orm');
432
473
  const db = await getNexusDb();
433
- await db.delete(projectRegistry).where(eq(projectRegistry.projectHash, project.hash));
434
- // T12354: an unregistered project keeps no checkouts in the path map.
474
+ await db.delete(projectRegistry).where(eq(projectRegistry.projectId, project.projectId));
475
+ // T12469: an explicitly unregistered project keeps no locations. (A vanished
476
+ // directory is marked `missing` instead; only this owner action deletes.)
477
+ await db.delete(projectLocations).where(eq(projectLocations.projectId, project.projectId));
478
+ // T12511: its probed git state goes with it.
479
+ await db.delete(projectGitState).where(eq(projectGitState.projectId, project.projectId));
480
+ // Legacy path map, still dual-written for older binaries (T12469).
435
481
  await db.delete(projectPaths).where(eq(projectPaths.projectId, project.projectId));
436
482
  await writeNexusAudit({
437
483
  action: 'unregister',
@@ -453,38 +499,99 @@ export async function nexusList(_projectRoot = '', _params = {}) {
453
499
  return [];
454
500
  }
455
501
  }
502
+ /**
503
+ * A project NAME matched more than one registry row (T12510). Names are not
504
+ * unique — two checkouts or two unrelated projects can share one — so the
505
+ * lookup refuses to pick one and lists every candidate id instead.
506
+ *
507
+ * @example
508
+ * ```ts
509
+ * try { await nexusGetProject('', { name: 'api' }); }
510
+ * catch (e) { if (e instanceof NexusProjectAmbiguityError) console.error(e.candidates); }
511
+ * ```
512
+ */
513
+ export class NexusProjectAmbiguityError extends CleoError {
514
+ /** Stable machine-readable error code. */
515
+ codeName = 'E_NEXUS_PROJECT_AMBIGUOUS';
516
+ /** Every matching project, most recently seen first. */
517
+ candidates;
518
+ /**
519
+ * @param name - The ambiguous project name, or alias key (T12589).
520
+ * @param rows - Every registry row that matches it.
521
+ * @param field - What `name` is: a project name, or an alias key that more
522
+ * than one project claims.
523
+ */
524
+ constructor(name, rows, field = 'name') {
525
+ const candidates = rows.map((r) => ({
526
+ projectId: r.projectId,
527
+ name: r.name,
528
+ path: r.projectPath,
529
+ lastSeen: r.lastSeen,
530
+ }));
531
+ super(ExitCode.INVALID_INPUT, `${field === 'name' ? 'Project name' : 'Legacy project alias'} '${name}' is ambiguous: ${candidates.length} projects match (${candidates
532
+ .map((c) => c.projectId)
533
+ .join(', ')}). Use a project id.`, {
534
+ fix: `Pass one of the candidate project ids instead of the ${field}.`,
535
+ details: {
536
+ field,
537
+ expected: 'a unique project name, id or hash',
538
+ actual: name,
539
+ candidates,
540
+ },
541
+ });
542
+ this.name = 'NexusProjectAmbiguityError';
543
+ this.candidates = candidates;
544
+ }
545
+ }
456
546
  export async function nexusGetProject(projectRootOrNameOrHash, paramsOrUndefined) {
457
547
  const nameOrHash = paramsOrUndefined !== undefined ? paramsOrUndefined.name : projectRootOrNameOrHash;
458
548
  try {
459
- const { eq, or } = await import('drizzle-orm');
549
+ const { eq } = await import('drizzle-orm');
460
550
  // ADR-090 · T11648: run on a LIVE handle with retry — the registry lives in
461
551
  // the GLOBAL ATTACH of the shared project handle, which a concurrent
462
552
  // cross-project open can close mid-query.
463
553
  const row = await withLiveNexusDb(async (db) => {
464
- // Try hash match first, then name
554
+ // T12469: the immutable id is the key, so it wins; a path hash is not
555
+ // unique, so among hash/name matches the most recently seen row wins.
465
556
  let rows = await db
466
557
  .select()
467
558
  .from(projectRegistry)
468
- .where(or(eq(projectRegistry.projectHash, nameOrHash), eq(projectRegistry.name, nameOrHash)));
559
+ .where(eq(projectRegistry.projectId, nameOrHash));
469
560
  if (rows.length === 0) {
470
- // Try direct projectId match
471
561
  rows = await db
472
562
  .select()
473
563
  .from(projectRegistry)
474
- .where(eq(projectRegistry.projectId, nameOrHash));
564
+ .where(eq(projectRegistry.projectHash, nameOrHash))
565
+ .orderBy(desc(projectRegistry.lastSeen));
475
566
  }
476
567
  if (rows.length === 0) {
477
- // Try alias resolution: legacyId → canonicalId lookup (T11025)
478
- const aliasRows = await db
568
+ // T12510: a name is not unique. One match resolves; several are
569
+ // ambiguous and the caller must choose by id — never rows[0].
570
+ rows = await db
479
571
  .select()
480
- .from(projectIdAliases)
481
- .where(eq(projectIdAliases.legacyId, nameOrHash))
482
- .limit(1);
483
- if (aliasRows.length > 0) {
572
+ .from(projectRegistry)
573
+ .where(eq(projectRegistry.name, nameOrHash))
574
+ .orderBy(desc(projectRegistry.lastSeen));
575
+ if (rows.length > 1)
576
+ throw new NexusProjectAmbiguityError(nameOrHash, rows);
577
+ }
578
+ if (rows.length === 0) {
579
+ // Try alias resolution: legacyId → canonicalId lookup (T11025). An
580
+ // alias several projects claim is refused, never rows[0] (T12589).
581
+ const alias = resolveProjectAlias(db, nameOrHash);
582
+ if (alias.status === 'ambiguous') {
583
+ const claimed = await db
584
+ .select()
585
+ .from(projectRegistry)
586
+ .where(inArray(projectRegistry.projectId, [...alias.claimants]))
587
+ .orderBy(desc(projectRegistry.lastSeen));
588
+ throw new NexusProjectAmbiguityError(nameOrHash, claimed, 'alias');
589
+ }
590
+ if (alias.status === 'resolved') {
484
591
  rows = await db
485
592
  .select()
486
593
  .from(projectRegistry)
487
- .where(eq(projectRegistry.projectId, aliasRows[0].canonicalId));
594
+ .where(eq(projectRegistry.projectId, alias.canonicalId));
488
595
  }
489
596
  }
490
597
  return rows[0] ?? null;
@@ -493,7 +600,9 @@ export async function nexusGetProject(projectRootOrNameOrHash, paramsOrUndefined
493
600
  return null;
494
601
  return rowToProject(row);
495
602
  }
496
- catch {
603
+ catch (error) {
604
+ if (error instanceof NexusProjectAmbiguityError)
605
+ throw error;
497
606
  return null;
498
607
  }
499
608
  }
@@ -526,7 +635,7 @@ export async function nexusSync(projectRootOrName, paramsOrUndefined) {
526
635
  lastSync: now,
527
636
  lastSeen: now,
528
637
  })
529
- .where(eq(projectRegistry.projectHash, project.hash));
638
+ .where(eq(projectRegistry.projectId, project.projectId));
530
639
  await writeNexusAudit({
531
640
  action: 'sync',
532
641
  projectHash: project.hash,
@@ -565,7 +674,7 @@ export async function nexusSyncAll() {
565
674
  lastSync: now,
566
675
  lastSeen: now,
567
676
  })
568
- .where(eq(projectRegistry.projectHash, project.hash));
677
+ .where(eq(projectRegistry.projectId, project.projectId));
569
678
  synced++;
570
679
  }
571
680
  catch {
@@ -599,27 +708,39 @@ export async function nexusUpdateIndexStats(projectPath, stats) {
599
708
  const { getNexusDb } = await import('../store/nexus-sqlite.js');
600
709
  const { eq } = await import('drizzle-orm');
601
710
  const db = await getNexusDb();
602
- const rows = await db
603
- .select()
711
+ // T12469: a path hash is not unique; the most recently seen row for this
712
+ // checkout is the one being indexed, and it is updated by its id.
713
+ const ownerAt = async () => (await db
714
+ .select({ projectId: projectRegistry.projectId })
604
715
  .from(projectRegistry)
605
- .where(eq(projectRegistry.projectHash, projectHash));
606
- if (rows.length === 0) {
607
- // Not yet registered — auto-register first (best effort)
716
+ .where(eq(projectRegistry.projectHash, projectHash))
717
+ .orderBy(desc(projectRegistry.lastSeen))
718
+ .limit(1))[0];
719
+ let owner = await ownerAt();
720
+ if (!owner) {
721
+ // Not yet registered — record the encounter (best effort). T12470: never
722
+ // `nexusRegister` here: analyze is not an explicit registration, so it
723
+ // must neither mint/write `.cleo/project-id` nor repoint an existing
724
+ // project's row to this path. The encounter records an unconfirmed
725
+ // checkout as a candidate, which owns no row and gets no stats.
608
726
  try {
609
- await nexusRegister(projectPath);
727
+ const { recordProjectEncounter } = await import('../paths.js');
728
+ await recordProjectEncounter(projectPath);
610
729
  }
611
730
  catch {
612
- // Already registered or cannot register — ignore
731
+ // Cannot record — ignore; stats are best effort.
613
732
  }
733
+ owner = await ownerAt();
614
734
  }
615
- await db
616
- .update(projectRegistry)
617
- .set({
618
- lastIndexed: now,
619
- statsJson: JSON.stringify(stats),
620
- lastSeen: now,
621
- })
622
- .where(eq(projectRegistry.projectHash, projectHash));
735
+ if (owner)
736
+ await db
737
+ .update(projectRegistry)
738
+ .set({
739
+ lastIndexed: now,
740
+ statsJson: JSON.stringify(stats),
741
+ lastSeen: now,
742
+ })
743
+ .where(eq(projectRegistry.projectId, owner.projectId));
623
744
  await writeNexusAudit({
624
745
  action: 'update-index-stats',
625
746
  projectHash,
@@ -663,7 +784,7 @@ export async function nexusSetPermission(projectRoot, params) {
663
784
  await db
664
785
  .update(projectRegistry)
665
786
  .set({ permissions: permission })
666
- .where(eq(projectRegistry.projectHash, project.hash));
787
+ .where(eq(projectRegistry.projectId, project.projectId));
667
788
  await writeNexusAudit({
668
789
  action: 'set-permission',
669
790
  projectHash: project.hash,
@@ -676,18 +797,19 @@ export async function nexusSetPermission(projectRoot, params) {
676
797
  /**
677
798
  * Reconcile the current project's identity with the global nexus registry.
678
799
  *
679
- * 4-scenario policy:
800
+ * 3-scenario policy, keyed by the immutable project id alone (ADR-094 · T12469):
680
801
  * 1. projectId in registry + path matches → update lastSeen, return {status:'ok'}
681
802
  * 2. projectId in registry + path changed → update path+hash, return {status:'path_updated'}
682
803
  * 3. projectId not in registry → auto-register, return {status:'auto_registered'}
683
- * 4. projectHash matches but different projectId → throw CleoError (identity conflict)
684
804
  *
685
- * Uses projectId as the stable identifier across project moves, since
686
- * projectHash is derived from the absolute path and changes when moved.
805
+ * The former scenario 4 (a row at this path hash under another id → identity
806
+ * conflict) is gone: a path is a location, not an identity. That row is a
807
+ * stale location of another project, recorded as `superseded` in
808
+ * `nexus_project_locations` when this project is recorded.
687
809
  *
688
810
  * @task T5368
689
811
  */
690
- export async function nexusReconcile(projectRoot, _params = {}) {
812
+ export async function nexusReconcile(projectRoot, params = {}) {
691
813
  if (!projectRoot) {
692
814
  throw new CleoError(ExitCode.INVALID_INPUT, 'Project root path required');
693
815
  }
@@ -695,114 +817,105 @@ export async function nexusReconcile(projectRoot, _params = {}) {
695
817
  const { getNexusDb } = await import('../store/nexus-sqlite.js');
696
818
  const { eq } = await import('drizzle-orm');
697
819
  const db = await getNexusDb();
820
+ // T12470: reconcile never mints or writes an identity — that is `cleo init`
821
+ // / `cleo nexus register` / `cleo doctor project-identity --resolve`.
698
822
  const projectId = await readProjectId(projectRoot);
823
+ if (!projectId)
824
+ throw new CleoError(ExitCode.CONFIG_ERROR, `Project at ${projectRoot} declares no identity (.cleo/project-id or project-info.json projectId); refusing to derive one from its path`, { fix: `Run \`cleo init\` in ${projectRoot} to record the project's identity` });
699
825
  const currentHash = generateProjectHash(projectRoot);
700
- const canonicalIdentity = await canonicalProjectId(projectRoot);
701
- const stableProjectId = projectId || canonicalIdentity.id;
702
- // Scenario 4 check: hash matches but different projectId
703
- if (projectId) {
704
- const hashRows = await db
705
- .select()
706
- .from(projectRegistry)
707
- .where(eq(projectRegistry.projectHash, currentHash));
708
- const hashMatch = hashRows[0];
709
- if (hashMatch && hashMatch.projectId !== projectId) {
826
+ const pathFingerprint = await projectPathFingerprint(projectRoot);
827
+ const evidence = await collectCheckoutEvidence(projectRoot);
828
+ // T12470: the declared id alone; the path fingerprint is an alias only.
829
+ const stableProjectId = projectId;
830
+ // Look up by the immutable id (stable across moves). T12469: the path and
831
+ // its hash are never consulted — a row at this path under another id is a
832
+ // stale location of another project, superseded when this one is recorded.
833
+ const idRows = await db
834
+ .select()
835
+ .from(projectRegistry)
836
+ .where(eq(projectRegistry.projectId, stableProjectId));
837
+ const existing = idRows[0];
838
+ if (existing) {
839
+ const now = new Date().toISOString();
840
+ if (existing.projectPath === projectRoot) {
841
+ // Scenario 1: path matches — just update lastSeen
842
+ await db
843
+ .update(projectRegistry)
844
+ .set({ lastSeen: now })
845
+ .where(eq(projectRegistry.projectId, stableProjectId));
846
+ recordProjectCheckout(db, {
847
+ projectId: stableProjectId,
848
+ projectPath: projectRoot,
849
+ projectHash: currentHash,
850
+ now,
851
+ evidence,
852
+ checkoutNonce: ensureCheckoutNonce(projectRoot),
853
+ });
710
854
  await writeNexusAudit({
711
855
  action: 'reconcile',
712
856
  projectHash: currentHash,
713
- projectId,
857
+ projectId: stableProjectId,
714
858
  operation: 'reconcile',
715
- success: false,
716
- errorMessage: `Identity conflict: hash ${currentHash} registered to '${hashMatch.projectId}', current project is '${projectId}'`,
859
+ success: true,
860
+ details: { status: 'ok' },
717
861
  });
718
- throw new CleoError(ExitCode.NEXUS_REGISTRY_CORRUPT, `Project identity conflict: hash ${currentHash} is registered to projectId '${hashMatch.projectId}' but current project has projectId '${projectId}'`, { fix: 'Manually resolve the conflict with `cleo nexus unregister` and re-register' });
862
+ await recordProjectIdAliases(stableProjectId, [stableProjectId, pathFingerprint.id, legacyProjectId(projectRoot)], now);
863
+ return { status: 'ok' };
719
864
  }
720
- }
721
- // Look up by projectId (stable across moves)
722
- if (projectId) {
723
- const idRows = await db
724
- .select()
725
- .from(projectRegistry)
726
- .where(eq(projectRegistry.projectId, projectId));
727
- const existing = idRows[0];
728
- if (existing) {
729
- const now = new Date().toISOString();
730
- if (existing.projectPath === projectRoot) {
731
- // Scenario 1: path matches — just update lastSeen
732
- await db
733
- .update(projectRegistry)
734
- .set({ lastSeen: now })
735
- .where(eq(projectRegistry.projectId, projectId));
736
- recordProjectCheckout(db, {
737
- projectId,
738
- projectPath: projectRoot,
739
- projectHash: currentHash,
740
- now,
741
- });
742
- await writeNexusAudit({
743
- action: 'reconcile',
744
- projectHash: currentHash,
745
- projectId,
746
- operation: 'reconcile',
747
- success: true,
748
- details: { status: 'ok' },
749
- });
750
- await recordProjectIdAliases(stableProjectId, [stableProjectId, canonicalIdentity.id, legacyProjectId(projectRoot)], now);
751
- return { status: 'ok' };
752
- }
753
- // Scenario 2: path changed — update path, hash, lastSeen, and DB paths
754
- const oldPath = existing.projectPath;
755
- const newBrainDbPath = registryStorePath(projectRoot);
756
- const newTasksDbPath = registryStorePath(projectRoot);
757
- await db
758
- .update(projectRegistry)
759
- .set({
760
- projectPath: projectRoot,
761
- projectHash: currentHash,
762
- lastSeen: now,
763
- brainDbPath: newBrainDbPath,
764
- tasksDbPath: newTasksDbPath,
765
- })
766
- .where(eq(projectRegistry.projectId, projectId));
767
- recordProjectCheckout(db, {
768
- projectId,
865
+ // Scenario 2: path changed — update path, hash, lastSeen, and DB paths
866
+ const oldPath = existing.projectPath;
867
+ // T12470: even an explicit reconcile never takes the row (and its
868
+ // permissions) away from a location that still exists on this device —
869
+ // that is a second checkout or a clone, not a move. It is recorded as a
870
+ // candidate unless the caller explicitly asks to rebind.
871
+ if (!params.forceRebind && !isSupersededRegistryPath(oldPath) && existsSync(oldPath)) {
872
+ recordCandidateLocation(db, {
873
+ projectId: stableProjectId,
769
874
  projectPath: projectRoot,
770
875
  projectHash: currentHash,
771
876
  now,
877
+ evidence,
772
878
  });
773
879
  await writeNexusAudit({
774
880
  action: 'reconcile',
775
881
  projectHash: currentHash,
776
- projectId,
882
+ projectId: stableProjectId,
777
883
  operation: 'reconcile',
778
884
  success: true,
779
- details: { status: 'path_updated', oldPath, newPath: projectRoot },
885
+ details: { status: 'candidate', oldPath, newPath: projectRoot },
780
886
  });
781
- await recordProjectIdAliases(stableProjectId, [stableProjectId, canonicalIdentity.id, legacyProjectId(projectRoot)], now);
782
- return { status: 'path_updated', oldPath, newPath: projectRoot };
887
+ return { status: 'candidate', oldPath, newPath: projectRoot };
783
888
  }
784
- }
785
- // Also check by hash for projects without a projectId
786
- const hashRows = await db
787
- .select()
788
- .from(projectRegistry)
789
- .where(eq(projectRegistry.projectHash, currentHash));
790
- const hashMatch = hashRows[0];
791
- if (hashMatch) {
792
- const now = new Date().toISOString();
889
+ const newBrainDbPath = registryStorePath(projectRoot);
890
+ const newTasksDbPath = registryStorePath(projectRoot);
793
891
  await db
794
892
  .update(projectRegistry)
795
- .set({ lastSeen: now })
796
- .where(eq(projectRegistry.projectHash, currentHash));
893
+ .set({
894
+ projectPath: projectRoot,
895
+ projectHash: currentHash,
896
+ lastSeen: now,
897
+ brainDbPath: newBrainDbPath,
898
+ tasksDbPath: newTasksDbPath,
899
+ })
900
+ .where(eq(projectRegistry.projectId, stableProjectId));
901
+ recordProjectCheckout(db, {
902
+ projectId: stableProjectId,
903
+ projectPath: projectRoot,
904
+ projectHash: currentHash,
905
+ now,
906
+ evidence,
907
+ checkoutNonce: ensureCheckoutNonce(projectRoot),
908
+ });
797
909
  await writeNexusAudit({
798
910
  action: 'reconcile',
799
911
  projectHash: currentHash,
912
+ projectId: stableProjectId,
800
913
  operation: 'reconcile',
801
914
  success: true,
802
- details: { status: 'ok' },
915
+ details: { status: 'path_updated', oldPath, newPath: projectRoot },
803
916
  });
804
- await recordProjectIdAliases(hashMatch.projectId, [hashMatch.projectId, canonicalIdentity.id, legacyProjectId(projectRoot)], now);
805
- return { status: 'ok' };
917
+ await recordProjectIdAliases(stableProjectId, [stableProjectId, pathFingerprint.id, legacyProjectId(projectRoot)], now);
918
+ return { status: 'path_updated', oldPath, newPath: projectRoot };
806
919
  }
807
920
  // Scenario 3: not in registry — auto-register
808
921
  try {
@@ -860,6 +973,9 @@ export async function nexusMoveProject(projectId, newPath) {
860
973
  tasksDbPath: newTasksDbPath,
861
974
  })
862
975
  .where(eq(projectRegistry.projectId, projectId));
976
+ // Record the location (and re-home any row displaced from the new path)
977
+ // immediately, so two rows never share a path (T12469).
978
+ recordProjectCheckout(db, { projectId, projectPath: resolvedPath, projectHash: newHash, now });
863
979
  await writeNexusAudit({
864
980
  action: 'move',
865
981
  projectHash: newHash,
@@ -932,6 +1048,22 @@ export { resetNexusDbState };
932
1048
  * Convert a caught error to an EngineResult failure.
933
1049
  */
934
1050
  function caughtToEngineError(error, fallbackMsg) {
1051
+ if (error instanceof NexusProjectAmbiguityError) {
1052
+ return engineError(error.codeName, error.message, {
1053
+ exitCode: error.code,
1054
+ details: error.details,
1055
+ fix: error.fix,
1056
+ });
1057
+ }
1058
+ // T12558: a refusal at a relocated root keeps its typed code, exit class,
1059
+ // fix and details (`movedTo`) instead of collapsing to E_INTERNAL.
1060
+ if (error instanceof CleoError && error.code === ExitCode.PROJECT_MOVED) {
1061
+ return engineError('E_PROJECT_MOVED', error.message, {
1062
+ exitCode: error.code,
1063
+ details: error.details,
1064
+ fix: error.fix,
1065
+ });
1066
+ }
935
1067
  const e = error instanceof Error ? error : null;
936
1068
  return engineError('E_INTERNAL', e?.message ?? fallbackMsg);
937
1069
  }
@@ -1070,9 +1202,9 @@ export async function nexusSyncProject(name) {
1070
1202
  * @task T1569
1071
1203
  */
1072
1204
  // SSoT-EXEMPT:engine-migration-T1569
1073
- export async function nexusReconcileProject(projectRoot) {
1205
+ export async function nexusReconcileProject(projectRoot, params = {}) {
1074
1206
  try {
1075
- const result = await nexusReconcile(projectRoot, {});
1207
+ const result = await nexusReconcile(projectRoot, params);
1076
1208
  return engineSuccess(result);
1077
1209
  }
1078
1210
  catch (error) {
@@ -1088,12 +1220,35 @@ export async function nexusReconcileProject(projectRoot) {
1088
1220
  export async function nexusProjectsList() {
1089
1221
  try {
1090
1222
  const list = await nexusList('', {});
1091
- return engineSuccess({ projects: list, count: list.length });
1223
+ const { getNexusRegistryDb } = await import('../store/nexus-sqlite.js');
1224
+ const devices = listNexusDevices(await getNexusRegistryDb(getCleoHome()));
1225
+ return engineSuccess({ projects: list, count: list.length, devices });
1092
1226
  }
1093
1227
  catch (error) {
1094
1228
  return caughtToEngineError(error, 'Failed to list nexus projects');
1095
1229
  }
1096
1230
  }
1231
+ /**
1232
+ * Probe and record the git state of every project location on this device
1233
+ * (`nexus.projects.status`, T12511). Bounded concurrency, a per-location
1234
+ * timeout, no network unless `fetch` — see `nexus/git-state.ts`.
1235
+ *
1236
+ * @param _projectRoot - Unused: the probe covers every location on this device
1237
+ * (uniform ADR-057 signature).
1238
+ * @param params - Fetch, concurrency, timeout and staleness.
1239
+ * @returns Fresh rows for this device plus recorded rows of other devices.
1240
+ * @task T12511
1241
+ */
1242
+ export async function nexusProjectsStatus(_projectRoot, params) {
1243
+ try {
1244
+ const { getNexusRegistryDb } = await import('../store/nexus-sqlite.js');
1245
+ const { runProjectsGitStatus } = await import('./git-state.js');
1246
+ return engineSuccess(await runProjectsGitStatus(await getNexusRegistryDb(getCleoHome()), params));
1247
+ }
1248
+ catch (error) {
1249
+ return caughtToEngineError(error, 'Failed to probe project git state');
1250
+ }
1251
+ }
1097
1252
  /**
1098
1253
  * Register a project in the global nexus registry (Phase 2 dispatch op).
1099
1254
  *