@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
package/dist/init.js CHANGED
@@ -30,23 +30,47 @@
30
30
  * @task T4707
31
31
  * @epic T4663
32
32
  */
33
- import { existsSync, readdirSync, readFileSync } from 'node:fs';
34
- import { copyFile, lstat, mkdir, readFile, symlink, unlink, writeFile } from 'node:fs/promises';
33
+ import { copyFileSync, existsSync, constants as fsConstants, readdirSync, readFileSync, realpathSync, statSync, } from 'node:fs';
34
+ import { appendFile, copyFile, lstat, mkdir, readFile, symlink, unlink, writeFile, } from 'node:fs/promises';
35
35
  import { platform } from 'node:os';
36
- import { basename, dirname, join } from 'node:path';
36
+ import { basename, dirname, join, relative, resolve } from 'node:path';
37
37
  import { ExitCode } from '@cleocode/contracts';
38
+ import { isAbsolutePath } from '@cleocode/paths';
38
39
  import { classifyProject } from './discovery.js';
39
40
  import { CleoError } from './errors.js';
40
- import { ensureGitHooks } from './hooks.js';
41
+ import { resolveGitDir, resolveHooksDir } from './git/hooks-install.js';
42
+ import { ensureGitHooks, MANAGED_HOOKS } from './hooks.js';
41
43
  import { ensureInjection } from './injection.js';
42
44
  import { writeMemoryBridge } from './memory/memory-bridge.js';
43
45
  import { migrateAgentOutputs } from './migration/agent-outputs.js';
44
46
  import { pushWarning } from './output.js';
45
- import { getAgentsHome, getCleoDirAbsolute, getCleoHome, getProjectRoot, resolveCleoDir, } from './paths.js';
47
+ import { getAgentsHome, getCleoDir, getCleoDirAbsolute, getCleoHome, getProjectRoot, isGitLinkedCheckout, linkedWorktreeMainRoot, recordProjectEncounter, resolveCleoDir, worktreeScope, } from './paths.js';
48
+ import { captureProjectScope } from './project-scope.js';
46
49
  // Shared utility imports
47
50
  import { ensureBrainDb, ensureCleoGitRepo, ensureCleoOsHub, ensureCleoStructure, ensureConfig, ensureGitignore, ensureProjectContext, ensureProjectGitInitialCommit, ensureProjectInfo, ensureWorktreeInclude, getPackageRoot, removeCleoFromRootGitignore, } from './scaffold.js';
48
51
  import { ensureGlobalSchemas } from './schema-management.js';
49
52
  import { readJson } from './store/json.js';
53
+ /**
54
+ * Stable machine-readable codes for `cleo init` refusals (T12562). Carried in
55
+ * `CleoError.details.codeName` so the CLI and the dispatch engine can surface
56
+ * them instead of a generic `E_INTERNAL` / "use force=true".
57
+ *
58
+ * @task T12562
59
+ */
60
+ export const INIT_ERROR_CODES = {
61
+ /** cwd is the initialized project root; `--force` re-initializes it. */
62
+ alreadyInitialized: 'E_ALREADY_INITIALIZED',
63
+ /** cwd is inside an ancestor project; init changed nothing. */
64
+ ancestorProject: 'E_INIT_ANCESTOR_PROJECT',
65
+ /** `--force` resolved to a root other than cwd. */
66
+ forceNotCwd: 'E_INIT_FORCE_NOT_CWD',
67
+ /** cwd is inside a linked git worktree; its project is the main checkout. */
68
+ inWorktree: 'E_INIT_IN_WORKTREE',
69
+ /** cwd is a submodule / separate-git-dir checkout under a CLEO project. */
70
+ gitlinkUnsupported: 'E_INIT_GITLINK_UNSUPPORTED',
71
+ /** The pre-`--force` snapshot could not be taken; nothing was changed. */
72
+ snapshotFailed: 'E_INIT_SNAPSHOT_FAILED',
73
+ };
50
74
  // ── Helpers ──────────────────────────────────────────────────────────
