@cleocode/core 2026.10.5 → 2026.10.6

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 (321) hide show
  1. package/dist/bootstrap.d.ts +13 -0
  2. package/dist/bootstrap.d.ts.map +1 -1
  3. package/dist/bootstrap.js +21 -32
  4. package/dist/bootstrap.js.map +1 -1
  5. package/dist/build-provenance.json +2 -2
  6. package/dist/cloud/nexus-cloud-status.d.ts.map +1 -1
  7. package/dist/cloud/nexus-cloud-status.js +3 -1
  8. package/dist/cloud/nexus-cloud-status.js.map +1 -1
  9. package/dist/cloud/nexus-device.d.ts +1 -1
  10. package/dist/cloud/nexus-presence-refresh.d.ts.map +1 -1
  11. package/dist/cloud/nexus-presence-refresh.js +20 -13
  12. package/dist/cloud/nexus-presence-refresh.js.map +1 -1
  13. package/dist/cloud/nexus-vault.d.ts.map +1 -1
  14. package/dist/cloud/nexus-vault.js +4 -1
  15. package/dist/cloud/nexus-vault.js.map +1 -1
  16. package/dist/docs/derive-links.d.ts +69 -0
  17. package/dist/docs/derive-links.d.ts.map +1 -0
  18. package/dist/docs/derive-links.js +85 -0
  19. package/dist/docs/derive-links.js.map +1 -0
  20. package/dist/docs/docs-generator.d.ts.map +1 -1
  21. package/dist/docs/docs-generator.js +2 -0
  22. package/dist/docs/docs-generator.js.map +1 -1
  23. package/dist/docs/docs-update.d.ts.map +1 -1
  24. package/dist/docs/docs-update.js +24 -4
  25. package/dist/docs/docs-update.js.map +1 -1
  26. package/dist/docs/fetch-result.d.ts +77 -0
  27. package/dist/docs/fetch-result.d.ts.map +1 -0
  28. package/dist/docs/fetch-result.js +132 -0
  29. package/dist/docs/fetch-result.js.map +1 -0
  30. package/dist/docs/supersede.d.ts.map +1 -1
  31. package/dist/docs/supersede.js +9 -0
  32. package/dist/docs/supersede.js.map +1 -1
  33. package/dist/doctor/db-substrate.d.ts.map +1 -1
  34. package/dist/doctor/db-substrate.js +64 -29
  35. package/dist/doctor/db-substrate.js.map +1 -1
  36. package/dist/doctor/row-identity-refill.d.ts.map +1 -1
  37. package/dist/doctor/row-identity-refill.js +25 -10
  38. package/dist/doctor/row-identity-refill.js.map +1 -1
  39. package/dist/doctor/row-identity.d.ts.map +1 -1
  40. package/dist/doctor/row-identity.js +8 -2
  41. package/dist/doctor/row-identity.js.map +1 -1
  42. package/dist/doctor/sync-repair.d.ts +5 -0
  43. package/dist/doctor/sync-repair.d.ts.map +1 -1
  44. package/dist/doctor/sync-repair.js +11 -0
  45. package/dist/doctor/sync-repair.js.map +1 -1
  46. package/dist/doctor/sync-triggers.d.ts.map +1 -1
  47. package/dist/doctor/sync-triggers.js +3 -17
  48. package/dist/doctor/sync-triggers.js.map +1 -1
  49. package/dist/hygiene/validate-spawn-readiness.d.ts +6 -1
  50. package/dist/hygiene/validate-spawn-readiness.d.ts.map +1 -1
  51. package/dist/hygiene/validate-spawn-readiness.js +11 -6
  52. package/dist/hygiene/validate-spawn-readiness.js.map +1 -1
  53. package/dist/init.d.ts.map +1 -1
  54. package/dist/init.js +10 -1
  55. package/dist/init.js.map +1 -1
  56. package/dist/injection.d.ts +37 -12
  57. package/dist/injection.d.ts.map +1 -1
  58. package/dist/injection.js +152 -35
  59. package/dist/injection.js.map +1 -1
  60. package/dist/memory/brain-search.d.ts.map +1 -1
  61. package/dist/memory/brain-search.js +7 -32
  62. package/dist/memory/brain-search.js.map +1 -1
  63. package/dist/memory/pipeline-manifest-sqlite.d.ts +2 -0
  64. package/dist/memory/pipeline-manifest-sqlite.d.ts.map +1 -1
  65. package/dist/memory/pipeline-manifest-sqlite.js +51 -9
  66. package/dist/memory/pipeline-manifest-sqlite.js.map +1 -1
  67. package/dist/nexus/assessment-projection.d.ts +96 -1
  68. package/dist/nexus/assessment-projection.d.ts.map +1 -1
  69. package/dist/nexus/assessment-projection.js +135 -0
  70. package/dist/nexus/assessment-projection.js.map +1 -1
  71. package/dist/nexus/assessment-store.d.ts +54 -0
  72. package/dist/nexus/assessment-store.d.ts.map +1 -1
  73. package/dist/nexus/assessment-store.js +161 -2
  74. package/dist/nexus/assessment-store.js.map +1 -1
  75. package/dist/nexus/knowledge.d.ts +19 -0
  76. package/dist/nexus/knowledge.d.ts.map +1 -1
  77. package/dist/nexus/knowledge.js +56 -2
  78. package/dist/nexus/knowledge.js.map +1 -1
  79. package/dist/orchestrate/spawn-ops.d.ts.map +1 -1
  80. package/dist/orchestrate/spawn-ops.js +12 -1
  81. package/dist/orchestrate/spawn-ops.js.map +1 -1
  82. package/dist/release/commit-presence.d.ts +24 -0
  83. package/dist/release/commit-presence.d.ts.map +1 -1
  84. package/dist/release/commit-presence.js +31 -0
  85. package/dist/release/commit-presence.js.map +1 -1
  86. package/dist/release/plan.d.ts +8 -6
  87. package/dist/release/plan.d.ts.map +1 -1
  88. package/dist/release/plan.js +11 -6
  89. package/dist/release/plan.js.map +1 -1
  90. package/dist/release/reconcile.d.ts.map +1 -1
  91. package/dist/release/reconcile.js +10 -8
  92. package/dist/release/reconcile.js.map +1 -1
  93. package/dist/release/verify-provenance.d.ts.map +1 -1
  94. package/dist/release/verify-provenance.js +6 -8
  95. package/dist/release/verify-provenance.js.map +1 -1
  96. package/dist/resources/admission-ledger.d.ts +66 -0
  97. package/dist/resources/admission-ledger.d.ts.map +1 -1
  98. package/dist/resources/admission-ledger.js +145 -6
  99. package/dist/resources/admission-ledger.js.map +1 -1
  100. package/dist/resources/run-class.d.ts +71 -0
  101. package/dist/resources/run-class.d.ts.map +1 -1
  102. package/dist/resources/run-class.js +203 -0
  103. package/dist/resources/run-class.js.map +1 -1
  104. package/dist/resources/run-governed.d.ts +2 -0
  105. package/dist/resources/run-governed.d.ts.map +1 -1
  106. package/dist/resources/run-governed.js +1 -0
  107. package/dist/resources/run-governed.js.map +1 -1
  108. package/dist/scaffold/ensure-config.d.ts +20 -9
  109. package/dist/scaffold/ensure-config.d.ts.map +1 -1
  110. package/dist/scaffold/ensure-config.js +56 -23
  111. package/dist/scaffold/ensure-config.js.map +1 -1
  112. package/dist/scaffold/ensure-skills.d.ts +10 -0
  113. package/dist/scaffold/ensure-skills.d.ts.map +1 -1
  114. package/dist/scaffold/ensure-skills.js +47 -3
  115. package/dist/scaffold/ensure-skills.js.map +1 -1
  116. package/dist/scaffold/upgrade-file-journal.d.ts +79 -0
  117. package/dist/scaffold/upgrade-file-journal.d.ts.map +1 -0
  118. package/dist/scaffold/upgrade-file-journal.js +111 -0
  119. package/dist/scaffold/upgrade-file-journal.js.map +1 -0
  120. package/dist/session/engine-ops.d.ts.map +1 -1
  121. package/dist/session/engine-ops.js +10 -2
  122. package/dist/session/engine-ops.js.map +1 -1
  123. package/dist/sessions/index.d.ts.map +1 -1
  124. package/dist/sessions/index.js +3 -0
  125. package/dist/sessions/index.js.map +1 -1
  126. package/dist/spawn/worktree-lock-holder.d.ts +59 -1
  127. package/dist/spawn/worktree-lock-holder.d.ts.map +1 -1
  128. package/dist/spawn/worktree-lock-holder.js +114 -0
  129. package/dist/spawn/worktree-lock-holder.js.map +1 -1
  130. package/dist/store/attachment-store.d.ts.map +1 -1
  131. package/dist/store/attachment-store.js +38 -0
  132. package/dist/store/attachment-store.js.map +1 -1
  133. package/dist/store/backup-recover.d.ts +4 -4
  134. package/dist/store/backup-recover.d.ts.map +1 -1
  135. package/dist/store/backup-recover.js +11 -4
  136. package/dist/store/backup-recover.js.map +1 -1
  137. package/dist/store/backup-sidecar.d.ts +19 -1
  138. package/dist/store/backup-sidecar.d.ts.map +1 -1
  139. package/dist/store/backup-sidecar.js +57 -6
  140. package/dist/store/backup-sidecar.js.map +1 -1
  141. package/dist/store/db-helpers.js +1 -1
  142. package/dist/store/display-id-alias.js +1 -1
  143. package/dist/store/display-id-alias.js.map +1 -1
  144. package/dist/store/dual-scope-db.d.ts +2 -0
  145. package/dist/store/dual-scope-db.d.ts.map +1 -1
  146. package/dist/store/dual-scope-db.js +28 -16
  147. package/dist/store/dual-scope-db.js.map +1 -1
  148. package/dist/store/exodus/archive.d.ts +42 -2
  149. package/dist/store/exodus/archive.d.ts.map +1 -1
  150. package/dist/store/exodus/archive.js +81 -4
  151. package/dist/store/exodus/archive.js.map +1 -1
  152. package/dist/store/exodus/bare-family.d.ts +104 -0
  153. package/dist/store/exodus/bare-family.d.ts.map +1 -0
  154. package/dist/store/exodus/bare-family.js +470 -0
  155. package/dist/store/exodus/bare-family.js.map +1 -0
  156. package/dist/store/exodus/column-transforms.d.ts.map +1 -1
  157. package/dist/store/exodus/column-transforms.js +15 -8
  158. package/dist/store/exodus/column-transforms.js.map +1 -1
  159. package/dist/store/exodus/health.d.ts +2 -0
  160. package/dist/store/exodus/health.d.ts.map +1 -1
  161. package/dist/store/exodus/health.js +7 -1
  162. package/dist/store/exodus/health.js.map +1 -1
  163. package/dist/store/exodus/index.d.ts +2 -2
  164. package/dist/store/exodus/index.d.ts.map +1 -1
  165. package/dist/store/exodus/index.js +2 -2
  166. package/dist/store/exodus/index.js.map +1 -1
  167. package/dist/store/exodus/migrate.d.ts.map +1 -1
  168. package/dist/store/exodus/migrate.js +30 -1
  169. package/dist/store/exodus/migrate.js.map +1 -1
  170. package/dist/store/exodus/on-open.d.ts +11 -0
  171. package/dist/store/exodus/on-open.d.ts.map +1 -1
  172. package/dist/store/exodus/on-open.js +26 -1
  173. package/dist/store/exodus/on-open.js.map +1 -1
  174. package/dist/store/exodus/prior-recoveries.d.ts +3 -2
  175. package/dist/store/exodus/prior-recoveries.d.ts.map +1 -1
  176. package/dist/store/exodus/prior-recoveries.js +7 -3
  177. package/dist/store/exodus/prior-recoveries.js.map +1 -1
  178. package/dist/store/exodus/reconcile.d.ts +44 -6
  179. package/dist/store/exodus/reconcile.d.ts.map +1 -1
  180. package/dist/store/exodus/reconcile.js +246 -173
  181. package/dist/store/exodus/reconcile.js.map +1 -1
  182. package/dist/store/exodus/recovery.d.ts +48 -0
  183. package/dist/store/exodus/recovery.d.ts.map +1 -1
  184. package/dist/store/exodus/recovery.js +104 -6
  185. package/dist/store/exodus/recovery.js.map +1 -1
  186. package/dist/store/exodus/seal.d.ts.map +1 -1
  187. package/dist/store/exodus/seal.js +4 -2
  188. package/dist/store/exodus/seal.js.map +1 -1
  189. package/dist/store/exodus/table-order.d.ts +6 -0
  190. package/dist/store/exodus/table-order.d.ts.map +1 -1
  191. package/dist/store/exodus/table-order.js +15 -0
  192. package/dist/store/exodus/table-order.js.map +1 -1
  193. package/dist/store/exodus/types.d.ts +4 -0
  194. package/dist/store/exodus/types.d.ts.map +1 -1
  195. package/dist/store/exodus/types.js +4 -0
  196. package/dist/store/exodus/types.js.map +1 -1
  197. package/dist/store/exodus/verify-migration.d.ts.map +1 -1
  198. package/dist/store/exodus/verify-migration.js +22 -17
  199. package/dist/store/exodus/verify-migration.js.map +1 -1
  200. package/dist/store/identity-share.d.ts +14 -0
  201. package/dist/store/identity-share.d.ts.map +1 -1
  202. package/dist/store/identity-share.js +33 -0
  203. package/dist/store/identity-share.js.map +1 -1
  204. package/dist/store/lock.d.ts +33 -0
  205. package/dist/store/lock.d.ts.map +1 -1
  206. package/dist/store/lock.js +60 -0
  207. package/dist/store/lock.js.map +1 -1
  208. package/dist/store/portable-bundle-import.d.ts.map +1 -1
  209. package/dist/store/portable-bundle-import.js +7 -0
  210. package/dist/store/portable-bundle-import.js.map +1 -1
  211. package/dist/store/portable-bundle-scan.d.ts +3 -2
  212. package/dist/store/portable-bundle-scan.d.ts.map +1 -1
  213. package/dist/store/portable-bundle-scan.js +7 -5
  214. package/dist/store/portable-bundle-scan.js.map +1 -1
  215. package/dist/store/portable-bundle.d.ts +1 -1
  216. package/dist/store/portable-bundle.d.ts.map +1 -1
  217. package/dist/store/portable-bundle.js +9 -1
  218. package/dist/store/portable-bundle.js.map +1 -1
  219. package/dist/store/repair-malformed-dbs.d.ts.map +1 -1
  220. package/dist/store/repair-malformed-dbs.js +36 -6
  221. package/dist/store/repair-malformed-dbs.js.map +1 -1
  222. package/dist/store/restore-marker.d.ts +20 -2
  223. package/dist/store/restore-marker.d.ts.map +1 -1
  224. package/dist/store/restore-marker.js +41 -1
  225. package/dist/store/restore-marker.js.map +1 -1
  226. package/dist/store/row-identity-flag.d.ts +9 -6
  227. package/dist/store/row-identity-flag.d.ts.map +1 -1
  228. package/dist/store/row-identity-flag.js +10 -7
  229. package/dist/store/row-identity-flag.js.map +1 -1
  230. package/dist/store/row-identity-registry.d.ts +4 -3
  231. package/dist/store/row-identity-registry.d.ts.map +1 -1
  232. package/dist/store/row-identity-registry.js +132 -31
  233. package/dist/store/row-identity-registry.js.map +1 -1
  234. package/dist/store/row-identity.d.ts +81 -14
  235. package/dist/store/row-identity.d.ts.map +1 -1
  236. package/dist/store/row-identity.js +238 -32
  237. package/dist/store/row-identity.js.map +1 -1
  238. package/dist/store/schema/cleo-shared/brain.d.ts +368 -0
  239. package/dist/store/schema/cleo-shared/brain.d.ts.map +1 -1
  240. package/dist/store/schema/cleo-shared/brain.js +104 -2
  241. package/dist/store/schema/cleo-shared/brain.js.map +1 -1
  242. package/dist/store/sync/apply/applier.d.ts +5 -0
  243. package/dist/store/sync/apply/applier.d.ts.map +1 -1
  244. package/dist/store/sync/apply/applier.js +5 -1
  245. package/dist/store/sync/apply/applier.js.map +1 -1
  246. package/dist/store/sync/apply/parent-delete.d.ts.map +1 -1
  247. package/dist/store/sync/apply/parent-delete.js +4 -0
  248. package/dist/store/sync/apply/parent-delete.js.map +1 -1
  249. package/dist/store/sync/capture.d.ts +13 -1
  250. package/dist/store/sync/capture.d.ts.map +1 -1
  251. package/dist/store/sync/capture.js +31 -3
  252. package/dist/store/sync/capture.js.map +1 -1
  253. package/dist/store/sync/flags.d.ts +14 -5
  254. package/dist/store/sync/flags.d.ts.map +1 -1
  255. package/dist/store/sync/flags.js +20 -8
  256. package/dist/store/sync/flags.js.map +1 -1
  257. package/dist/store/sync/genesis.d.ts +130 -0
  258. package/dist/store/sync/genesis.d.ts.map +1 -0
  259. package/dist/store/sync/genesis.js +337 -0
  260. package/dist/store/sync/genesis.js.map +1 -0
  261. package/dist/store/sync/repair.d.ts +2 -2
  262. package/dist/store/sync/repair.d.ts.map +1 -1
  263. package/dist/store/sync/repair.js +55 -15
  264. package/dist/store/sync/repair.js.map +1 -1
  265. package/dist/store/sync/sealer.d.ts +14 -0
  266. package/dist/store/sync/sealer.d.ts.map +1 -1
  267. package/dist/store/sync/sealer.js +27 -6
  268. package/dist/store/sync/sealer.js.map +1 -1
  269. package/dist/store/sync/segments.d.ts +124 -0
  270. package/dist/store/sync/segments.d.ts.map +1 -0
  271. package/dist/store/sync/segments.js +267 -0
  272. package/dist/store/sync/segments.js.map +1 -0
  273. package/dist/store/sync/sequencing.d.ts +44 -1
  274. package/dist/store/sync/sequencing.d.ts.map +1 -1
  275. package/dist/store/sync/sequencing.js +59 -2
  276. package/dist/store/sync/sequencing.js.map +1 -1
  277. package/dist/store/sync/timestamp-canon.d.ts +6 -3
  278. package/dist/store/sync/timestamp-canon.d.ts.map +1 -1
  279. package/dist/store/sync/timestamp-canon.js +55 -4
  280. package/dist/store/sync/timestamp-canon.js.map +1 -1
  281. package/dist/store/sync/txn-signing.d.ts +69 -0
  282. package/dist/store/sync/txn-signing.d.ts.map +1 -0
  283. package/dist/store/sync/txn-signing.js +81 -0
  284. package/dist/store/sync/txn-signing.js.map +1 -0
  285. package/dist/store/table-classification.d.ts.map +1 -1
  286. package/dist/store/table-classification.js +30 -0
  287. package/dist/store/table-classification.js.map +1 -1
  288. package/dist/store/twin-collapse.d.ts.map +1 -1
  289. package/dist/store/twin-collapse.js +65 -2
  290. package/dist/store/twin-collapse.js.map +1 -1
  291. package/dist/system/backup.d.ts +3 -2
  292. package/dist/system/backup.d.ts.map +1 -1
  293. package/dist/system/backup.js +43 -17
  294. package/dist/system/backup.js.map +1 -1
  295. package/dist/system/health.d.ts.map +1 -1
  296. package/dist/system/health.js +2 -1
  297. package/dist/system/health.js.map +1 -1
  298. package/dist/tasks/affected-packages.d.ts +26 -0
  299. package/dist/tasks/affected-packages.d.ts.map +1 -1
  300. package/dist/tasks/affected-packages.js +95 -28
  301. package/dist/tasks/affected-packages.js.map +1 -1
  302. package/dist/tasks/change-set.d.ts.map +1 -1
  303. package/dist/tasks/change-set.js +14 -4
  304. package/dist/tasks/change-set.js.map +1 -1
  305. package/dist/tasks/done-plan.d.ts.map +1 -1
  306. package/dist/tasks/done-plan.js +50 -4
  307. package/dist/tasks/done-plan.js.map +1 -1
  308. package/dist/tasks/test-run-binding.d.ts +14 -0
  309. package/dist/tasks/test-run-binding.d.ts.map +1 -1
  310. package/dist/tasks/test-run-binding.js +35 -4
  311. package/dist/tasks/test-run-binding.js.map +1 -1
  312. package/dist/upgrade.d.ts +6 -0
  313. package/dist/upgrade.d.ts.map +1 -1
  314. package/dist/upgrade.js +58 -11
  315. package/dist/upgrade.js.map +1 -1
  316. package/migrations/drizzle-cleo-global/20261010120000_t12894-brain-row-uids/migration.sql +88 -0
  317. package/migrations/drizzle-cleo-project/20261010120000_t12894-brain-row-uids/migration.sql +92 -0
  318. package/migrations/sync-journal/20261007120000_t12343-segment-outbox/migration.sql +38 -0
  319. package/package.json +13 -13
  320. package/templates/CLEO-INJECTION.md +1 -1
  321. package/templates/CLEO-REFERENCE.md +2 -2
