@cleocode/core 2026.10.6 → 2026.10.7

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 (242) hide show
  1. package/dist/build-provenance.json +2 -2
  2. package/dist/cloud/http.d.ts +8 -0
  3. package/dist/cloud/http.d.ts.map +1 -1
  4. package/dist/cloud/http.js +11 -0
  5. package/dist/cloud/http.js.map +1 -1
  6. package/dist/cloud/journal.d.ts +6 -0
  7. package/dist/cloud/journal.d.ts.map +1 -1
  8. package/dist/cloud/journal.js +1 -1
  9. package/dist/cloud/journal.js.map +1 -1
  10. package/dist/cloud/nexus-cloud-status.d.ts.map +1 -1
  11. package/dist/cloud/nexus-cloud-status.js +3 -1
  12. package/dist/cloud/nexus-cloud-status.js.map +1 -1
  13. package/dist/cloud/nexus-vault.d.ts +86 -1
  14. package/dist/cloud/nexus-vault.d.ts.map +1 -1
  15. package/dist/cloud/nexus-vault.js +875 -98
  16. package/dist/cloud/nexus-vault.js.map +1 -1
  17. package/dist/docs/doctor.d.ts +183 -0
  18. package/dist/docs/doctor.d.ts.map +1 -0
  19. package/dist/docs/doctor.js +537 -0
  20. package/dist/docs/doctor.js.map +1 -0
  21. package/dist/doctor/system-health.d.ts +189 -0
  22. package/dist/doctor/system-health.d.ts.map +1 -0
  23. package/dist/doctor/system-health.js +783 -0
  24. package/dist/doctor/system-health.js.map +1 -0
  25. package/dist/git/hooks-install.d.ts +17 -34
  26. package/dist/git/hooks-install.d.ts.map +1 -1
  27. package/dist/git/hooks-install.js +173 -70
  28. package/dist/git/hooks-install.js.map +1 -1
  29. package/dist/harness/ask-enforce.d.ts +43 -0
  30. package/dist/harness/ask-enforce.d.ts.map +1 -0
  31. package/dist/harness/ask-enforce.js +165 -0
  32. package/dist/harness/ask-enforce.js.map +1 -0
  33. package/dist/hooks.d.ts +8 -30
  34. package/dist/hooks.d.ts.map +1 -1
  35. package/dist/hooks.js +36 -116
  36. package/dist/hooks.js.map +1 -1
  37. package/dist/init.d.ts +2 -1
  38. package/dist/init.d.ts.map +1 -1
  39. package/dist/init.js +5 -14
  40. package/dist/init.js.map +1 -1
  41. package/dist/injection.d.ts +2 -2
  42. package/dist/injection.d.ts.map +1 -1
  43. package/dist/injection.js +108 -10
  44. package/dist/injection.js.map +1 -1
  45. package/dist/internal.d.ts +1 -1
  46. package/dist/internal.d.ts.map +1 -1
  47. package/dist/internal.js +1 -1
  48. package/dist/internal.js.map +1 -1
  49. package/dist/issue/create.d.ts +4 -0
  50. package/dist/issue/create.d.ts.map +1 -1
  51. package/dist/issue/create.js +12 -0
  52. package/dist/issue/create.js.map +1 -1
  53. package/dist/issue/index.d.ts +1 -1
  54. package/dist/issue/index.d.ts.map +1 -1
  55. package/dist/issue/index.js +1 -1
  56. package/dist/issue/index.js.map +1 -1
  57. package/dist/orchestrate/spawn-ops.d.ts.map +1 -1
  58. package/dist/orchestrate/spawn-ops.js +8 -2
  59. package/dist/orchestrate/spawn-ops.js.map +1 -1
  60. package/dist/orchestration/lean-change.d.ts +15 -0
  61. package/dist/orchestration/lean-change.d.ts.map +1 -0
  62. package/dist/orchestration/lean-change.js +17 -0
  63. package/dist/orchestration/lean-change.js.map +1 -0
  64. package/dist/orchestration/spawn-prompt.d.ts.map +1 -1
  65. package/dist/orchestration/spawn-prompt.js +6 -4
  66. package/dist/orchestration/spawn-prompt.js.map +1 -1
  67. package/dist/release/ci-evidence.d.ts +59 -0
  68. package/dist/release/ci-evidence.d.ts.map +1 -1
  69. package/dist/release/ci-evidence.js +150 -5
  70. package/dist/release/ci-evidence.js.map +1 -1
  71. package/dist/release/plan.d.ts.map +1 -1
  72. package/dist/release/plan.js +11 -2
  73. package/dist/release/plan.js.map +1 -1
  74. package/dist/release/pr-evidence.d.ts +15 -0
  75. package/dist/release/pr-evidence.d.ts.map +1 -1
  76. package/dist/release/pr-evidence.js +42 -1
  77. package/dist/release/pr-evidence.js.map +1 -1
  78. package/dist/release/reconcile.js +2 -2
  79. package/dist/release/reconcile.js.map +1 -1
  80. package/dist/release/verify-provenance.js +2 -2
  81. package/dist/release/verify-provenance.js.map +1 -1
  82. package/dist/resources/admission-ledger.d.ts +8 -0
  83. package/dist/resources/admission-ledger.d.ts.map +1 -1
  84. package/dist/resources/admission-ledger.js +5 -0
  85. package/dist/resources/admission-ledger.js.map +1 -1
  86. package/dist/resources/claim-keepalive.d.ts +34 -0
  87. package/dist/resources/claim-keepalive.d.ts.map +1 -0
  88. package/dist/resources/claim-keepalive.js +49 -0
  89. package/dist/resources/claim-keepalive.js.map +1 -0
  90. package/dist/resources/governor.d.ts.map +1 -1
  91. package/dist/resources/governor.js +3 -0
  92. package/dist/resources/governor.js.map +1 -1
  93. package/dist/scaffold/ensure-config.js +1 -1
  94. package/dist/scaffold/ensure-config.js.map +1 -1
  95. package/dist/store/attachment-store.d.ts.map +1 -1
  96. package/dist/store/attachment-store.js +2 -1
  97. package/dist/store/attachment-store.js.map +1 -1
  98. package/dist/store/restore-marker.d.ts +50 -7
  99. package/dist/store/restore-marker.d.ts.map +1 -1
  100. package/dist/store/restore-marker.js +77 -25
  101. package/dist/store/restore-marker.js.map +1 -1
  102. package/dist/store/row-identity-registry.d.ts +6 -4
  103. package/dist/store/row-identity-registry.d.ts.map +1 -1
  104. package/dist/store/row-identity-registry.js +156 -33
  105. package/dist/store/row-identity-registry.js.map +1 -1
  106. package/dist/store/schema/cleo-project/provenance-orphans.d.ts +16 -0
  107. package/dist/store/schema/cleo-project/provenance-orphans.d.ts.map +1 -1
  108. package/dist/store/schema/cleo-project/provenance-orphans.js +4 -1
  109. package/dist/store/schema/cleo-project/provenance-orphans.js.map +1 -1
  110. package/dist/store/schema/cleo-shared/brain.d.ts +240 -0
  111. package/dist/store/schema/cleo-shared/brain.d.ts.map +1 -1
  112. package/dist/store/schema/cleo-shared/brain.js +69 -0
  113. package/dist/store/schema/cleo-shared/brain.js.map +1 -1
  114. package/dist/store/schema/tasks.d.ts +1 -1
  115. package/dist/store/schema/tasks.d.ts.map +1 -1
  116. package/dist/store/schema/tasks.js +9 -1
  117. package/dist/store/schema/tasks.js.map +1 -1
  118. package/dist/store/sync/apply/applier.d.ts.map +1 -1
  119. package/dist/store/sync/apply/applier.js +85 -3
  120. package/dist/store/sync/apply/applier.js.map +1 -1
  121. package/dist/store/sync/apply/parent-delete.d.ts.map +1 -1
  122. package/dist/store/sync/apply/parent-delete.js +4 -0
  123. package/dist/store/sync/apply/parent-delete.js.map +1 -1
  124. package/dist/store/sync/capture.d.ts +8 -0
  125. package/dist/store/sync/capture.d.ts.map +1 -1
  126. package/dist/store/sync/capture.js +20 -0
  127. package/dist/store/sync/capture.js.map +1 -1
  128. package/dist/store/sync/clock-store.d.ts +21 -0
  129. package/dist/store/sync/clock-store.d.ts.map +1 -1
  130. package/dist/store/sync/clock-store.js +47 -0
  131. package/dist/store/sync/clock-store.js.map +1 -1
  132. package/dist/store/sync/conflicts.d.ts +13 -0
  133. package/dist/store/sync/conflicts.d.ts.map +1 -1
  134. package/dist/store/sync/conflicts.js +22 -0
  135. package/dist/store/sync/conflicts.js.map +1 -1
  136. package/dist/store/sync/genesis.d.ts +113 -12
  137. package/dist/store/sync/genesis.d.ts.map +1 -1
  138. package/dist/store/sync/genesis.js +325 -27
  139. package/dist/store/sync/genesis.js.map +1 -1
  140. package/dist/store/sync/merge/types.d.ts +8 -2
  141. package/dist/store/sync/merge/types.d.ts.map +1 -1
  142. package/dist/store/sync/pull.d.ts +192 -0
  143. package/dist/store/sync/pull.d.ts.map +1 -0
  144. package/dist/store/sync/pull.js +429 -0
  145. package/dist/store/sync/pull.js.map +1 -0
  146. package/dist/store/sync/push.d.ts +110 -0
  147. package/dist/store/sync/push.d.ts.map +1 -0
  148. package/dist/store/sync/push.js +172 -0
  149. package/dist/store/sync/push.js.map +1 -0
  150. package/dist/store/sync/replay-pin.d.ts +70 -0
  151. package/dist/store/sync/replay-pin.d.ts.map +1 -0
  152. package/dist/store/sync/replay-pin.js +172 -0
  153. package/dist/store/sync/replay-pin.js.map +1 -0
  154. package/dist/store/sync/sealer.d.ts.map +1 -1
  155. package/dist/store/sync/sealer.js +6 -2
  156. package/dist/store/sync/sealer.js.map +1 -1
  157. package/dist/store/sync/timestamp-canon.d.ts.map +1 -1
  158. package/dist/store/sync/timestamp-canon.js +15 -0
  159. package/dist/store/sync/timestamp-canon.js.map +1 -1
  160. package/dist/store/table-classification.d.ts.map +1 -1
  161. package/dist/store/table-classification.js +51 -15
  162. package/dist/store/table-classification.js.map +1 -1
  163. package/dist/store/tasks-schema.d.ts +1 -1
  164. package/dist/store/tasks-schema.d.ts.map +1 -1
  165. package/dist/store/tasks-schema.js +1 -1
  166. package/dist/store/tasks-schema.js.map +1 -1
  167. package/dist/store/twin-collapse.d.ts.map +1 -1
  168. package/dist/store/twin-collapse.js +5 -0
  169. package/dist/store/twin-collapse.js.map +1 -1
  170. package/dist/store/vault-manifest.d.ts +7 -0
  171. package/dist/store/vault-manifest.d.ts.map +1 -1
  172. package/dist/store/vault-manifest.js +4 -0
  173. package/dist/store/vault-manifest.js.map +1 -1
  174. package/dist/tasks/ac-table.d.ts +17 -0
  175. package/dist/tasks/ac-table.d.ts.map +1 -1
  176. package/dist/tasks/ac-table.js +49 -0
  177. package/dist/tasks/ac-table.js.map +1 -1
  178. package/dist/tasks/affected-scope.d.ts +52 -3
  179. package/dist/tasks/affected-scope.d.ts.map +1 -1
  180. package/dist/tasks/affected-scope.js +94 -3
  181. package/dist/tasks/affected-scope.js.map +1 -1
  182. package/dist/tasks/change-set.d.ts.map +1 -1
  183. package/dist/tasks/change-set.js +9 -5
  184. package/dist/tasks/change-set.js.map +1 -1
  185. package/dist/tasks/complete-ci.d.ts +2 -0
  186. package/dist/tasks/complete-ci.d.ts.map +1 -1
  187. package/dist/tasks/complete-ci.js +26 -7
  188. package/dist/tasks/complete-ci.js.map +1 -1
  189. package/dist/tasks/complete.d.ts.map +1 -1
  190. package/dist/tasks/complete.js +10 -0
  191. package/dist/tasks/complete.js.map +1 -1
  192. package/dist/tasks/done-plan.d.ts.map +1 -1
  193. package/dist/tasks/done-plan.js +63 -6
  194. package/dist/tasks/done-plan.js.map +1 -1
  195. package/dist/tasks/evidence.d.ts +3 -0
  196. package/dist/tasks/evidence.d.ts.map +1 -1
  197. package/dist/tasks/evidence.js +106 -2
  198. package/dist/tasks/evidence.js.map +1 -1
  199. package/dist/tasks/gate-preview.d.ts +19 -1
  200. package/dist/tasks/gate-preview.d.ts.map +1 -1
  201. package/dist/tasks/gate-preview.js +44 -2
  202. package/dist/tasks/gate-preview.js.map +1 -1
  203. package/dist/tasks/gate-runner.d.ts +16 -0
  204. package/dist/tasks/gate-runner.d.ts.map +1 -1
  205. package/dist/tasks/gate-runner.js +25 -2
  206. package/dist/tasks/gate-runner.js.map +1 -1
  207. package/dist/tasks/qa-run-binding.d.ts +88 -0
  208. package/dist/tasks/qa-run-binding.d.ts.map +1 -0
  209. package/dist/tasks/qa-run-binding.js +188 -0
  210. package/dist/tasks/qa-run-binding.js.map +1 -0
  211. package/dist/tasks/req.d.ts +50 -0
  212. package/dist/tasks/req.d.ts.map +1 -1
  213. package/dist/tasks/req.js +99 -1
  214. package/dist/tasks/req.js.map +1 -1
  215. package/dist/tasks/test-run-binding.d.ts +29 -0
  216. package/dist/tasks/test-run-binding.d.ts.map +1 -1
  217. package/dist/tasks/test-run-binding.js +47 -23
  218. package/dist/tasks/test-run-binding.js.map +1 -1
  219. package/dist/tasks/tool-resolver.d.ts +9 -0
  220. package/dist/tasks/tool-resolver.d.ts.map +1 -1
  221. package/dist/tasks/tool-resolver.js +14 -3
  222. package/dist/tasks/tool-resolver.js.map +1 -1
  223. package/dist/tasks/tool-semaphore.d.ts.map +1 -1
  224. package/dist/tasks/tool-semaphore.js +3 -0
  225. package/dist/tasks/tool-semaphore.js.map +1 -1
  226. package/dist/upgrade.d.ts.map +1 -1
  227. package/dist/upgrade.js +10 -1
  228. package/dist/upgrade.js.map +1 -1
  229. package/dist/validation/engine-ops.d.ts.map +1 -1
  230. package/dist/validation/engine-ops.js +14 -3
  231. package/dist/validation/engine-ops.js.map +1 -1
  232. package/migrations/drizzle-cleo-global/20261010130000_t12895-brain-natural-uids/migration.sql +28 -0
  233. package/migrations/drizzle-cleo-global/20261010140000_t12896-brain-autoinc-uids/migration.sql +54 -0
  234. package/migrations/drizzle-cleo-project/20261010130000_t12895-brain-natural-uids/migration.sql +36 -0
  235. package/migrations/drizzle-cleo-project/20261010140000_t12896-brain-autoinc-uids/migration.sql +58 -0
  236. package/migrations/sync-journal/20261008120000_t12343-pull-cursor/migration.sql +28 -0
  237. package/migrations/sync-journal/20261009120000_t13318-seen-floor/migration.sql +41 -0
  238. package/package.json +18 -18
  239. package/templates/CLEO-INJECTION.md +5 -3
  240. package/templates/CLEO-REFERENCE.md +1 -1
  241. package/templates/git-hooks/legacy-hashes.json +20 -0
  242. package/templates/git-hooks/pre-commit +1 -0
