@ccdd/project 2.0.1

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 (163) hide show
  1. package/README.md +25 -0
  2. package/dist/monitor-ui/assets/GraphView-CYMJ1Nb7.css +1 -0
  3. package/dist/monitor-ui/assets/GraphView-UjtW4QRC.js +27 -0
  4. package/dist/monitor-ui/assets/ValidationView-CC1FvqUl.js +1 -0
  5. package/dist/monitor-ui/assets/ValidationView-DWl4b8Ug.css +1 -0
  6. package/dist/monitor-ui/assets/_plugin-vue_export-helper-BDNMzG2s.js +1 -0
  7. package/dist/monitor-ui/assets/elk-api-yRi2AOS6.js +1 -0
  8. package/dist/monitor-ui/assets/elk.bundled-CtLobQTy.js +24 -0
  9. package/dist/monitor-ui/assets/graph-layout-worker-CgfWoa9t.js +22 -0
  10. package/dist/monitor-ui/assets/index-CUzg-dht.css +1 -0
  11. package/dist/monitor-ui/assets/index-Cpm0fC0p.js +8 -0
  12. package/dist/monitor-ui/index.html +15 -0
  13. package/dist/scripts/prepare-demo.d.ts +26 -0
  14. package/dist/scripts/prepare-demo.js +121 -0
  15. package/dist/scripts/prepare-demo.js.map +1 -0
  16. package/dist/src/artifacts/groups.d.ts +9 -0
  17. package/dist/src/artifacts/groups.js +77 -0
  18. package/dist/src/artifacts/groups.js.map +1 -0
  19. package/dist/src/artifacts/human.d.ts +38 -0
  20. package/dist/src/artifacts/human.js +156 -0
  21. package/dist/src/artifacts/human.js.map +1 -0
  22. package/dist/src/artifacts/index.d.ts +149 -0
  23. package/dist/src/artifacts/index.js +354 -0
  24. package/dist/src/artifacts/index.js.map +1 -0
  25. package/dist/src/artifacts/instruction.d.ts +23 -0
  26. package/dist/src/artifacts/instruction.js +94 -0
  27. package/dist/src/artifacts/instruction.js.map +1 -0
  28. package/dist/src/artifacts/mcp-server.d.ts +6 -0
  29. package/dist/src/artifacts/mcp-server.js +96 -0
  30. package/dist/src/artifacts/mcp-server.js.map +1 -0
  31. package/dist/src/artifacts/tool-check.d.ts +40 -0
  32. package/dist/src/artifacts/tool-check.js +113 -0
  33. package/dist/src/artifacts/tool-check.js.map +1 -0
  34. package/dist/src/artifacts/types.d.ts +43 -0
  35. package/dist/src/artifacts/types.js +97 -0
  36. package/dist/src/artifacts/types.js.map +1 -0
  37. package/dist/src/broker/config.d.ts +11 -0
  38. package/dist/src/broker/config.js +141 -0
  39. package/dist/src/broker/config.js.map +1 -0
  40. package/dist/src/broker/graph.d.ts +69 -0
  41. package/dist/src/broker/graph.js +94 -0
  42. package/dist/src/broker/graph.js.map +1 -0
  43. package/dist/src/broker/index.d.ts +170 -0
  44. package/dist/src/broker/index.js +931 -0
  45. package/dist/src/broker/index.js.map +1 -0
  46. package/dist/src/cli.d.ts +24 -0
  47. package/dist/src/cli.js +340 -0
  48. package/dist/src/cli.js.map +1 -0
  49. package/dist/src/contracts.d.ts +116 -0
  50. package/dist/src/contracts.js +2 -0
  51. package/dist/src/contracts.js.map +1 -0
  52. package/dist/src/definitions.d.ts +53 -0
  53. package/dist/src/definitions.js +2 -0
  54. package/dist/src/definitions.js.map +1 -0
  55. package/dist/src/doctor/index.d.ts +41 -0
  56. package/dist/src/doctor/index.js +189 -0
  57. package/dist/src/doctor/index.js.map +1 -0
  58. package/dist/src/executors/auth.d.ts +16 -0
  59. package/dist/src/executors/auth.js +150 -0
  60. package/dist/src/executors/auth.js.map +1 -0
  61. package/dist/src/executors/errors.d.ts +6 -0
  62. package/dist/src/executors/errors.js +10 -0
  63. package/dist/src/executors/errors.js.map +1 -0
  64. package/dist/src/executors/index.d.ts +20 -0
  65. package/dist/src/executors/index.js +262 -0
  66. package/dist/src/executors/index.js.map +1 -0
  67. package/dist/src/executors/pi.d.ts +32 -0
  68. package/dist/src/executors/pi.js +190 -0
  69. package/dist/src/executors/pi.js.map +1 -0
  70. package/dist/src/executors/process.d.ts +22 -0
  71. package/dist/src/executors/process.js +70 -0
  72. package/dist/src/executors/process.js.map +1 -0
  73. package/dist/src/local.d.ts +13 -0
  74. package/dist/src/local.js +20 -0
  75. package/dist/src/local.js.map +1 -0
  76. package/dist/src/monitor/actions.d.ts +12 -0
  77. package/dist/src/monitor/actions.js +74 -0
  78. package/dist/src/monitor/actions.js.map +1 -0
  79. package/dist/src/monitor/server.d.ts +8 -0
  80. package/dist/src/monitor/server.js +493 -0
  81. package/dist/src/monitor/server.js.map +1 -0
  82. package/dist/src/monitor/store.d.ts +22 -0
  83. package/dist/src/monitor/store.js +517 -0
  84. package/dist/src/monitor/store.js.map +1 -0
  85. package/dist/src/monitor/types.d.ts +143 -0
  86. package/dist/src/monitor/types.js +2 -0
  87. package/dist/src/monitor/types.js.map +1 -0
  88. package/dist/src/monitor/ui/api.d.ts +11 -0
  89. package/dist/src/monitor/ui/api.js +29 -0
  90. package/dist/src/monitor/ui/api.js.map +1 -0
  91. package/dist/src/monitor/ui/critic-presentation.d.ts +11 -0
  92. package/dist/src/monitor/ui/critic-presentation.js +60 -0
  93. package/dist/src/monitor/ui/critic-presentation.js.map +1 -0
  94. package/dist/src/monitor/ui/format.d.ts +9 -0
  95. package/dist/src/monitor/ui/format.js +22 -0
  96. package/dist/src/monitor/ui/format.js.map +1 -0
  97. package/dist/src/monitor/ui/graph-layout.d.ts +43 -0
  98. package/dist/src/monitor/ui/graph-layout.js +191 -0
  99. package/dist/src/monitor/ui/graph-layout.js.map +1 -0
  100. package/dist/src/monitor/ui/tool-content.d.ts +13 -0
  101. package/dist/src/monitor/ui/tool-content.js +22 -0
  102. package/dist/src/monitor/ui/tool-content.js.map +1 -0
  103. package/dist/src/monitor/ui/tool-input.d.ts +23 -0
  104. package/dist/src/monitor/ui/tool-input.js +112 -0
  105. package/dist/src/monitor/ui/tool-input.js.map +1 -0
  106. package/dist/src/project/cli.d.ts +9 -0
  107. package/dist/src/project/cli.js +306 -0
  108. package/dist/src/project/cli.js.map +1 -0
  109. package/dist/src/project/graph.d.ts +4 -0
  110. package/dist/src/project/graph.js +26 -0
  111. package/dist/src/project/graph.js.map +1 -0
  112. package/dist/src/project/identity.d.ts +5 -0
  113. package/dist/src/project/identity.js +87 -0
  114. package/dist/src/project/identity.js.map +1 -0
  115. package/dist/src/project/index.d.ts +19 -0
  116. package/dist/src/project/index.js +26 -0
  117. package/dist/src/project/index.js.map +1 -0
  118. package/dist/src/project/query.d.ts +9 -0
  119. package/dist/src/project/query.js +136 -0
  120. package/dist/src/project/query.js.map +1 -0
  121. package/dist/src/project/store.d.ts +15 -0
  122. package/dist/src/project/store.js +47 -0
  123. package/dist/src/project/store.js.map +1 -0
  124. package/dist/src/project/types.d.ts +106 -0
  125. package/dist/src/project/types.js +2 -0
  126. package/dist/src/project/types.js.map +1 -0
  127. package/dist/src/requester/index.d.ts +16 -0
  128. package/dist/src/requester/index.js +96 -0
  129. package/dist/src/requester/index.js.map +1 -0
  130. package/dist/src/runtime-paths.d.ts +1 -0
  131. package/dist/src/runtime-paths.js +4 -0
  132. package/dist/src/runtime-paths.js.map +1 -0
  133. package/dist/src/sdk.d.ts +9 -0
  134. package/dist/src/sdk.js +3 -0
  135. package/dist/src/sdk.js.map +1 -0
  136. package/dist/src/tools/contracts.d.ts +108 -0
  137. package/dist/src/tools/contracts.js +2 -0
  138. package/dist/src/tools/contracts.js.map +1 -0
  139. package/dist/src/tools/host.d.ts +7 -0
  140. package/dist/src/tools/host.js +98 -0
  141. package/dist/src/tools/host.js.map +1 -0
  142. package/dist/src/tools/paths.d.ts +2 -0
  143. package/dist/src/tools/paths.js +18 -0
  144. package/dist/src/tools/paths.js.map +1 -0
  145. package/dist/src/tools/runner.d.ts +54 -0
  146. package/dist/src/tools/runner.js +194 -0
  147. package/dist/src/tools/runner.js.map +1 -0
  148. package/dist/src/tools/runtime-host.d.ts +1 -0
  149. package/dist/src/tools/runtime-host.js +116 -0
  150. package/dist/src/tools/runtime-host.js.map +1 -0
  151. package/dist/src/tools/schema.d.ts +6 -0
  152. package/dist/src/tools/schema.js +106 -0
  153. package/dist/src/tools/schema.js.map +1 -0
  154. package/dist/src/worker-client.d.ts +27 -0
  155. package/dist/src/worker-client.js +96 -0
  156. package/dist/src/worker-client.js.map +1 -0
  157. package/dist/src/worker.d.ts +1 -0
  158. package/dist/src/worker.js +50 -0
  159. package/dist/src/worker.js.map +1 -0
  160. package/dist/src/workspaces/index.d.ts +33 -0
  161. package/dist/src/workspaces/index.js +394 -0
  162. package/dist/src/workspaces/index.js.map +1 -0
  163. package/package.json +26 -0
