@cluesmith/codev 3.2.3 → 3.2.4

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 (157) hide show
  1. package/dashboard-dist/assets/index-BZ1x7x1X.js.map +1 -1
  2. package/dist/agent-farm/cli.d.ts.map +1 -1
  3. package/dist/agent-farm/cli.js +31 -0
  4. package/dist/agent-farm/cli.js.map +1 -1
  5. package/dist/agent-farm/commands/attach.js +2 -2
  6. package/dist/agent-farm/commands/attach.js.map +1 -1
  7. package/dist/agent-farm/commands/send.d.ts +2 -2
  8. package/dist/agent-farm/commands/send.js +3 -3
  9. package/dist/agent-farm/commands/send.js.map +1 -1
  10. package/dist/agent-farm/commands/setup.d.ts +4 -1
  11. package/dist/agent-farm/commands/setup.d.ts.map +1 -1
  12. package/dist/agent-farm/commands/setup.js +8 -4
  13. package/dist/agent-farm/commands/setup.js.map +1 -1
  14. package/dist/agent-farm/commands/spawn-worktree.d.ts +11 -0
  15. package/dist/agent-farm/commands/spawn-worktree.d.ts.map +1 -1
  16. package/dist/agent-farm/commands/spawn-worktree.js +64 -16
  17. package/dist/agent-farm/commands/spawn-worktree.js.map +1 -1
  18. package/dist/agent-farm/commands/status.d.ts.map +1 -1
  19. package/dist/agent-farm/commands/status.js +26 -2
  20. package/dist/agent-farm/commands/status.js.map +1 -1
  21. package/dist/agent-farm/commands/tower-sweep-husks.d.ts +6 -0
  22. package/dist/agent-farm/commands/tower-sweep-husks.d.ts.map +1 -0
  23. package/dist/agent-farm/commands/tower-sweep-husks.js +77 -0
  24. package/dist/agent-farm/commands/tower-sweep-husks.js.map +1 -0
  25. package/dist/agent-farm/commands/tower.d.ts.map +1 -1
  26. package/dist/agent-farm/commands/tower.js +34 -0
  27. package/dist/agent-farm/commands/tower.js.map +1 -1
  28. package/dist/agent-farm/commands/whoami.d.ts +65 -0
  29. package/dist/agent-farm/commands/whoami.d.ts.map +1 -0
  30. package/dist/agent-farm/commands/whoami.js +196 -0
  31. package/dist/agent-farm/commands/whoami.js.map +1 -0
  32. package/dist/agent-farm/lib/tower-client.d.ts +1 -1
  33. package/dist/agent-farm/lib/tower-client.d.ts.map +1 -1
  34. package/dist/agent-farm/lib/tower-client.js.map +1 -1
  35. package/dist/agent-farm/servers/architect-session-holder.d.ts +133 -0
  36. package/dist/agent-farm/servers/architect-session-holder.d.ts.map +1 -0
  37. package/dist/agent-farm/servers/architect-session-holder.js +268 -0
  38. package/dist/agent-farm/servers/architect-session-holder.js.map +1 -0
  39. package/dist/agent-farm/servers/process-census.d.ts +41 -0
  40. package/dist/agent-farm/servers/process-census.d.ts.map +1 -0
  41. package/dist/agent-farm/servers/process-census.js +62 -0
  42. package/dist/agent-farm/servers/process-census.js.map +1 -0
  43. package/dist/agent-farm/servers/send-buffer.d.ts.map +1 -1
  44. package/dist/agent-farm/servers/send-buffer.js +13 -0
  45. package/dist/agent-farm/servers/send-buffer.js.map +1 -1
  46. package/dist/agent-farm/servers/session-log-sweep.d.ts +93 -0
  47. package/dist/agent-farm/servers/session-log-sweep.d.ts.map +1 -0
  48. package/dist/agent-farm/servers/session-log-sweep.js +165 -0
  49. package/dist/agent-farm/servers/session-log-sweep.js.map +1 -0
  50. package/dist/agent-farm/servers/shellper-husk-sweep.d.ts +87 -0
  51. package/dist/agent-farm/servers/shellper-husk-sweep.d.ts.map +1 -0
  52. package/dist/agent-farm/servers/shellper-husk-sweep.js +129 -0
  53. package/dist/agent-farm/servers/shellper-husk-sweep.js.map +1 -0
  54. package/dist/agent-farm/servers/tower-instances.d.ts.map +1 -1
  55. package/dist/agent-farm/servers/tower-instances.js +52 -5
  56. package/dist/agent-farm/servers/tower-instances.js.map +1 -1
  57. package/dist/agent-farm/servers/tower-routes.d.ts.map +1 -1
  58. package/dist/agent-farm/servers/tower-routes.js +147 -4
  59. package/dist/agent-farm/servers/tower-routes.js.map +1 -1
  60. package/dist/agent-farm/servers/tower-server.js +95 -1
  61. package/dist/agent-farm/servers/tower-server.js.map +1 -1
  62. package/dist/agent-farm/servers/tower-terminals.d.ts.map +1 -1
  63. package/dist/agent-farm/servers/tower-terminals.js +38 -5
  64. package/dist/agent-farm/servers/tower-terminals.js.map +1 -1
  65. package/dist/agent-farm/servers/tower-utils.d.ts +35 -0
  66. package/dist/agent-farm/servers/tower-utils.d.ts.map +1 -1
  67. package/dist/agent-farm/servers/tower-utils.js +74 -5
  68. package/dist/agent-farm/servers/tower-utils.js.map +1 -1
  69. package/dist/agent-farm/state.d.ts +6 -1
  70. package/dist/agent-farm/state.d.ts.map +1 -1
  71. package/dist/agent-farm/state.js +5 -2
  72. package/dist/agent-farm/state.js.map +1 -1
  73. package/dist/commands/adopt.d.ts +3 -2
  74. package/dist/commands/adopt.d.ts.map +1 -1
  75. package/dist/commands/adopt.js +7 -6
  76. package/dist/commands/adopt.js.map +1 -1
  77. package/dist/commands/consult/agy-auth-cache.d.ts +97 -0
  78. package/dist/commands/consult/agy-auth-cache.d.ts.map +1 -0
  79. package/dist/commands/consult/agy-auth-cache.js +320 -0
  80. package/dist/commands/consult/agy-auth-cache.js.map +1 -0
  81. package/dist/commands/consult/index.d.ts.map +1 -1
  82. package/dist/commands/consult/index.js +59 -0
  83. package/dist/commands/consult/index.js.map +1 -1
  84. package/dist/commands/doctor.d.ts +28 -0
  85. package/dist/commands/doctor.d.ts.map +1 -1
  86. package/dist/commands/doctor.js +187 -3
  87. package/dist/commands/doctor.js.map +1 -1
  88. package/dist/commands/init.d.ts +3 -2
  89. package/dist/commands/init.d.ts.map +1 -1
  90. package/dist/commands/init.js +7 -6
  91. package/dist/commands/init.js.map +1 -1
  92. package/dist/commands/porch/index.d.ts.map +1 -1
  93. package/dist/commands/porch/index.js +11 -8
  94. package/dist/commands/porch/index.js.map +1 -1
  95. package/dist/commands/update.d.ts +4 -4
  96. package/dist/commands/update.d.ts.map +1 -1
  97. package/dist/commands/update.js +9 -11
  98. package/dist/commands/update.js.map +1 -1
  99. package/dist/lib/config.d.ts +1 -0
  100. package/dist/lib/config.d.ts.map +1 -1
  101. package/dist/lib/config.js.map +1 -1
  102. package/dist/lib/default-branch.d.ts +1 -1
  103. package/dist/lib/default-branch.js +1 -1
  104. package/dist/lib/gitignore.d.ts +25 -2
  105. package/dist/lib/gitignore.d.ts.map +1 -1
  106. package/dist/lib/gitignore.js +70 -0
  107. package/dist/lib/gitignore.js.map +1 -1
  108. package/dist/lib/migration-backup-audit.d.ts +64 -0
  109. package/dist/lib/migration-backup-audit.d.ts.map +1 -0
  110. package/dist/lib/migration-backup-audit.js +145 -0
  111. package/dist/lib/migration-backup-audit.js.map +1 -0
  112. package/dist/lib/protocol-drift-audit.d.ts +118 -0
  113. package/dist/lib/protocol-drift-audit.d.ts.map +1 -0
  114. package/dist/lib/protocol-drift-audit.js +217 -0
  115. package/dist/lib/protocol-drift-audit.js.map +1 -0
  116. package/dist/lib/scaffold.d.ts +10 -3
  117. package/dist/lib/scaffold.d.ts.map +1 -1
  118. package/dist/lib/scaffold.js +29 -26
  119. package/dist/lib/scaffold.js.map +1 -1
  120. package/dist/terminal/pty-manager.d.ts +7 -0
  121. package/dist/terminal/pty-manager.d.ts.map +1 -1
  122. package/dist/terminal/pty-manager.js +16 -0
  123. package/dist/terminal/pty-manager.js.map +1 -1
  124. package/dist/terminal/pty-session.d.ts +25 -4
  125. package/dist/terminal/pty-session.d.ts.map +1 -1
  126. package/dist/terminal/pty-session.js +83 -11
  127. package/dist/terminal/pty-session.js.map +1 -1
  128. package/dist/terminal/session-manager.d.ts +76 -0
  129. package/dist/terminal/session-manager.d.ts.map +1 -1
  130. package/dist/terminal/session-manager.js +252 -44
  131. package/dist/terminal/session-manager.js.map +1 -1
  132. package/dist/terminal/shellper-client.d.ts +19 -4
  133. package/dist/terminal/shellper-client.d.ts.map +1 -1
  134. package/dist/terminal/shellper-client.js +70 -8
  135. package/dist/terminal/shellper-client.js.map +1 -1
  136. package/dist/terminal/shellper-process.d.ts.map +1 -1
  137. package/dist/terminal/shellper-process.js +20 -5
  138. package/dist/terminal/shellper-process.js.map +1 -1
  139. package/dist/terminal/shellper-protocol.d.ts +40 -2
  140. package/dist/terminal/shellper-protocol.d.ts.map +1 -1
  141. package/dist/terminal/shellper-protocol.js +72 -5
  142. package/dist/terminal/shellper-protocol.js.map +1 -1
  143. package/package.json +7 -7
  144. package/skeleton/.claude/skills/afx/SKILL.md +13 -0
  145. package/skeleton/.claude/skills/arch-init/SKILL.md +122 -0
  146. package/skeleton/.claude/skills/codev/SKILL.md +2 -2
  147. package/skeleton/.codex/skills/afx/SKILL.md +157 -0
  148. package/skeleton/.codex/skills/arch-init/SKILL.md +122 -0
  149. package/skeleton/.codex/skills/codev/SKILL.md +59 -0
  150. package/skeleton/.codex/skills/consult/SKILL.md +96 -0
  151. package/skeleton/.codex/skills/generate-image/SKILL.md +45 -0
  152. package/skeleton/.codex/skills/porch/SKILL.md +60 -0
  153. package/skeleton/.codex/skills/update-arch-docs/SKILL.md +132 -0
  154. package/skeleton/resources/commands/agent-farm.md +89 -0
  155. package/skeleton/resources/commands/codev.md +5 -0
  156. package/skeleton/resources/commands/consult.md +26 -0
  157. package/skeleton/roles/architect.md +11 -0
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Migration-backup audit for `codev doctor` (issue #1239).
3
+ *
4
+ * State migrations leave copies of the pre-migration state behind and nothing
5
+ * ever removes them. A disk audit on 2026-07-25 found an 18 GB
6
+ * `~/.agent-farm.bak-*` directory still on disk three weeks after the migration
7
+ * that created it — a full copy of the agent-farm dir, dominated by the logs it
8
+ * duplicated.
9
+ *
10
+ * Two leftover families exist:
11
+ *
12
+ * 1. `~/{.,}agent-farm*bak*` — whole-directory copies of the agent-farm home,
13
+ * taken by hand during the #1118 state consolidation. These are the big
14
+ * ones (they include `logs/`).
15
+ * 2. `*.pre-merge-<timestamp>` — the source `state.db` (plus `-wal`/`-shm`
16
+ * sidecars) that `db/consolidate.ts` renames rather than deletes after
17
+ * merging it into `global.db`. Small, but equally unreaped.
18
+ *
19
+ * This module reports; it never deletes. These are multi-gigabyte copies of the
20
+ * user's own state, and the decision to remove them is the human's. Doctor
21
+ * prints age + size + the exact `rm -rf` command so that decision is one
22
+ * paste away.
23
+ */
24
+ /**
25
+ * A leftover is only worth nagging about once the migration that produced it
26
+ * has demonstrably held up. Below this age it is reported informationally;
27
+ * at or above it, doctor counts it as a warning.
28
+ */
29
+ export declare const STALE_BACKUP_AGE_DAYS = 7;
30
+ export type MigrationBackupKind = 'home-copy' | 'pre-merge';
31
+ export interface MigrationBackup {
32
+ /** Absolute path to the leftover file or directory. */
33
+ path: string;
34
+ kind: MigrationBackupKind;
35
+ /** Whole days since last modification. */
36
+ ageDays: number;
37
+ /** Size on disk in bytes, or null when it could not be measured. */
38
+ sizeBytes: number | null;
39
+ /** True once `ageDays >= STALE_BACKUP_AGE_DAYS`. */
40
+ stale: boolean;
41
+ }
42
+ /** Human-readable byte size, e.g. `18.0 GB`. */
43
+ export declare function formatBytes(bytes: number): string;
44
+ export interface FindMigrationBackupsOptions {
45
+ /** Home directory to scan. Defaults to the real home; overridable for tests. */
46
+ home?: string;
47
+ /** Workspace root whose `.agent-farm/` is scanned for `*.pre-merge-*`. */
48
+ workspaceRoot?: string | null;
49
+ /** Reference time for age computation. Defaults to now. */
50
+ now?: Date;
51
+ }
52
+ /**
53
+ * Find every migration leftover on disk, newest first.
54
+ *
55
+ * Scans the home directory for whole-directory copies, and both the agent-farm
56
+ * home (`~/.agent-farm/`) and the workspace's `.agent-farm/` for `*.pre-merge-*`
57
+ * renames. Read-only; safe to call unconditionally.
58
+ */
59
+ export declare function findMigrationBackups(options?: FindMigrationBackupsOptions): MigrationBackup[];
60
+ /** One-line doctor rendering: path, age, size. */
61
+ export declare function formatMigrationBackup(backup: MigrationBackup): string;
62
+ /** Total measured bytes across a set of leftovers (unmeasurable ones count 0). */
63
+ export declare function totalBytes(backups: MigrationBackup[]): number;
64
+ //# sourceMappingURL=migration-backup-audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-backup-audit.d.ts","sourceRoot":"","sources":["../../src/lib/migration-backup-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAOH;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAEvC,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,WAAW,CAAC;AAE5D,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,mBAAmB,CAAC;IAC1B,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,oDAAoD;IACpD,KAAK,EAAE,OAAO,CAAC;CAChB;AAoCD,gDAAgD;AAChD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASjD;AA+CD,MAAM,WAAW,2BAA2B;IAC1C,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,2DAA2D;IAC3D,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,2BAAgC,GACxC,eAAe,EAAE,CAgBnB;AAED,kDAAkD;AAClD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAIrE;AAED,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAE7D"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Migration-backup audit for `codev doctor` (issue #1239).
3
+ *
4
+ * State migrations leave copies of the pre-migration state behind and nothing
5
+ * ever removes them. A disk audit on 2026-07-25 found an 18 GB
6
+ * `~/.agent-farm.bak-*` directory still on disk three weeks after the migration
7
+ * that created it — a full copy of the agent-farm dir, dominated by the logs it
8
+ * duplicated.
9
+ *
10
+ * Two leftover families exist:
11
+ *
12
+ * 1. `~/{.,}agent-farm*bak*` — whole-directory copies of the agent-farm home,
13
+ * taken by hand during the #1118 state consolidation. These are the big
14
+ * ones (they include `logs/`).
15
+ * 2. `*.pre-merge-<timestamp>` — the source `state.db` (plus `-wal`/`-shm`
16
+ * sidecars) that `db/consolidate.ts` renames rather than deletes after
17
+ * merging it into `global.db`. Small, but equally unreaped.
18
+ *
19
+ * This module reports; it never deletes. These are multi-gigabyte copies of the
20
+ * user's own state, and the decision to remove them is the human's. Doctor
21
+ * prints age + size + the exact `rm -rf` command so that decision is one
22
+ * paste away.
23
+ */
24
+ import { readdirSync, lstatSync, existsSync } from 'node:fs';
25
+ import { homedir } from 'node:os';
26
+ import { join } from 'node:path';
27
+ import { spawnSync } from 'node:child_process';
28
+ /**
29
+ * A leftover is only worth nagging about once the migration that produced it
30
+ * has demonstrably held up. Below this age it is reported informationally;
31
+ * at or above it, doctor counts it as a warning.
32
+ */
33
+ export const STALE_BACKUP_AGE_DAYS = 7;
34
+ /**
35
+ * Matches a hand-taken whole-directory copy of the agent-farm home.
36
+ *
37
+ * Requires BOTH an `agent-farm` prefix (so an unrelated `my-backups/` is never
38
+ * touched) and a backup marker. The marker spelling has varied across the
39
+ * migrations that produced these — `.agent-farm.bak-<ts>` and
40
+ * `agent-farm-db-backup-<ts>` are both real — so match `bak` and `back` alike.
41
+ * The live `.agent-farm` itself has no separator after the prefix and is never
42
+ * matched.
43
+ */
44
+ function isHomeCopy(name) {
45
+ return /^\.?agent-farm[.-]/i.test(name) && /bac?k/i.test(name);
46
+ }
47
+ /** Matches the `*.pre-merge-<timestamp>` renames left by db/consolidate.ts. */
48
+ function isPreMerge(name) {
49
+ return name.includes('.pre-merge-');
50
+ }
51
+ /**
52
+ * Measure a path's size on disk with `du -sk`.
53
+ *
54
+ * A recursive Node walk would stat tens of thousands of log files on exactly
55
+ * the multi-GB directories this audit exists to find, so shell out instead.
56
+ * Returns null (reported as "size unknown") when `du` is unavailable or times
57
+ * out — never a guessed number.
58
+ */
59
+ function measureBytes(path) {
60
+ const result = spawnSync('du', ['-sk', path], { encoding: 'utf-8', timeout: 20000 });
61
+ if (result.status !== 0 || !result.stdout)
62
+ return null;
63
+ const kb = parseInt(result.stdout.trim().split(/\s+/)[0], 10);
64
+ return Number.isFinite(kb) ? kb * 1024 : null;
65
+ }
66
+ /** Human-readable byte size, e.g. `18.0 GB`. */
67
+ export function formatBytes(bytes) {
68
+ const units = ['B', 'KB', 'MB', 'GB', 'TB'];
69
+ let value = bytes;
70
+ let unit = 0;
71
+ while (value >= 1024 && unit < units.length - 1) {
72
+ value /= 1024;
73
+ unit++;
74
+ }
75
+ return unit === 0 ? `${value} B` : `${value.toFixed(1)} ${units[unit]}`;
76
+ }
77
+ function inspect(path, kind, now) {
78
+ let stat;
79
+ try {
80
+ stat = lstatSync(path);
81
+ }
82
+ catch {
83
+ // Vanished between readdir and lstat — nothing to report.
84
+ return null;
85
+ }
86
+ const ageDays = Math.floor((now - stat.mtimeMs) / 86_400_000);
87
+ return {
88
+ path,
89
+ kind,
90
+ ageDays,
91
+ sizeBytes: measureBytes(path),
92
+ stale: ageDays >= STALE_BACKUP_AGE_DAYS,
93
+ };
94
+ }
95
+ function scanDir(dir, match, kind, now) {
96
+ if (!existsSync(dir))
97
+ return [];
98
+ let names;
99
+ try {
100
+ names = readdirSync(dir);
101
+ }
102
+ catch {
103
+ // Unreadable directory (permissions) — not something doctor should fail on.
104
+ return [];
105
+ }
106
+ const found = [];
107
+ for (const name of names) {
108
+ if (!match(name))
109
+ continue;
110
+ const entry = inspect(join(dir, name), kind, now);
111
+ if (entry)
112
+ found.push(entry);
113
+ }
114
+ return found;
115
+ }
116
+ /**
117
+ * Find every migration leftover on disk, newest first.
118
+ *
119
+ * Scans the home directory for whole-directory copies, and both the agent-farm
120
+ * home (`~/.agent-farm/`) and the workspace's `.agent-farm/` for `*.pre-merge-*`
121
+ * renames. Read-only; safe to call unconditionally.
122
+ */
123
+ export function findMigrationBackups(options = {}) {
124
+ const home = options.home ?? homedir();
125
+ const now = (options.now ?? new Date()).getTime();
126
+ const backups = [
127
+ ...scanDir(home, isHomeCopy, 'home-copy', now),
128
+ ...scanDir(join(home, '.agent-farm'), isPreMerge, 'pre-merge', now),
129
+ ];
130
+ if (options.workspaceRoot) {
131
+ backups.push(...scanDir(join(options.workspaceRoot, '.agent-farm'), isPreMerge, 'pre-merge', now));
132
+ }
133
+ return backups.sort((a, b) => a.ageDays - b.ageDays);
134
+ }
135
+ /** One-line doctor rendering: path, age, size. */
136
+ export function formatMigrationBackup(backup) {
137
+ const age = backup.ageDays === 1 ? '1 day old' : `${backup.ageDays} days old`;
138
+ const size = backup.sizeBytes === null ? 'size unknown' : formatBytes(backup.sizeBytes);
139
+ return `${backup.path} — ${age}, ${size}`;
140
+ }
141
+ /** Total measured bytes across a set of leftovers (unmeasurable ones count 0). */
142
+ export function totalBytes(backups) {
143
+ return backups.reduce((sum, b) => sum + (b.sizeBytes ?? 0), 0);
144
+ }
145
+ //# sourceMappingURL=migration-backup-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-backup-audit.js","sourceRoot":"","sources":["../../src/lib/migration-backup-audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Protocol-file drift audit (#1210).
3
+ *
4
+ * Detects two silent failure modes of the four-tier resolver
5
+ * (`.codev/` → `codev/` → cache → installed skeleton):
6
+ *
7
+ * 1. **Shadow drift** — a project-local copy (tier-1 `.codev/` or tier-2 `codev/`)
8
+ * of a framework file that ALSO ships in the installed skeleton. The resolver
9
+ * serves the local copy, so a stale snapshot of an old upstream default keeps
10
+ * winning forever, silently, even after the package ships a fix. This audit
11
+ * diffs each local copy against its skeleton counterpart and classifies it:
12
+ * - `identical` → a redundant copy that adds nothing but risk (safe to remove;
13
+ * resolution then falls back to the package).
14
+ * - `differs` → "customized or stale? — adjudicate" (a human must decide;
15
+ * we NEVER auto-act).
16
+ *
17
+ * 2. **Skeleton staleness** — the installed `@cluesmith/codev` package is itself a
18
+ * version behind npm `latest`, so even NON-shadowed resolution serves pre-fix
19
+ * framework files. Reported as an explicit `installed X; latest Y` pair
20
+ * (a computed "N behind" distance is not crisply testable), best-effort and
21
+ * offline-tolerant.
22
+ *
23
+ * Report-only: this module performs NO writes to disk. Adjudication stays human —
24
+ * local copies may be deliberate customizations (that is the resolver's whole point).
25
+ *
26
+ * Mirrors the existing doctor audit precedents: `pr-gate-audit.ts` (#943) and
27
+ * `framework-ref-audit.ts` (#1011) — a pure lib returning findings + formatters,
28
+ * consumed by `commands/doctor.ts`.
29
+ */
30
+ /**
31
+ * The framework subtrees whose files ship in the skeleton and resolve via the
32
+ * four-tier resolver. Pinned scan set (per the spec) — prompts and per-protocol
33
+ * templates live WITHIN `protocols/`, so they are covered transitively.
34
+ *
35
+ * Maintenance point: a new top-level framework subtree must be added here (same
36
+ * shape as `PR_PRODUCING_PROTOCOLS` in pr-gate-audit). `codev/resources/` is
37
+ * deliberately EXCLUDED — those are user-evolved files (arch.md, lessons-learned.md,
38
+ * and their -critical companions), not framework files, and must never be flagged.
39
+ */
40
+ export declare const FRAMEWORK_DRIFT_DIRS: readonly ["protocols", "consult-types", "roles"];
41
+ /** The two project-local override roots, in resolver-precedence order (tier 1 first). */
42
+ declare const OVERRIDE_TIERS: readonly [".codev", "codev"];
43
+ export type OverrideTier = (typeof OVERRIDE_TIERS)[number];
44
+ export type DriftStatus = 'identical' | 'differs';
45
+ export interface DriftFinding {
46
+ /** Path relative to the skeleton/override root, e.g. `protocols/spir/protocol.md`. */
47
+ relativePath: string;
48
+ /** Which local override root holds this copy. */
49
+ tier: OverrideTier;
50
+ /** Byte-comparison result against the skeleton counterpart. */
51
+ status: DriftStatus;
52
+ /**
53
+ * Whether the four-tier resolver actually resolves THIS copy (i.e. it is the
54
+ * live one the runtime loads). A tier-2 `codev/` copy shadowed by a tier-1
55
+ * `.codev/` copy is still reported (it is still rot), but marked not-the-winner.
56
+ */
57
+ isResolvedWinner: boolean;
58
+ }
59
+ export interface StalenessResult {
60
+ /** Installed `@cluesmith/codev` version. */
61
+ installed: string;
62
+ /** npm `latest`, or null when the registry could not be reached. */
63
+ latest: string | null;
64
+ /** True only when a latest version was obtained AND installed < latest. */
65
+ behind: boolean;
66
+ /** Human note when latest could not be determined. */
67
+ note?: string;
68
+ }
69
+ /** Injectable seam for the npm-latest lookup so tests are deterministic (no network). */
70
+ export type FetchLatest = () => string | null;
71
+ /**
72
+ * Audit a project for shadow drift against the installed skeleton.
73
+ *
74
+ * For every framework file in the skeleton (under FRAMEWORK_DRIFT_DIRS), checks
75
+ * whether a local copy exists in `.codev/` and/or `codev/`; for each local copy
76
+ * found, byte-compares it against the skeleton file and records a finding. Returns
77
+ * one finding per local copy (so a file present in BOTH tiers yields two findings).
78
+ *
79
+ * @param workspaceRoot - project root (auto-detected via findWorkspaceRoot if omitted)
80
+ */
81
+ export declare function auditProtocolDrift(workspaceRoot?: string): DriftFinding[];
82
+ /**
83
+ * Whether the project has ANY local copy of a scanned skeleton file, in EITHER
84
+ * override root. Cheap existence-only scan (no hashing) used for the no-op gate:
85
+ * the existing `hasLocalOverride()` only checks tier-2 `codev/`, so drift detection
86
+ * must check both tiers itself.
87
+ */
88
+ export declare function hasFrameworkShadows(workspaceRoot?: string): boolean;
89
+ /** Bound on the npm-latest lookup (ms). The registry can't stall doctor beyond this. */
90
+ export declare const NPM_LATEST_TIMEOUT_MS = 2500;
91
+ /**
92
+ * Default npm-latest lookup: `npm view @cluesmith/codev version`. Bounded by
93
+ * `NPM_LATEST_TIMEOUT_MS` (spawnSync kills the child past it) and offline-tolerant —
94
+ * an unreachable registry, non-zero exit, missing `npm`, or unparsable output all
95
+ * yield `null` rather than throwing or hanging. Exported so tests can assert the
96
+ * real bounded/offline behavior (not just an injected stub).
97
+ */
98
+ export declare function fetchLatestVersion(): string | null;
99
+ /**
100
+ * Compare the installed package version against npm `latest`. Never throws and
101
+ * never hangs beyond the fetch timeout — an unreachable registry yields
102
+ * `{ latest: null, behind: false, note }` so doctor stays usable offline.
103
+ *
104
+ * @param fetchLatest - injectable latest-version source (defaults to `npm view`)
105
+ */
106
+ export declare function checkSkeletonStaleness(fetchLatest?: FetchLatest): StalenessResult;
107
+ /**
108
+ * Render a shadow-drift finding for doctor output.
109
+ *
110
+ * @param skeletonVersion - installed skeleton/package version; when provided it is
111
+ * named in the line so the human can tell WHICH skeleton the local copy diverged
112
+ * from (the spec requires the adjudication warning to name the package version).
113
+ */
114
+ export declare function formatDriftFinding(f: DriftFinding, skeletonVersion?: string): string;
115
+ /** Render the staleness result for doctor output. */
116
+ export declare function formatStaleness(s: StalenessResult): string;
117
+ export {};
118
+ //# sourceMappingURL=protocol-drift-audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol-drift-audit.d.ts","sourceRoot":"","sources":["../../src/lib/protocol-drift-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AASH;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,kDAAmD,CAAC;AAKrF,yFAAyF;AACzF,QAAA,MAAM,cAAc,8BAA+B,CAAC;AACpD,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,sFAAsF;IACtF,YAAY,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,IAAI,EAAE,YAAY,CAAC;IACnB,+DAA+D;IAC/D,MAAM,EAAE,WAAW,CAAC;IACpB;;;;OAIG;IACH,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,2EAA2E;IAC3E,MAAM,EAAE,OAAO,CAAC;IAChB,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,yFAAyF;AACzF,MAAM,MAAM,WAAW,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC;AAkB9C;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAoCzE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAUnE;AAoBD,wFAAwF;AACxF,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C;;;;;;GAMG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAelD;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,GAAE,WAAgC,GAC5C,eAAe,CAYjB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,YAAY,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAQpF;AAED,qDAAqD;AACrD,wBAAgB,eAAe,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAQ1D"}
@@ -0,0 +1,217 @@
1
+ /**
2
+ * Protocol-file drift audit (#1210).
3
+ *
4
+ * Detects two silent failure modes of the four-tier resolver
5
+ * (`.codev/` → `codev/` → cache → installed skeleton):
6
+ *
7
+ * 1. **Shadow drift** — a project-local copy (tier-1 `.codev/` or tier-2 `codev/`)
8
+ * of a framework file that ALSO ships in the installed skeleton. The resolver
9
+ * serves the local copy, so a stale snapshot of an old upstream default keeps
10
+ * winning forever, silently, even after the package ships a fix. This audit
11
+ * diffs each local copy against its skeleton counterpart and classifies it:
12
+ * - `identical` → a redundant copy that adds nothing but risk (safe to remove;
13
+ * resolution then falls back to the package).
14
+ * - `differs` → "customized or stale? — adjudicate" (a human must decide;
15
+ * we NEVER auto-act).
16
+ *
17
+ * 2. **Skeleton staleness** — the installed `@cluesmith/codev` package is itself a
18
+ * version behind npm `latest`, so even NON-shadowed resolution serves pre-fix
19
+ * framework files. Reported as an explicit `installed X; latest Y` pair
20
+ * (a computed "N behind" distance is not crisply testable), best-effort and
21
+ * offline-tolerant.
22
+ *
23
+ * Report-only: this module performs NO writes to disk. Adjudication stays human —
24
+ * local copies may be deliberate customizations (that is the resolver's whole point).
25
+ *
26
+ * Mirrors the existing doctor audit precedents: `pr-gate-audit.ts` (#943) and
27
+ * `framework-ref-audit.ts` (#1011) — a pure lib returning findings + formatters,
28
+ * consumed by `commands/doctor.ts`.
29
+ */
30
+ import * as fs from 'node:fs';
31
+ import * as path from 'node:path';
32
+ import { createHash } from 'node:crypto';
33
+ import { spawnSync } from 'node:child_process';
34
+ import { getSkeletonDir, listSkeletonFiles, resolveCodevFile, findWorkspaceRoot } from './skeleton.js';
35
+ import { version as installedVersion } from '../version.js';
36
+ /**
37
+ * The framework subtrees whose files ship in the skeleton and resolve via the
38
+ * four-tier resolver. Pinned scan set (per the spec) — prompts and per-protocol
39
+ * templates live WITHIN `protocols/`, so they are covered transitively.
40
+ *
41
+ * Maintenance point: a new top-level framework subtree must be added here (same
42
+ * shape as `PR_PRODUCING_PROTOCOLS` in pr-gate-audit). `codev/resources/` is
43
+ * deliberately EXCLUDED — those are user-evolved files (arch.md, lessons-learned.md,
44
+ * and their -critical companions), not framework files, and must never be flagged.
45
+ */
46
+ export const FRAMEWORK_DRIFT_DIRS = ['protocols', 'consult-types', 'roles'];
47
+ /** Only these extensions are framework files worth diffing. */
48
+ const FRAMEWORK_EXTS = new Set(['.md', '.json']);
49
+ /** The two project-local override roots, in resolver-precedence order (tier 1 first). */
50
+ const OVERRIDE_TIERS = ['.codev', 'codev'];
51
+ /** SHA-256 of a file's raw bytes (no text decoding — EOL/trailing-newline sensitive). */
52
+ function hashBytes(filePath) {
53
+ return createHash('sha256').update(fs.readFileSync(filePath)).digest('hex');
54
+ }
55
+ /**
56
+ * Skeleton-relative framework files under a scan-set subtree, filtered to
57
+ * framework extensions. Enumerated via the resolver's own `listSkeletonFiles`
58
+ * (over `getSkeletonDir()`) so this audit and runtime resolution agree on exactly
59
+ * what the skeleton is. Returned paths (e.g. `protocols/spir/protocol.md`) are
60
+ * both the skeleton-relative and the override-relative path.
61
+ */
62
+ function skeletonFrameworkFiles(sub) {
63
+ return listSkeletonFiles(sub).filter((rel) => FRAMEWORK_EXTS.has(path.extname(rel)));
64
+ }
65
+ /**
66
+ * Audit a project for shadow drift against the installed skeleton.
67
+ *
68
+ * For every framework file in the skeleton (under FRAMEWORK_DRIFT_DIRS), checks
69
+ * whether a local copy exists in `.codev/` and/or `codev/`; for each local copy
70
+ * found, byte-compares it against the skeleton file and records a finding. Returns
71
+ * one finding per local copy (so a file present in BOTH tiers yields two findings).
72
+ *
73
+ * @param workspaceRoot - project root (auto-detected via findWorkspaceRoot if omitted)
74
+ */
75
+ export function auditProtocolDrift(workspaceRoot) {
76
+ const root = workspaceRoot ?? findWorkspaceRoot();
77
+ const skeletonDir = getSkeletonDir();
78
+ const findings = [];
79
+ for (const sub of FRAMEWORK_DRIFT_DIRS) {
80
+ for (const rel of skeletonFrameworkFiles(sub)) {
81
+ const skeletonPath = path.join(skeletonDir, rel);
82
+ let skeletonHash;
83
+ try {
84
+ skeletonHash = hashBytes(skeletonPath);
85
+ }
86
+ catch {
87
+ continue; // unreadable skeleton file — nothing to diff against
88
+ }
89
+ // Which copy does the resolver actually pick? (absolute path or null)
90
+ const resolved = resolveCodevFile(rel, root);
91
+ const resolvedAbs = resolved ? path.resolve(resolved) : null;
92
+ for (const tier of OVERRIDE_TIERS) {
93
+ const localPath = path.join(root, tier, rel);
94
+ if (!fs.existsSync(localPath) || !fs.statSync(localPath).isFile())
95
+ continue;
96
+ const status = hashBytes(localPath) === skeletonHash ? 'identical' : 'differs';
97
+ findings.push({
98
+ relativePath: rel,
99
+ tier,
100
+ status,
101
+ isResolvedWinner: resolvedAbs === path.resolve(localPath),
102
+ });
103
+ }
104
+ }
105
+ }
106
+ return findings;
107
+ }
108
+ /**
109
+ * Whether the project has ANY local copy of a scanned skeleton file, in EITHER
110
+ * override root. Cheap existence-only scan (no hashing) used for the no-op gate:
111
+ * the existing `hasLocalOverride()` only checks tier-2 `codev/`, so drift detection
112
+ * must check both tiers itself.
113
+ */
114
+ export function hasFrameworkShadows(workspaceRoot) {
115
+ const root = workspaceRoot ?? findWorkspaceRoot();
116
+ for (const sub of FRAMEWORK_DRIFT_DIRS) {
117
+ for (const rel of skeletonFrameworkFiles(sub)) {
118
+ for (const tier of OVERRIDE_TIERS) {
119
+ if (fs.existsSync(path.join(root, tier, rel)))
120
+ return true;
121
+ }
122
+ }
123
+ }
124
+ return false;
125
+ }
126
+ /** Parse a dotted version into numeric parts; non-numeric segments → 0. */
127
+ function parseVersion(v) {
128
+ return v.split('.').map((p) => parseInt(p.replace(/[^0-9]/g, ''), 10) || 0);
129
+ }
130
+ /** True if `a` is strictly older than `b` (semver-ish, major.minor.patch). */
131
+ function versionLt(a, b) {
132
+ const pa = parseVersion(a);
133
+ const pb = parseVersion(b);
134
+ for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
135
+ const x = pa[i] || 0;
136
+ const y = pb[i] || 0;
137
+ if (x < y)
138
+ return true;
139
+ if (x > y)
140
+ return false;
141
+ }
142
+ return false;
143
+ }
144
+ /** Bound on the npm-latest lookup (ms). The registry can't stall doctor beyond this. */
145
+ export const NPM_LATEST_TIMEOUT_MS = 2500;
146
+ /**
147
+ * Default npm-latest lookup: `npm view @cluesmith/codev version`. Bounded by
148
+ * `NPM_LATEST_TIMEOUT_MS` (spawnSync kills the child past it) and offline-tolerant —
149
+ * an unreachable registry, non-zero exit, missing `npm`, or unparsable output all
150
+ * yield `null` rather than throwing or hanging. Exported so tests can assert the
151
+ * real bounded/offline behavior (not just an injected stub).
152
+ */
153
+ export function fetchLatestVersion() {
154
+ try {
155
+ const r = spawnSync('npm', ['view', '@cluesmith/codev', 'version'], {
156
+ encoding: 'utf-8',
157
+ timeout: NPM_LATEST_TIMEOUT_MS,
158
+ stdio: 'pipe',
159
+ });
160
+ if (r.status === 0 && r.stdout) {
161
+ const v = r.stdout.trim();
162
+ return /^\d+\.\d+\.\d+/.test(v) ? v : null;
163
+ }
164
+ return null;
165
+ }
166
+ catch {
167
+ return null;
168
+ }
169
+ }
170
+ /**
171
+ * Compare the installed package version against npm `latest`. Never throws and
172
+ * never hangs beyond the fetch timeout — an unreachable registry yields
173
+ * `{ latest: null, behind: false, note }` so doctor stays usable offline.
174
+ *
175
+ * @param fetchLatest - injectable latest-version source (defaults to `npm view`)
176
+ */
177
+ export function checkSkeletonStaleness(fetchLatest = fetchLatestVersion) {
178
+ const installed = installedVersion;
179
+ let latest = null;
180
+ try {
181
+ latest = fetchLatest();
182
+ }
183
+ catch {
184
+ latest = null;
185
+ }
186
+ if (!latest) {
187
+ return { installed, latest: null, behind: false, note: 'could not check (offline?)' };
188
+ }
189
+ return { installed, latest, behind: versionLt(installed, latest) };
190
+ }
191
+ /**
192
+ * Render a shadow-drift finding for doctor output.
193
+ *
194
+ * @param skeletonVersion - installed skeleton/package version; when provided it is
195
+ * named in the line so the human can tell WHICH skeleton the local copy diverged
196
+ * from (the spec requires the adjudication warning to name the package version).
197
+ */
198
+ export function formatDriftFinding(f, skeletonVersion) {
199
+ const loc = `${f.tier}/${f.relativePath}`;
200
+ const ver = skeletonVersion ? ` v${skeletonVersion}` : '';
201
+ if (f.status === 'identical') {
202
+ return `${loc} — byte-identical redundant copy of the installed skeleton${ver}; safe to remove (resolution then falls back to the package)`;
203
+ }
204
+ const winner = f.isResolvedWinner ? ' [resolved — this copy is live]' : '';
205
+ return `${loc} — differs from installed skeleton${ver}; customized or stale? — adjudicate${winner}`;
206
+ }
207
+ /** Render the staleness result for doctor output. */
208
+ export function formatStaleness(s) {
209
+ if (s.latest === null) {
210
+ return `installed ${s.installed}; latest: ${s.note ?? 'unknown'}`;
211
+ }
212
+ if (s.behind) {
213
+ return `installed ${s.installed}; latest ${s.latest} — behind (run: codev update)`;
214
+ }
215
+ return `installed ${s.installed}; latest ${s.latest} (up to date)`;
216
+ }
217
+ //# sourceMappingURL=protocol-drift-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol-drift-audit.js","sourceRoot":"","sources":["../../src/lib/protocol-drift-audit.ts"],"names":[],"mappings":"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"}
@@ -107,13 +107,20 @@ interface CopySkillsOptions {
107
107
  skipExisting?: boolean;
108
108
  }
109
109
  interface CopySkillsResult {
110
+ /** Project-relative provider-qualified paths, including a trailing slash. */
110
111
  copied: string[];
112
+ /** Project-relative provider-qualified paths, including a trailing slash. */
111
113
  skipped: string[];
112
- directoryCreated: boolean;
114
+ /** Project-relative provider skill roots that were created. */
115
+ directoriesCreated: string[];
113
116
  }
117
+ export declare const SKILL_PROVIDERS: readonly ["claude", "codex"];
114
118
  /**
115
- * Copy .claude/skills/ from skeleton to project root.
116
- * Skills are Claude Code slash commands that provide contextual guidance.
119
+ * Copy provider-native skill trees from the skeleton to the project root.
120
+ *
121
+ * Each skill directory is the preservation boundary: skipExisting leaves an
122
+ * existing skill completely untouched while still backfilling missing skills
123
+ * for either provider.
117
124
  */
118
125
  export declare function copySkills(targetDir: string, skeletonDir: string, options?: CopySkillsOptions): CopySkillsResult;
119
126
  interface CopyRolesOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/lib/scaffold.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/lib/scaffold.ts"],"names":[],"mappings":"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"}