51
75
  /**
52
76
  * Symlink type for directory symlinks.
@@ -285,7 +309,7 @@ export async function initCoreSkills(created, warnings) {
285
309
  const req = createRequire(import.meta.url);
286
310
  const skillsPkgMain = req.resolve('@cleocode/skills/package.json');
287
311
  const skillsPkgRoot = dirname(skillsPkgMain);
288
- if (existsSync(join(skillsPkgRoot, 'skills.json'))) {
312
+ if (existsSync(join(skillsPkgRoot, 'skills', 'manifest.json'))) {
289
313
  ctSkillsRoot = skillsPkgRoot;
290
314
  }
291
315
  }
@@ -296,13 +320,13 @@ export async function initCoreSkills(created, warnings) {
296
320
  try {
297
321
  // Workspace monorepo fallback (packages/skills/)
298
322
  const bundledPath = join(packageRoot, 'packages', 'skills');
299
- if (existsSync(join(bundledPath, 'skills.json'))) {
323
+ if (existsSync(join(bundledPath, 'skills', 'manifest.json'))) {
300
324
  ctSkillsRoot = bundledPath;
301
325
  }
302
326
  else {
303
327
  // node_modules fallback
304
328
  const ctSkillsPath = join(packageRoot, 'node_modules', '@cleocode', 'skills');
305
- if (existsSync(join(ctSkillsPath, 'skills.json'))) {
329
+ if (existsSync(join(ctSkillsPath, 'skills', 'manifest.json'))) {
306
330
  ctSkillsRoot = ctSkillsPath;
307
331
  }
308
332
  }
@@ -322,15 +346,17 @@ export async function initCoreSkills(created, warnings) {
322
346
  catch {
323
347
  warnings.push('Failed to register skill library with CAAMP');
324
348
  }
325
- // Read the skills catalog to find core skills
326
- const catalogPath = join(ctSkillsRoot, 'skills.json');
327
- const catalog = JSON.parse(readFileSync(catalogPath, 'utf-8'));
328
- const skills = catalog.skills ?? [];
329
- // Install core and recommended skills (tier 0, 1, 2)
330
- const coreSkills = skills.filter((s) => s.tier <= 2);
349
+ // T12653: the manifest (generated from SKILL.md frontmatter) is the only
350
+ // skills index. Install every skill that declares `metadata.install:
351
+ // harness`; `internal` skills never reach a harness (D11157).
352
+ // scripts/lint-emitted-skills.mjs mirrors this selection — change both.
353
+ const manifestPath = join(ctSkillsRoot, 'skills', 'manifest.json');
354
+ const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
355
+ const skills = manifest.skills ?? [];
356
+ const harnessSkills = skills.filter((s) => s.install === 'harness');
331
357
  const installed = [];
332
- for (const skill of coreSkills) {
333
- const skillSourceDir = dirname(join(ctSkillsRoot, skill.path));
358
+ for (const skill of harnessSkills) {
359
+ const skillSourceDir = join(ctSkillsRoot, 'skills', skill.name);
334
360
  if (!existsSync(skillSourceDir)) {
335
361
  continue;
336
362
  }
@@ -353,11 +379,49 @@ export async function initCoreSkills(created, warnings) {
353
379
  if (installed.length > 0) {
354
380
  created.push(`skills: ${installed.length} core skills installed`);
355
381
  }
382
+ // T12678: record what CLEO installed, then remove bundled skills CLEO no
383
+ // longer installs (internal or retired) — only where CLEO owns them.
384
+ await pruneAfterInstall(ctSkillsRoot, installed, providers, created, warnings);
356
385
  }
357
386
  catch (err) {
358
387
  warnings.push(`Core skill install: ${err instanceof Error ? err.message : String(err)}`);
359
388
  }
360
389
  }
390
+ /**
391
+ * Write the bundled-install ledger and prune skills the bundled manifest no
392
+ * longer installs (T12678). Best-effort: failures become warnings.
393
+ *
394
+ * @param ctSkillsRoot - `@cleocode/skills` package root.
395
+ * @param installed - Skills installed by this run.
396
+ * @param providers - Installed harness providers.
397
+ * @param created - Accumulator for created/removed messages.
398
+ * @param warnings - Accumulator for warnings.
399
+ */
400
+ async function pruneAfterInstall(ctSkillsRoot, installed, providers, created, warnings) {
401
+ try {
402
+ const { resolveProviderSkillsDirs } = await import('@cleocode/caamp');
403
+ const { resolveSkillsRoot } = await import('./skills/skill-root.js');
404
+ const { defaultPruneRegistry, pruneBundledSkills, recordBundledInstalls } = await import('./skills/prune-bundled.js');
405
+ const skillsRoot = resolveSkillsRoot();
406
+ await recordBundledInstalls(skillsRoot, installed);
407
+ const receipt = await pruneBundledSkills({
408
+ bundledSkillsDir: join(ctSkillsRoot, 'skills'),
409
+ skillsRoot,
410
+ providerSkillDirs: providers.flatMap((p) => resolveProviderSkillsDirs(p, 'global')),
411
+ registry: await defaultPruneRegistry(),
412
+ receiptPath: join(skillsRoot, '.prune-receipts.jsonl'),
413
+ });
414
+ const moved = receipt.actions.filter((a) => a.action === 'quarantined');
415
+ if (moved.length > 0) {
416
+ created.push(`skills: quarantined ${moved.length} entries no longer installed (${[...new Set(moved.map((a) => a.name))].join(', ')}); restore with cleo skills doctor restore ${receipt.quarantineId}`);
417
+ }
418
+ for (const e of receipt.errors)
419
+ warnings.push(`Skill prune: ${e}`);
420
+ }
421
+ catch (err) {
422
+ warnings.push(`Skill prune: ${err instanceof Error ? err.message : String(err)}`);
423
+ }
424
+ }
361
425
  /**
362
426
  * Register/reconcile project with NEXUS.
363
427
  * Uses nexusReconcile for idempotent handshake — auto-registers if new,
@@ -365,7 +429,7 @@ export async function initCoreSkills(created, warnings) {
365
429
  * @task T4684
366
430
  * @task T5368
367
431
  */