@@ -3,6 +3,7 @@
3
3
  * project-info.json, and related template/version utilities.
4
4
  */
5
5
  import type { ScaffoldResult } from '@cleocode/contracts/scaffold-diagnostics';
6
+ import type { UpgradeFileJournal } from './upgrade-file-journal.js';
6
7
  /**
7
8
  * Resolve the `.cleo` directory for scaffold steps.
8
9
  *
@@ -73,33 +74,43 @@ export declare function getCleoVersion(): string;
73
74
  */
74
75
  export declare function createDefaultConfig(): Record<string, unknown>;
75
76
  /**
76
- * Create or repair .cleo/.gitignore from template.
77
- * Idempotent: skips if file already exists with correct content.
77
+ * Options for the repair of user-owned rule files
78
+ * ({@link ensureGitignore}, {@link ensureWorktreeInclude}).
79
+ */
80
+ export interface RuleFileRepairOptions {
81
+ /** Journal that backs up the file before it changes and lists it (upgrade, T13409). */
82
+ journal?: UpgradeFileJournal;
83
+ }
84
+ /**
85
+ * Create .cleo/.gitignore from the template, or append the template rules an
86
+ * existing file lacks. Idempotent; never drops or reorders the user's lines (T13409).
78
87
  *
79
88
  * @param projectRoot - Absolute path to the project root directory
89
+ * @param opts - Backup journal (upgrade)
80
90
  * @returns Scaffold result indicating whether the gitignore was created, repaired, or skipped
81
91
  */
