@cleocode/core 2026.9.23 → 2026.9.24

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 (651) hide show
  1. package/dist/admin/import-tasks.d.ts.map +1 -1
  2. package/dist/admin/import-tasks.js +35 -6
  3. package/dist/admin/import-tasks.js.map +1 -1
  4. package/dist/admin/import.d.ts.map +1 -1
  5. package/dist/admin/import.js +25 -6
  6. package/dist/admin/import.js.map +1 -1
  7. package/dist/build-provenance.json +2 -2
  8. package/dist/cloud/http.d.ts +8 -0
  9. package/dist/cloud/http.d.ts.map +1 -1
  10. package/dist/cloud/http.js +8 -1
  11. package/dist/cloud/http.js.map +1 -1
  12. package/dist/cloud/index.d.ts +6 -1
  13. package/dist/cloud/index.d.ts.map +1 -1
  14. package/dist/cloud/index.js +6 -1
  15. package/dist/cloud/index.js.map +1 -1
  16. package/dist/cloud/nexus-auth.d.ts +169 -0
  17. package/dist/cloud/nexus-auth.d.ts.map +1 -0
  18. package/dist/cloud/nexus-auth.js +372 -0
  19. package/dist/cloud/nexus-auth.js.map +1 -0
  20. package/dist/cloud/nexus-credentials.d.ts +188 -0
  21. package/dist/cloud/nexus-credentials.d.ts.map +1 -0
  22. package/dist/cloud/nexus-credentials.js +323 -0
  23. package/dist/cloud/nexus-credentials.js.map +1 -0
  24. package/dist/cloud/nexus-link.d.ts +85 -0
  25. package/dist/cloud/nexus-link.d.ts.map +1 -0
  26. package/dist/cloud/nexus-link.js +226 -0
  27. package/dist/cloud/nexus-link.js.map +1 -0
  28. package/dist/cloud/presence.d.ts +88 -0
  29. package/dist/cloud/presence.d.ts.map +1 -0
  30. package/dist/cloud/presence.js +137 -0
  31. package/dist/cloud/presence.js.map +1 -0
  32. package/dist/cloud/projects.d.ts +3 -1
  33. package/dist/cloud/projects.d.ts.map +1 -1
  34. package/dist/cloud/projects.js +4 -2
  35. package/dist/cloud/projects.js.map +1 -1
  36. package/dist/crypto/credentials.d.ts +14 -4
  37. package/dist/crypto/credentials.d.ts.map +1 -1
  38. package/dist/crypto/credentials.js +15 -1
  39. package/dist/crypto/credentials.js.map +1 -1
  40. package/dist/decide/bench/dataset.d.ts +125 -0
  41. package/dist/decide/bench/dataset.d.ts.map +1 -0
  42. package/dist/decide/bench/dataset.js +457 -0
  43. package/dist/decide/bench/dataset.js.map +1 -0
  44. package/dist/decide/bench/index.d.ts +23 -0
  45. package/dist/decide/bench/index.d.ts.map +1 -0
  46. package/dist/decide/bench/index.js +23 -0
  47. package/dist/decide/bench/index.js.map +1 -0
  48. package/dist/decide/bench/metrics.d.ts +55 -0
  49. package/dist/decide/bench/metrics.d.ts.map +1 -0
  50. package/dist/decide/bench/metrics.js +100 -0
  51. package/dist/decide/bench/metrics.js.map +1 -0
  52. package/dist/decide/bench/operation.d.ts +119 -0
  53. package/dist/decide/bench/operation.d.ts.map +1 -0
  54. package/dist/decide/bench/operation.js +171 -0
  55. package/dist/decide/bench/operation.js.map +1 -0
  56. package/dist/decide/bench/profiles.d.ts +74 -0
  57. package/dist/decide/bench/profiles.d.ts.map +1 -0
  58. package/dist/decide/bench/profiles.js +131 -0
  59. package/dist/decide/bench/profiles.js.map +1 -0
  60. package/dist/decide/bench/questions.d.ts +40 -0
  61. package/dist/decide/bench/questions.d.ts.map +1 -0
  62. package/dist/decide/bench/questions.js +107 -0
  63. package/dist/decide/bench/questions.js.map +1 -0
  64. package/dist/decide/bench/report.d.ts +21 -0
  65. package/dist/decide/bench/report.d.ts.map +1 -0
  66. package/dist/decide/bench/report.js +120 -0
  67. package/dist/decide/bench/report.js.map +1 -0
  68. package/dist/decide/bench/runner.d.ts +203 -0
  69. package/dist/decide/bench/runner.d.ts.map +1 -0
  70. package/dist/decide/bench/runner.js +335 -0
  71. package/dist/decide/bench/runner.js.map +1 -0
  72. package/dist/decide/bench/source.d.ts +21 -0
  73. package/dist/decide/bench/source.d.ts.map +1 -0
  74. package/dist/decide/bench/source.js +67 -0
  75. package/dist/decide/bench/source.js.map +1 -0
  76. package/dist/decide/bench/spot-check.d.ts +117 -0
  77. package/dist/decide/bench/spot-check.d.ts.map +1 -0
  78. package/dist/decide/bench/spot-check.js +221 -0
  79. package/dist/decide/bench/spot-check.js.map +1 -0
  80. package/dist/decide/bench/stats.d.ts +57 -0
  81. package/dist/decide/bench/stats.d.ts.map +1 -0
  82. package/dist/decide/bench/stats.js +82 -0
  83. package/dist/decide/bench/stats.js.map +1 -0
  84. package/dist/decide/bench/types.d.ts +216 -0
  85. package/dist/decide/bench/types.d.ts.map +1 -0
  86. package/dist/decide/bench/types.js +104 -0
  87. package/dist/decide/bench/types.js.map +1 -0
  88. package/dist/decide/client.d.ts +35 -1
  89. package/dist/decide/client.d.ts.map +1 -1
  90. package/dist/decide/client.js +124 -30
  91. package/dist/decide/client.js.map +1 -1
  92. package/dist/decide/credentials.d.ts +177 -17
  93. package/dist/decide/credentials.d.ts.map +1 -1
  94. package/dist/decide/credentials.js +505 -41
  95. package/dist/decide/credentials.js.map +1 -1
  96. package/dist/decide/index.d.ts +8 -8
  97. package/dist/decide/index.d.ts.map +1 -1
  98. package/dist/decide/index.js +8 -8
  99. package/dist/decide/index.js.map +1 -1
  100. package/dist/decide/jev-wire.d.ts +25 -19
  101. package/dist/decide/jev-wire.d.ts.map +1 -1
  102. package/dist/decide/jev-wire.js +56 -31
  103. package/dist/decide/jev-wire.js.map +1 -1
  104. package/dist/decide/operations.d.ts +63 -12
  105. package/dist/decide/operations.d.ts.map +1 -1
  106. package/dist/decide/operations.js +116 -58
  107. package/dist/decide/operations.js.map +1 -1
  108. package/dist/decide/provider-state.d.ts +85 -12
  109. package/dist/decide/provider-state.d.ts.map +1 -1
  110. package/dist/decide/provider-state.js +154 -21
  111. package/dist/decide/provider-state.js.map +1 -1
  112. package/dist/decide/provider.d.ts +5 -0
  113. package/dist/decide/provider.d.ts.map +1 -1
  114. package/dist/decide/provider.js.map +1 -1
  115. package/dist/decide/providers.d.ts +15 -2
  116. package/dist/decide/providers.d.ts.map +1 -1
  117. package/dist/decide/providers.js +22 -6
  118. package/dist/decide/providers.js.map +1 -1
  119. package/dist/decide/sites/registry.d.ts +22 -0
  120. package/dist/decide/sites/registry.d.ts.map +1 -1
  121. package/dist/decide/sites/registry.js +23 -0
  122. package/dist/decide/sites/registry.js.map +1 -1
  123. package/dist/decide/wizard.d.ts +12 -4
  124. package/dist/decide/wizard.d.ts.map +1 -1
  125. package/dist/decide/wizard.js +79 -26
  126. package/dist/decide/wizard.js.map +1 -1
  127. package/dist/dispatch/mvi-projection.d.ts +15 -2
  128. package/dist/dispatch/mvi-projection.d.ts.map +1 -1
  129. package/dist/dispatch/mvi-projection.js +73 -12
  130. package/dist/dispatch/mvi-projection.js.map +1 -1
  131. package/dist/docs/adr-allocator.d.ts +2 -2
  132. package/dist/docs/adr-allocator.d.ts.map +1 -1
  133. package/dist/docs/adr-allocator.js +17 -4
  134. package/dist/docs/adr-allocator.js.map +1 -1
  135. package/dist/docs/blob-consolidation.js +1 -1
  136. package/dist/docs/blob-consolidation.js.map +1 -1
  137. package/dist/docs/display-alias.d.ts +1 -1
  138. package/dist/docs/display-alias.d.ts.map +1 -1
  139. package/dist/docs/display-alias.js +7 -4
  140. package/dist/docs/display-alias.js.map +1 -1
  141. package/dist/docs/docs-inconsistency-detector.js +1 -1
  142. package/dist/docs/docs-inconsistency-detector.js.map +1 -1
  143. package/dist/docs/docs-update.d.ts.map +1 -1
  144. package/dist/docs/docs-update.js +6 -1
  145. package/dist/docs/docs-update.js.map +1 -1
  146. package/dist/docs/export-document.js +2928 -1053
  147. package/dist/docs/export-document.js.map +3 -3
  148. package/dist/docs/numbering.js +1 -1
  149. package/dist/docs/numbering.js.map +1 -1
  150. package/dist/docs/supersede.d.ts.map +1 -1
  151. package/dist/docs/supersede.js +6 -3
  152. package/dist/docs/supersede.js.map +1 -1
  153. package/dist/docs/version-ssot.js +1 -1
  154. package/dist/docs/version-ssot.js.map +1 -1
  155. package/dist/doctor/db-substrate.d.ts.map +1 -1
  156. package/dist/doctor/db-substrate.js +39 -24
  157. package/dist/doctor/db-substrate.js.map +1 -1
  158. package/dist/doctor/knowledge-summary.d.ts +10 -3
  159. package/dist/doctor/knowledge-summary.d.ts.map +1 -1
  160. package/dist/doctor/knowledge-summary.js +10 -3
  161. package/dist/doctor/knowledge-summary.js.map +1 -1
  162. package/dist/doctor/project-identity.d.ts +128 -37
  163. package/dist/doctor/project-identity.d.ts.map +1 -1
  164. package/dist/doctor/project-identity.js +476 -63
  165. package/dist/doctor/project-identity.js.map +1 -1
  166. package/dist/doctor/twin-collapse.d.ts +52 -2
  167. package/dist/doctor/twin-collapse.d.ts.map +1 -1
  168. package/dist/doctor/twin-collapse.js +108 -4
  169. package/dist/doctor/twin-collapse.js.map +1 -1
  170. package/dist/error-catalog.js +2 -2
  171. package/dist/error-catalog.js.map +1 -1
  172. package/dist/error-registry.js +1 -1
  173. package/dist/error-registry.js.map +1 -1
  174. package/dist/gateway-client/generated/types.gen.d.ts +22 -2
  175. package/dist/gateway-client/generated/types.gen.d.ts.map +1 -1
  176. package/dist/index.d.ts +1 -1
  177. package/dist/index.d.ts.map +1 -1
  178. package/dist/index.js +1 -1
  179. package/dist/index.js.map +1 -1
  180. package/dist/init.d.ts.map +1 -1
  181. package/dist/init.js +20 -11
  182. package/dist/init.js.map +1 -1
  183. package/dist/inject/index.d.ts.map +1 -1
  184. package/dist/inject/index.js +2 -3
  185. package/dist/inject/index.js.map +1 -1
  186. package/dist/internal.d.ts +5 -4
  187. package/dist/internal.d.ts.map +1 -1
  188. package/dist/internal.js +6 -4
  189. package/dist/internal.js.map +1 -1
  190. package/dist/llm/credential-remove-entry.d.ts +59 -0
  191. package/dist/llm/credential-remove-entry.d.ts.map +1 -0
  192. package/dist/llm/credential-remove-entry.js +101 -0
  193. package/dist/llm/credential-remove-entry.js.map +1 -0
  194. package/dist/llm/oauth/device-code.d.ts +26 -6
  195. package/dist/llm/oauth/device-code.d.ts.map +1 -1
  196. package/dist/llm/oauth/device-code.js +44 -12
  197. package/dist/llm/oauth/device-code.js.map +1 -1
  198. package/dist/llm/plugin-facade.js +3017 -1142
  199. package/dist/llm/plugin-facade.js.map +3 -3
  200. package/dist/memory/attention.d.ts.map +1 -1
  201. package/dist/memory/attention.js +5 -3
  202. package/dist/memory/attention.js.map +1 -1
  203. package/dist/memory/decisions.d.ts +48 -3
  204. package/dist/memory/decisions.d.ts.map +1 -1
  205. package/dist/memory/decisions.js +98 -14
  206. package/dist/memory/decisions.js.map +1 -1
  207. package/dist/memory/learnings.d.ts +6 -6
  208. package/dist/memory/patterns.d.ts +4 -4
  209. package/dist/migration/manual/T10165-backfill-adr-index.d.ts.map +1 -1
  210. package/dist/migration/manual/T10165-backfill-adr-index.js +5 -1
  211. package/dist/migration/manual/T10165-backfill-adr-index.js.map +1 -1
  212. package/dist/nexus/fleet-status.d.ts +83 -0
  213. package/dist/nexus/fleet-status.d.ts.map +1 -0
  214. package/dist/nexus/fleet-status.js +414 -0
  215. package/dist/nexus/fleet-status.js.map +1 -0
  216. package/dist/nexus/git-state.d.ts +15 -0
  217. package/dist/nexus/git-state.d.ts.map +1 -1
  218. package/dist/nexus/git-state.js +67 -2
  219. package/dist/nexus/git-state.js.map +1 -1
  220. package/dist/nexus/identity.d.ts.map +1 -1
  221. package/dist/nexus/identity.js +4 -0
  222. package/dist/nexus/identity.js.map +1 -1
  223. package/dist/nexus/index.d.ts +4 -1
  224. package/dist/nexus/index.d.ts.map +1 -1
  225. package/dist/nexus/index.js +7 -1
  226. package/dist/nexus/index.js.map +1 -1
  227. package/dist/nexus/migrate-json-to-sqlite.d.ts +3 -2
  228. package/dist/nexus/migrate-json-to-sqlite.d.ts.map +1 -1
  229. package/dist/nexus/migrate-json-to-sqlite.js +9 -17
  230. package/dist/nexus/migrate-json-to-sqlite.js.map +1 -1
  231. package/dist/nexus/ops.d.ts +1 -0
  232. package/dist/nexus/ops.d.ts.map +1 -1
  233. package/dist/nexus/project-activity.d.ts +104 -0
  234. package/dist/nexus/project-activity.d.ts.map +1 -0
  235. package/dist/nexus/project-activity.js +150 -0
  236. package/dist/nexus/project-activity.js.map +1 -0
  237. package/dist/nexus/query.d.ts +2 -2
  238. package/dist/nexus/query.d.ts.map +1 -1
  239. package/dist/nexus/query.js +4 -19
  240. package/dist/nexus/query.js.map +1 -1
  241. package/dist/nexus/registry-errors.d.ts +61 -0
  242. package/dist/nexus/registry-errors.d.ts.map +1 -0
  243. package/dist/nexus/registry-errors.js +85 -0
  244. package/dist/nexus/registry-errors.js.map +1 -0
  245. package/dist/nexus/registry.d.ts +30 -5
  246. package/dist/nexus/registry.d.ts.map +1 -1
  247. package/dist/nexus/registry.js +115 -70
  248. package/dist/nexus/registry.js.map +1 -1
  249. package/dist/orchestrate/pivot.d.ts +4 -0
  250. package/dist/orchestrate/pivot.d.ts.map +1 -1
  251. package/dist/orchestrate/pivot.js +75 -12
  252. package/dist/orchestrate/pivot.js.map +1 -1
  253. package/dist/orchestrate/query-ops.d.ts.map +1 -1
  254. package/dist/orchestrate/query-ops.js +29 -27
  255. package/dist/orchestrate/query-ops.js.map +1 -1
  256. package/dist/orchestrate/spawn-ops.d.ts.map +1 -1
  257. package/dist/orchestrate/spawn-ops.js +29 -3
  258. package/dist/orchestrate/spawn-ops.js.map +1 -1
  259. package/dist/orchestration/bootstrap.d.ts.map +1 -1
  260. package/dist/orchestration/bootstrap.js +20 -14
  261. package/dist/orchestration/bootstrap.js.map +1 -1
  262. package/dist/orchestration/index.d.ts +15 -1
  263. package/dist/orchestration/index.d.ts.map +1 -1
  264. package/dist/orchestration/index.js +25 -6
  265. package/dist/orchestration/index.js.map +1 -1
  266. package/dist/orchestration/lead-rollup.d.ts +7 -1
  267. package/dist/orchestration/lead-rollup.d.ts.map +1 -1
  268. package/dist/orchestration/lead-rollup.js +6 -3
  269. package/dist/orchestration/lead-rollup.js.map +1 -1
  270. package/dist/orchestration/spawn-prompt.js +1 -1
  271. package/dist/orchestration/spawn-prompt.js.map +1 -1
  272. package/dist/orchestration/waves.d.ts +21 -10
  273. package/dist/orchestration/waves.d.ts.map +1 -1
  274. package/dist/orchestration/waves.js +38 -35
  275. package/dist/orchestration/waves.js.map +1 -1
  276. package/dist/paths.d.ts +9 -2
  277. package/dist/paths.d.ts.map +1 -1
  278. package/dist/paths.js +30 -13
  279. package/dist/paths.js.map +1 -1
  280. package/dist/phases/index.d.ts +1 -1
  281. package/dist/phases/index.d.ts.map +1 -1
  282. package/dist/phases/index.js +3 -4
  283. package/dist/phases/index.js.map +1 -1
  284. package/dist/project-info.d.ts +40 -3
  285. package/dist/project-info.d.ts.map +1 -1
  286. package/dist/project-info.js +74 -6
  287. package/dist/project-info.js.map +1 -1
  288. package/dist/project-lifecycle.d.ts +28 -7
  289. package/dist/project-lifecycle.d.ts.map +1 -1
  290. package/dist/project-lifecycle.js +114 -47
  291. package/dist/project-lifecycle.js.map +1 -1
  292. package/dist/project-scope.d.ts +70 -3
  293. package/dist/project-scope.d.ts.map +1 -1
  294. package/dist/project-scope.js +154 -15
  295. package/dist/project-scope.js.map +1 -1
  296. package/dist/release/open.d.ts +12 -2
  297. package/dist/release/open.d.ts.map +1 -1
  298. package/dist/release/open.js +32 -3
  299. package/dist/release/open.js.map +1 -1
  300. package/dist/release/preflight-skip.d.ts +73 -0
  301. package/dist/release/preflight-skip.d.ts.map +1 -0
  302. package/dist/release/preflight-skip.js +254 -0
  303. package/dist/release/preflight-skip.js.map +1 -0
  304. package/dist/render/decide/index.d.ts +51 -0
  305. package/dist/render/decide/index.d.ts.map +1 -0
  306. package/dist/render/decide/index.js +289 -0
  307. package/dist/render/decide/index.js.map +1 -0
  308. package/dist/render/index.d.ts +1 -0
  309. package/dist/render/index.d.ts.map +1 -1
  310. package/dist/render/index.js +1 -0
  311. package/dist/render/index.js.map +1 -1
  312. package/dist/render/nexus/graph/index.d.ts +5 -0
  313. package/dist/render/nexus/graph/index.d.ts.map +1 -1
  314. package/dist/render/nexus/graph/index.js +53 -0
  315. package/dist/render/nexus/graph/index.js.map +1 -1
  316. package/dist/scaffold/ensure-config.d.ts +14 -6
  317. package/dist/scaffold/ensure-config.d.ts.map +1 -1
  318. package/dist/scaffold/ensure-config.js +39 -17
  319. package/dist/scaffold/ensure-config.js.map +1 -1
  320. package/dist/scaffold/project-identity.d.ts +115 -23
  321. package/dist/scaffold/project-identity.d.ts.map +1 -1
  322. package/dist/scaffold/project-identity.js +196 -44
  323. package/dist/scaffold/project-identity.js.map +1 -1
  324. package/dist/selfimprove/fix-gen.js +3027 -1152
  325. package/dist/selfimprove/fix-gen.js.map +3 -3
  326. package/dist/sentient/cross-project-hygiene.d.ts +12 -6
  327. package/dist/sentient/cross-project-hygiene.d.ts.map +1 -1
  328. package/dist/sentient/cross-project-hygiene.js +15 -10
  329. package/dist/sentient/cross-project-hygiene.js.map +1 -1
  330. package/dist/session/engine-ops.d.ts +13 -4
  331. package/dist/session/engine-ops.d.ts.map +1 -1
  332. package/dist/session/engine-ops.js +38 -45
  333. package/dist/session/engine-ops.js.map +1 -1
  334. package/dist/sessions/briefing.d.ts +7 -3
  335. package/dist/sessions/briefing.d.ts.map +1 -1
  336. package/dist/sessions/briefing.js +10 -10
  337. package/dist/sessions/briefing.js.map +1 -1
  338. package/dist/sessions/drift-watchdog.d.ts.map +1 -1
  339. package/dist/sessions/drift-watchdog.js +11 -19
  340. package/dist/sessions/drift-watchdog.js.map +1 -1
  341. package/dist/sessions/focus-state-store.d.ts +103 -26
  342. package/dist/sessions/focus-state-store.d.ts.map +1 -1
  343. package/dist/sessions/focus-state-store.js +166 -37
  344. package/dist/sessions/focus-state-store.js.map +1 -1
  345. package/dist/sessions/handoff.d.ts.map +1 -1
  346. package/dist/sessions/handoff.js +9 -18
  347. package/dist/sessions/handoff.js.map +1 -1
  348. package/dist/sessions/index.d.ts +4 -2
  349. package/dist/sessions/index.d.ts.map +1 -1
  350. package/dist/sessions/index.js +35 -6
  351. package/dist/sessions/index.js.map +1 -1
  352. package/dist/sessions/session-drift.d.ts.map +1 -1
  353. package/dist/sessions/session-drift.js +4 -2
  354. package/dist/sessions/session-drift.js.map +1 -1
  355. package/dist/sessions/session-view.d.ts +8 -1
  356. package/dist/sessions/session-view.d.ts.map +1 -1
  357. package/dist/sessions/session-view.js +9 -2
  358. package/dist/sessions/session-view.js.map +1 -1
  359. package/dist/setup/config-json-merge.d.ts.map +1 -1
  360. package/dist/setup/config-json-merge.js +1 -0
  361. package/dist/setup/config-json-merge.js.map +1 -1
  362. package/dist/setup/index.d.ts +4 -2
  363. package/dist/setup/index.d.ts.map +1 -1
  364. package/dist/setup/index.js +6 -2
  365. package/dist/setup/index.js.map +1 -1
  366. package/dist/setup/sections/nexus-account.d.ts +32 -0
  367. package/dist/setup/sections/nexus-account.d.ts.map +1 -0
  368. package/dist/setup/sections/nexus-account.js +64 -0
  369. package/dist/setup/sections/nexus-account.js.map +1 -0
  370. package/dist/setup/wizard.d.ts +1 -1
  371. package/dist/setup/wizard.d.ts.map +1 -1
  372. package/dist/setup/wizard.js.map +1 -1
  373. package/dist/skills/orchestrator/startup.d.ts.map +1 -1
  374. package/dist/skills/orchestrator/startup.js +18 -31
  375. package/dist/skills/orchestrator/startup.js.map +1 -1
  376. package/dist/snapshot/index.d.ts.map +1 -1
  377. package/dist/snapshot/index.js +60 -53
  378. package/dist/snapshot/index.js.map +1 -1
  379. package/dist/spawn/agent-identity.d.ts +33 -1
  380. package/dist/spawn/agent-identity.d.ts.map +1 -1
  381. package/dist/spawn/agent-identity.js +53 -1
  382. package/dist/spawn/agent-identity.js.map +1 -1
  383. package/dist/spawn/index.d.ts +1 -1
  384. package/dist/spawn/index.d.ts.map +1 -1
  385. package/dist/spawn/index.js +1 -1
  386. package/dist/spawn/index.js.map +1 -1
  387. package/dist/stats/index.d.ts.map +1 -1
  388. package/dist/stats/index.js +3 -4
  389. package/dist/stats/index.js.map +1 -1
  390. package/dist/status/index.d.ts +12 -3
  391. package/dist/status/index.d.ts.map +1 -1
  392. package/dist/status/index.js +47 -5
  393. package/dist/status/index.js.map +1 -1
  394. package/dist/store/attachment-repair.d.ts.map +1 -1
  395. package/dist/store/attachment-repair.js +42 -3
  396. package/dist/store/attachment-repair.js.map +1 -1
  397. package/dist/store/attachment-store.d.ts.map +1 -1
  398. package/dist/store/attachment-store.js +30 -46
  399. package/dist/store/attachment-store.js.map +1 -1
  400. package/dist/store/backup-recover-brain.d.ts +4 -0
  401. package/dist/store/backup-recover-brain.d.ts.map +1 -1
  402. package/dist/store/backup-recover-brain.js +2 -0
  403. package/dist/store/backup-recover-brain.js.map +1 -1
  404. package/dist/store/backup-recover.d.ts +9 -0
  405. package/dist/store/backup-recover.d.ts.map +1 -1
  406. package/dist/store/backup-recover.js +28 -1
  407. package/dist/store/backup-recover.js.map +1 -1
  408. package/dist/store/backup-sidecar.d.ts +30 -0
  409. package/dist/store/backup-sidecar.d.ts.map +1 -1
  410. package/dist/store/backup-sidecar.js +90 -2
  411. package/dist/store/backup-sidecar.js.map +1 -1
  412. package/dist/store/blob-keep.d.ts +135 -0
  413. package/dist/store/blob-keep.d.ts.map +1 -0
  414. package/dist/store/blob-keep.js +283 -0
  415. package/dist/store/blob-keep.js.map +1 -0
  416. package/dist/store/converters.d.ts.map +1 -1
  417. package/dist/store/converters.js +11 -0
  418. package/dist/store/converters.js.map +1 -1
  419. package/dist/store/credential-transfer.d.ts +37 -5
  420. package/dist/store/credential-transfer.d.ts.map +1 -1
  421. package/dist/store/credential-transfer.js +73 -18
  422. package/dist/store/credential-transfer.js.map +1 -1
  423. package/dist/store/data-accessor.d.ts +1 -1
  424. package/dist/store/data-accessor.d.ts.map +1 -1
  425. package/dist/store/data-accessor.js.map +1 -1
  426. package/dist/store/db-helpers.d.ts +18 -0
  427. package/dist/store/db-helpers.d.ts.map +1 -1
  428. package/dist/store/db-helpers.js +46 -0
  429. package/dist/store/db-helpers.js.map +1 -1
  430. package/dist/store/exodus/on-open.d.ts.map +1 -1
  431. package/dist/store/exodus/on-open.js +35 -0
  432. package/dist/store/exodus/on-open.js.map +1 -1
  433. package/dist/store/exodus/runtime-targets.d.ts +3 -3
  434. package/dist/store/exodus/runtime-targets.js +3 -3
  435. package/dist/store/import-remap.d.ts +12 -1
  436. package/dist/store/import-remap.d.ts.map +1 -1
  437. package/dist/store/import-remap.js +14 -0
  438. package/dist/store/import-remap.js.map +1 -1
  439. package/dist/store/legacy-tasks-lineage.d.ts +3 -1
  440. package/dist/store/legacy-tasks-lineage.d.ts.map +1 -1
  441. package/dist/store/legacy-tasks-lineage.js +3 -1
  442. package/dist/store/legacy-tasks-lineage.js.map +1 -1
  443. package/dist/store/memory-accessor.js +1 -1
  444. package/dist/store/memory-accessor.js.map +1 -1
  445. package/dist/store/migration-manager.d.ts +61 -0
  446. package/dist/store/migration-manager.d.ts.map +1 -1
  447. package/dist/store/migration-manager.js +102 -4
  448. package/dist/store/migration-manager.js.map +1 -1
  449. package/dist/store/nexus-validation-schemas.d.ts +64 -0
  450. package/dist/store/nexus-validation-schemas.d.ts.map +1 -1
  451. package/dist/store/portable-bundle-import.d.ts +8 -0
  452. package/dist/store/portable-bundle-import.d.ts.map +1 -1
  453. package/dist/store/portable-bundle-import.js +10 -0
  454. package/dist/store/portable-bundle-import.js.map +1 -1
  455. package/dist/store/portable-bundle-scan.d.ts.map +1 -1
  456. package/dist/store/portable-bundle-scan.js +1 -0
  457. package/dist/store/portable-bundle-scan.js.map +1 -1
  458. package/dist/store/portable-bundle.d.ts.map +1 -1
  459. package/dist/store/portable-bundle.js +15 -14
  460. package/dist/store/portable-bundle.js.map +1 -1
  461. package/dist/store/pre-repair-snapshot.d.ts +4 -1
  462. package/dist/store/pre-repair-snapshot.d.ts.map +1 -1
  463. package/dist/store/pre-repair-snapshot.js +5 -1
  464. package/dist/store/pre-repair-snapshot.js.map +1 -1
  465. package/dist/store/regenerators.d.ts +4 -2
  466. package/dist/store/regenerators.d.ts.map +1 -1
  467. package/dist/store/regenerators.js +7 -3
  468. package/dist/store/regenerators.js.map +1 -1
  469. package/dist/store/repair-malformed-dbs.d.ts +4 -0
  470. package/dist/store/repair-malformed-dbs.d.ts.map +1 -1
  471. package/dist/store/repair-malformed-dbs.js +3 -0
  472. package/dist/store/repair-malformed-dbs.js.map +1 -1
  473. package/dist/store/safety-data-accessor.d.ts +8 -3
  474. package/dist/store/safety-data-accessor.d.ts.map +1 -1
  475. package/dist/store/safety-data-accessor.js +11 -4
  476. package/dist/store/safety-data-accessor.js.map +1 -1
  477. package/dist/store/schema/cleo-global/nexus.d.ts +48 -0
  478. package/dist/store/schema/cleo-global/nexus.d.ts.map +1 -1
  479. package/dist/store/schema/cleo-global/nexus.js +17 -0
  480. package/dist/store/schema/cleo-global/nexus.js.map +1 -1
  481. package/dist/store/schema/cleo-project/docs.d.ts +16 -0
  482. package/dist/store/schema/cleo-project/docs.d.ts.map +1 -1
  483. package/dist/store/schema/cleo-project/docs.js +10 -0
  484. package/dist/store/schema/cleo-project/docs.js.map +1 -1
  485. package/dist/store/schema/cleo-project/tasks-core.d.ts +80 -0
  486. package/dist/store/schema/cleo-project/tasks-core.d.ts.map +1 -1
  487. package/dist/store/schema/cleo-project/tasks-core.js +25 -1
  488. package/dist/store/schema/cleo-project/tasks-core.js.map +1 -1
  489. package/dist/store/schema/cleo-shared/brain.d.ts +1 -1
  490. package/dist/store/schema/memory-schema.d.ts +1 -1
  491. package/dist/store/schema/nexus-schema.d.ts +48 -0
  492. package/dist/store/schema/nexus-schema.d.ts.map +1 -1
  493. package/dist/store/schema/nexus-schema.js +28 -7
  494. package/dist/store/schema/nexus-schema.js.map +1 -1
  495. package/dist/store/session-store.d.ts +65 -0
  496. package/dist/store/session-store.d.ts.map +1 -1
  497. package/dist/store/session-store.js +108 -7
  498. package/dist/store/session-store.js.map +1 -1
  499. package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
  500. package/dist/store/sqlite-data-accessor.js +245 -47
  501. package/dist/store/sqlite-data-accessor.js.map +1 -1
  502. package/dist/store/sqlite.d.ts +15 -3
  503. package/dist/store/sqlite.d.ts.map +1 -1
  504. package/dist/store/sqlite.js +52 -20
  505. package/dist/store/sqlite.js.map +1 -1
  506. package/dist/store/store-write-guard.d.ts +9 -3
  507. package/dist/store/store-write-guard.d.ts.map +1 -1
  508. package/dist/store/store-write-guard.js +25 -4
  509. package/dist/store/store-write-guard.js.map +1 -1
  510. package/dist/store/table-classification.d.ts +1 -1
  511. package/dist/store/table-classification.d.ts.map +1 -1
  512. package/dist/store/table-classification.js +34 -8
  513. package/dist/store/table-classification.js.map +1 -1
  514. package/dist/store/task-claim.d.ts +144 -0
  515. package/dist/store/task-claim.d.ts.map +1 -0
  516. package/dist/store/task-claim.js +195 -0
  517. package/dist/store/task-claim.js.map +1 -0
  518. package/dist/store/task-version.d.ts +43 -5
  519. package/dist/store/task-version.d.ts.map +1 -1
  520. package/dist/store/task-version.js +113 -17
  521. package/dist/store/task-version.js.map +1 -1
  522. package/dist/store/tasks-schema.d.ts +2 -0
  523. package/dist/store/tasks-schema.d.ts.map +1 -1
  524. package/dist/store/tasks-schema.js +1 -0
  525. package/dist/store/tasks-schema.js.map +1 -1
  526. package/dist/store/tasks-sqlite.js +1 -1
  527. package/dist/store/tasks-sqlite.js.map +1 -1
  528. package/dist/store/twin-collapse.d.ts +339 -22
  529. package/dist/store/twin-collapse.d.ts.map +1 -1
  530. package/dist/store/twin-collapse.js +1323 -48
  531. package/dist/store/twin-collapse.js.map +1 -1
  532. package/dist/store/umbrella-data-accessor.d.ts +8 -3
  533. package/dist/store/umbrella-data-accessor.d.ts.map +1 -1
  534. package/dist/store/umbrella-data-accessor.js +10 -4
  535. package/dist/store/umbrella-data-accessor.js.map +1 -1
  536. package/dist/store/validation-schemas.d.ts +161 -1
  537. package/dist/store/validation-schemas.d.ts.map +1 -1
  538. package/dist/store/with-retry.d.ts +36 -0
  539. package/dist/store/with-retry.d.ts.map +1 -1
  540. package/dist/store/with-retry.js +51 -0
  541. package/dist/store/with-retry.js.map +1 -1
  542. package/dist/store/worktree-build-guard.d.ts +13 -4
  543. package/dist/store/worktree-build-guard.d.ts.map +1 -1
  544. package/dist/store/worktree-build-guard.js +21 -10
  545. package/dist/store/worktree-build-guard.js.map +1 -1
  546. package/dist/store/worktree-isolation-guard.d.ts +121 -10
  547. package/dist/store/worktree-isolation-guard.d.ts.map +1 -1
  548. package/dist/store/worktree-isolation-guard.js +155 -34
  549. package/dist/store/worktree-isolation-guard.js.map +1 -1
  550. package/dist/system/backup.d.ts +7 -0
  551. package/dist/system/backup.d.ts.map +1 -1
  552. package/dist/system/backup.js +5 -0
  553. package/dist/system/backup.js.map +1 -1
  554. package/dist/system/health.d.ts.map +1 -1
  555. package/dist/system/health.js +3 -1
  556. package/dist/system/health.js.map +1 -1
  557. package/dist/system/inject-generate.d.ts.map +1 -1
  558. package/dist/system/inject-generate.js +23 -10
  559. package/dist/system/inject-generate.js.map +1 -1
  560. package/dist/system/project-health.d.ts +8 -0
  561. package/dist/system/project-health.d.ts.map +1 -1
  562. package/dist/system/project-health.js +13 -5
  563. package/dist/system/project-health.js.map +1 -1
  564. package/dist/task-tools/index.d.ts +1 -1
  565. package/dist/task-tools/index.d.ts.map +1 -1
  566. package/dist/task-tools/index.js +1 -1
  567. package/dist/task-tools/index.js.map +1 -1
  568. package/dist/task-tools/score-task-priority.d.ts +38 -0
  569. package/dist/task-tools/score-task-priority.d.ts.map +1 -1
  570. package/dist/task-tools/score-task-priority.js +51 -0
  571. package/dist/task-tools/score-task-priority.js.map +1 -1
  572. package/dist/task-work/claims.d.ts +215 -0
  573. package/dist/task-work/claims.d.ts.map +1 -0
  574. package/dist/task-work/claims.js +272 -0
  575. package/dist/task-work/claims.js.map +1 -0
  576. package/dist/task-work/index.d.ts +47 -3
  577. package/dist/task-work/index.d.ts.map +1 -1
  578. package/dist/task-work/index.js +74 -41
  579. package/dist/task-work/index.js.map +1 -1
  580. package/dist/tasks/add.d.ts.map +1 -1
  581. package/dist/tasks/add.js +3 -2
  582. package/dist/tasks/add.js.map +1 -1
  583. package/dist/tasks/analyze.d.ts.map +1 -1
  584. package/dist/tasks/analyze.js +3 -4
  585. package/dist/tasks/analyze.js.map +1 -1
  586. package/dist/tasks/change-set.d.ts +5 -0
  587. package/dist/tasks/change-set.d.ts.map +1 -1
  588. package/dist/tasks/change-set.js +59 -3
  589. package/dist/tasks/change-set.js.map +1 -1
  590. package/dist/tasks/complete.d.ts +16 -0
  591. package/dist/tasks/complete.d.ts.map +1 -1
  592. package/dist/tasks/complete.js +27 -7
  593. package/dist/tasks/complete.js.map +1 -1
  594. package/dist/tasks/component-pr.d.ts +162 -1
  595. package/dist/tasks/component-pr.d.ts.map +1 -1
  596. package/dist/tasks/component-pr.js +560 -59
  597. package/dist/tasks/component-pr.js.map +1 -1
  598. package/dist/tasks/done-record.d.ts +14 -1
  599. package/dist/tasks/done-record.d.ts.map +1 -1
  600. package/dist/tasks/done-record.js +37 -0
  601. package/dist/tasks/done-record.js.map +1 -1
  602. package/dist/tasks/duplicate-detector.d.ts +20 -1
  603. package/dist/tasks/duplicate-detector.d.ts.map +1 -1
  604. package/dist/tasks/duplicate-detector.js +10 -2
  605. package/dist/tasks/duplicate-detector.js.map +1 -1
  606. package/dist/tasks/engine-wrap-ops.d.ts +19 -10
  607. package/dist/tasks/engine-wrap-ops.d.ts.map +1 -1
  608. package/dist/tasks/engine-wrap-ops.js +38 -10
  609. package/dist/tasks/engine-wrap-ops.js.map +1 -1
  610. package/dist/tasks/graph-ops.d.ts +9 -2
  611. package/dist/tasks/graph-ops.d.ts.map +1 -1
  612. package/dist/tasks/graph-ops.js +24 -32
  613. package/dist/tasks/graph-ops.js.map +1 -1
  614. package/dist/tasks/plan.d.ts.map +1 -1
  615. package/dist/tasks/plan.js +16 -60
  616. package/dist/tasks/plan.js.map +1 -1
  617. package/dist/tasks/task-context.d.ts.map +1 -1
  618. package/dist/tasks/task-context.js +13 -0
  619. package/dist/tasks/task-context.js.map +1 -1
  620. package/dist/tasks/task-import.d.ts.map +1 -1
  621. package/dist/tasks/task-import.js +21 -12
  622. package/dist/tasks/task-import.js.map +1 -1
  623. package/dist/tasks/task-next.d.ts +25 -2
  624. package/dist/tasks/task-next.d.ts.map +1 -1
  625. package/dist/tasks/task-next.js +32 -13
  626. package/dist/tasks/task-next.js.map +1 -1
  627. package/dist/tasks/update.d.ts.map +1 -1
  628. package/dist/tasks/update.js +7 -5
  629. package/dist/tasks/update.js.map +1 -1
  630. package/dist/upgrade.d.ts +1 -1
  631. package/dist/upgrade.d.ts.map +1 -1
  632. package/dist/upgrade.js +48 -9
  633. package/dist/upgrade.js.map +1 -1
  634. package/dist/validation/doctor/checks.d.ts +20 -6
  635. package/dist/validation/doctor/checks.d.ts.map +1 -1
  636. package/dist/validation/doctor/checks.js +51 -8
  637. package/dist/validation/doctor/checks.js.map +1 -1
  638. package/dist/validation/validate-ops.d.ts.map +1 -1
  639. package/dist/validation/validate-ops.js +2 -3
  640. package/dist/validation/validate-ops.js.map +1 -1
  641. package/migrations/drizzle-cleo-global/20260929010000_t12512-registry-probed-opened/migration.sql +35 -0
  642. package/migrations/drizzle-cleo-global/20260929020000_t12721-git-state-head-committed-at/migration.sql +25 -0
  643. package/migrations/drizzle-cleo-project/20260929000000_t12535-docs-attachments-union-shape/migration.sql +21 -0
  644. package/migrations/drizzle-cleo-project/20260929120000_t12502-task-claim-leases/migration.sql +77 -0
  645. package/migrations/drizzle-cleo-project/20260929130000_t12736-claim-lease-iso-repair/migration.sql +37 -0
  646. package/package.json +23 -13
  647. package/schemas/project-info.schema.json +10 -4
  648. package/templates/CLEO-INJECTION.md +1 -1
  649. package/templates/CLEO-REFERENCE.md +3 -3
  650. package/templates/cleo-gitignore +11 -0
  651. package/templates/workflows/release-prepare.yml.tmpl +156 -10
