@cleocode/core 2026.10.8 → 2026.10.9-rc.ci.676

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 (266) hide show
  1. package/dist/build-provenance.json +2 -2
  2. package/dist/cloud/auto-sync-command-entry.d.ts +13 -0
  3. package/dist/cloud/auto-sync-command-entry.d.ts.map +1 -0
  4. package/dist/cloud/auto-sync-command-entry.js +18 -0
  5. package/dist/cloud/auto-sync-command-entry.js.map +1 -0
  6. package/dist/cloud/auto-sync-command.d.ts +64 -0
  7. package/dist/cloud/auto-sync-command.d.ts.map +1 -0
  8. package/dist/cloud/auto-sync-command.js +109 -0
  9. package/dist/cloud/auto-sync-command.js.map +1 -0
  10. package/dist/cloud/auto-sync.d.ts +111 -0
  11. package/dist/cloud/auto-sync.d.ts.map +1 -0
  12. package/dist/cloud/auto-sync.js +275 -0
  13. package/dist/cloud/auto-sync.js.map +1 -0
  14. package/dist/cloud/nexus-cloud-device-overview.d.ts +52 -0
  15. package/dist/cloud/nexus-cloud-device-overview.d.ts.map +1 -0
  16. package/dist/cloud/nexus-cloud-device-overview.js +105 -0
  17. package/dist/cloud/nexus-cloud-device-overview.js.map +1 -0
  18. package/dist/cloud/nexus-cloud-journal-activity.d.ts +56 -0
  19. package/dist/cloud/nexus-cloud-journal-activity.d.ts.map +1 -0
  20. package/dist/cloud/nexus-cloud-journal-activity.js +98 -0
  21. package/dist/cloud/nexus-cloud-journal-activity.js.map +1 -0
  22. package/dist/cloud/nexus-cloud-status.d.ts.map +1 -1
  23. package/dist/cloud/nexus-cloud-status.js +88 -5
  24. package/dist/cloud/nexus-cloud-status.js.map +1 -1
  25. package/dist/cloud/nexus-vault.d.ts +19 -5
  26. package/dist/cloud/nexus-vault.d.ts.map +1 -1
  27. package/dist/cloud/nexus-vault.js +376 -71
  28. package/dist/cloud/nexus-vault.js.map +1 -1
  29. package/dist/cloud/replica-rebind.d.ts +14 -0
  30. package/dist/cloud/replica-rebind.d.ts.map +1 -1
  31. package/dist/cloud/replica-rebind.js +20 -1
  32. package/dist/cloud/replica-rebind.js.map +1 -1
  33. package/dist/config.d.ts +10 -0
  34. package/dist/config.d.ts.map +1 -1
  35. package/dist/config.js +19 -0
  36. package/dist/config.js.map +1 -1
  37. package/dist/docs/docs-ops.d.ts +4 -2
  38. package/dist/docs/docs-ops.d.ts.map +1 -1
  39. package/dist/docs/docs-ops.js +107 -15
  40. package/dist/docs/docs-ops.js.map +1 -1
  41. package/dist/doctor/system-health.d.ts +76 -2
  42. package/dist/doctor/system-health.d.ts.map +1 -1
  43. package/dist/doctor/system-health.js +264 -41
  44. package/dist/doctor/system-health.js.map +1 -1
  45. package/dist/hooks/project-runner.d.ts +10 -0
  46. package/dist/hooks/project-runner.d.ts.map +1 -0
  47. package/dist/hooks/project-runner.js +328 -0
  48. package/dist/hooks/project-runner.js.map +1 -0
  49. package/dist/hooks/project-state.d.ts +41 -0
  50. package/dist/hooks/project-state.d.ts.map +1 -0
  51. package/dist/hooks/project-state.js +331 -0
  52. package/dist/hooks/project-state.js.map +1 -0
  53. package/dist/hooks/release-gate.d.ts +61 -0
  54. package/dist/hooks/release-gate.d.ts.map +1 -0
  55. package/dist/hooks/release-gate.js +70 -0
  56. package/dist/hooks/release-gate.js.map +1 -0
  57. package/dist/nexus/analyze-orchestrator.d.ts +2 -0
  58. package/dist/nexus/analyze-orchestrator.d.ts.map +1 -1
  59. package/dist/nexus/analyze-orchestrator.js +1 -0
  60. package/dist/nexus/analyze-orchestrator.js.map +1 -1
  61. package/dist/nexus/freshness.d.ts +67 -3
  62. package/dist/nexus/freshness.d.ts.map +1 -1
  63. package/dist/nexus/freshness.js +130 -9
  64. package/dist/nexus/freshness.js.map +1 -1
  65. package/dist/nexus/refresh-child.d.ts +14 -0
  66. package/dist/nexus/refresh-child.d.ts.map +1 -0
  67. package/dist/nexus/refresh-child.js +24 -0
  68. package/dist/nexus/refresh-child.js.map +1 -0
  69. package/dist/orchestrate/spawn-ops.d.ts +8 -1
  70. package/dist/orchestrate/spawn-ops.d.ts.map +1 -1
  71. package/dist/orchestrate/spawn-ops.js +42 -12
  72. package/dist/orchestrate/spawn-ops.js.map +1 -1
  73. package/dist/orchestration/spawn.d.ts +5 -0
  74. package/dist/orchestration/spawn.d.ts.map +1 -1
  75. package/dist/orchestration/spawn.js +4 -1
  76. package/dist/orchestration/spawn.js.map +1 -1
  77. package/dist/release/channel.d.ts.map +1 -1
  78. package/dist/release/channel.js +10 -0
  79. package/dist/release/channel.js.map +1 -1
  80. package/dist/release/github-pr.d.ts.map +1 -1
  81. package/dist/release/github-pr.js +1 -0
  82. package/dist/release/github-pr.js.map +1 -1
  83. package/dist/release/plan.d.ts +8 -3
  84. package/dist/release/plan.d.ts.map +1 -1
  85. package/dist/release/plan.js +72 -15
  86. package/dist/release/plan.js.map +1 -1
  87. package/dist/release/reconcile.d.ts.map +1 -1
  88. package/dist/release/reconcile.js +6 -15
  89. package/dist/release/reconcile.js.map +1 -1
  90. package/dist/sentient/daemon-entry.d.ts +6 -0
  91. package/dist/sentient/daemon-entry.d.ts.map +1 -1
  92. package/dist/sentient/daemon-entry.js +12 -0
  93. package/dist/sentient/daemon-entry.js.map +1 -1
  94. package/dist/sentient/worktree-dispatch.d.ts +7 -0
  95. package/dist/sentient/worktree-dispatch.d.ts.map +1 -1
  96. package/dist/sentient/worktree-dispatch.js +37 -1
  97. package/dist/sentient/worktree-dispatch.js.map +1 -1
  98. package/dist/sessions/session-end-snapshot-entry.d.ts +4 -1
  99. package/dist/sessions/session-end-snapshot-entry.d.ts.map +1 -1
  100. package/dist/sessions/session-end-snapshot-entry.js +9 -1
  101. package/dist/sessions/session-end-snapshot-entry.js.map +1 -1
  102. package/dist/spawn/agent-identity.d.ts.map +1 -1
  103. package/dist/spawn/agent-identity.js +96 -1
  104. package/dist/spawn/agent-identity.js.map +1 -1
  105. package/dist/spawn/branch-lock.d.ts +27 -8
  106. package/dist/spawn/branch-lock.d.ts.map +1 -1
  107. package/dist/spawn/branch-lock.js +57 -73
  108. package/dist/spawn/branch-lock.js.map +1 -1
  109. package/dist/store/agent-resolver.d.ts +6 -0
  110. package/dist/store/agent-resolver.d.ts.map +1 -1
  111. package/dist/store/agent-resolver.js +2 -0
  112. package/dist/store/agent-resolver.js.map +1 -1
  113. package/dist/store/dual-scope-db.d.ts +20 -0
  114. package/dist/store/dual-scope-db.d.ts.map +1 -1
  115. package/dist/store/dual-scope-db.js +81 -8
  116. package/dist/store/dual-scope-db.js.map +1 -1
  117. package/dist/store/exodus/bare-family.d.ts.map +1 -1
  118. package/dist/store/exodus/bare-family.js +4 -1
  119. package/dist/store/exodus/bare-family.js.map +1 -1
  120. package/dist/store/exodus/migrate.d.ts.map +1 -1
  121. package/dist/store/exodus/migrate.js +2 -0
  122. package/dist/store/exodus/migrate.js.map +1 -1
  123. package/dist/store/exodus/on-open.d.ts.map +1 -1
  124. package/dist/store/exodus/on-open.js +16 -4
  125. package/dist/store/exodus/on-open.js.map +1 -1
  126. package/dist/store/exodus/reconcile.d.ts.map +1 -1
  127. package/dist/store/exodus/reconcile.js +2 -0
  128. package/dist/store/exodus/reconcile.js.map +1 -1
  129. package/dist/store/portable-bundle-import.d.ts +17 -0
  130. package/dist/store/portable-bundle-import.d.ts.map +1 -1
  131. package/dist/store/portable-bundle-import.js +46 -31
  132. package/dist/store/portable-bundle-import.js.map +1 -1
  133. package/dist/store/portable-bundle-scan.d.ts.map +1 -1
  134. package/dist/store/portable-bundle-scan.js +5 -0
  135. package/dist/store/portable-bundle-scan.js.map +1 -1
  136. package/dist/store/row-identity-registry.d.ts +4 -3
  137. package/dist/store/row-identity-registry.d.ts.map +1 -1
  138. package/dist/store/row-identity-registry.js +37 -35
  139. package/dist/store/row-identity-registry.js.map +1 -1
  140. package/dist/store/row-identity.d.ts.map +1 -1
  141. package/dist/store/row-identity.js +6 -1
  142. package/dist/store/row-identity.js.map +1 -1
  143. package/dist/store/schema/cleo-global/agent-registry.d.ts +16 -0
  144. package/dist/store/schema/cleo-global/agent-registry.d.ts.map +1 -1
  145. package/dist/store/schema/cleo-global/agent-registry.js +4 -1
  146. package/dist/store/schema/cleo-global/agent-registry.js.map +1 -1
  147. package/dist/store/schema/cleo-project/provenance-orphans.d.ts +126 -1
  148. package/dist/store/schema/cleo-project/provenance-orphans.d.ts.map +1 -1
  149. package/dist/store/schema/cleo-project/provenance-orphans.js +41 -1
  150. package/dist/store/schema/cleo-project/provenance-orphans.js.map +1 -1
  151. package/dist/store/sqlite-data-accessor.d.ts +40 -0
  152. package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
  153. package/dist/store/sqlite-data-accessor.js +122 -0
  154. package/dist/store/sqlite-data-accessor.js.map +1 -1
  155. package/dist/store/sync/activity.d.ts +64 -0
  156. package/dist/store/sync/activity.d.ts.map +1 -0
  157. package/dist/store/sync/activity.js +220 -0
  158. package/dist/store/sync/activity.js.map +1 -0
  159. package/dist/store/sync/apply/applier.d.ts.map +1 -1
  160. package/dist/store/sync/apply/applier.js +58 -2
  161. package/dist/store/sync/apply/applier.js.map +1 -1
  162. package/dist/store/sync/apply/write-api.d.ts.map +1 -1
  163. package/dist/store/sync/apply/write-api.js +45 -3
  164. package/dist/store/sync/apply/write-api.js.map +1 -1
  165. package/dist/store/sync/capture.d.ts +6 -4
  166. package/dist/store/sync/capture.d.ts.map +1 -1
  167. package/dist/store/sync/capture.js +16 -4
  168. package/dist/store/sync/capture.js.map +1 -1
  169. package/dist/store/sync/collision-settle.d.ts +120 -0
  170. package/dist/store/sync/collision-settle.d.ts.map +1 -1
  171. package/dist/store/sync/collision-settle.js +342 -5
  172. package/dist/store/sync/collision-settle.js.map +1 -1
  173. package/dist/store/sync/flags.d.ts +34 -0
  174. package/dist/store/sync/flags.d.ts.map +1 -1
  175. package/dist/store/sync/flags.js +46 -0
  176. package/dist/store/sync/flags.js.map +1 -1
  177. package/dist/store/sync/genesis.d.ts +8 -0
  178. package/dist/store/sync/genesis.d.ts.map +1 -1
  179. package/dist/store/sync/genesis.js +18 -5
  180. package/dist/store/sync/genesis.js.map +1 -1
  181. package/dist/store/sync/push.d.ts +4 -2
  182. package/dist/store/sync/push.d.ts.map +1 -1
  183. package/dist/store/sync/push.js +10 -1
  184. package/dist/store/sync/push.js.map +1 -1
  185. package/dist/store/sync/rebind.d.ts +20 -0
  186. package/dist/store/sync/rebind.d.ts.map +1 -1
  187. package/dist/store/sync/rebind.js +86 -4
  188. package/dist/store/sync/rebind.js.map +1 -1
  189. package/dist/store/sync/reconcile-copy.d.ts +152 -0
  190. package/dist/store/sync/reconcile-copy.d.ts.map +1 -0
  191. package/dist/store/sync/reconcile-copy.js +428 -0
  192. package/dist/store/sync/reconcile-copy.js.map +1 -0
  193. package/dist/store/sync/reconcile.d.ts +80 -0
  194. package/dist/store/sync/reconcile.d.ts.map +1 -1
  195. package/dist/store/sync/reconcile.js +97 -5
  196. package/dist/store/sync/reconcile.js.map +1 -1
  197. package/dist/store/sync/repair.d.ts +11 -0
  198. package/dist/store/sync/repair.d.ts.map +1 -1
  199. package/dist/store/sync/repair.js +14 -3
  200. package/dist/store/sync/repair.js.map +1 -1
  201. package/dist/store/sync/replica.d.ts +74 -1
  202. package/dist/store/sync/replica.d.ts.map +1 -1
  203. package/dist/store/sync/replica.js +104 -6
  204. package/dist/store/sync/replica.js.map +1 -1
  205. package/dist/store/sync/row-meta.d.ts +4 -2
  206. package/dist/store/sync/row-meta.d.ts.map +1 -1
  207. package/dist/store/sync/row-meta.js +6 -4
  208. package/dist/store/sync/row-meta.js.map +1 -1
  209. package/dist/store/sync/sealer.d.ts +2 -0
  210. package/dist/store/sync/sealer.d.ts.map +1 -1
  211. package/dist/store/sync/sealer.js +33 -4
  212. package/dist/store/sync/sealer.js.map +1 -1
  213. package/dist/store/sync/structural.d.ts.map +1 -1
  214. package/dist/store/sync/structural.js +3 -1
  215. package/dist/store/sync/structural.js.map +1 -1
  216. package/dist/store/sync/timestamp-canon.d.ts.map +1 -1
  217. package/dist/store/sync/timestamp-canon.js +2 -0
  218. package/dist/store/sync/timestamp-canon.js.map +1 -1
  219. package/dist/store/table-classification.d.ts +29 -0
  220. package/dist/store/table-classification.d.ts.map +1 -1
  221. package/dist/store/table-classification.js +85 -19
  222. package/dist/store/table-classification.js.map +1 -1
  223. package/dist/store/twin-collapse.d.ts.map +1 -1
  224. package/dist/store/twin-collapse.js +28 -10
  225. package/dist/store/twin-collapse.js.map +1 -1
  226. package/dist/store/vault-manifest.d.ts +5 -0
  227. package/dist/store/vault-manifest.d.ts.map +1 -1
  228. package/dist/store/vault-manifest.js +14 -1
  229. package/dist/store/vault-manifest.js.map +1 -1
  230. package/dist/tasks/affected-packages.d.ts +15 -5
  231. package/dist/tasks/affected-packages.d.ts.map +1 -1
  232. package/dist/tasks/affected-packages.js +20 -8
  233. package/dist/tasks/affected-packages.js.map +1 -1
  234. package/dist/tasks/done-record.d.ts +14 -4
  235. package/dist/tasks/done-record.d.ts.map +1 -1
  236. package/dist/tasks/done-record.js +21 -9
  237. package/dist/tasks/done-record.js.map +1 -1
  238. package/dist/tasks/evidence.d.ts.map +1 -1
  239. package/dist/tasks/evidence.js +45 -4
  240. package/dist/tasks/evidence.js.map +1 -1
  241. package/dist/tasks/gate-runner.d.ts +5 -4
  242. package/dist/tasks/gate-runner.d.ts.map +1 -1
  243. package/dist/tasks/gate-runner.js +18 -11
  244. package/dist/tasks/gate-runner.js.map +1 -1
  245. package/dist/tasks/tool-cache.d.ts +27 -1
  246. package/dist/tasks/tool-cache.d.ts.map +1 -1
  247. package/dist/tasks/tool-cache.js +110 -6
  248. package/dist/tasks/tool-cache.js.map +1 -1
  249. package/dist/tools/fs.d.ts +3 -1
  250. package/dist/tools/fs.d.ts.map +1 -1
  251. package/dist/tools/fs.js +35 -2
  252. package/dist/tools/fs.js.map +1 -1
  253. package/dist/validation/engine-ops.d.ts +10 -3
  254. package/dist/validation/engine-ops.d.ts.map +1 -1
  255. package/dist/validation/engine-ops.js +17 -8
  256. package/dist/validation/engine-ops.js.map +1 -1
  257. package/migrations/drizzle-cleo-global/20261010180000_t12915-agent-registry-uids/migration.sql +18 -0
  258. package/migrations/drizzle-cleo-project/20261010170000_t12896b-brain-task-observations/migration.sql +37 -0
  259. package/migrations/sync-journal/20261009150000_t13335-capture-pin/migration.sql +13 -0
  260. package/package.json +18 -13
  261. package/schemas/config.schema.json +12 -0
  262. package/schemas/project-context.schema.json +5 -0
  263. package/templates/CLEO-INJECTION.md +2 -2
  264. package/templates/CLEO-REFERENCE.md +6 -4
  265. package/templates/git-hooks/pre-push +29 -1
  266. package/templates/workflows/release-prepare.yml.tmpl +1 -0