82
- export declare function ensureGitignore(projectRoot: string): Promise<ScaffoldResult>;
92
+ export declare function ensureGitignore(projectRoot: string, opts?: RuleFileRepairOptions): Promise<ScaffoldResult>;
83
93
  /**
84
- * Create or repair `.worktreeinclude` (canonical, at project root) from the
85
- * shipped template. Idempotent — skips when the existing file already
86
- * matches the template byte-for-byte (after CR-LF + trim normalisation).
94
+ * Create `.worktreeinclude` (canonical, at project root) from the shipped
95
+ * template, or append the template entries an existing file lacks.
96
+ * Idempotent; never drops or reorders the user's lines (T13409).
87
97
  *
88
98
  * Resolution rules (T9983):
89
- * - If `<projectRoot>/.worktreeinclude` already exists → keep + compare to
90
- * the template; repair if drifted.
99
+ * - If `<projectRoot>/.worktreeinclude` already exists → keep it and append
100
+ * only the missing template entries.
91
101
  * - Else if legacy `<projectRoot>/.cleo/worktree-include` exists → SKIP
92
102
  * (do not overwrite the legacy file in place; `cleo doctor
93
103
  * --migrate-worktree-include` is the explicit migration path).
94
104
  * - Else → write the canonical template.
95
105
  *
96
106
  * @param projectRoot - Absolute path to the project root directory
107
+ * @param opts - Backup journal (upgrade)
97
108
  * @returns Scaffold result indicating whether `.worktreeinclude` was
98
109
  * created, repaired, or skipped.
99
110
  *
100
111
  * @task T9983
101
112
  */