@@ -1,33 +1,44 @@
1
1
  /**
2
- * Write-once portable project identity: decide, re-link, adopt (T12325).
2
+ * Write-once portable project identity: decide, re-link, adopt (T12325 · T12716).
3
3
  *
4
- * The tracked `.cleo/project-id` file (read by `@cleocode/paths`) is the one
5
- * project identifier that survives a fresh clone, a move, and a new device.
6
- * This module owns the two write-side rules ADR-094 (amending ADR-013 §9) depends on:
4
+ * The tracked identity — `.cleo/project.json` `{schemaVersion, id, name}`,
5
+ * with the ADR-094 `.cleo/project-id` kept as a legacy mirror (both read by
6
+ * `@cleocode/paths` `readPortableProjectId`) — is the one project identifier
7
+ * that survives a fresh clone, a move, and a new device. This module owns the
8
+ * write-side rules:
7
9
  *
8
- * 1. **Write once.** The file is created with `O_EXCL` and never rewritten. A
9
- * conflicting or malformed file is reported, not repaired.
10
- * 2. **Never silently re-mint.** When no local or tracked id exists, the
10
+ * 1. **Write once.** The id is created with `O_EXCL` and never rewritten. A
11
+ * conflicting or malformed file is reported, not repaired. Only the
12
+ * manifest's `name` may change, through {@link renameProjectManifest}.
13
+ * 2. **Never silently re-mint.** When no tracked or local id exists, the
11
14
  * global registry is searched for the project's previous identity (same
12
15
  * path, its canonical-fingerprint alias, or a live checkout of the same remote). A
13
16
  * unique candidate is re-linked; several candidates refuse to guess; a new
14
17
  * id is minted only when nothing can be re-linked or when the caller asks
15
18
  * for one explicitly.
19
+ * 3. **Never migrate on open.** Tracked files are created here only for a
20
+ * project that has NONE yet. Turning a legacy `project-id` into
21
+ * `project.json` is `cleo doctor project-identity --resolve` alone.
16
22
  *
17
- * Precedence when both files exist and disagree: the local
18
- * `project-info.json` id wins and the conflict is reported. Local state
19
- * (registry row, aliases, brain) is keyed by that id, so switching silently
20
- * would re-key it — the data-loss geometry this whole design avoids. Two ids
21
- * for one repository means two lineages (typically two devices that each ran
22
- * `cleo init` before this file existed); reconciling them is an explicit act.
23
+ * Precedence when the tracked id and the `project-info.json` cache disagree
24
+ * (T12716, reversing the T12325 rule): the TRACKED id wins, as it already did
25
+ * for every reader. The disagreement is reported. The cache is not rewritten
26
+ * here: local state (registry row, aliases) keyed by the old id is re-keyed,
27
+ * with the old id kept as an alias, only by `cleo doctor project-identity
28
+ * --resolve`. Two ids for one repository means two lineages (typically two
29
+ * devices that each ran `cleo init` before the id was tracked).
23
30
  *
24
31
  * @task T12325
32
+ * @task T12716
33
+ * @see ADR-096 — one committed `.cleo/project.json` (amends ADR-094)
25
34
  */