@@ -0,0 +1,328 @@
1
+ /** Ordered project executor, separate from the best-effort internal registry (T13343). */
2
+ import { spawn } from 'node:child_process';
3
+ import { ProjectHookVerdictSchema, } from '@cleocode/contracts/project-hooks.js';
4
+ import { discoveryEnv } from '../git/work-tree.js';
5
+ import { atomicWrite } from '../store/atomic.js';
6
+ import { computeHookActivation, inspectProjectHooks, matchesProjectHook, readProjectHookRecord, readProjectHooksLocalState, readProjectHooksManifest, resolveProjectHookContext, resolveProjectHookExecutable, resolveProjectHookFile, resolveProjectHookStateFile, } from './project-state.js';
7
+ import { HOOKS_V1_UNRELEASED } from './release-gate.js';
8
+ const MAX_INPUT_BYTES = 65536;
9
+ const MAX_OUTPUT_BYTES = 65536;
10
+ const MAX_INVOCATION_MS = 120000;
11
+ function fault(invocation, code, id = 'cleo.project-hooks') {
12
+ return {
13
+ id,
14
+ status: 'infrastructure-error',
15
+ blocks: invocation.source === 'ci',
16
+ code,
17
+ exitCode: null,
18
+ signal: null,
19
+ durationMs: 0,
20
+ };
21
+ }
22
+ function sameInputs(left, right) {
23
+ return Boolean(left &&
24
+ right &&
25
+ left.projectIdentity === right.projectIdentity &&
26
+ left.manifestHash === right.manifestHash &&
27
+ JSON.stringify(left.files) === JSON.stringify(right.files) &&
28
+ JSON.stringify(left.executables) === JSON.stringify(right.executables));
29
+ }
30
+ function blocksFor(status, hook, invocation) {
31
+ if (invocation.source === 'agent')
32
+ return false;
33
+ if (invocation.source === 'ci')
34
+ return !['pass', 'skip'].includes(status);
35
+ return (status === 'block' ||
36
+ (['checker-error', 'timeout'].includes(status) && hook.checkerErrorPolicy === 'block'));
37
+ }
38
+ async function executeOne(hook, invocation, remainingMs, signal) {
39
+ const started = performance.now();
40
+ const outcome = {
41
+ id: hook.id,
42
+ status: 'checker-error',
43
+ blocks: false,
44
+ code: 'HOOK_CHECKER_ERROR',
45
+ exitCode: null,
46
+ signal: null,
47
+ durationMs: 0,
48
+ };
49
+ try {
50
+ const executable = await resolveProjectHookExecutable(invocation.projectRoot, hook.executable);
51
+ const handler = await resolveProjectHookFile(invocation.projectRoot, hook.handler);
52
+ const payload = JSON.stringify(invocation);
53
+ await new Promise((complete) => {
54
+ const child = spawn(executable, [handler, ...hook.args], {
55
+ cwd: invocation.projectRoot,
56
+ env: discoveryEnv(),
57
+ shell: false,
58
+ detached: process.platform !== 'win32',
59
+ stdio: ['pipe', 'pipe', 'pipe'],
60
+ });
61
+ let finished = false;
62
+ const stdout = [];
63
+ let bytes = 0;
64
+ let interrupted = false;
65
+ let cleanupTimer;
66
+ const finish = () => {
67
+ if (finished)
68
+ return;
69
+ finished = true;
70
+ clearTimeout(timer);
71
+ if (cleanupTimer)
72
+ clearTimeout(cleanupTimer);
73
+ signal?.removeEventListener('abort', onAbort);
74
+ child.stdin.destroy();
75
+ child.stdout.destroy();
76
+ child.stderr.destroy();
77
+ complete();
78
+ };
79
+ const killGroup = () => {
80
+ try {
81
+ if (process.platform !== 'win32' && child.pid)
82
+ process.kill(-child.pid, 'SIGKILL');
83
+ else
84
+ child.kill('SIGKILL');
85
+ }
86
+ catch {
87
+ /* The child may already have exited. */
88
+ }
89
+ };
90
+ const terminate = () => {
91
+ interrupted = true;
92
+ killGroup();
93
+ outcome.signal = 'SIGKILL';
94
+ cleanupTimer = setTimeout(finish, 250);
95
+ };
96
+ const onAbort = () => {
97
+ outcome.status = 'infrastructure-error';
98
+ outcome.code = 'HOOK_ABORTED';
99
+ terminate();
100
+ };
101
+ const timer = setTimeout(() => {
102
+ outcome.status = remainingMs < hook.timeoutMs ? 'infrastructure-error' : 'timeout';
103
+ outcome.code = remainingMs < hook.timeoutMs ? 'HOOK_INVOCATION_TIMEOUT' : 'HOOK_TIMEOUT';
104
+ terminate();
105
+ }, Math.min(hook.timeoutMs, remainingMs));
106
+ signal?.addEventListener('abort', onAbort, { once: true });
107
+ if (signal?.aborted)
108
+ onAbort();
109
+ child.stdout.on('data', (chunk) => {
110
+ if (interrupted)
111
+ return;
112
+ bytes += chunk.length;
113
+ if (bytes > MAX_OUTPUT_BYTES) {
114
+ outcome.code = 'HOOK_OUTPUT_TOO_LARGE';
115
+ terminate();
116
+ return;
117
+ }
118
+ stdout.push(chunk);
119
+ });
120
+ // Never persist child stderr: it may contain secrets or arbitrary payloads.
121
+ child.stderr.on('data', (chunk) => {
122
+ bytes += chunk.length;
123
+ if (!interrupted && bytes > MAX_OUTPUT_BYTES) {
124
+ outcome.code = 'HOOK_OUTPUT_TOO_LARGE';
125
+ terminate();
126
+ }
127
+ });
128
+ child.on('error', () => {
129
+ outcome.status = 'infrastructure-error';
130
+ outcome.code = 'HOOK_EXECUTION_FAILED';
131
+ finish();
132
+ });
133
+ child.stdin.on('error', () => {
134
+ /* close/error determines the verdict. */
135
+ });
136
+ child.on('exit', () => {
137
+ // Stop descendants that remain in the checker process group after its verdict.
138
+ killGroup();
139
+ });
140
+ child.on('close', (exitCode, signal) => {
141
+ if (finished)
142
+ return;
143
+ outcome.exitCode = exitCode;
144
+ outcome.signal = signal;
145
+ if (!interrupted) {
146
+ if (signal)
147
+ outcome.code = 'HOOK_SIGNAL';
148
+ else if (exitCode !== 0)
149
+ outcome.code = 'HOOK_NONZERO_EXIT';
150
+ else {
151
+ try {
152
+ const verdict = ProjectHookVerdictSchema.parse(JSON.parse(Buffer.concat(stdout).toString('utf8')));
153
+ outcome.status = verdict.status;
154
+ if (verdict.message)
155
+ outcome.message = verdict.message;
156
+ outcome.code = `HOOK_${verdict.status.toUpperCase().replace('-', '_')}`;
157
+ }
158
+ catch {
159
+ outcome.code = 'HOOK_INVALID_VERDICT';
160
+ }
161
+ }
162
+ }
163
+ finish();
164
+ });
165
+ child.stdin.end(payload);
166
+ });
167
+ }
168
+ catch {
169
+ outcome.status = 'infrastructure-error';
170
+ outcome.code = 'HOOK_EXECUTION_UNAVAILABLE';
171
+ }
172
+ outcome.durationMs = Math.round(performance.now() - started);
173
+ outcome.blocks = blocksFor(outcome.status, hook, invocation);
174
+ return outcome;
175
+ }
176
+ /** Execute activated definitions in source order; internal faults always allow locally. */
177
+ export async function executeProjectHooks(invocation, id, activationRoot, signal) {
178
+ const deadline = performance.now() + MAX_INVOCATION_MS;
179
+ try {
180
+ if (Buffer.byteLength(JSON.stringify(invocation)) > MAX_INPUT_BYTES)
181
+ return [fault(invocation, 'HOOK_INPUT_TOO_LARGE')];
182
+ const inspection = await inspectProjectHooks(activationRoot ?? invocation.projectRoot, deadline, signal);
183
+ const checkout = resolveProjectHookContext(invocation.projectRoot);
184
+ if (checkout.gitCommonDir !== invocation.gitCommonDir ||
185
+ checkout.projectRoot !== invocation.projectRoot ||
186
+ checkout.gitCommonDir !== inspection.context.gitCommonDir) {
187
+ return [fault(invocation, 'HOOK_CHECKOUT_MISMATCH')];
188
+ }
189
+ if (activationRoot &&
190
+ checkout.projectRoot !== inspection.context.projectRoot &&
191
+ inspection.activation === 'active') {
192
+ const target = await computeHookActivation(checkout, await readProjectHooksManifest(checkout), deadline, signal);
193
+ const state = await readProjectHooksLocalState(inspection.context);
194
+ const approved = state.activation;
195
+ // Inherit approval only for the same project and identical executable inputs.
196
+ // A changed worktree definition or dependency always requires reactivation.
197
+ if (!approved ||
198
+ target.projectIdentity !== approved.projectIdentity ||
199
+ target.manifestHash !== approved.manifestHash ||
200
+ JSON.stringify(target.files) !== JSON.stringify(approved.files) ||
201
+ JSON.stringify(target.executables) !== JSON.stringify(approved.executables)) {
202
+ return [
203
+ {
204
+ id: id ?? 'cleo.project-hooks',
205
+ status: 'warn',
206
+ blocks: invocation.source === 'ci',
207
+ code: 'HOOK_REACTIVATION_REQUIRED',
208
+ exitCode: null,
209
+ signal: null,
210
+ durationMs: 0,
211
+ },
212
+ ];
213
+ }
214
+ }
215
+ if (inspection.activation === 'unreleased') {
216
+ // T13557: inert on a build without hooks-v1; a required CI check still fails.
217
+ if (invocation.source === 'ci')
218
+ return [fault(invocation, HOOKS_V1_UNRELEASED)];
219
+ return [
220
+ {
221
+ id: id ?? 'cleo.project-hooks',
222
+ status: 'skip',
223
+ blocks: false,
224
+ code: HOOKS_V1_UNRELEASED,
225
+ exitCode: null,
226
+ signal: null,
227
+ durationMs: 0,
228
+ },
229
+ ];
230
+ }
231
+ if (inspection.activation !== 'active') {
232
+ if (invocation.source === 'ci')
233
+ return [fault(invocation, 'HOOK_REQUIRED_ACTIVATION_MISSING')];
234
+ return [
235
+ {
236
+ id: id ?? 'cleo.project-hooks',
237
+ status: inspection.activation === 'disabled' ? 'skip' : 'warn',
238
+ blocks: false,
239
+ code: inspection.activation === 'disabled' ? 'HOOK_DISABLED' : 'HOOK_REACTIVATION_REQUIRED',
240
+ exitCode: null,
241
+ signal: null,
242
+ durationMs: 0,
243
+ },
244
+ ];
245
+ }
246
+ const definitions = inspection.manifest.hooks.filter((hook) => id ? hook.id === id : matchesProjectHook(hook, invocation.source, invocation.event));
247
+ if (id && definitions.length === 0)
248
+ return [fault(invocation, 'HOOK_NOT_FOUND', id)];
249
+ const outcomes = [];
250
+ const approved = (await readProjectHooksLocalState(inspection.context)).activation;
251
+ for (const hook of definitions) {
252
+ // Recheck between handlers: an earlier checker may have changed later code.
253
+ const fresh = await readProjectHooksLocalState(inspection.context);
254
+ const target = await computeHookActivation(checkout, await readProjectHooksManifest(checkout), deadline, signal);
255
+ if (!fresh.hooks.project.enabled ||
256
+ !sameInputs(fresh.activation, approved) ||
257
+ !sameInputs(target, approved)) {
258
+ outcomes.push({
259
+ id: hook.id,
260
+ status: 'warn',
261
+ blocks: invocation.source === 'ci',
262
+ code: 'HOOK_REACTIVATION_REQUIRED',
263
+ exitCode: null,
264
+ signal: null,
265
+ durationMs: 0,
266
+ });
267
+ break;
268
+ }
269
+ const remainingMs = Math.floor(deadline - performance.now());
270
+ if (remainingMs <= 0) {
271
+ outcomes.push({
272
+ id: hook.id,
273
+ status: 'infrastructure-error',
274
+ blocks: invocation.source === 'ci',
275
+ code: 'HOOK_INVOCATION_TIMEOUT',
276
+ exitCode: null,
277
+ signal: null,
278
+ durationMs: MAX_INVOCATION_MS,
279
+ });
280
+ break;
281
+ }
282
+ if (signal?.aborted) {
283
+ outcomes.push(fault(invocation, 'HOOK_ABORTED', hook.id));
284
+ break;
285
+ }
286
+ outcomes.push(await executeOne(hook, invocation, remainingMs, signal));
287
+ }
288
+ // A last-result record is bounded and contains only executor-owned metadata.
289
+ // A failed receipt write is visible as infrastructure fault, never a fake pass.
290
+ try {
291
+ const receipt = {
292
+ schemaVersion: 1,
293
+ manifestHash: approved?.manifestHash ?? '',
294
+ source: invocation.source,
295
+ event: invocation.event.slice(0, 128),
296
+ recordedAt: new Date().toISOString(),
297
+ outcomes: outcomes.map(({ message: _message, ...safe }) => safe),
298
+ };
299
+ await atomicWrite(await resolveProjectHookStateFile(inspection.context, 'last-execution.json'), `${JSON.stringify(receipt)}\n`, { mode: 0o600 });
300
+ }
301
+ catch {
302
+ outcomes.push(fault(invocation, 'HOOK_RECEIPT_WRITE_FAILED'));
303
+ }
304
+ return outcomes;
305
+ }
306
+ catch {
307
+ return [fault(invocation, 'HOOK_INFRASTRUCTURE_ERROR')];
308
+ }
309
+ }
310
+ /** Contracts port for worktree and other consumers; no internal registry coupling. */
311
+ export const projectHookExecutor = { execute: executeProjectHooks };
312
+ /** Bind worktree inheritance to an explicitly activated source checkout. */
313
+ export function createProjectHookExecutor(activationRoot) {
314
+ return { execute: (invocation) => executeProjectHooks(invocation, undefined, activationRoot) };
315
+ }
316
+ /** Read only a bounded last execution record and validate its safe shape. */
317
+ export async function readLastProjectHookExecution(cwd) {
318
+ const inspection = await inspectProjectHooks(cwd);
319
+ const file = await resolveProjectHookStateFile(inspection.context, 'last-execution.json');
320
+ try {
321
+ const { HookExecutionReceiptSchema } = await import('@cleocode/contracts/project-hooks.js');
322
+ return HookExecutionReceiptSchema.parse(JSON.parse(await readProjectHookRecord(file, MAX_OUTPUT_BYTES)));
323
+ }
324
+ catch {
325
+ return undefined;
326
+ }
327
+ }
328
+ //# sourceMappingURL=project-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-runner.js","sourceRoot":"","sources":["../../src/hooks/project-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { ProjectHookDeliveryServices } from '@cleocode/contracts/project-hook-delivery.js';
2
+ import { type HookActivation, type ProjectHookContext, type ProjectHookDefinition, type ProjectHookInspection, type ProjectHooksLocalState, type ProjectHooksManifest } from '@cleocode/contracts/project-hooks.js';
3
+ export { HooksV1UnreleasedError } from './release-gate.js';
4
+ /** Read a hook definition or private record with a hard allocation bound, including racing growth. */
5
+ export declare function readProjectHookRecord(path: string, maxBytes: number): Promise<string>;
6
+ /**
7
+ * Supply canonical cold-path utilities through the provider delivery contracts port.
8
+ * @remarks
9
+ * This keeps provider delivery independent of the SDK at runtime while reusing its bounded reader.
10
+ * Git receives a snapshot without ambient repository overrides; the process environment is unchanged.
11
+ * @returns The bounded reader and sanitized Git discovery environment for one delivery invocation.
12
+ * @example
13
+ * ```typescript
14
+ * const services = createProjectHookDeliveryServices();
15
+ * const canReadConfiguration = typeof services.readTextFile === 'function';
16
+ * ```
17
+ */
18
+ export declare function createProjectHookDeliveryServices(): ProjectHookDeliveryServices;
19
+ /** Resolve checkout and hook paths through Git without reading CLEO stores. */
20
+ export declare function resolveProjectHookContext(cwd: string): ProjectHookContext;
21
+ /** Resolve a real path inside this checkout, refusing symlink escapes. */
22
+ export declare function resolveProjectHookFile(root: string, file: string): Promise<string>;
23
+ /** Read a bounded tracked definition and reject malformed or duplicate entries. */
24
+ export declare function readProjectHooksManifest(context: ProjectHookContext): Promise<ProjectHooksManifest>;
25
+ /** Resolve a shell-free executable; project executable paths must remain inside checkout. */
26
+ export declare function resolveProjectHookExecutable(root: string, executable: string): Promise<string>;
27
+ /** Compute the executable inputs bound by explicit activation. */
28
+ export declare function computeHookActivation(context: ProjectHookContext, manifest: ProjectHooksManifest, deadline?: number, signal?: AbortSignal): Promise<HookActivation>;
29
+ /** Resolve a private receipt path and reject redirected state directories or files. */
30
+ export declare function resolveProjectHookStateFile(context: ProjectHookContext, name: string): Promise<string>;
31
+ /** Read machine-local feature state; no record means disabled. */
32
+ export declare function readProjectHooksLocalState(context: ProjectHookContext): Promise<ProjectHooksLocalState>;
33
+ /** Check that the explicit local approval still matches all declared code inputs. */
34
+ export declare function inspectProjectHooks(cwd: string, deadline?: number, signal?: AbortSignal): Promise<ProjectHookInspection>;
35
+ /** Explicitly activate the present definitions; does not install or grant harness trust. */
36
+ export declare function activateProjectHooks(cwd: string): Promise<ProjectHooksLocalState>;
37
+ /** Disable machine-local execution without modifying project or native harness configuration. */
38
+ export declare function disableProjectHooks(cwd: string): Promise<void>;
39
+ /** Match a project's binding without treating shell command text as a Git operation. */
40
+ export declare function matchesProjectHook(hook: ProjectHookDefinition, source: string, event: string): boolean;
41
+ //# sourceMappingURL=project-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-state.d.ts","sourceRoot":"","sources":["../../src/hooks/project-state.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAChG,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAE1B,KAAK,sBAAsB,EAE3B,KAAK,oBAAoB,EAE1B,MAAM,sCAAsC,CAAC;AAM9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAM3D,sGAAsG;AACtG,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE3F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iCAAiC,IAAI,2BAA2B,CAE/E;AAED,+EAA+E;AAC/E,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAmBzE;AAED,0EAA0E;AAC1E,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQxF;AAED,mFAAmF;AACnF,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,oBAAoB,CAAC,CAW/B;AAED,6FAA6F;AAC7F,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAqBjB;AA0CD,kEAAkE;AAClE,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,SAA6B,EACrC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAgDzB;AAED,uFAAuF;AACvF,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,kBAAkB,EAC3B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,kEAAkE;AAClE,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,sBAAsB,CAAC,CAWjC;AA4CD,qFAAqF;AACrF,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,qBAAqB,CAAC,CAiChC;AAED,4FAA4F;AAC5F,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA0BvF;AAED,iGAAiG;AACjG,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWpE;AAED,wFAAwF;AACxF,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,qBAAqB,EAC3B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAET"}