102
- export declare function ensureWorktreeInclude(projectRoot: string): Promise<ScaffoldResult>;
113
+ export declare function ensureWorktreeInclude(projectRoot: string, opts?: RuleFileRepairOptions): Promise<ScaffoldResult>;
103
114
  /**
104
115
  * Create default config.json if missing.
105
116
  * Idempotent: skips if file already exists.
@@ -1 +1 @@
1
- {"version":3,"file":"ensure-config.d.ts","sourceRoot":"","sources":["../../src/scaffold/ensure-config.ts"],"names":[],"mappings":"AACA;;;GAGG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAM/E;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAWlE;AAED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,ihDAwDnC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB,oaAarC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAKvC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAW5C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAelD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAQvC;AAgBD;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoD7D;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAiBlF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA6BxF;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACzB,OAAO,CAAC,cAAc,CAAC,CAsCzB;AAaD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GACpD,OAAO,CAAC,cAAc,CAAC,CA0IzB;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAMvF"}
1
+ {"version":3,"file":"ensure-config.d.ts","sourceRoot":"","sources":["../../src/scaffold/ensure-config.ts"],"names":[],"mappings":"AACA;;;GAGG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAK/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAWlE;AAED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,ihDAwDnC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB,oaAarC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAKvC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAW5C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAelD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAQvC;AAgBD;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoD7D;AAKD;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,uFAAuF;IACvF,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AAiCD;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,qBAAqB,GAC3B,OAAO,CAAC,cAAc,CAAC,CAWzB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,qBAAqB,GAC3B,OAAO,CAAC,cAAc,CAAC,CAuBzB;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACzB,OAAO,CAAC,cAAc,CAAC,CAsCzB;AAaD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GACpD,OAAO,CAAC,cAAc,CAAC,CAoJzB;AAWD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAMvF"}
@@ -267,60 +267,78 @@ export function createDefaultConfig() {
267
267
  },
268
268
  };
269
269
  }
270
+ /** Comment written above rules a repair appends to a user-owned ignore/include file. */
271
+ const APPENDED_RULES_HEADER = '# Added by cleo: CLEO-required entries missing from this file';
270
272
  /**
271
- * Create or repair .cleo/.gitignore from template.
272
- * Idempotent: skips if file already exists with correct content.
273
+ * Append the template entries an existing rule file lacks, never dropping or
274
+ * reordering the user's lines (T13409).
275
+ *
276
+ * A bare `*` is never appended: in a file without it, the user chose not to
277
+ * deny everything, and a trailing `*` would override every allow rule they wrote.
278
+ */
279
+ async function repairRuleFile(path, templateContent, opts) {
280
+ // Loaded lazily: this module is on the startup path of read commands (gate 39).
281
+ const { appendMissingLines, writeIfChanged } = await import('./upgrade-file-journal.js');
282
+ const existing = readFileSync(path, 'utf-8');
283
+ const template = templateContent
284
+ .split(/\r?\n/)
285
+ .filter((line) => line.trim() !== '*')
286
+ .join('\n');
287
+ const { content, added } = appendMissingLines(existing, template, APPENDED_RULES_HEADER);
288
+ if (added.length === 0) {
289
+ return { action: 'skipped', path, details: 'All CLEO-required entries present' };
290
+ }
291
+ await writeIfChanged(path, content, opts?.journal);
292
+ return {
293
+ action: 'repaired',
294
+ path,
295
+ details: `Appended ${added.length} missing CLEO-required entr${added.length === 1 ? 'y' : 'ies'}: ${added.join(', ')}`,
296
+ };
297
+ }
298
+ /**
299
+ * Create .cleo/.gitignore from the template, or append the template rules an
300
+ * existing file lacks. Idempotent; never drops or reorders the user's lines (T13409).
273
301
  *
274
302
  * @param projectRoot - Absolute path to the project root directory
303
+ * @param opts - Backup journal (upgrade)
275
304
  * @returns Scaffold result indicating whether the gitignore was created, repaired, or skipped
276
305
  */