26
35
  /**
27
36
  * Where the identity a scaffold step settled on came from.
28
37
  *
29
- * - `project-info` — the existing local `project-info.json` id (adopted as-is).
30
- * - `tracked` — the committed `.cleo/project-id` (fresh clone).
38
+ * - `tracked` — the committed `.cleo/project.json` (or legacy `.cleo/project-id`);
39
+ * it wins over the `project-info.json` cache (T12716).
40
+ * - `project-info` — the `project-info.json` cache, used only when no tracked
41
+ * file exists yet (a project from before ADR-094).
31
42
  * - `registry-path` / `registry-alias` / `registry-remote` — re-linked from the
32
43
  * global registry because neither file was present.
33
44
  * - `minted` — a new random id; only when nothing could be re-linked or the
@@ -54,11 +65,16 @@ export interface ProjectIdentityDecision {
54
65
  /** Human-readable facts to surface (conflicts, re-links, coverage gaps). */
55
66
  diagnostics: string[];
56
67
  }
57
- /** Outcome of making sure `.cleo/project-id` records the project's id. */
68
+ /** Outcome of making sure the tracked files record the project's id. */
58
69
  export type PortableIdFileOutcome =
59
- /** Already present with the same id. */
70
+ /** `project.json` already records the same id. */
60
71
  'present'