@@ -0,0 +1,394 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { constants, watch } from 'node:fs';
3
+ import { chmod, copyFile, lstat, mkdir, open, readFile, readdir, readlink, realpath, rename, rm, symlink, unlink } from 'node:fs/promises';
4
+ import { setTimeout as delay } from 'node:timers/promises';
5
+ import path from 'node:path';
6
+ const errorCode = (error) => error !== null && typeof error === 'object' && 'code' in error ? error.code : undefined;
7
+ const errorMessage = (error) => error instanceof Error ? error.message : String(error);
8
+ const HASH = /^[a-f0-9]{64}$/;
9
+ const digest = (value) => createHash('sha256').update(value).digest('hex');
10
+ const contained = (root, candidate) => {
11
+ const relative = path.relative(root, candidate);
12
+ return relative === '' || (!path.isAbsolute(relative) && relative !== '..' && !relative.startsWith(`..${path.sep}`));
13
+ };
14
+ const failure = (message, code = 'WORKSPACE_UNSAFE') => Object.assign(new Error(message), { code });
15
+ const changed = (mode, detail = '') => failure(`Review workspace changed${detail ? `: ${detail}` : '.'}`, mode === 'copy' ? 'WORKSPACE_CACHE_TAMPERED' : 'WORKSPACE_CHANGED');
16
+ async function canonicalFuturePath(value) {
17
+ const resolved = path.resolve(value);
18
+ try {
19
+ return await realpath(resolved);
20
+ }
21
+ catch (error) {
22
+ if (errorCode(error) !== 'ENOENT')
23
+ throw error;
24
+ const parent = path.dirname(resolved);
25
+ if (parent === resolved)
26
+ throw error;
27
+ return path.join(await canonicalFuturePath(parent), path.basename(resolved));
28
+ }
29
+ }
30
+ /** State, events, caches and review outputs must never be part of the observed input. */
31
+ export async function validateStateLocation(repoPath, stateDir) {
32
+ if (typeof repoPath !== 'string' || !repoPath || typeof stateDir !== 'string' || !stateDir) {
33
+ throw failure('repoPath and an external stateDir are required.');
34
+ }
35
+ const source = await realpath(repoPath);
36
+ if (!(await lstat(source)).isDirectory())
37
+ throw failure('Workspace must be a directory.');
38
+ const state = await canonicalFuturePath(stateDir);
39
+ if (contained(source, state))
40
+ throw failure('CCDD stateDir must be outside the source workspace.');
41
+ return { repoPath: source, stateDir: state };
42
+ }
43
+ function metadata(info) {
44
+ return [info.dev, info.ino, info.mode, info.size, info.mtimeNs, info.ctimeNs, info.birthtimeNs].map(String);
45
+ }
46
+ /** Every entry participates: no Git, ignore rules, extension filters or implicit exclusions. */
47
+ async function inspect(root, { signal, requireReadonly = false, contents = true } = {}) {
48
+ const entries = [];
49
+ const metadataEntries = [];
50
+ const walk = async (relative) => {
51
+ signal?.throwIfAborted();
52
+ const absolute = relative ? path.join(root, relative) : root;
53
+ const before = await lstat(absolute, { bigint: true });
54
+ metadataEntries.push([relative, ...metadata(before)]);
55
+ if (requireReadonly && !before.isSymbolicLink() && (before.mode & 146n))
56
+ throw changed('copy', `writable cache entry ${relative || '.'}`);
57
+ if (before.isDirectory()) {
58
+ if (relative)
59
+ entries.push({ path: relative, type: 'directory', executable: Number(before.mode & 73n) });
60
+ const names = (await readdir(absolute)).sort();
61
+ for (const name of names)
62
+ await walk(relative ? `${relative}/${name}` : name);
63
+ }
64
+ else if (before.isFile() && contents) {
65
+ const file = await open(absolute, constants.O_RDONLY | constants.O_NOFOLLOW);
66
+ let content;
67
+ try {
68
+ const opened = await file.stat({ bigint: true });
69
+ if (JSON.stringify(metadata(before)) !== JSON.stringify(metadata(opened)))
70
+ throw changed('lock', relative);
71
+ const hash = createHash('sha256');
72
+ const buffer = Buffer.allocUnsafe(128 * 1024);
73
+ let position = 0;
74
+ while (true) {
75
+ signal?.throwIfAborted();
76
+ const { bytesRead } = await file.read(buffer, 0, buffer.length, position);
77
+ if (!bytesRead)
78
+ break;
79
+ hash.update(buffer.subarray(0, bytesRead));
80
+ position += bytesRead;
81
+ }
82
+ content = hash.digest('hex');
83
+ }
84
+ finally {
85
+ await file.close();
86
+ }
87
+ entries.push({ path: relative, type: 'file', executable: Number(before.mode & 73n), content });
88
+ }
89
+ else if (before.isFile()) {
90
+ entries.push({ path: relative, type: 'file', executable: Number(before.mode & 73n) });
91
+ }
92
+ else if (before.isSymbolicLink()) {
93
+ const target = await readlink(absolute);
94
+ if (path.isAbsolute(target) || !contained(root, path.resolve(path.dirname(absolute), target))) {
95
+ throw failure(`Workspace symlink must be relative and stay inside the workspace: ${relative}`);
96
+ }
97
+ let resolved;
98
+ try {
99
+ resolved = await realpath(absolute);
100
+ }
101
+ catch {
102
+ throw failure(`Workspace symlink must resolve to an existing internal entry: ${relative}`);
103
+ }
104
+ if (!contained(root, resolved))
105
+ throw failure(`Workspace symlink escapes the workspace: ${relative}`);
106
+ entries.push({ path: relative, type: 'symlink', target });
107
+ }
108
+ else {
109
+ throw failure(`Unsupported workspace entry (only directories, regular files and internal symlinks are supported): ${relative}`);
110
+ }
111
+ const after = await lstat(absolute, { bigint: true });
112
+ if (JSON.stringify(metadata(before)) !== JSON.stringify(metadata(after)))
113
+ throw changed('lock', relative || '.');
114
+ };
115
+ await walk('');
116
+ return { hash: digest(JSON.stringify(entries)), metadataHash: digest(JSON.stringify(metadataEntries)), entries };
117
+ }
118
+ export async function fingerprintWorkspace(workspacePath) {
119
+ return (await inspect(await realpath(workspacePath))).hash;
120
+ }
121
+ function observe(root, mode, externalSignal) {
122
+ const controller = new AbortController();
123
+ let closed = false;
124
+ let watcher;
125
+ let timer;
126
+ let scanning;
127
+ let baseline;
128
+ let initialized = false;
129
+ let eventPending = false;
130
+ const abort = (reason) => { if (!controller.signal.aborted)
131
+ controller.abort(reason); };
132
+ const externalAbort = () => abort(externalSignal?.reason);
133
+ externalSignal?.addEventListener('abort', externalAbort, { once: true });
134
+ if (externalSignal?.aborted)
135
+ externalAbort();
136
+ try {
137
+ watcher = watch(root, { recursive: true }, () => {
138
+ eventPending = true;
139
+ if (initialized)
140
+ void check(false).catch(() => { });
141
+ });
142
+ watcher.on('error', error => abort(failure(`Cannot monitor review workspace: ${errorMessage(error)}`)));
143
+ }
144
+ catch (error) {
145
+ externalSignal?.removeEventListener('abort', externalAbort);
146
+ throw failure(`Cannot monitor review workspace: ${errorMessage(error)}`);
147
+ }
148
+ const check = async (contents = true) => {
149
+ controller.signal.throwIfAborted();
150
+ if (closed)
151
+ throw failure('Workspace handle is closed.');
152
+ if (scanning) {
153
+ await scanning;
154
+ // A caller asking for a full validation must not inherit a metadata-only poll.
155
+ if (!contents)
156
+ return;
157
+ }
158
+ scanning = (async () => {
159
+ let current;
160
+ do {
161
+ eventPending = false;
162
+ current = await inspect(root, { signal: controller.signal, requireReadonly: mode === 'copy', contents });
163
+ if (baseline && ((contents && current.hash !== baseline.hash) || current.metadataHash !== baseline.metadataHash))
164
+ throw changed(mode);
165
+ controller.signal.throwIfAborted();
166
+ } while (eventPending);
167
+ return current;
168
+ })().catch((error) => {
169
+ if (controller.signal.aborted)
170
+ throw controller.signal.reason;
171
+ // An entry can disappear or stop being a directory between lstat and readdir.
172
+ // Once a baseline exists, these races are input mutations, not unrelated IO failures.
173
+ if (baseline && (errorCode(error) === 'ENOENT' || errorCode(error) === 'ENOTDIR'))
174
+ error = changed(mode, errorMessage(error));
175
+ if (mode === 'copy' && errorCode(error) === 'WORKSPACE_CHANGED')
176
+ error = changed(mode, errorMessage(error));
177
+ abort(error);
178
+ throw error;
179
+ }).finally(() => { scanning = undefined; });
180
+ return scanning;
181
+ };
182
+ return {
183
+ signal: controller.signal,
184
+ async initialize(expected) {
185
+ const before = await inspect(root, { signal: controller.signal, requireReadonly: mode === 'copy', contents: false });
186
+ const current = await inspect(root, { signal: controller.signal, requireReadonly: mode === 'copy' });
187
+ if (before.metadataHash !== current.metadataHash)
188
+ throw changed(mode, 'input changed while acquiring the workspace');
189
+ baseline = current;
190
+ if (expected && (expected.hash !== baseline.hash || expected.metadataHash !== baseline.metadataHash)) {
191
+ abort(changed(mode, 'input changed since the request was prepared'));
192
+ controller.signal.throwIfAborted();
193
+ }
194
+ initialized = true;
195
+ if (eventPending)
196
+ await check(false);
197
+ // FSEvents can deliver notifications from before watch registration. Compare ctime/inode
198
+ // metadata rather than treating a delayed notification alone as a new mutation.
199
+ timer = setInterval(() => { if (!closed && !controller.signal.aborted)
200
+ void check(false).catch(() => { }); }, 1000);
201
+ timer.unref();
202
+ return baseline;
203
+ },
204
+ assertUnchanged: check,
205
+ async close() {
206
+ if (closed)
207
+ return;
208
+ closed = true;
209
+ clearInterval(timer);
210
+ watcher.close();
211
+ externalSignal?.removeEventListener('abort', externalAbort);
212
+ await scanning?.catch(() => { });
213
+ },
214
+ };
215
+ }
216
+ async function copyEntries(source, destination, entries, signal) {
217
+ for (const entry of entries) {
218
+ signal?.throwIfAborted();
219
+ const target = path.join(destination, entry.path);
220
+ if (entry.type === 'directory')
221
+ await mkdir(target, { mode: 0o700 });
222
+ else if (entry.type === 'symlink')
223
+ await symlink(entry.target, target);
224
+ else {
225
+ await copyFile(path.join(source, entry.path), target, constants.COPYFILE_EXCL);
226
+ await chmod(target, 0o444 | entry.executable);
227
+ }
228
+ }
229
+ for (const entry of [...entries].reverse()) {
230
+ if (entry.type === 'directory')
231
+ await chmod(path.join(destination, entry.path), 0o444 | entry.executable);
232
+ }
233
+ await chmod(destination, 0o555);
234
+ }
235
+ async function acquirePublication(cacheRoot, hash, signal) {
236
+ const lockPath = path.join(cacheRoot, `.publish-${hash}`);
237
+ const deadline = Date.now() + 30_000;
238
+ while (true) {
239
+ signal?.throwIfAborted();
240
+ try {
241
+ const lock = await open(lockPath, 'wx', 0o600);
242
+ const identity = await lock.stat();
243
+ try {
244
+ await lock.writeFile(JSON.stringify({ pid: process.pid }));
245
+ }
246
+ catch (error) {
247
+ await lock.close();
248
+ await unlink(lockPath).catch(() => { });
249
+ throw error;
250
+ }
251
+ return async () => {
252
+ await lock.close();
253
+ const current = await lstat(lockPath).catch(() => null);
254
+ if (current?.ino === identity.ino && current?.dev === identity.dev)
255
+ await unlink(lockPath);
256
+ };
257
+ }
258
+ catch (error) {
259
+ if (errorCode(error) !== 'EEXIST')
260
+ throw error;
261
+ const identity = await lstat(lockPath).catch(() => null);
262
+ if (identity?.isSymbolicLink())
263
+ throw failure('Cache publication lock must not be a symlink.');
264
+ const owner = await readFile(lockPath, 'utf8').then(value => JSON.parse(value)).catch(() => null);
265
+ if (typeof owner?.pid === 'number' && Number.isInteger(owner.pid) && owner.pid > 0) {
266
+ let dead = false;
267
+ try {
268
+ process.kill(owner.pid, 0);
269
+ }
270
+ catch (probeError) {
271
+ dead = errorCode(probeError) === 'ESRCH';
272
+ }
273
+ const current = await lstat(lockPath).catch(() => null);
274
+ if (dead && current?.ino === identity?.ino && current?.dev === identity?.dev) {
275
+ await unlink(lockPath).catch(error => { if (errorCode(error) !== 'ENOENT')
276
+ throw error; });
277
+ continue;
278
+ }
279
+ }
280
+ if (Date.now() >= deadline)
281
+ throw failure('Workspace cache publication is busy; retry this request.');
282
+ await delay(20, undefined, { signal });
283
+ }
284
+ }
285
+ }
286
+ /** Delete only caller-owned private scratch, never a shared cache or a source workspace. */
287
+ export async function removeOwnedWorkspaceTree(directory) {
288
+ // Only unpublished private staging is made writable; shared cache inputs are never mutated.
289
+ const makeWritable = async (current) => {
290
+ const info = await lstat(current);
291
+ if (!info.isDirectory())
292
+ return;
293
+ await chmod(current, 0o700);
294
+ for (const name of await readdir(current))
295
+ await makeWritable(path.join(current, name));
296
+ };
297
+ try {
298
+ await makeWritable(directory);
299
+ await rm(directory, { recursive: true, force: true });
300
+ }
301
+ catch (error) {
302
+ if (errorCode(error) !== 'ENOENT')
303
+ throw error;
304
+ }
305
+ }
306
+ export async function prepareWorkspace({ repoPath, stateDir, mode = 'copy', signal } = {}) {
307
+ if (!['copy', 'lock'].includes(mode))
308
+ throw failure('Workspace mode must be copy or lock.');
309
+ const canonical = await validateStateLocation(repoPath, stateDir);
310
+ const source = canonical.repoPath;
311
+ const observer = observe(source, 'lock', signal);
312
+ let stage;
313
+ let releasePublication;
314
+ try {
315
+ const initial = await observer.initialize();
316
+ if (mode === 'lock') {
317
+ const descriptor = Object.freeze({ version: 1, mode, sourcePath: source, path: source, hash: initial.hash, stateDir: canonical.stateDir, baselineMetadataHash: initial.metadataHash });
318
+ return { descriptor, signal: observer.signal, assertUnchanged: observer.assertUnchanged, close: observer.close };
319
+ }
320
+ const cacheRoot = path.join(canonical.stateDir, 'workspaces');
321
+ await mkdir(cacheRoot, { recursive: true, mode: 0o700 });
322
+ if (await realpath(cacheRoot) !== cacheRoot)
323
+ throw failure('Workspace cache directory must not be a symlink.');
324
+ const destination = path.join(cacheRoot, initial.hash);
325
+ releasePublication = await acquirePublication(cacheRoot, initial.hash, observer.signal);
326
+ let cached;
327
+ try {
328
+ if (!(await lstat(destination)).isDirectory())
329
+ throw changed('copy', 'cache root must be a regular directory');
330
+ cached = await inspect(destination, { signal, requireReadonly: true });
331
+ }
332
+ catch (error) {
333
+ if (errorCode(error) !== 'ENOENT')
334
+ throw error;
335
+ }
336
+ if (cached && cached.hash !== initial.hash)
337
+ throw changed('copy', 'cached content does not match its hash');
338
+ if (!cached) {
339
+ stage = path.join(cacheRoot, `.capture-${randomUUID()}`);
340
+ await mkdir(stage, { mode: 0o700 });
341
+ await copyEntries(source, stage, initial.entries, observer.signal);
342
+ const copied = await inspect(stage, { signal: observer.signal, requireReadonly: true });
343
+ if (copied.hash !== initial.hash)
344
+ throw changed('lock', 'source changed during copy');
345
+ await observer.assertUnchanged();
346
+ await rename(stage, destination);
347
+ stage = undefined;
348
+ }
349
+ await observer.assertUnchanged();
350
+ await observer.close();
351
+ if (stage) {
352
+ await removeOwnedWorkspaceTree(stage);
353
+ stage = undefined;
354
+ }
355
+ await releasePublication();
356
+ releasePublication = undefined;
357
+ const verified = await inspect(destination, { signal, requireReadonly: true });
358
+ if (verified.hash !== initial.hash)
359
+ throw changed('copy', 'cached content does not match its hash');
360
+ const descriptor = Object.freeze({ version: 1, mode, sourcePath: source, path: destination, hash: initial.hash, stateDir: canonical.stateDir, baselineMetadataHash: verified.metadataHash });
361
+ return await reopenWorkspace(descriptor, { signal });
362
+ }
363
+ catch (error) {
364
+ await observer.close();
365
+ if (stage)
366
+ await removeOwnedWorkspaceTree(stage);
367
+ await releasePublication?.();
368
+ throw error;
369
+ }
370
+ }
371
+ export async function reopenWorkspace(descriptor, { signal } = {}) {
372
+ if (!descriptor || descriptor.version !== 1 || !['copy', 'lock'].includes(descriptor.mode) ||
373
+ !HASH.test(descriptor.hash ?? '') || !HASH.test(descriptor.baselineMetadataHash ?? '') ||
374
+ ['sourcePath', 'path', 'stateDir'].some(key => typeof descriptor[key] !== 'string' || !path.isAbsolute(descriptor[key]))) {
375
+ throw failure('Invalid persisted workspace descriptor.');
376
+ }
377
+ const { mode, sourcePath, stateDir } = descriptor;
378
+ if (contained(sourcePath, stateDir))
379
+ throw failure('Persisted stateDir must be outside the source workspace.');
380
+ const expectedPath = mode === 'lock' ? sourcePath : path.join(stateDir, 'workspaces', descriptor.hash);
381
+ if (descriptor.path !== expectedPath || await realpath(descriptor.path) !== expectedPath || !(await lstat(expectedPath)).isDirectory()) {
382
+ throw failure('Persisted workspace descriptor has an invalid input path.');
383
+ }
384
+ const observer = observe(expectedPath, mode, signal);
385
+ try {
386
+ await observer.initialize({ hash: descriptor.hash, metadataHash: descriptor.baselineMetadataHash });
387
+ return { descriptor: Object.freeze({ ...descriptor }), signal: observer.signal, assertUnchanged: observer.assertUnchanged, close: observer.close };
388
+ }
389
+ catch (error) {
390
+ await observer.close();
391
+ throw error;
392
+ }
393
+ }
394
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/workspaces/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@ccdd/project",
3
+ "version": "2.0.1",
4
+ "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org/" },
5
+ "repository": { "type": "git", "url": "git+https://github.com/lhj6102/ccdd.git", "directory": "packages/project" },
6
+ "description": "Pull-based project validation, review history and request-scoped CCDD execution",
7
+ "type": "module",
8
+ "engines": { "node": ">=24" },
9
+ "exports": { ".": { "types": "./dist/src/project/index.d.ts", "import": "./dist/src/project/index.js" } },
10
+ "types": "./dist/src/project/index.d.ts",
11
+ "bin": { "ccdd-project": "./dist/src/project/cli.js", "ccdd": "./dist/src/cli.js" },
12
+ "files": ["dist/", "README.md"],
13
+ "scripts": { "build": "node ../../scripts/build-project.mjs", "prepack": "npm run build" },
14
+ "peerDependencies": { "@ccdd/core": ">=2.0.0 <3" },
15
+ "dependencies": {
16
+ "@earendil-works/pi-agent-core": "0.85.1",
17
+ "@earendil-works/pi-ai": "0.85.1",
18
+ "@lucide/vue": "1.41.0",
19
+ "@vue-flow/background": "1.3.2",
20
+ "@vue-flow/core": "1.48.2",
21
+ "elkjs": "0.12.0",
22
+ "typebox": "1.3.7",
23
+ "vue": "3.5.42"
24
+ },
25
+ "devDependencies": { "@ccdd/core": "file:../.." }
26
+ }