277
- export async function ensureGitignore(projectRoot) {
306
+ export async function ensureGitignore(projectRoot, opts) {
278
307
  const cleoDir = resolveScaffoldCleoDir(projectRoot);
279
308
  const gitignorePath = join(cleoDir, '.gitignore');
280
309
  const templateContent = getGitignoreContent();
281
310
  if (existsSync(gitignorePath)) {
282
- const existing = readFileSync(gitignorePath, 'utf-8');
283
- const normalize = (s) => s.trim().replace(/\r\n/g, '\n');
284
- if (normalize(existing) === normalize(templateContent)) {
285
- return { action: 'skipped', path: gitignorePath, details: 'Already matches template' };
286
- }
287
- await writeFile(gitignorePath, templateContent);
288
- return { action: 'repaired', path: gitignorePath, details: 'Updated to match template' };
311
+ return repairRuleFile(gitignorePath, templateContent, opts);
289
312
  }
290
313
  await writeFile(gitignorePath, templateContent);
291
314
  return { action: 'created', path: gitignorePath };
292
315
  }
293
316
  /**
294
- * Create or repair `.worktreeinclude` (canonical, at project root) from the
295
- * shipped template. Idempotent — skips when the existing file already
296
- * matches the template byte-for-byte (after CR-LF + trim normalisation).
317
+ * Create `.worktreeinclude` (canonical, at project root) from the shipped
318
+ * template, or append the template entries an existing file lacks.
319
+ * Idempotent; never drops or reorders the user's lines (T13409).
297
320
  *
298
321
  * Resolution rules (T9983):
299
- * - If `<projectRoot>/.worktreeinclude` already exists → keep + compare to
300
- * the template; repair if drifted.
322
+ * - If `<projectRoot>/.worktreeinclude` already exists → keep it and append
323
+ * only the missing template entries.
301
324
  * - Else if legacy `<projectRoot>/.cleo/worktree-include` exists → SKIP
302
325
  * (do not overwrite the legacy file in place; `cleo doctor
303
326
  * --migrate-worktree-include` is the explicit migration path).
304
327
  * - Else → write the canonical template.
305
328
  *
306
329
  * @param projectRoot - Absolute path to the project root directory
330
+ * @param opts - Backup journal (upgrade)
307
331
  * @returns Scaffold result indicating whether `.worktreeinclude` was
308
332
  * created, repaired, or skipped.
309
333
  *
310
334
  * @task T9983
311
335
  */
312
- export async function ensureWorktreeInclude(projectRoot) {
336
+ export async function ensureWorktreeInclude(projectRoot, opts) {
313
337
  const canonicalPath = join(projectRoot, '.worktreeinclude');
314
338
  const legacyPath = join(resolveScaffoldCleoDir(projectRoot), 'worktree-include');
315
339
  const templateContent = getWorktreeIncludeContent();
316
340
  if (existsSync(canonicalPath)) {
317
- const existing = readFileSync(canonicalPath, 'utf-8');
318
- const normalize = (s) => s.trim().replace(/\r\n/g, '\n');
319
- if (normalize(existing) === normalize(templateContent)) {
320
- return { action: 'skipped', path: canonicalPath, details: 'Already matches template' };
321
- }
322
- await writeFile(canonicalPath, templateContent);
323
- return { action: 'repaired', path: canonicalPath, details: 'Updated to match template' };
341
+ return repairRuleFile(canonicalPath, templateContent, opts);
324
342
  }
325
343
  // T9983: when only the legacy file exists, leave it in place. The reader
326
344
  // honours it under a one-cycle deprecation warning. Users opt-in to the
@@ -536,10 +554,25 @@ export async function ensureProjectInfo(projectRoot, opts) {
536
554
  projectContext: projectContextSchemaVersion,
537
555
  },
538
556
  };
557
+ // T13409: a regenerate that changes nothing but the timestamp writes nothing,
558
+ // so a second `cleo upgrade` reports no applied action.
559
+ if (existing) {
560
+ const { lastUpdated: _next, ...nextFields } = projectInfo;
561
+ const { lastUpdated: _prev, ...prevFields } = existing;
562
+ if (stableStringify(nextFields) === stableStringify(prevFields)) {
563
+ return { action: 'skipped', path: projectInfoPath, details: 'project-info.json current' };
564
+ }
565
+ }
539
566
  await writeFile(projectInfoPath, JSON.stringify(projectInfo, null, 2));
540
567
  const action = opts?.force && existsSync(projectInfoPath) ? 'regenerated' : 'created';
541
568
  return { action, path: projectInfoPath, details: await describeIdentity() };
542
569
  }
570
+ /** JSON with object keys sorted at every level, so key order never counts as a change. */
571
+ function stableStringify(value) {
572
+ return JSON.stringify(value, (_key, v) => v !== null && typeof v === 'object' && !Array.isArray(v)
573
+ ? Object.fromEntries(Object.entries(v).sort(([a], [b]) => a.localeCompare(b)))
574
+ : v);
575
+ }
543
576
  /**
544
577
  * No-op. Kept for API compatibility.
545
578
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ensure-config.js","sourceRoot":"","sources":["../../src/scaffold/ensure-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ensure-config.js","sourceRoot":"","sources":["../../src/scaffold/ensure-config.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@
3
3
  * project-context.json.
4
4
  */
5
5
  import type { ScaffoldResult } from '@cleocode/contracts/scaffold-diagnostics';
6
+ import type { UpgradeFileJournal } from './upgrade-file-journal.js';
6
7
  /**
7
8
  * Detect and write project-context.json.
8
9
  * Idempotent: skips if file exists and is less than staleDays old (default: 30).
@@ -11,10 +12,19 @@ import type { ScaffoldResult } from '@cleocode/contracts/scaffold-diagnostics';
11
12
  * @param opts - Optional configuration
12
13
  * @param opts.force - When true, regenerate even if the file is fresh
13
14
  * @param opts.staleDays - Age threshold in days before regeneration (default: 30)
15
+ * @param opts.journal - Backs the file up before it changes and lists it (upgrade, T13409)
14
16
  * @returns Scaffold result indicating the action taken
17
+ *
18
+ * @remarks
19
+ * Regenerating an existing file keeps every key it has, in its order: detected
20
+ * values are updated in place, keys detection does not produce are kept, and
21
+ * new keys are appended (T13409: a refresh once dropped `build.outputDir` and
22
+ * reordered the tracked file). When nothing but `detectedAt` would change, the
23
+ * file is left byte-identical.
15
24
  */
16
25
  export declare function ensureProjectContext(projectRoot: string, opts?: {
17
26
  force?: boolean;
18
27
  staleDays?: number;
28
+ journal?: UpgradeFileJournal;
19
29
  }): Promise<ScaffoldResult>;
20
30
  //# sourceMappingURL=ensure-skills.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ensure-skills.d.ts","sourceRoot":"","sources":["../../src/scaffold/ensure-skills.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAI/E;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAAC,cAAc,CAAC,CAqGzB"}
1
+ {"version":3,"file":"ensure-skills.d.ts","sourceRoot":"","sources":["../../src/scaffold/ensure-skills.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAG/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,kBAAkB,CAAA;CAAE,GAC3E,OAAO,CAAC,cAAc,CAAC,CAiHzB"}
@@ -3,7 +3,6 @@
3
3
  * project-context.json.
4
4
  */
5
5
  import { existsSync, readFileSync } from 'node:fs';
6
- import { writeFile } from 'node:fs/promises';
7
6
  import { dirname, join } from 'node:path';
8
7
  import { fileURLToPath } from 'node:url';
9
8
  import { pushWarning } from '../output.js';
@@ -16,7 +15,15 @@ import { resolveScaffoldCleoDir } from './ensure-config.js';
16
15
  * @param opts - Optional configuration
17
16
  * @param opts.force - When true, regenerate even if the file is fresh
18
17
  * @param opts.staleDays - Age threshold in days before regeneration (default: 30)
18
+ * @param opts.journal - Backs the file up before it changes and lists it (upgrade, T13409)
19
19
  * @returns Scaffold result indicating the action taken
20
+ *
21
+ * @remarks
22
+ * Regenerating an existing file keeps every key it has, in its order: detected
23
+ * values are updated in place, keys detection does not produce are kept, and
24
+ * new keys are appended (T13409: a refresh once dropped `build.outputDir` and
25
+ * reordered the tracked file). When nothing but `detectedAt` would change, the
26
+ * file is left byte-identical.
20
27
  */
21
28
  export async function ensureProjectContext(projectRoot, opts) {
22
29
  const cleoDir = resolveScaffoldCleoDir(projectRoot);
@@ -46,6 +53,7 @@ export async function ensureProjectContext(projectRoot, opts) {
46
53
  const context = detectProjectType(projectRoot);
47
54
  // Blocks only the user writes (`release`, `evidence`), carried over verbatim.
48
55
  let declared = {};
56
+ let previous = null;
49
57
  // Preserve user-supplied command overrides from existing file so
50
58
  // regeneration does not silently clobber them (T12027 / #1122 / #1129).
51
59
  if (existsSync(contextPath)) {
@@ -53,12 +61,23 @@ export async function ensureProjectContext(projectRoot, opts) {
53
61
  const existing = JSON.parse(readFileSync(contextPath, 'utf-8'));
54
62
  preserveUserOverrides(existing, context);
55
63
  declared = declaredBlocks(existing);
64
+ previous = asRecord(existing);
56
65
  }
57
66
  catch {
58
67
  // If we can't parse existing, proceed with freshly-detected context
59
68
  }
60
69
  }
61
- const output = { ...context, ...declared };
70
+ const detected = { ...context, ...declared };
71
+ const output = previous ? mergeKeepingExisting(previous, detected) : detected;
72
+ if (previous && sameIgnoringDetectedAt(previous, output)) {
73
+ return {
74
+ action: 'skipped',
75
+ path: contextPath,
76
+ details: 'Re-detection found nothing new; project-context.json left unchanged',
77
+ };
78
+ }
79
+ if (previous && 'detectedAt' in previous)
80
+ output.detectedAt = detected.detectedAt;
62
81
  try {
63
82
  const schemaPath = join(dirname(fileURLToPath(import.meta.url)), '../../schemas/project-context.schema.json');
64
83
  if (existsSync(schemaPath)) {
@@ -83,7 +102,8 @@ export async function ensureProjectContext(projectRoot, opts) {
83
102
  catch {
84
103
  // Schema validation is best-effort — never block the write
85
104
  }
86
- await writeFile(contextPath, JSON.stringify(output, null, 2));
105
+ const { writeIfChanged } = await import('./upgrade-file-journal.js');
106
+ await writeIfChanged(contextPath, JSON.stringify(output, null, 2), opts?.journal);
87
107
  // T13125: propose, never persist, the affected-scope command. A written
88
108
  // template would read as declared, outlive an edit to testing.command and
89
109
  // run a different script than the user's (review of #1818); tool:test
@@ -156,6 +176,30 @@ function preserveUserOverrides(existing, context) {
156
176
  context['security-scan'] = { command: secscanCmd };
157
177
  }
158
178
  }
179
+ /**
180
+ * Merge freshly detected context into an existing file's object (T13409):
181
+ * every existing key keeps its position, a detected value replaces the old one,
182
+ * a key detection does not produce (such as `build.outputDir`) is kept as is,
183
+ * and keys new to the file are appended.
184
+ */
185
+ function mergeKeepingExisting(existing, detected) {
186
+ const merged = {};
187
+ for (const [key, value] of Object.entries(existing)) {
188
+ const ours = asRecord(value);
189
+ const theirs = asRecord(detected[key]);
190
+ merged[key] = ours && theirs ? mergeKeepingExisting(ours, theirs) : (detected[key] ?? value);
191
+ }
192
+ for (const [key, value] of Object.entries(detected)) {
193
+ if (!(key in merged) && value !== undefined)
194
+ merged[key] = value;
195
+ }
196
+ return merged;
197
+ }
198
+ /** Whether two context objects serialize identically once `detectedAt` is ignored. */
199
+ function sameIgnoringDetectedAt(a, b) {
200
+ const strip = ({ detectedAt: _ignored, ...rest }) => rest;
201
+ return JSON.stringify(strip(a)) === JSON.stringify(strip(b));
202
+ }
159
203
  /** A parsed JSON value as an object, or `null` when it is not a plain object. */
160
204
  function asRecord(value) {
161
205
  return value !== null && typeof value === 'object' && !Array.isArray(value)
@@ -1 +1 @@
1
- {"version":3,"file":"ensure-skills.js","sourceRoot":"","sources":["../../src/scaffold/ensure-skills.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ensure-skills.js","sourceRoot":"","sources":["../../src/scaffold/ensure-skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Backed-up, change-only file writes for `cleo upgrade` (T13409).
3
+ *
4
+ * Upgrade edits files the project owns (AGENTS.md, CLAUDE.md, `.cleo/.gitignore`,
5
+ * `.worktreeinclude`, `project-context.json`). Every edit goes through a journal:
6
+ * an unchanged file is never rewritten, and a changed file's previous bytes are
7
+ * copied under `.cleo/backups/upgrade/<stamp>/` before the new bytes land. The
8
+ * journal's entries are listed in the upgrade result so the owner sees every
9
+ * path that changed and where its backup is.
10
+ *
11
+ * Also holds the line-merge used for `.gitignore`-style files: upgrade only ever
12
+ * appends the template lines a file is missing, never drops or reorders the
13
+ * user's lines.
14
+ *
15
+ * @task T13409
16
+ */
17
+ /** One file an upgrade changed. */
18
+ export interface UpgradeFileChange {
19
+ /** Absolute path of the changed file. */
20
+ path: string;
21
+ /** Absolute path of the copy holding its previous bytes; `null` when the file was created. */
22
+ backupPath: string | null;
23
+ }
24
+ /** Records the files one upgrade run changed and where their backups are. */
25
+ export interface UpgradeFileJournal {
26
+ /** Project root; backups keep each file's path relative to it. */
27
+ readonly projectRoot: string;
28
+ /** Directory receiving this run's backups. */
29
+ readonly backupDir: string;
30
+ /** Files changed so far, in write order. */
31
+ readonly changes: UpgradeFileChange[];
32
+ }
33
+ /**
34
+ * Create the journal for one upgrade run.
35
+ *
36
+ * @param projectRoot - Absolute project root.
37
+ * @param cleoDir - The project's `.cleo` directory.
38
+ * @returns An empty journal whose backups land in `<cleoDir>/backups/upgrade/<stamp>/`.
39
+ */
40
+ export declare function createUpgradeFileJournal(projectRoot: string, cleoDir: string): UpgradeFileJournal;
41
+ /**
42
+ * Copy `path`'s current bytes into the journal's backup directory and record the change.
43
+ *
44
+ * Call before replacing a file whose new content differs. A missing file is
45
+ * recorded as created, with no backup.
46
+ *
47
+ * @param journal - The run's journal.
48
+ * @param path - Absolute path about to change.
49
+ * @returns The recorded change.
50
+ */
51
+ export declare function backupBeforeChange(journal: UpgradeFileJournal, path: string): Promise<UpgradeFileChange>;
52
+ /**
53
+ * Write `content` to `path` only when it differs from what is there, backing
54
+ * the old bytes up first when a journal is given.
55
+ *
56
+ * @param path - Absolute file path.
57
+ * @param content - New file content.
58
+ * @param journal - The run's journal; omitted outside upgrade (init writes fresh files).
59
+ * @returns `true` when the file was written, `false` when it already held `content`.
60
+ */
61
+ export declare function writeIfChanged(path: string, content: string, journal?: UpgradeFileJournal): Promise<boolean>;
62
+ /**
63
+ * Append the template's rule lines that `existing` lacks, keeping every user
64
+ * line, comment and their order byte-for-byte.
65
+ *
66
+ * Only non-blank, non-comment lines count; comparison trims whitespace. The
67
+ * appended lines keep the template's relative order, so an allow rule still
68
+ * follows the deny rule it depends on.
69
+ *
70
+ * @param existing - Current file content.
71
+ * @param template - Shipped template content.
72
+ * @param header - Comment line written above the appended lines.
73
+ * @returns The merged content, and the lines that were appended.
74
+ */
75
+ export declare function appendMissingLines(existing: string, template: string, header: string): {
76
+ content: string;
77
+ added: string[];
78
+ };
79
+ //# sourceMappingURL=upgrade-file-journal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-file-journal.d.ts","sourceRoot":"","sources":["../../src/scaffold/upgrade-file-journal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,mCAAmC;AACnC,MAAM,WAAW,iBAAiB;IAChC,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,8FAA8F;IAC9F,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,6EAA6E;AAC7E,MAAM,WAAW,kBAAkB;IACjC,kEAAkE;IAClE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,iBAAiB,EAAE,CAAC;CACvC;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAOjG;AASD;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,kBAAkB,EAC3B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,iBAAiB,CAAC,CAU5B;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,OAAO,CAAC,CAKlB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAoBtC"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Backed-up, change-only file writes for `cleo upgrade` (T13409).
3
+ *
4
+ * Upgrade edits files the project owns (AGENTS.md, CLAUDE.md, `.cleo/.gitignore`,
5
+ * `.worktreeinclude`, `project-context.json`). Every edit goes through a journal:
6
+ * an unchanged file is never rewritten, and a changed file's previous bytes are
7
+ * copied under `.cleo/backups/upgrade/<stamp>/` before the new bytes land. The
8
+ * journal's entries are listed in the upgrade result so the owner sees every
9
+ * path that changed and where its backup is.
10
+ *
11
+ * Also holds the line-merge used for `.gitignore`-style files: upgrade only ever
12
+ * appends the template lines a file is missing, never drops or reorders the
13
+ * user's lines.
14
+ *
15
+ * @task T13409
16
+ */
17
+ import { existsSync, readFileSync } from 'node:fs';
18
+ import { copyFile, mkdir } from 'node:fs/promises';
19
+ import { dirname, isAbsolute, join, relative } from 'node:path';
20
+ import { writeFileAtomic } from '../tools/fs.js';
21
+ /**
22
+ * Create the journal for one upgrade run.
23
+ *
24
+ * @param projectRoot - Absolute project root.
25
+ * @param cleoDir - The project's `.cleo` directory.
26
+ * @returns An empty journal whose backups land in `<cleoDir>/backups/upgrade/<stamp>/`.
27
+ */
28
+ export function createUpgradeFileJournal(projectRoot, cleoDir) {
29
+ const stamp = new Date().toISOString().replace(/[:.]/g, '-');
30
+ return {
31
+ projectRoot,
32
+ backupDir: join(cleoDir, 'backups', 'upgrade', stamp),
33
+ changes: [],
34
+ };
35
+ }
36
+ /** Backup location for `path`: its project-relative path, or its absolute path re-rooted. */
37
+ function backupPathFor(journal, path) {
38
+ const rel = relative(journal.projectRoot, path);
39
+ const inside = rel !== '' && !rel.startsWith('..') && !isAbsolute(rel);
40
+ return join(journal.backupDir, inside ? rel : join('_external', path.replace(/^[/\\]+/, '')));
41
+ }
42
+ /**
43
+ * Copy `path`'s current bytes into the journal's backup directory and record the change.
44
+ *
45
+ * Call before replacing a file whose new content differs. A missing file is
46
+ * recorded as created, with no backup.
47
+ *
48
+ * @param journal - The run's journal.
49
+ * @param path - Absolute path about to change.
50
+ * @returns The recorded change.
51
+ */
52
+ export async function backupBeforeChange(journal, path) {
53
+ let backupPath = null;
54
+ if (existsSync(path)) {
55
+ backupPath = backupPathFor(journal, path);
56
+ await mkdir(dirname(backupPath), { recursive: true });
57
+ await copyFile(path, backupPath);
58
+ }
59
+ const change = { path, backupPath };
60
+ journal.changes.push(change);
61
+ return change;
62
+ }
63
+ /**
64
+ * Write `content` to `path` only when it differs from what is there, backing
65
+ * the old bytes up first when a journal is given.
66
+ *
67
+ * @param path - Absolute file path.
68
+ * @param content - New file content.
69
+ * @param journal - The run's journal; omitted outside upgrade (init writes fresh files).
70
+ * @returns `true` when the file was written, `false` when it already held `content`.
71
+ */
72
+ export async function writeIfChanged(path, content, journal) {
73
+ if (existsSync(path) && readFileSync(path, 'utf-8') === content)
74
+ return false;
75
+ if (journal)
76
+ await backupBeforeChange(journal, path);
77
+ await writeFileAtomic({ path, content });
78
+ return true;
79
+ }
80
+ /**
81
+ * Append the template's rule lines that `existing` lacks, keeping every user
82
+ * line, comment and their order byte-for-byte.
83
+ *
84
+ * Only non-blank, non-comment lines count; comparison trims whitespace. The
85
+ * appended lines keep the template's relative order, so an allow rule still
86
+ * follows the deny rule it depends on.
87
+ *
88
+ * @param existing - Current file content.
89
+ * @param template - Shipped template content.
90
+ * @param header - Comment line written above the appended lines.
91
+ * @returns The merged content, and the lines that were appended.
92
+ */
93
+ export function appendMissingLines(existing, template, header) {
94
+ const isRule = (line) => line.trim() !== '' && !line.trim().startsWith('#');
95
+ const present = new Set(existing
96
+ .split(/\r?\n/)
97
+ .filter(isRule)
98
+ .map((line) => line.trim()));
99
+ const added = [
100
+ ...new Set(template
101
+ .split(/\r?\n/)
102
+ .filter(isRule)
103
+ .map((line) => line.trim())
104
+ .filter((line) => !present.has(line))),
105
+ ];
106
+ if (added.length === 0)
107
+ return { content: existing, added };
108
+ const base = existing === '' || existing.endsWith('\n') ? existing : `${existing}\n`;
109
+ return { content: `${base}\n${header}\n${added.join('\n')}\n`, added };
110
+ }
111
+ //# sourceMappingURL=upgrade-file-journal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-file-journal.js","sourceRoot":"","sources":["../../src/scaffold/upgrade-file-journal.ts"],"names":[],"mappings":"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"}