61
- /** Created now (first adoption). */
72
+ /**
73
+ * Only the legacy `project-id` records the same id. Reported, not migrated:
74
+ * `cleo doctor project-identity --resolve` writes `project.json` (T12716).
75
+ */
76
+ | 'legacy'
77
+ /** Created now (first adoption): `project.json` plus the `project-id` mirror. */
62
78
  | 'written'
63
79
  /** Present with a DIFFERENT id — reported, not rewritten. */
64
80
  | 'conflict'
@@ -112,19 +128,95 @@ export declare function findRelinkCandidates(projectRoot: string, cleoHome?: str
112
128
  */
113
129
  export declare function decideProjectIdentity(projectRoot: string, localInfoId: string | undefined, options?: DecideProjectIdentityOptions): Promise<ProjectIdentityDecision>;
114
130
  /**
115
- * Make sure `<projectRoot>/.cleo/project-id` records `projectId` — write-once.
131
+ * Default display name for a project root: its directory basename, made a
132
+ * valid name (control characters and separators replaced, a leading `~`
133
+ * dropped, capped at {@link PROJECT_DISPLAY_NAME_MAX}). `project` when nothing
134
+ * usable is left.
135
+ *
136
+ * @param projectRoot - Project root.
137
+ * @returns A name that passes `isValidProjectDisplayName`.
138
+ *
139
+ * @example
140
+ * ```ts
141
+ * defaultProjectDisplayName('/work/cleocode'); // 'cleocode'
142
+ * ```
143
+ * @task T12716
144
+ */
145
+ export declare function defaultProjectDisplayName(projectRoot: string): string;
146
+ /**
147
+ * Create `.cleo/project.json` for `projectId` — create-only (`O_EXCL`).
116
148
  *
117
- * Creates the file only when absent (`O_EXCL`); a present file is compared,
118
- * never rewritten.
149
+ * @param projectRoot - Absolute project root.
150
+ * @param projectId - The identity to record; never changed afterwards.
151
+ * @param name - Display name; must pass `isValidProjectDisplayName`.
152
+ * @returns `written`, or — for a file that already exists — `present` (same
153
+ * id), `conflict` (different id) or `invalid` (unparseable). Never rewrites.
154
+ *
155
+ * @example
156
+ * ```ts
157
+ * await createProjectManifest(root, 'c78d09c3a8ee', 'cleocode'); // 'written'
158
+ * ```
159
+ * @task T12716
160
+ */
161
+ export declare function createProjectManifest(projectRoot: string, projectId: string, name: string): Promise<'written' | 'present' | 'conflict' | 'invalid' | 'no-cleo-dir'>;
162
+ /**
163
+ * Create the legacy `.cleo/project-id` mirror for `projectId` — create-only.
164
+ * Older builds read only this file, so it is kept beside `project.json`
165
+ * until a later removal (T12716).
166
+ *
167
+ * @param projectRoot - Absolute project root.
168
+ * @param projectId - The identity to mirror.
169
+ * @returns `written`, or for an existing file `present` / `conflict` / `invalid`.
170
+ *
171
+ * @example
172
+ * ```ts
173
+ * await createProjectIdMirror(root, 'c78d09c3a8ee');
174
+ * ```
175
+ * @task T12716
176
+ */
177
+ export declare function createProjectIdMirror(projectRoot: string, projectId: string): Promise<'written' | 'present' | 'conflict' | 'invalid' | 'no-cleo-dir'>;
178
+ /**
179
+ * Make sure the tracked files record `projectId` — write-once.
180
+ *
181
+ * Only a project with NO tracked identity gets files: `project.json` and the
182
+ * legacy `project-id` mirror, both created with `O_EXCL`. A present file is
183
+ * compared, never rewritten, and a legacy-only project is reported as
184
+ * `legacy` rather than migrated (migration is `cleo doctor project-identity
185
+ * --resolve`, T12716).
119
186
  *
120
187
  * @param projectRoot - Absolute project root.
121
188
  * @param projectId - The identity to adopt.
122
- * @returns What happened; `conflict`/`invalid` are for the caller to report.
189
+ * @param name - Display name for a new `project.json`; defaults to
190
+ * {@link defaultProjectDisplayName}. Ignored when a file already exists.
191
+ * @returns What happened; `legacy`/`conflict`/`invalid` are for the caller to report.
123
192
  *
124
193
  * @example
125
194
  * ```ts
126
195
  * const outcome = await ensurePortableProjectId(root, info.projectId);
127
196
  * ```
128
197
  */
129
- export declare function ensurePortableProjectId(projectRoot: string, projectId: string): Promise<PortableIdFileOutcome>;
198
+ export declare function ensurePortableProjectId(projectRoot: string, projectId: string, name?: string): Promise<PortableIdFileOutcome>;
199
+ /**
200
+ * Rename a project in its committed `.cleo/project.json`: only `name` changes;
201
+ * the id is carried over byte-identical and keys this build does not know are
202
+ * kept (`writeProjectManifestName`: a tmp file unique to the call, renamed
203
+ * into place, so a crash never leaves a half-written identity file).
204
+ *
205
+ * @param projectRoot - Absolute project root.
206
+ * @param name - New display name (trimmed; must pass `isValidProjectDisplayName`).
207
+ * @returns The previous and new manifest names.
208
+ * @throws {CleoError} `VALIDATION_ERROR` for an invalid name; `CONFIG_ERROR`
209
+ * when `project.json` is absent (migrate first) or unusable.
210
+ *
211
+ * @example
212
+ * ```ts
213
+ * await renameProjectManifest(root, 'cleo-platform');
214
+ * ```
215
+ * @task T12716
216
+ */
217
+ export declare function renameProjectManifest(projectRoot: string, name: string): Promise<{
218
+ oldName: string;
219
+ newName: string;
220
+ projectId: string;
221
+ }>;
130
222
  //# sourceMappingURL=project-identity.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-identity.d.ts","sourceRoot":"","sources":["../../src/scaffold/project-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAmBH;;;;;;;;;GASG;AACH,MAAM,MAAM,qBAAqB,GAC7B,cAAc,GACd,SAAS,GACT,eAAe,GACf,gBAAgB,GAChB,iBAAiB,GACjB,QAAQ,CAAC;AAEb,6DAA6D;AAC7D,MAAM,MAAM,SAAS,GAAG,eAAe,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;AAE/E,2EAA2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,GAAG,EAAE,SAAS,CAAC;CAChB;AAED,wDAAwD;AACxD,MAAM,WAAW,uBAAuB;IACtC,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,MAAM,EAAE,qBAAqB,CAAC;IAC9B,4EAA4E;IAC5E,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,0EAA0E;AAC1E,MAAM,MAAM,qBAAqB;AAC/B,wCAAwC;AACtC,SAAS;AACX,oCAAoC;GAClC,SAAS;AACX,6DAA6D;GAC3D,UAAU;AACZ,kEAAkE;GAChE,SAAS;AACX,yDAAyD;GACvD,aAAa,CAAC;AAElB,iDAAiD;AACjD,MAAM,WAAW,4BAA4B;IAC3C;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,6EAA6E;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAc1D;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC;IAAE,UAAU,EAAE,eAAe,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAsDnE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,uBAAuB,CAAC,CA0DlC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,qBAAqB,CAAC,CAoBhC"}
1
+ {"version":3,"file":"project-identity.d.ts","sourceRoot":"","sources":["../../src/scaffold/project-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AA4BH;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,qBAAqB,GAC7B,cAAc,GACd,SAAS,GACT,eAAe,GACf,gBAAgB,GAChB,iBAAiB,GACjB,QAAQ,CAAC;AAEb,6DAA6D;AAC7D,MAAM,MAAM,SAAS,GAAG,eAAe,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;AAE/E,2EAA2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,GAAG,EAAE,SAAS,CAAC;CAChB;AAED,wDAAwD;AACxD,MAAM,WAAW,uBAAuB;IACtC,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,MAAM,EAAE,qBAAqB,CAAC;IAC9B,4EAA4E;IAC5E,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wEAAwE;AACxE,MAAM,MAAM,qBAAqB;AAC/B,kDAAkD;AAChD,SAAS;AACX;;;GAGG;GACD,QAAQ;AACV,iFAAiF;GAC/E,SAAS;AACX,6DAA6D;GAC3D,UAAU;AACZ,kEAAkE;GAChE,SAAS;AACX,yDAAyD;GACvD,aAAa,CAAC;AAElB,iDAAiD;AACjD,MAAM,WAAW,4BAA4B;IAC3C;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,6EAA6E;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAc1D;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC;IAAE,UAAU,EAAE,eAAe,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAsDnE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,uBAAuB,CAAC,CAoElC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAOrE;AAaD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,CAAC,CAazE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,CAAC,CAQzE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,CAAC,CAkBhC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CA0BlE"}
@@ -1,34 +1,43 @@
1
1
  /**
2
- * Write-once portable project identity: decide, re-link, adopt (T12325).
2
+ * Write-once portable project identity: decide, re-link, adopt (T12325 · T12716).
3
3
  *
4
- * The tracked `.cleo/project-id` file (read by `@cleocode/paths`) is the one
5
- * project identifier that survives a fresh clone, a move, and a new device.
6
- * This module owns the two write-side rules ADR-094 (amending ADR-013 §9) depends on:
4
+ * The tracked identity — `.cleo/project.json` `{schemaVersion, id, name}`,
5
+ * with the ADR-094 `.cleo/project-id` kept as a legacy mirror (both read by
6
+ * `@cleocode/paths` `readPortableProjectId`) — is the one project identifier
7
+ * that survives a fresh clone, a move, and a new device. This module owns the
8
+ * write-side rules:
7
9
  *
8
- * 1. **Write once.** The file is created with `O_EXCL` and never rewritten. A
9
- * conflicting or malformed file is reported, not repaired.
10
- * 2. **Never silently re-mint.** When no local or tracked id exists, the
10
+ * 1. **Write once.** The id is created with `O_EXCL` and never rewritten. A
11
+ * conflicting or malformed file is reported, not repaired. Only the
12
+ * manifest's `name` may change, through {@link renameProjectManifest}.
13
+ * 2. **Never silently re-mint.** When no tracked or local id exists, the
11
14
  * global registry is searched for the project's previous identity (same
12
15
  * path, its canonical-fingerprint alias, or a live checkout of the same remote). A
13
16
  * unique candidate is re-linked; several candidates refuse to guess; a new
14
17
  * id is minted only when nothing can be re-linked or when the caller asks
15
18
  * for one explicitly.
19
+ * 3. **Never migrate on open.** Tracked files are created here only for a
20
+ * project that has NONE yet. Turning a legacy `project-id` into
21
+ * `project.json` is `cleo doctor project-identity --resolve` alone.
16
22
  *
17
- * Precedence when both files exist and disagree: the local
18
- * `project-info.json` id wins and the conflict is reported. Local state
19
- * (registry row, aliases, brain) is keyed by that id, so switching silently
20
- * would re-key it — the data-loss geometry this whole design avoids. Two ids
21
- * for one repository means two lineages (typically two devices that each ran
22
- * `cleo init` before this file existed); reconciling them is an explicit act.
23
+ * Precedence when the tracked id and the `project-info.json` cache disagree
24
+ * (T12716, reversing the T12325 rule): the TRACKED id wins, as it already did
25
+ * for every reader. The disagreement is reported. The cache is not rewritten
26
+ * here: local state (registry row, aliases) keyed by the old id is re-keyed,
27
+ * with the old id kept as an alias, only by `cleo doctor project-identity
28
+ * --resolve`. Two ids for one repository means two lineages (typically two
29
+ * devices that each ran `cleo init` before the id was tracked).
23
30
  *
24
31
  * @task T12325
32
+ * @task T12716
33
+ * @see ADR-096 — one committed `.cleo/project.json` (amends ADR-094)
25
34
  */
26
35
  import { randomUUID } from 'node:crypto';
27
36
  import { existsSync, readFileSync } from 'node:fs';
28
37
  import { writeFile } from 'node:fs/promises';
29
- import { join, resolve } from 'node:path';
38
+ import { basename, join, resolve } from 'node:path';
30
39
  import { ExitCode } from '@cleocode/contracts';
31
- import { canonicalizePath, computePathFingerprintId, formatPortableProjectId, getCleoHome, isValidPortableProjectId, portableProjectIdPath, readPortableProjectId, } from '@cleocode/paths';
40
+ import { canonicalizePath, computePathFingerprintId, formatPortableProjectId, formatProjectManifest, getCleoHome, isValidPortableProjectId, isValidProjectDisplayName, PORTABLE_PROJECT_ID_FILE, PROJECT_DISPLAY_NAME_MAX, PROJECT_MANIFEST_FILE, PROJECT_MANIFEST_SCHEMA_VERSION, portableProjectIdPath, projectManifestPath, readPortableProjectId, readProjectIdFile, readProjectManifest, } from '@cleocode/paths';
32
41
  import { CleoError } from '../errors.js';
33
42
  import { normalizeRemoteUrl } from '../nexus/identity.js';
34
43
  /** Re-exported from its home in `nexus/identity` (moved there by T12470). */
@@ -127,17 +136,26 @@ export async function findRelinkCandidates(projectRoot, cleoHome = getCleoHome()
127
136
  export async function decideProjectIdentity(projectRoot, localInfoId, options = {}) {
128
137
  const tracked = readPortableProjectId(projectRoot);
129
138
  const diagnostics = [];
130
- if (localInfoId) {
131
- if (tracked.status === 'valid' && tracked.projectId !== localInfoId) {
132
- diagnostics.push(`identity conflict: .cleo/project-id is '${tracked.projectId}' but project-info.json is '${localInfoId}'; keeping the local id — reconcile explicitly`);
133
- }
134
- return { projectId: localInfoId, source: 'project-info', diagnostics };
135
- }
139
+ const trackedFile = `.cleo/${tracked.status !== 'absent' ? (tracked.file ?? PORTABLE_PROJECT_ID_FILE) : PROJECT_MANIFEST_FILE}`;
140
+ // T12716: the tracked id wins — the ONE place this rule lives. Readers
141
+ // (`readDeclaredProjectIdentity`, `decodeProjectInfo`) apply the same order.
136
142
  if (tracked.status === 'valid') {
143
+ if (localInfoId && localInfoId !== tracked.projectId) {
144
+ diagnostics.push(`identity conflict: ${trackedFile} is '${tracked.projectId}' but the project-info.json cache is '${localInfoId}'; the tracked id wins. Re-key local state with \`cleo doctor project-identity --resolve\` (the old id stays resolvable as an alias)`);
145
+ }
137
146
  return { projectId: tracked.projectId, source: 'tracked', diagnostics };
138
147
  }
139
148
  if (tracked.status === 'invalid') {
140
- throw new CleoError(ExitCode.CONFIG_ERROR, `Tracked project identity ${portableProjectIdPath(projectRoot)} is unusable (${tracked.reason}); refusing to mint a replacement`, { fix: 'Restore it from version control: `git checkout -- .cleo/project-id`' });
149
+ if (localInfoId) {
150
+ // Never block a working checkout on a damaged tracked file, and never
151
+ // regenerate it: keep the cached id and report the file.
152
+ diagnostics.push(`${trackedFile} is unusable (${tracked.reason}); keeping the project-info.json id '${localInfoId}'. Restore it: \`git checkout -- ${trackedFile}\``);
153
+ return { projectId: localInfoId, source: 'project-info', diagnostics };
154
+ }
155
+ throw new CleoError(ExitCode.CONFIG_ERROR, `Tracked project identity ${join(projectRoot, trackedFile)} is unusable (${tracked.reason}); refusing to mint a replacement`, { fix: `Restore it from version control: \`git checkout -- ${trackedFile}\`` });
156
+ }
157
+ if (localInfoId) {
158
+ return { projectId: localInfoId, source: 'project-info', diagnostics };
141
159
  }
142
160
  if (options.mintNewIdentity) {
143
161
  diagnostics.push('minted a new identity on explicit request');
@@ -157,7 +175,7 @@ export async function decideProjectIdentity(projectRoot, localInfoId, options =
157
175
  throw new CleoError(ExitCode.CONFIG_ERROR, `Cannot re-link project identity for ${projectRoot}: ${ids.length} registered identities match by ${via} (${tier
158
176
  .map((candidate) => `${candidate.projectId} @ ${candidate.projectPath}`)
159
177
  .join(', ')})`, {
160
- fix: 'Write the intended id to .cleo/project-id, or mint explicitly with `cleo init --new-identity`',
178
+ fix: 'Restore .cleo/project.json (or the legacy .cleo/project-id) with the intended id from version control, or mint explicitly with `cleo init --new-identity`',
161
179
  });
162
180
  }
163
181
  }
@@ -165,45 +183,179 @@ export async function decideProjectIdentity(projectRoot, localInfoId, options =
165
183
  return { projectId: randomUUID(), source: 'minted', diagnostics };
166
184
  }
167
185
  /**
168
- * Make sure `<projectRoot>/.cleo/project-id` records `projectId` — write-once.
186
+ * Default display name for a project root: its directory basename, made a
187
+ * valid name (control characters and separators replaced, a leading `~`
188
+ * dropped, capped at {@link PROJECT_DISPLAY_NAME_MAX}). `project` when nothing
189
+ * usable is left.
169
190
  *
170
- * Creates the file only when absent (`O_EXCL`); a present file is compared,
171
- * never rewritten.
191
+ * @param projectRoot - Project root.
192
+ * @returns A name that passes `isValidProjectDisplayName`.
193
+ *
194
+ * @example
195
+ * ```ts
196
+ * defaultProjectDisplayName('/work/cleocode'); // 'cleocode'
197
+ * ```
198
+ * @task T12716
199
+ */
200
+ export function defaultProjectDisplayName(projectRoot) {
201
+ const cleaned = basename(resolve(projectRoot))
202
+ .replace(/[/\\\u0000-\u001f\u007f]/g, '-')
203
+ .replace(/^~+/, '')
204
+ .slice(0, PROJECT_DISPLAY_NAME_MAX)
205
+ .trim();
206
+ return isValidProjectDisplayName(cleaned) ? cleaned : 'project';
207
+ }
208
+ /** Create a file with `O_EXCL`; `false` when it already exists. */
209
+ async function writeExclusive(path, content) {
210
+ try {
211
+ await writeFile(path, content, { flag: 'wx' });
212
+ return true;
213
+ }
214
+ catch (error) {
215
+ if (error instanceof Error && 'code' in error && error.code === 'EEXIST')
216
+ return false;
217
+ throw error;
218
+ }
219
+ }
220
+ /**
221
+ * Create `.cleo/project.json` for `projectId` — create-only (`O_EXCL`).
222
+ *
223
+ * @param projectRoot - Absolute project root.
224
+ * @param projectId - The identity to record; never changed afterwards.
225
+ * @param name - Display name; must pass `isValidProjectDisplayName`.
226
+ * @returns `written`, or — for a file that already exists — `present` (same
227
+ * id), `conflict` (different id) or `invalid` (unparseable). Never rewrites.
228
+ *
229
+ * @example
230
+ * ```ts
231
+ * await createProjectManifest(root, 'c78d09c3a8ee', 'cleocode'); // 'written'
232
+ * ```
233
+ * @task T12716
234
+ */
235
+ export async function createProjectManifest(projectRoot, projectId, name) {
236
+ if (!isValidPortableProjectId(projectId) || !isValidProjectDisplayName(name))
237
+ return 'invalid';
238
+ if (!existsSync(join(projectRoot, '.cleo')))
239
+ return 'no-cleo-dir';
240
+ const body = formatProjectManifest({
241
+ schemaVersion: PROJECT_MANIFEST_SCHEMA_VERSION,
242
+ id: projectId,
243
+ name,
244
+ });
245
+ if (await writeExclusive(projectManifestPath(projectRoot), body))
246
+ return 'written';
247
+ // Present (or lost a race): judge what is there, never overwrite it.
248
+ const current = readProjectManifest(projectRoot);
249
+ if (current.status !== 'valid')
250
+ return 'invalid';
251
+ return current.manifest.id === projectId ? 'present' : 'conflict';
252
+ }
253
+ /**
254
+ * Create the legacy `.cleo/project-id` mirror for `projectId` — create-only.
255
+ * Older builds read only this file, so it is kept beside `project.json`
256
+ * until a later removal (T12716).
257
+ *
258
+ * @param projectRoot - Absolute project root.
259
+ * @param projectId - The identity to mirror.
260
+ * @returns `written`, or for an existing file `present` / `conflict` / `invalid`.
261
+ *
262
+ * @example
263
+ * ```ts
264
+ * await createProjectIdMirror(root, 'c78d09c3a8ee');
265
+ * ```
266
+ * @task T12716
267
+ */
268
+ export async function createProjectIdMirror(projectRoot, projectId) {
269
+ if (!isValidPortableProjectId(projectId))
270
+ return 'invalid';
271
+ if (!existsSync(join(projectRoot, '.cleo')))
272
+ return 'no-cleo-dir';
273
+ if (await writeExclusive(portableProjectIdPath(projectRoot), formatPortableProjectId(projectId)))
274
+ return 'written';
275
+ const current = readProjectIdFile(projectRoot);
276
+ if (current.status !== 'valid')
277
+ return 'invalid';
278
+ return current.projectId === projectId ? 'present' : 'conflict';
279
+ }
280
+ /**
281
+ * Make sure the tracked files record `projectId` — write-once.
282
+ *
283
+ * Only a project with NO tracked identity gets files: `project.json` and the
284
+ * legacy `project-id` mirror, both created with `O_EXCL`. A present file is
285
+ * compared, never rewritten, and a legacy-only project is reported as
286
+ * `legacy` rather than migrated (migration is `cleo doctor project-identity
287
+ * --resolve`, T12716).
172
288
  *
173
289
  * @param projectRoot - Absolute project root.
174
290
  * @param projectId - The identity to adopt.
175
- * @returns What happened; `conflict`/`invalid` are for the caller to report.
291
+ * @param name - Display name for a new `project.json`; defaults to
292
+ * {@link defaultProjectDisplayName}. Ignored when a file already exists.
293
+ * @returns What happened; `legacy`/`conflict`/`invalid` are for the caller to report.
176
294
  *
177
295
  * @example
178
296
  * ```ts
179
297
  * const outcome = await ensurePortableProjectId(root, info.projectId);
180
298
  * ```
181
299
  */
182
- export async function ensurePortableProjectId(projectRoot, projectId) {
300
+ export async function ensurePortableProjectId(projectRoot, projectId, name) {
183
301
  const current = readPortableProjectId(projectRoot);
184
- if (current.status === 'valid')
185
- return current.projectId === projectId ? 'present' : 'conflict';
302
+ if (current.status === 'valid') {
303
+ if (current.projectId !== projectId)
304
+ return 'conflict';
305
+ return current.file === PORTABLE_PROJECT_ID_FILE ? 'legacy' : 'present';
306
+ }
186
307
  if (current.status === 'invalid')
187
308
  return 'invalid';
188
309
  if (!isValidPortableProjectId(projectId))
189
310
  return 'invalid';
190
311
  if (!existsSync(join(projectRoot, '.cleo')))
191
312
  return 'no-cleo-dir';
192
- try {
193
- await writeFile(portableProjectIdPath(projectRoot), formatPortableProjectId(projectId), {
194
- flag: 'wx',
195
- });
196
- return 'written';
313
+ const displayName = name !== undefined && isValidProjectDisplayName(name)
314
+ ? name
315
+ : defaultProjectDisplayName(projectRoot);
316
+ const manifest = await createProjectManifest(projectRoot, projectId, displayName);
317
+ if (manifest !== 'written' && manifest !== 'present')
318
+ return manifest;
319
+ const mirror = await createProjectIdMirror(projectRoot, projectId);
320
+ if (mirror === 'conflict' || mirror === 'invalid')
321
+ return mirror;
322
+ return manifest;
323
+ }
324
+ /**
325
+ * Rename a project in its committed `.cleo/project.json`: only `name` changes;
326
+ * the id is carried over byte-identical and keys this build does not know are
327
+ * kept (`writeProjectManifestName`: a tmp file unique to the call, renamed
328
+ * into place, so a crash never leaves a half-written identity file).
329
+ *
330
+ * @param projectRoot - Absolute project root.
331
+ * @param name - New display name (trimmed; must pass `isValidProjectDisplayName`).
332
+ * @returns The previous and new manifest names.
333
+ * @throws {CleoError} `VALIDATION_ERROR` for an invalid name; `CONFIG_ERROR`
334
+ * when `project.json` is absent (migrate first) or unusable.
335
+ *
336
+ * @example
337
+ * ```ts
338
+ * await renameProjectManifest(root, 'cleo-platform');
339
+ * ```
340
+ * @task T12716
341
+ */
342
+ export async function renameProjectManifest(projectRoot, name) {
343
+ const newName = name.trim();
344
+ if (!isValidProjectDisplayName(newName)) {
345
+ throw new CleoError(ExitCode.VALIDATION_ERROR, `Invalid project name '${newName}': use 1-${PROJECT_DISPLAY_NAME_MAX} characters with no "/", "\\", control characters or leading "~"`);
197
346
  }
198
- catch (error) {
199
- if (error instanceof Error && 'code' in error && error.code === 'EEXIST') {
200
- // Lost a race with another writer: judge what they wrote, never overwrite it.
201
- const raced = readPortableProjectId(projectRoot);
202
- if (raced.status === 'valid')
203
- return raced.projectId === projectId ? 'present' : 'conflict';
204
- return 'invalid';
205
- }
206
- throw error;
347
+ const current = readProjectManifest(projectRoot);
348
+ if (current.status !== 'valid') {
349
+ throw new CleoError(ExitCode.CONFIG_ERROR, current.status === 'absent'
350
+ ? `${projectManifestPath(projectRoot)} does not exist yet`
351
+ : `${projectManifestPath(projectRoot)} is unusable (${current.reason})`, {
352
+ fix: current.status === 'absent'
353
+ ? 'Run `cleo doctor project-identity --resolve` to record the identity in .cleo/project.json'
354
+ : `Restore it from version control: \`git checkout -- .cleo/${PROJECT_MANIFEST_FILE}\``,
355
+ });
207
356
  }
357
+ // Only `name` changes; unknown keys survive; a per-call tmp file (T12716).
358
+ const { writeProjectManifestName } = await import('../project-info.js');
359
+ return writeProjectManifestName(projectRoot, newName);
208
360
  }
209
361
  //# sourceMappingURL=project-identity.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-identity.js","sourceRoot":"","sources":["../../src/scaffold/project-identity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project-identity.js","sourceRoot":"","sources":["../../src/scaffold/project-identity.ts"],"names":[],"mappings":"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"}