@@ -0,0 +1,537 @@
1
+ /**
2
+ * `cleo docs doctor` — store health diagnostics + safe repairs — T13447.
3
+ *
4
+ * Audits the CleoDocs store (`cleo.db` `attachments`/`docs_wikilinks` tables
5
+ * plus the on-disk legacy surfaces) for six known drift classes and, when
6
+ * invoked with `apply: true`, performs the repairs that are safe to run
7
+ * in-place:
8
+ *
9
+ * - `dangling-pointers` — `local-file` rows whose path is gone from disk
10
+ * or lives inside a worktree/tmp directory. Repair
11
+ * archives the row (`lifecycle_status = 'archived'`)
12
+ * when the file is gone; existing files are left
13
+ * alone (content capture is T13360's scope).
14
+ * - `doc-version-skew` — slugged rows whose `docVersion` trails the
15
+ * revision count in `.cleo/audit/docs-versioning.jsonl`
16
+ * (the T13351 bug left historical rows at 1). Repair
17
+ * sets `docVersion = revisions + 1`.
18
+ * - `empty-provenance` — slugged text docs with NULL/empty `topics` AND
19
+ * `related_tasks` whose content is retrievable.
20
+ * Repair re-derives both columns via
21
+ * {@link deriveDocLinks} (T13357 semantics).
22
+ * - `wikilinks-drift` — expected edges (derived from the current
23
+ * provenance columns) missing from `docs_wikilinks`.
24
+ * Repair is a full {@link rebuildDocsWikilinks}.
25
+ * - `legacy-store-present`— `.cleo/attachments/index.db`,
26
+ * `.cleo/docs-publications.json` and/or
27
+ * `.cleo/attachments/sha256/` still on disk.
28
+ * - `stale-drafts` — slugged docs still `draft` after
29
+ * `--older-than-days` (default 30).
30
+ *
31
+ * SAFETY: `apply: true` REFUSES to run without a backup receipt
32
+ * ({@link DocsDoctorOptions.backupReceiptPath}) whose mtime is at most
33
+ * {@link DOCS_DOCTOR_BACKUP_MAX_AGE_MS} old. The dispatch layer creates the
34
+ * backup itself (same `createBackup` as `cleo backup add`) and passes the
35
+ * receipt path automatically; a dry run needs no receipt.
36
+ *
37
+ * The module never logs to console — every outcome flows through the
38
+ * returned report.
39
+ *
40
+ * @task T13447 (Epic T13340 / Saga T13339)
41
+ * @see docs-update.ts — audit-log version semantics (version = revisions + 1)
42
+ * @see derive-links.ts — topics/related_tasks derivation (T13357)
43
+ * @see wikilinks.ts — derived edge table + rebuild (T11826)
44
+ */
45
+ import { existsSync, readFileSync, statSync } from 'node:fs';
46
+ import { tmpdir } from 'node:os';
47
+ import { isAbsolute, join, resolve, sep } from 'node:path';
48
+ import { getCleoWorktreesRoot } from '@cleocode/paths';
49
+ import { eq } from 'drizzle-orm';
50
+ import { createAttachmentStore } from '../store/attachment-store.js';
51
+ import { docsWikilinks } from '../store/schema/attachments.js';
52
+ import { getDb } from '../store/sqlite.js';
53
+ import { docsAttachments } from '../store/tasks-schema.js';
54
+ import { deriveDocLinks, isScannableTextMime, linksJsonOrNull } from './derive-links.js';
55
+ import { DOCS_VERSIONING_AUDIT_FILE } from './docs-update.js';
56
+ import { deriveWikilinkEdges, rebuildDocsWikilinks } from './wikilinks.js';
57
+ /**
58
+ * Maximum age of the backup receipt accepted before an `apply` run.
59
+ *
60
+ * A receipt older than this is treated as stale: the operator (or the
61
+ * dispatch layer) must create a fresh backup before repairs proceed.
62
+ *
63
+ * @task T13447
64
+ */
65
+ export const DOCS_DOCTOR_BACKUP_MAX_AGE_MS = 10 * 60 * 1000;
66
+ /**
67
+ * Default age threshold for the `stale-drafts` diagnostic (days).
68
+ *
69
+ * @task T13447
70
+ */
71
+ export const DOCS_DOCTOR_DEFAULT_OLDER_THAN_DAYS = 30;
72
+ /**
73
+ * Per-diagnostic detail cap — the report stays readable on stores with
74
+ * hundreds of offenders; the full count is always reported.
75
+ *
76
+ * @task T13447
77
+ */
78
+ export const DOCS_DOCTOR_MAX_DETAIL_ITEMS = 50;
79
+ /**
80
+ * Parse a row's `attachment_json` defensively. Malformed JSON yields null —
81
+ * such rows are skipped by kind-scoped checks rather than failing the run.
82
+ *
83
+ * @internal
84
+ */
85
+ function parseAttachmentJson(raw) {
86
+ try {
87
+ const parsed = JSON.parse(raw);
88
+ if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {
89
+ return parsed;
90
+ }
91
+ return null;
92
+ }
93
+ catch {
94
+ return null;
95
+ }
96
+ }
97
+ /** Narrow a parsed payload to the `local-file` shape. @internal */
98
+ function asLocalFile(payload) {
99
+ if (payload['kind'] !== 'local-file')
100
+ return null;
101
+ const path = payload['path'];
102
+ if (typeof path !== 'string' || path.length === 0)
103
+ return null;
104
+ const mime = payload['mime'];
105
+ const labels = payload['labels'];
106
+ return {
107
+ kind: 'local-file',
108
+ path,
109
+ ...(typeof mime === 'string' ? { mime } : {}),
110
+ ...(Array.isArray(labels)
111
+ ? { labels: labels.filter((l) => typeof l === 'string') }
112
+ : {}),
113
+ };
114
+ }
115
+ /**
116
+ * True when `absPath` points inside a worktree or temp directory:
117
+ * the canonical CLEO worktrees root, a `.claude/worktrees/` agent spawn, or
118
+ * the OS temp dir. Such paths are ephemeral — a `local-file` pointer into
119
+ * them dangles as soon as the worktree is cleaned up.
120
+ *
121
+ * @internal
122
+ */
123
+ function isWorktreeOrTmpPath(absPath) {
124
+ const worktreesRoot = getCleoWorktreesRoot();
125
+ if (absPath === worktreesRoot || absPath.startsWith(`${worktreesRoot}${sep}`)) {
126
+ return 'worktree';
127
+ }
128
+ if (absPath.includes(`${sep}.claude${sep}worktrees${sep}`))
129
+ return 'worktree';
130
+ const tmp = tmpdir();
131
+ if (absPath.startsWith(`${tmp}${sep}`) || absPath.startsWith(`${sep}tmp${sep}`))
132
+ return 'tmp';
133
+ return null;
134
+ }
135
+ /**
136
+ * Sum the audit-log revisions per slug. Mirrors the
137
+ * `countVersionsForSlug` semantics in `docs-update.ts`: the expected
138
+ * `docVersion` for a slug is `1 + total revisions`.
139
+ *
140
+ * @internal
141
+ */
142
+ function readAuditRevisionCounts(projectRoot) {
143
+ const counts = new Map();
144
+ let raw;
145
+ try {
146
+ raw = readFileSync(join(projectRoot, DOCS_VERSIONING_AUDIT_FILE), 'utf-8');
147
+ }
148
+ catch {
149
+ return counts;
150
+ }
151
+ for (const line of raw.split('\n')) {
152
+ if (!line)
153
+ continue;
154
+ let entry;
155
+ try {
156
+ entry = JSON.parse(line);
157
+ }
158
+ catch {
159
+ continue;
160
+ }
161
+ if (entry.op !== 'docs.update' || typeof entry.slug !== 'string')
162
+ continue;
163
+ const revisions = Array.isArray(entry.revisions) ? entry.revisions.length : 0;
164
+ counts.set(entry.slug, (counts.get(entry.slug) ?? 0) + revisions);
165
+ }
166
+ return counts;
167
+ }
168
+ /** True when a JSON-array TEXT column is NULL, empty, or `'[]'`. @internal */
169
+ function isEmptyJsonArray(raw) {
170
+ if (raw === null || raw.trim().length === 0)
171
+ return true;
172
+ try {
173
+ const parsed = JSON.parse(raw);
174
+ return Array.isArray(parsed) && parsed.length === 0;
175
+ }
176
+ catch {
177
+ return false;
178
+ }
179
+ }
180
+ /**
181
+ * Refuse an apply run without a fresh backup receipt.
182
+ *
183
+ * @internal
184
+ */
185
+ function checkBackupReceipt(receiptPath) {
186
+ if (receiptPath === undefined || receiptPath.length === 0) {
187
+ return {
188
+ // @sync-invariant none:input-shape a precondition refusal before any repair write; nothing was written
189
+ code: 'E_DOCS_DOCTOR_BACKUP_REQUIRED',
190
+ message: 'docs doctor --apply requires a backup receipt created within the last ' +
191
+ `${DOCS_DOCTOR_BACKUP_MAX_AGE_MS / 60000} minutes — run \`cleo backup add\` first ` +
192
+ '(the CLI does this automatically)',
193
+ };
194
+ }
195
+ let mtimeMs;
196
+ try {
197
+ mtimeMs = statSync(receiptPath).mtimeMs;
198
+ }
199
+ catch {
200
+ return {
201
+ // @sync-invariant none:input-shape a precondition refusal before any repair write; nothing was written
202
+ code: 'E_DOCS_DOCTOR_BACKUP_REQUIRED',
203
+ message: `backup receipt not found: ${receiptPath}`,
204
+ };
205
+ }
206
+ if (Date.now() - mtimeMs > DOCS_DOCTOR_BACKUP_MAX_AGE_MS) {
207
+ return {
208
+ // @sync-invariant none:input-shape a precondition refusal before any repair write; nothing was written
209
+ code: 'E_DOCS_DOCTOR_BACKUP_STALE',
210
+ message: `backup receipt is older than ${DOCS_DOCTOR_BACKUP_MAX_AGE_MS / 60000} minutes: ` +
211
+ `${receiptPath} — create a fresh backup (\`cleo backup add\`) before applying repairs`,
212
+ };
213
+ }
214
+ return null;
215
+ }
216
+ /**
217
+ * Fetch a row's decoded UTF-8 content when it is a scannable text doc.
218
+ *
219
+ * Blob rows read through the AttachmentStore; `llms-txt` rows carry inline
220
+ * content. Returns null for binary kinds or unreadable blobs.
221
+ *
222
+ * @internal
223
+ */
224
+ async function fetchRowContent(row, payload, projectRoot) {
225
+ if (!payload)
226
+ return null;
227
+ const kind = payload['kind'];
228
+ if (kind === 'llms-txt') {
229
+ const content = payload['content'];
230
+ return typeof content === 'string' ? content : null;
231
+ }
232
+ if (kind !== 'blob')
233
+ return null;
234
+ const mime = payload['mime'];
235
+ if (!isScannableTextMime(typeof mime === 'string' ? mime : undefined))
236
+ return null;
237
+ const store = createAttachmentStore();
238
+ try {
239
+ const result = await store.get(row.sha256, projectRoot);
240
+ return result ? result.bytes.toString('utf-8') : null;
241
+ }
242
+ catch {
243
+ return null;
244
+ }
245
+ }
246
+ /**
247
+ * Run the docs store health check.
248
+ *
249
+ * Dry run (default): every diagnostic is reported and every repair is
250
+ * listed as a plan item with `applied: false` — nothing is written.
251
+ * Apply: the backup gate runs first, then repairs execute in dependency
252
+ * order (doc-version-skew, empty-provenance, dangling-pointers, and finally
253
+ * the wikilinks rebuild, which re-derives from the freshly repaired columns).
254
+ *
255
+ * @param projectRoot - Absolute path to the CLEO project root.
256
+ * @param opts - Apply flag, stale-draft threshold, backup receipt.
257
+ * @returns The structured report, or a backup-gate refusal.
258
+ * @task T13447
259
+ */
260
+ // @sync-invariant docs.lifecycle.transitions the only lifecycle write is draft→archived for dangling rows, a legal matrix transition
261
+ export async function runDocsDoctor(projectRoot, opts = {}) {
262
+ const apply = opts.apply === true;
263
+ const olderThanDays = opts.olderThanDays ?? DOCS_DOCTOR_DEFAULT_OLDER_THAN_DAYS;
264
+ if (apply) {
265
+ const refusal = checkBackupReceipt(opts.backupReceiptPath);
266
+ if (refusal)
267
+ return { ok: false, error: refusal };
268
+ }
269
+ const db = await getDb(projectRoot);
270
+ const rows = await db.select().from(docsAttachments).all();
271
+ const payloadById = new Map();
272
+ for (const row of rows)
273
+ payloadById.set(row.id, parseAttachmentJson(row.attachmentJson));
274
+ const repairs = [];
275
+ // ── dangling-pointers ──────────────────────────────────────────────────────
276
+ const danglingItems = [];
277
+ let danglingCount = 0;
278
+ const archivable = [];
279
+ for (const row of rows) {
280
+ const payload = payloadById.get(row.id) ?? null;
281
+ const localFile = payload === null ? null : asLocalFile(payload);
282
+ if (!localFile)
283
+ continue;
284
+ const absPath = isAbsolute(localFile.path)
285
+ ? localFile.path
286
+ : resolve(projectRoot, localFile.path);
287
+ const exists = existsSync(absPath);
288
+ const ephemeral = isWorktreeOrTmpPath(absPath);
289
+ if (exists && ephemeral === null)
290
+ continue;
291
+ danglingCount += 1;
292
+ const reason = !exists ? 'missing' : (ephemeral ?? 'missing');
293
+ if (!exists)
294
+ archivable.push({ row, path: absPath });
295
+ if (danglingItems.length < DOCS_DOCTOR_MAX_DETAIL_ITEMS) {
296
+ danglingItems.push({
297
+ attachmentId: row.id,
298
+ slug: row.slug,
299
+ path: absPath,
300
+ exists,
301
+ reason,
302
+ });
303
+ }
304
+ }
305
+ for (const { row, path } of archivable) {
306
+ repairs.push({
307
+ kind: 'dangling-pointers',
308
+ action: 'archive-dangling',
309
+ applied: apply,
310
+ attachmentId: row.id,
311
+ ...(row.slug !== null ? { slug: row.slug } : {}),
312
+ detail: `marked-dangling: local-file target missing (${path}) → lifecycle_status = 'archived'`,
313
+ });
314
+ }
315
+ // ── doc-version-skew ───────────────────────────────────────────────────────
316
+ const revisionCounts = readAuditRevisionCounts(projectRoot);
317
+ const skewItems = [];
318
+ let skewCount = 0;
319
+ const skewed = [];
320
+ for (const row of rows) {
321
+ if (row.slug === null)
322
+ continue;
323
+ const expected = (revisionCounts.get(row.slug) ?? 0) + 1;
324
+ if (row.docVersion >= expected)
325
+ continue;
326
+ skewCount += 1;
327
+ skewed.push({ row, expected });
328
+ if (skewItems.length < DOCS_DOCTOR_MAX_DETAIL_ITEMS) {
329
+ skewItems.push({
330
+ attachmentId: row.id,
331
+ slug: row.slug,
332
+ docVersion: row.docVersion,
333
+ expected,
334
+ });
335
+ }
336
+ }
337
+ for (const { row, expected } of skewed) {
338
+ repairs.push({
339
+ kind: 'doc-version-skew',
340
+ action: 'set-doc-version',
341
+ applied: apply,
342
+ attachmentId: row.id,
343
+ ...(row.slug !== null ? { slug: row.slug } : {}),
344
+ detail: `audit-note: docVersion ${row.docVersion} → ${expected} (audit log revisions + 1)`,
345
+ });
346
+ }
347
+ // ── empty-provenance ───────────────────────────────────────────────────────
348
+ const provItems = [];
349
+ let provCount = 0;
350
+ const backfillable = [];
351
+ for (const row of rows) {
352
+ if (row.slug === null)
353
+ continue;
354
+ if (!isEmptyJsonArray(row.topics) || !isEmptyJsonArray(row.relatedTasks))
355
+ continue;
356
+ const payload = payloadById.get(row.id) ?? null;
357
+ const content = await fetchRowContent(row, payload, projectRoot);
358
+ if (content === null)
359
+ continue;
360
+ const labelsRaw = payload?.['labels'];
361
+ const labels = Array.isArray(labelsRaw)
362
+ ? labelsRaw.filter((l) => typeof l === 'string')
363
+ : undefined;
364
+ provCount += 1;
365
+ backfillable.push({ row, content, labels });
366
+ if (provItems.length < DOCS_DOCTOR_MAX_DETAIL_ITEMS) {
367
+ provItems.push({ attachmentId: row.id, slug: row.slug });
368
+ }
369
+ }
370
+ for (const { row, content, labels } of backfillable) {
371
+ const derived = deriveDocLinks(content, labels);
372
+ const derivedCount = derived.topics.length + derived.relatedTasks.length;
373
+ repairs.push({
374
+ kind: 'empty-provenance',
375
+ action: 'backfill-provenance',
376
+ applied: apply && derivedCount > 0,
377
+ attachmentId: row.id,
378
+ ...(row.slug !== null ? { slug: row.slug } : {}),
379
+ detail: derivedCount > 0
380
+ ? `derived topics=[${derived.topics.join(',')}] related_tasks=[${derived.relatedTasks.join(',')}]`
381
+ : 'no derivable topics or task mentions — columns stay NULL',
382
+ });
383
+ }
384
+ // ── wikilinks-drift ────────────────────────────────────────────────────────
385
+ const slugById = new Map();
386
+ for (const row of rows) {
387
+ if (row.slug !== null)
388
+ slugById.set(row.id, row.slug);
389
+ }
390
+ const expectedEdges = deriveWikilinkEdges(rows
391
+ .filter((r) => r.slug !== null)
392
+ .map((r) => ({
393
+ slug: r.slug,
394
+ supersedesSlug: r.supersedes ? (slugById.get(r.supersedes) ?? null) : null,
395
+ supersededBySlug: r.supersededBy ? (slugById.get(r.supersededBy) ?? null) : null,
396
+ relatedTasks: r.relatedTasks,
397
+ topics: r.topics,
398
+ })));
399
+ const existingEdges = await db
400
+ .select({
401
+ fromSlug: docsWikilinks.fromSlug,
402
+ toSlug: docsWikilinks.toSlug,
403
+ relation: docsWikilinks.relation,
404
+ })
405
+ .from(docsWikilinks)
406
+ .all();
407
+ const existingKeys = new Set(existingEdges.map((e) => `${e.fromSlug}|${e.toSlug}|${e.relation}`));
408
+ const missingEdges = expectedEdges.filter((e) => !existingKeys.has(`${e.fromSlug}|${e.toSlug}|${e.relation}`));
409
+ const driftItems = missingEdges
410
+ .slice(0, DOCS_DOCTOR_MAX_DETAIL_ITEMS)
411
+ .map((e) => ({ fromSlug: e.fromSlug, toSlug: e.toSlug, relation: e.relation }));
412
+ if (missingEdges.length > 0) {
413
+ repairs.push({
414
+ kind: 'wikilinks-drift',
415
+ action: 'rebuild-wikilinks',
416
+ applied: apply,
417
+ detail: `${missingEdges.length} expected edge(s) absent from docs_wikilinks → full re-derivation`,
418
+ });
419
+ }
420
+ // ── legacy-store-present ───────────────────────────────────────────────────
421
+ const legacyCandidates = [
422
+ {
423
+ path: join(projectRoot, '.cleo', 'attachments', 'index.db'),
424
+ what: 'legacy attachment index',
425
+ },
426
+ {
427
+ path: join(projectRoot, '.cleo', 'docs-publications.json'),
428
+ what: 'publication ledger',
429
+ },
430
+ {
431
+ path: join(projectRoot, '.cleo', 'attachments', 'sha256'),
432
+ what: 'legacy fs blob store',
433
+ },
434
+ ];
435
+ const legacyItems = legacyCandidates
436
+ .filter((c) => existsSync(c.path))
437
+ .map((c) => ({ path: c.path, what: c.what }));
438
+ // ── stale-drafts ───────────────────────────────────────────────────────────
439
+ const cutoffIso = new Date(Date.now() - olderThanDays * 24 * 60 * 60 * 1000).toISOString();
440
+ const staleRows = rows.filter((r) => r.slug !== null && r.lifecycleStatus === 'draft' && r.createdAt < cutoffIso);
441
+ const staleItems = staleRows
442
+ .slice(0, DOCS_DOCTOR_MAX_DETAIL_ITEMS)
443
+ .map((r) => ({ attachmentId: r.id, slug: r.slug, createdAt: r.createdAt }));
444
+ const diagnostics = [
445
+ {
446
+ kind: 'dangling-pointers',
447
+ severity: 'warn',
448
+ count: danglingCount,
449
+ items: danglingItems,
450
+ truncated: danglingCount > danglingItems.length,
451
+ },
452
+ {
453
+ kind: 'doc-version-skew',
454
+ severity: 'warn',
455
+ count: skewCount,
456
+ items: skewItems,
457
+ truncated: skewCount > skewItems.length,
458
+ },
459
+ {
460
+ kind: 'empty-provenance',
461
+ severity: 'info',
462
+ count: provCount,
463
+ items: provItems,
464
+ truncated: provCount > provItems.length,
465
+ },
466
+ {
467
+ kind: 'wikilinks-drift',
468
+ severity: 'warn',
469
+ count: missingEdges.length,
470
+ items: driftItems,
471
+ truncated: missingEdges.length > driftItems.length,
472
+ },
473
+ {
474
+ kind: 'legacy-store-present',
475
+ severity: 'info',
476
+ count: legacyItems.length,
477
+ items: legacyItems,
478
+ truncated: false,
479
+ },
480
+ {
481
+ kind: 'stale-drafts',
482
+ severity: 'info',
483
+ count: staleRows.length,
484
+ items: staleItems,
485
+ truncated: staleRows.length > staleItems.length,
486
+ },
487
+ ];
488
+ // ── Apply repairs (backup gate already passed) ─────────────────────────────
489
+ if (apply) {
490
+ for (const { row, expected } of skewed) {
491
+ await db
492
+ .update(docsAttachments)
493
+ .set({ docVersion: expected })
494
+ .where(eq(docsAttachments.id, row.id))
495
+ .run();
496
+ }
497
+ for (const { row, content, labels } of backfillable) {
498
+ const derived = deriveDocLinks(content, labels);
499
+ if (derived.topics.length + derived.relatedTasks.length === 0)
500
+ continue;
501
+ await db
502
+ .update(docsAttachments)
503
+ .set({
504
+ topics: linksJsonOrNull(derived.topics),
505
+ relatedTasks: linksJsonOrNull(derived.relatedTasks),
506
+ })
507
+ .where(eq(docsAttachments.id, row.id))
508
+ .run();
509
+ }
510
+ for (const { row } of archivable) {
511
+ await db
512
+ .update(docsAttachments)
513
+ .set({ lifecycleStatus: 'archived' })
514
+ .where(eq(docsAttachments.id, row.id))
515
+ .run();
516
+ }
517
+ if (missingEdges.length > 0) {
518
+ await rebuildDocsWikilinks({ projectRoot });
519
+ }
520
+ }
521
+ const findings = diagnostics.reduce((sum, d) => sum + d.count, 0);
522
+ const summary = apply
523
+ ? `docs doctor applied ${repairs.filter((r) => r.applied).length} repair(s) across ${findings} finding(s)`
524
+ : `docs doctor found ${findings} finding(s); ${repairs.length} repair(s) planned (dry-run — pass --apply to execute)`;
525
+ return {
526
+ ok: true,
527
+ report: {
528
+ applied: apply,
529
+ olderThanDays,
530
+ backupReceiptPath: apply ? (opts.backupReceiptPath ?? null) : null,
531
+ diagnostics,
532
+ repairs,
533
+ summary,
534
+ },
535
+ };
536
+ }
537
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/docs/doctor.ts"],"names":[],"mappings":"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"}