368
- export async function initNexusRegistration(projectRoot, created, warnings) {
432
+ export async function initNexusRegistration(projectRoot, created, warnings, opts = {}) {
369
433
  try {
370
434
  const { shouldAutoRegisterProject } = await import('./nexus/registry-hygiene.js');
371
435
  if (!shouldAutoRegisterProject(projectRoot, getCleoHome())) {
@@ -373,8 +437,26 @@ export async function initNexusRegistration(projectRoot, created, warnings) {
373
437
  warnings.push('NEXUS registration skipped: project is under a temp directory (register explicitly with `cleo nexus register`)');
374
438
  return;
375
439
  }
440
+ if (opts.maintenance) {
441
+ // T12470: a maintenance command (`cleo upgrade` / `self-update`) is not
442
+ // an explicit registration. It goes through the encounter, which never
443
+ // mints an identity and never moves an existing row to this checkout.
444
+ const outcome = await recordProjectEncounter(projectRoot);
445
+ if (outcome === 'recorded')
446
+ created.push('NEXUS registration (encounter recorded)');
447
+ return;
448
+ }
376
449
  const { nexusReconcile } = await import('./nexus/registry.js');
377
- const result = await nexusReconcile(projectRoot);
450
+ const result = await nexusReconcile(projectRoot, {
451
+ ...(opts.forceRebind ? { forceRebind: true } : {}),
452
+ });
453
+ if (result.status === 'candidate') {
454
+ warnings.push(`NEXUS registration: this project is registered at ${result.oldPath}, which still exists; ` +
455
+ 'this checkout was recorded as a candidate and the registry was NOT repointed. ' +
456
+ 'If this checkout should own the registration, run `cleo doctor project-identity --resolve` ' +
457
+ 'or re-run with `--force-rebind`.');
458
+ return;
459
+ }
378
460
  if (result.status === 'auto_registered') {
379
461
  created.push('NEXUS registration (auto-registered new project)');
380
462
  }
@@ -539,6 +621,345 @@ export async function installHandoffRedirectStubs(projectRoot, created) {
539
621
  }
540
622
  }
541
623
  // ── Public API ───────────────────────────────────────────────────────
624
+ /**
625
+ * Canonicalize a path for identity comparison, tolerating a missing path.
626
+ *
627
+ * @param path - Absolute path.
628
+ * @returns The realpath, or the resolved path when it cannot be read.
629
+ */
630
+ function canonicalPath(path) {
631
+ try {
632
+ return realpathSync(path);
633
+ }
634
+ catch {
635
+ return resolve(path);
636
+ }
637
+ }
638
+ /**
639
+ * Report whether `child` lies strictly below `parent` (by canonical path).
640
+ *
641
+ * @param child - Candidate descendant.
642
+ * @param parent - Candidate ancestor.
643
+ * @returns `true` when `child` is inside `parent` and not equal to it.
644
+ */
645
+ function isStrictlyInside(child, parent) {
646
+ const rel = relative(canonicalPath(parent), canonicalPath(child));
647
+ return rel !== '' && !rel.startsWith('..') && !isAbsolutePath(rel);
648
+ }
649
+ /**
650
+ * The CLEO project that encloses a gitlink checkout (submodule or
651
+ * separate-git-dir), or `undefined` when none does (T12562 · T12558 round 5).
652
+ *
653
+ * The walk starts at the gitlink's PARENT directory, never at the checkout
654
+ * itself: a `.cleo/` inside the checkout — tracked files, or the tombstone a
655
+ * reroot leaves — must not make it look self-contained, because project-root
656
+ * resolution walks past a gitlink root and would still use the enclosing
657
+ * store. A relocation refusal met on the way up is not an enclosing project.
658
+ *
659
+ * @param gitlinkRoot - Root of the gitlink checkout (its `.git` is a file).
660
+ * @returns The enclosing project root, or `undefined`.
661
+ */
662
+ function enclosingProjectOfGitlink(gitlinkRoot) {
663
+ const parent = dirname(gitlinkRoot);
664
+ if (parent === gitlinkRoot)
665
+ return undefined;
666
+ try {
667
+ const root = getProjectRoot(parent);
668
+ return existsSync(join(root, '.cleo')) && isStrictlyInside(gitlinkRoot, root)
669
+ ? root
670
+ : undefined;
671
+ }
672
+ catch {
673
+ return undefined;
674
+ }
675
+ }
676
+ /**
677
+ * Find the nearest git checkout boundary at or above `start`.
678
+ *
679
+ * @param start - Absolute directory to start from.
680
+ * @returns The nearest boundary, or `null` when no `.git` entry exists above.
681
+ */
682
+ function findGitBoundary(start) {
683
+ let current = start;
684
+ while (true) {
685
+ const gitPath = join(current, '.git');
686
+ try {
687
+ const st = statSync(gitPath);
688
+ if (st.isDirectory())
689
+ return { root: current, kind: 'repo' };
690
+ if (st.isFile()) {
691
+ // A linked worktree shares its main checkout's project; a submodule or
692
+ // separate-git-dir gitlink is its own repository.
693
+ if (!isGitLinkedCheckout(current))
694
+ return { root: current, kind: 'submodule' };
695
+ const mainRoot = linkedWorktreeMainRoot(current);
696
+ return { root: current, kind: 'worktree', ...(mainRoot ? { mainRoot } : {}) };
697
+ }
698
+ }
699
+ catch {
700
+ // No `.git` here — keep walking.
701
+ }
702
+ const parent = dirname(current);
703
+ if (parent === current)
704
+ return null;
705
+ current = parent;
706
+ }
707
+ }
708
+ /**
709
+ * Choose the directory `cleo init` acts on (T12562).
710
+ *
711
+ * Every other command walks up from a subdirectory to the enclosing project,
712
+ * and keeps doing so. `init` is different because it CREATES a project, so the
713
+ * walk must not silently redirect it: from a child git repository nested under
714
+ * an initialized CLEO root the walk found the parent, and the guard then
715
+ * advised `--force` against the parent's store.
716
+ *
717
+ * Resolution order:
718
+ * 1. `--here` targets the working directory ({@link initProject} still refuses
719
+ * it inside a linked worktree).
720
+ * 2. An active worktree scope, an absolute `CLEO_DIR` or `CLEO_ROOT` /
721
+ * `CLEO_PROJECT_ROOT` pins the target explicitly (unchanged behaviour).
722
+ * 3. A working directory that is its own git root (`.git` is a directory)
723
+ * targets itself: a nested repository is a separate project. A gitlink
724
+ * checkout (linked worktree, submodule, separate-git-dir) does not, because
725
+ * project-root resolution cannot use a store there.
726
+ * 4. Otherwise the existing resolution applies. A plain (non-git)
727
+ * subdirectory of a CLEO project therefore still resolves to that ancestor;
728
+ * {@link initProject} reports it by absolute path and never wipes it.
729
+ *
730
+ * @param opts - `here` forces the working directory; `cwd` overrides `process.cwd()`.
731
+ * @returns The chosen target.
732
+ *
733
+ * @example
734
+ * ```ts
735
+ * resolveInitTarget(); // { projectRoot: '/repo/child', source: 'git-root', isCwd: true, ... }
736
+ * ```
737
+ *
738
+ * @task T12562
739
+ */
740
+ export function resolveInitTarget(opts = {}) {
741
+ const cwd = resolve(opts.cwd ?? process.cwd()); // CWD-OK: init creates the project at cwd (T12562)
742
+ const cleoDirEnv = getCleoDir();
743
+ const relativeCleoDir = isAbsolutePath(cleoDirEnv) ? '.cleo' : cleoDirEnv;
744
+ const envPinned = isAbsolutePath(cleoDirEnv) ||
745
+ Boolean(process.env['CLEO_ROOT'] ?? process.env['CLEO_PROJECT_ROOT']);
746
+ const pinned = envPinned || worktreeScope.getStore() !== undefined;
747
+ const gitBoundary = findGitBoundary(cwd);
748
+ let cleoDir;
749
+ let source;
750
+ if (opts.here) {
751
+ cleoDir = resolve(cwd, relativeCleoDir);
752
+ source = 'here';
753
+ }
754
+ else if (pinned) {
755
+ // T9803/D009: `bootstrap` is the only sanctioned cwd-relative fallback.
756
+ cleoDir = getCleoDirAbsolute(opts.cwd, { bootstrap: true });
757
+ source = 'pinned';
758
+ }
759
+ else if (gitBoundary?.kind === 'repo' && gitBoundary.root === cwd) {
760
+ cleoDir = resolve(cwd, relativeCleoDir);
761
+ source = 'git-root';
762
+ }
763
+ else {
764
+ cleoDir = getCleoDirAbsolute(opts.cwd, { bootstrap: true });
765
+ source = 'resolved';
766
+ }
767
+ // `cleoDir` is `<root>/.cleo` by default, so its parent is the project root.
768
+ // This also respects an absolute `CLEO_DIR` used by the init-e2e suite.
769
+ const projectRoot = dirname(cleoDir);
770
+ let enclosingProjectRoot;
771
+ if (gitBoundary?.kind === 'submodule') {
772
+ enclosingProjectRoot = enclosingProjectOfGitlink(gitBoundary.root);
773
+ }
774
+ return {
775
+ cleoDir,
776
+ projectRoot,
777
+ cwd,
778
+ source,
779
+ isCwd: canonicalPath(projectRoot) === canonicalPath(cwd),
780
+ envPinned,
781
+ gitBoundary,
782
+ ...(enclosingProjectRoot ? { enclosingProjectRoot } : {}),
783
+ };
784
+ }
785
+ /**
786
+ * Return the stable init refusal code carried by `err`, if any (T12562).
787
+ *
788
+ * @param err - Error thrown by core `initProject`.
789
+ * @returns One of {@link INIT_ERROR_CODES}, or `undefined`.
790
+ *
791
+ * @example
792
+ * ```ts
793
+ * initErrorCodeName(err); // 'E_INIT_ANCESTOR_PROJECT'
794
+ * ```
795
+ *
796
+ * @task T12562
797
+ */
798
+ export function initErrorCodeName(err) {
799
+ if (!(err instanceof CleoError))
800
+ return undefined;
801
+ const codeName = err.details?.['codeName'];
802
+ const known = Object.values(INIT_ERROR_CODES);
803
+ return typeof codeName === 'string' && known.includes(codeName) ? codeName : undefined;
804
+ }
805
+ /**
806
+ * Build a `cleo init` refusal carrying its stable code in `details.codeName`.
807
+ *
808
+ * @param codeName - One of {@link INIT_ERROR_CODES}.
809
+ * @param message - Self-contained message; the CLI prints only this line.
810
+ * @param fix - Copy-paste remedy.
811
+ * @param details - Extra structured context.
812
+ * @returns The error to throw.
813
+ */
814
+ function initRefusal(codeName, message, fix, details) {
815
+ return new CleoError(ExitCode.GENERAL_ERROR, message, {
816
+ fix,
817
+ details: { field: 'cwd', codeName, ...details },
818
+ });
819
+ }
820
+ /** What `--force` resets, stated once for every message that mentions it. */
821
+ const FORCE_RESETS = '--force resets .cleo/config.json and .cleo/project-info.json to defaults and rewrites ' +
822
+ '.cleo/.gitignore and the managed git hooks (commit-msg, pre-commit, pre-push); it deletes ' +
823
+ 'no task, brain or conduit data. It first snapshots the databases (VACUUM INTO) and those ' +
824
+ 'files into .cleo/backups/sqlite/ and refuses if the snapshot fails.';
825
+ /**
826
+ * Refuse any init that could touch a project other than the one the operator
827
+ * is standing in (T12562). Every refusal changes nothing.
828
+ *
829
+ * @param target - The resolved target.
830
+ * @param opts - The caller's init options.
831
+ * @param alreadyInitialized - Whether the target already holds a project.
832
+ * @throws {CleoError} With `details.codeName` from {@link INIT_ERROR_CODES}.
833
+ */
834
+ function assertInitTargetAllowed(target, opts, alreadyInitialized) {
835
+ const { cwd, projectRoot: root, gitBoundary: git } = target;
836
+ const additiveMapOnly = opts.mapCodebase === true && !opts.force;
837
+ // A linked worktree shares its main checkout's project (D009 / T9803): a
838
+ // `.cleo/` inside it is an orphan store. Only an explicit env pin, or the
839
+ // additive map of the already-initialized main project, may proceed.
840
+ if (git?.kind === 'worktree' && !target.envPinned) {
841
+ const main = git.mainRoot;
842
+ const mapsMain = main !== undefined &&
843
+ additiveMapOnly &&
844
+ alreadyInitialized &&
845
+ canonicalPath(root) === canonicalPath(main);
846
+ if (!mapsMain) {
847
+ const whose = main ? ` of ${main}` : '';
848
+ throw initRefusal(INIT_ERROR_CODES.inWorktree, `${cwd} is inside a linked git worktree${whose}. A worktree shares its main ` +
849
+ `checkout's CLEO project, so there is nothing to init here, and a .cleo/ inside a ` +
850
+ 'worktree would be an orphan store. Nothing was changed.' +
851
+ (main ? ` If ${main} is not a CLEO project yet, run \`cleo init\` there.` : ''), main
852
+ ? `cd ${JSON.stringify(main)} && cleo init`
853
+ : 'Run `cleo init` in the main checkout (`git worktree list` names it).', { resolvedRoot: root, worktreeRoot: git.root, ...(main ? { mainRoot: main } : {}) });
854
+ }
855
+ }
856
+ // A submodule / separate-git-dir checkout under a CLEO project: project-root
857
+ // resolution walks past a gitlink root, so a store created here would be
858
+ // ignored and every later command would use the superproject's store.
859
+ const enclosing = target.enclosingProjectRoot;
860
+ if (git?.kind === 'submodule' &&
861
+ enclosing !== undefined &&
862
+ !target.envPinned &&
863
+ !(additiveMapOnly && !opts.here)) {
864
+ throw initRefusal(INIT_ERROR_CODES.gitlinkUnsupported, `${git.root} is a submodule / separate-git-dir checkout inside the CLEO project at ` +
865
+ `${enclosing}. CLEO resolves this checkout to ${enclosing}, so every command run here ` +
866
+ `already uses that project's store; a separate store for a gitlink checkout is not ` +
867
+ 'supported yet (tracked separately). Nothing was changed.', `Use the project at ${enclosing} (run cleo from anywhere inside it).`, { resolvedRoot: root, repositoryRoot: git.root, enclosingProjectRoot: enclosing });
868
+ }
869
+ // An uninitialized repository between cwd and the ancestor project is the
870
+ // project the operator most likely meant: point there, not at cwd.
871
+ const nestedRepo = git?.kind === 'repo' && isStrictlyInside(git.root, root) ? git.root : undefined;
872
+ // Never advise --force against a root other than cwd (T12562 AC2).
873
+ const separateProjectFix = nestedRepo
874
+ ? `cd ${JSON.stringify(nestedRepo)} && cleo init`
875
+ : `cd ${JSON.stringify(cwd)} && cleo init --here`;
876
+ if (opts.force && !target.isCwd) {
877
+ throw initRefusal(INIT_ERROR_CODES.forceNotCwd, `Refusing --force: it would re-initialize ${root}, which is not the current directory ` +
878
+ `(${cwd}). --force only ever acts on the current directory's own project. ` +
879
+ 'Nothing was changed.', separateProjectFix, { field: 'force', resolvedRoot: root });
880
+ }
881
+ if (!alreadyInitialized || opts.force || additiveMapOnly)
882
+ return;
883
+ if (target.isCwd) {
884
+ throw initRefusal(INIT_ERROR_CODES.alreadyInitialized, `Project already initialized at ${root}. DANGER ZONE: ${FORCE_RESETS}`, 'cleo init --force', { resolvedRoot: root });
885
+ }
886
+ if (nestedRepo) {
887
+ throw initRefusal(INIT_ERROR_CODES.ancestorProject, `${cwd} is inside the git repository ${nestedRepo}, which is not a CLEO project yet; ` +
888
+ `the nearest CLEO project is ${root}. Nothing was changed. To make that repository ` +
889
+ `its own project, run \`cleo init\` in ${nestedRepo}.`, separateProjectFix, { resolvedRoot: root, repositoryRoot: nestedRepo });
890
+ }
891
+ throw initRefusal(INIT_ERROR_CODES.ancestorProject, `${cwd} is inside the CLEO project already initialized at ${root}. Nothing was ` +
892
+ `changed. To create a separate project in ${cwd}, run \`cleo init --here\` there.`, separateProjectFix, { resolvedRoot: root, source: target.source });
893
+ }
894
+ /**
895
+ * Every managed git hook a forced re-init could overwrite, as snapshot sources.
896
+ *
897
+ * `ensureGitHooks({ force })` writes `<root>/.git/hooks`. The hooks git
898
+ * actually runs may live elsewhere (a gitlink checkout's git dir, or a custom
899
+ * `core.hooksPath`), so that directory is resolved too and snapshotted when it
900
+ * differs (T12562).
901
+ *
902
+ * @param projRoot - Absolute project root.
903
+ * @returns `[label, sourcePath]` pairs for the snapshot.
904
+ */
905
+ function managedHookSnapshotSources(projRoot) {
906
+ const literal = join(projRoot, '.git', 'hooks');
907
+ const gitDir = resolveGitDir(projRoot);
908
+ const effective = gitDir ? resolveHooksDir(projRoot, gitDir) : literal;
909
+ const dirs = [['git-hook', literal]];
910
+ if (canonicalPath(effective) !== canonicalPath(literal))
911
+ dirs.push(['hooks-path', effective]);
912
+ return dirs.flatMap(([prefix, dir]) => MANAGED_HOOKS.map((h) => [`${prefix}-${h}`, join(dir, h)]));
913
+ }
914
+ /**
915
+ * Snapshot everything a forced re-init overwrites, and refuse to continue
916
+ * without a complete snapshot (T12562).
917
+ *
918
+ * Uses the `cleo backup add` path ({@link createBackup}): `VACUUM INTO` for the
919
+ * databases and atomic copies of `config.json` / `project-info.json`, with a
920
+ * restorable `<backupId>.meta.json` sidecar (`cleo restore backup`). The other
921
+ * files `--force` rewrites (`.cleo/.gitignore`, `.cleo/project-context.json`,
922
+ * the managed git hooks) are copied beside it as `<name>.<backupId>`.
923
+ *
924
+ * @param projRoot - Absolute project root being re-initialized.
925
+ * @param cleoDir - Absolute `.cleo/` directory of that root.
926
+ * @returns The backup id written by THIS run.
927
+ * @throws {CleoError} `E_INIT_SNAPSHOT_FAILED` when any required file is missing
928
+ * from this run's snapshot.
929
+ */
930
+ async function snapshotBeforeForcedReinit(projRoot, cleoDir) {
931
+ const { createBackup } = await import('./system/backup.js');
932
+ const result = await createBackup(projRoot, {
933
+ type: 'pre-force-init',
934
+ note: 'taken by `cleo init --force` before it resets project files (T12562)',
935
+ });
936
+ const required = ['config.json', 'project-info.json'].filter((f) => existsSync(join(cleoDir, f)));
937
+ // `tasks.db` is createBackup's label for the live project store (cleo.db).
938
+ if (existsSync(join(cleoDir, 'cleo.db')) || existsSync(join(cleoDir, 'tasks.db'))) {
939
+ required.push('tasks.db');
940
+ }
941
+ const missing = required.filter((f) => !result.files.includes(f));
942
+ const extras = [
943
+ ['.gitignore', join(cleoDir, '.gitignore')],
944
+ ['project-context.json', join(cleoDir, 'project-context.json')],
945
+ ...managedHookSnapshotSources(projRoot),
946
+ ];
947
+ for (const [label, src] of extras) {
948
+ if (!existsSync(src))
949
+ continue;
950
+ try {
951
+ copyFileSync(src, join(result.path, `${label}.${result.backupId}`), fsConstants.COPYFILE_EXCL);
952
+ }
953
+ catch {
954
+ missing.push(label);
955
+ }
956
+ }
957
+ if (missing.length > 0) {
958
+ throw initRefusal(INIT_ERROR_CODES.snapshotFailed, `Refusing --force: the pre-reset snapshot of ${projRoot} is incomplete (missing: ` +
959
+ `${missing.join(', ')}). Nothing was changed. Run \`cleo backup add\`, then retry.`, 'cleo backup add', { field: 'force', resolvedRoot: projRoot, missing, backupId: result.backupId });
960
+ }
961
+ return result.backupId;
962
+ }
542
963
  /**
543
964
  * Run update-docs only: refresh all injections without reinitializing.
544
965
  * Re-injects CLEO-INJECTION.md into all detected agent instruction files.
@@ -569,6 +990,33 @@ export async function updateDocs() {
569
990
  updateDocsOnly: true,
570
991
  };
571
992
  }
993
+ /**
994
+ * Remove the identity files a relocated project left (or `git checkout`
995
+ * restored) at `root`, so `cleo init --here --new-identity` mints a new id
996
+ * instead of adopting the old one: `.cleo/project-id` and
997
+ * `.cleo/project-info.json` only when they declare `projectId`, and the reroot
998
+ * tombstone. Nothing else is touched.
999
+ */
1000
+ async function retireRelocatedIdentity(root, projectId) {
1001
+ const { readPortableProjectId } = await import('@cleocode/paths');
1002
+ const tracked = readPortableProjectId(root);
1003
+ if (tracked.status === 'valid' && tracked.projectId === projectId) {
1004
+ await unlink(join(root, '.cleo', 'project-id'));
1005
+ }
1006
+ const infoPath = join(root, '.cleo', 'project-info.json');
1007
+ if (existsSync(infoPath)) {
1008
+ try {
1009
+ const info = JSON.parse(await readFile(infoPath, 'utf-8'));
1010
+ if (info.projectId === projectId)
1011
+ await unlink(infoPath);
1012
+ }
1013
+ catch {
1014
+ // Unparseable: ensureProjectInfo regenerates it.
1015
+ }
1016
+ }
1017
+ const { PROJECT_TOMBSTONE_FILE } = await import('./project-tombstone.js');
1018
+ await unlink(join(root, PROJECT_TOMBSTONE_FILE)).catch(() => undefined);
1019
+ }
572
1020
  /**
573
1021
  * Run full project initialization.
574
1022
  *
@@ -586,43 +1034,109 @@ export async function updateDocs() {
586
1034
  * @task T4707
587
1035
  */
588
1036
  export async function initProject(opts = {}) {
589
- // T9803/D009: `cleo init` is the ONLY caller permitted to bootstrap a
590
- // missing project root. Passing `{ bootstrap: true }` opts into the
591
- // cwd-relative fallback; every other caller must resolve through an
592
- // existing root or throw to prevent orphan-`.cleo/` synthesis inside
593
- // worktrees.
594
- const cleoDir = getCleoDirAbsolute(undefined, { bootstrap: true });
595
- // `cleo init` CREATES the project root, so we cannot call getProjectRoot()
596
- // here — that walks up looking for an existing `.cleo/` sentinel and throws
597
- // `E_NOT_FOUND` when none is present (the whole point of `init` is that
598
- // none is present yet). `cleoDir` is `<cwd>/.cleo` by default, so its
599
- // parent directory is the project root. This also respects an absolute
600
- // `CLEO_DIR` env var used by the init-e2e test suite to pin the target
601
- // directory.
602
- const projRoot = dirname(cleoDir);
603
- // Guard: fail if project already initialized (unless --force)
604
- const alreadyInitialized = existsSync(cleoDir) &&
605
- (existsSync(join(cleoDir, 'tasks.db')) || existsSync(join(cleoDir, 'config.json')));
606
- // T12077: `--map-codebase` is ADDITIVE — it analyses the tree and writes
607
- // findings to BRAIN; it scaffolds nothing and wipes nothing. Blocking it
608
- // behind this guard made the onboarding path self-contradictory: a fresh
609
- // `cleo init` on a brownfield repo returns
610
- //
611
- // nextSteps: [{ action: 'Anchor the existing codebase in BRAIN as baseline
612
- // context', command: 'cleo init --map-codebase' }]
613
- //
614
- // and running that exact command then failed with "Project already
615
- // initialized. DANGER ZONE: use --force to wipe and re-init." The only way
616
- // to follow CLEO's own advice was to destroy the project it had just set up.
617
- //
618
- // Measured on a greenfield sandbox: `cleo init` succeeded, and the very
619
- // first recommended follow-up was impossible.
620
- const additiveMapOnly = opts.mapCodebase === true;
621
- if (alreadyInitialized && !opts.force && !additiveMapOnly) {
622
- throw new CleoError(ExitCode.GENERAL_ERROR, 'Project already initialized. DANGER ZONE: use --force to wipe and re-init.', { fix: 'cleo init --force' });
1037
+ // T12562: choose the target explicitly instead of trusting the ancestor
1038
+ // walk. From a child git repo under an initialized CLEO root the walk
1039
+ // resolved the PARENT, the guard below then advised `--force`, and following
1040
+ // that advice re-initialized the parent store.
1041
+ const target = resolveInitTarget({ here: opts.here });
1042
+ const { cleoDir, projectRoot: projRoot } = target;
1043
+ // T12558: relocation state, detected WITHOUT writing or throwing yet.
1044
+ // Resolving from the target reports E_PROJECT_MOVED at a valid reroot
1045
+ // tombstone (at the target or an ancestor it would resolve to); the store
1046
+ // guard's registry arm is checked up front for the same reason.
1047
+ let movedOnResolve;
1048
+ if (!opts.here) {
1049
+ try {
1050
+ getProjectRoot(projRoot);
1051
+ }
1052
+ catch (err) {
1053
+ if (err instanceof CleoError && err.code === ExitCode.PROJECT_MOVED)
1054
+ movedOnResolve = err;
1055
+ }
1056
+ }
1057
+ const { detectRelocatedRoot, allowStoreAtRelocatedRoot } = await import('./store/relocated-store-guard.js');
1058
+ const { resolveDualScopeDbPath } = await import('./store/dual-scope-db.js');
1059
+ const relocated = existsSync(join(cleoDir, 'cleo.db'))
1060
+ ? null
1061
+ : detectRelocatedRoot(projRoot, resolveDualScopeDbPath('global'));
1062
+ // T12562: legacy `tasks.db` counts too, so a forced re-init snapshots it.
1063
+ // T12558: at a relocated root (no store) restored tracked files never count,
1064
+ // so #1605's guard never answers "already initialized — use --force" there.
1065
+ const alreadyInitialized = !relocated &&
1066
+ existsSync(cleoDir) &&
1067
+ (existsSync(join(cleoDir, 'cleo.db')) ||
1068
+ existsSync(join(cleoDir, 'tasks.db')) ||
1069
+ existsSync(join(cleoDir, 'config.json')));
1070
+ // #1605's target refusals (worktree, gitlink, force-not-cwd, ancestor) run
1071
+ // FIRST: a relocation opt-out can never reopen a target CLEO cannot use.
1072
+ assertInitTargetAllowed(target, opts, alreadyInitialized);
1073
+ // T12558: relocation refusals, still before any write.
1074
+ if (movedOnResolve)
1075
+ throw movedOnResolve;
1076
+ if (relocated && !opts.here) {
1077
+ const { projectMovedError } = await import('./project-tombstone.js');
1078
+ throw projectMovedError(projRoot, relocated, undefined, relocated.via);
1079
+ }
1080
+ // `--here` alone would ADOPT the relocated project's id and create a SECOND
1081
+ // store for it — two diverging copies of one project. Only a genuinely
1082
+ // separate project (a new id) may start here.
1083
+ if (relocated && !opts.newIdentity) {
1084
+ throw new CleoError(ExitCode.PROJECT_MOVED, `E_PROJECT_MOVED: ${projRoot} is where project ${relocated.projectId} was rerooted from; \`--here\` alone would create a second store for that same project`, {
1085
+ fix: `cd "${relocated.movedTo}" (the live project). To start a DIFFERENT project here, run \`cleo init --here --new-identity\` (mints a new id; commit the new .cleo/project-id).`,
1086
+ details: {
1087
+ field: 'projectRoot',
1088
+ projectId: relocated.projectId,
1089
+ movedFrom: projRoot,
1090
+ movedTo: relocated.movedTo,
1091
+ evidence: relocated.via,
1092
+ },
1093
+ });
1094
+ }
1095
+ // T12558: `--here --new-identity` at a relocated root — every refusal has
1096
+ // passed. The restored `.cleo/project-id` (and a stale tombstone) belong to
1097
+ // the relocated project; retire them so a new id is minted, not adopted.
1098
+ let retiredProjectId;
1099
+ if (relocated) {
1100
+ allowStoreAtRelocatedRoot(projRoot);
1101
+ retiredProjectId = relocated.projectId;
1102
+ await retireRelocatedIdentity(projRoot, relocated.projectId);
1103
+ const auditPath = join(cleoDir, 'audit', 'relocation-override.jsonl');
1104
+ await mkdir(dirname(auditPath), { recursive: true });
1105
+ await appendFile(auditPath, `${JSON.stringify({
1106
+ timestamp: new Date().toISOString(),
1107
+ action: 'init --here --new-identity',
1108
+ projectRoot: projRoot,
1109
+ projectId: relocated.projectId,
1110
+ movedTo: relocated.movedTo,
1111
+ evidence: relocated.via,
1112
+ newIdentity: true,
1113
+ })}\n`);
623
1114
  }
624
1115
  const force = !!opts.force;
1116
+ const scope = captureProjectScope(projRoot, worktreeScope.getStore());
1117
+ let preForceBackupId;
1118
+ if (force && alreadyInitialized) {
1119
+ preForceBackupId = await worktreeScope.run(scope, () => snapshotBeforeForcedReinit(projRoot, cleoDir));
1120
+ }
1121
+ // Pin every ambient `getProjectRoot()` / `getCleoDirAbsolute()` inside the
1122
+ // scaffolding steps to the chosen target, so none of them walks back up to
1123
+ // an ancestor project while the target's `.cleo/` is still being created.
1124
+ return worktreeScope.run(scope, () => scaffoldInitTarget(opts, { cleoDir, projRoot, force, preForceBackupId, retiredProjectId }));
1125
+ }
1126
+ /**
1127
+ * Run the scaffolding half of {@link initProject} against an already-chosen,
1128
+ * already-guarded target.
1129
+ *
1130
+ * @param opts - The caller's init options.
1131
+ * @param target - Resolved `.cleo/` directory, project root, force flag and pre-force backup id.
1132
+ * @returns The init result.
1133
+ */
1134
+ async function scaffoldInitTarget(opts, target) {
1135
+ const { cleoDir, projRoot, force, retiredProjectId } = target;
625
1136
  const created = [];
1137
+ if (target.preForceBackupId) {
1138
+ created.push(`pre-force snapshot: .cleo/backups/sqlite/*.${target.preForceBackupId} (cleo restore backup)`);
1139
+ }
626
1140
  const skipped = [];
627
1141
  const warnings = [];
628
1142
  // Phase 5 — classify the directory BEFORE creating any files so the
@@ -654,6 +1168,9 @@ export async function initProject(opts = {}) {
654
1168
  created.push('tasks.db');
655
1169
  }
656
1170
  catch (err) {
1171
+ // A relocated root is a refusal, never a store "deferred" behind success.
1172
+ if (err instanceof CleoError && err.code === ExitCode.PROJECT_MOVED)
1173
+ throw err;
657
1174
  // SQLite init failure is not fatal — will be created on first access
658
1175
  created.push(`tasks.db (deferred: ${err instanceof Error ? err.message : String(err)})`);
659
1176
  }
@@ -827,6 +1344,12 @@ export async function initProject(opts = {}) {
827
1344
  /re-linked|conflict|invalid|coverage missing/.test(projectInfoResult.details)) {
828
1345
  warnings.push(`Project identity: ${projectInfoResult.details}`);
829
1346
  }
1347
+ if (retiredProjectId) {
1348
+ warnings.push(`.cleo/project-id changed: this is a NEW project, not ${retiredProjectId} (which lives on elsewhere). Commit the new .cleo/project-id.`);
1349
+ // Both projects are registered under this directory's name; say so rather
1350
+ // than rename either one behind the operator's back.
1351
+ warnings.push(`Project name "${basename(projRoot)}" is now ambiguous: ${retiredProjectId} was registered under the same name. Rename this one with \`cleo project rename <new-name>\`.`);
1352
+ }
830
1353
  // Project context detection (always run during init)
831
1354
  try {
832
1355
  const detectResult = await ensureProjectContext(projRoot, { force: !!opts.detect });
@@ -890,7 +1413,9 @@ export async function initProject(opts = {}) {
890
1413
  // Note: Core skills installation is global-only (bootstrapGlobalCleo / installSkillsGlobally).
891
1414
  // Skills are NOT installed during project-level init — they are installed once globally.
892
1415
  // T4684: NEXUS registration (reconcile-based handshake, T5368)
893
- await initNexusRegistration(projRoot, created, warnings);
1416
+ await initNexusRegistration(projRoot, created, warnings, {
1417
+ ...(opts.forceRebind ? { forceRebind: true } : {}),
1418
+ });
894
1419
  // T5240: Adapter discovery, activation, and install
895
1420
  try {
896
1421
  const { AdapterManager } = await import('./adapters/index.js');