agentopology 0.5.1 → 0.6.0

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 (121) hide show
  1. package/README.md +5 -5
  2. package/dist/__tests__/e2e/roundtrip.test.d.ts +16 -0
  3. package/dist/__tests__/e2e/roundtrip.test.d.ts.map +1 -0
  4. package/dist/__tests__/e2e/roundtrip.test.js +178 -0
  5. package/dist/__tests__/e2e/roundtrip.test.js.map +1 -0
  6. package/dist/__tests__/e2e/scaffold-owns.test.d.ts +10 -0
  7. package/dist/__tests__/e2e/scaffold-owns.test.d.ts.map +1 -0
  8. package/dist/__tests__/e2e/scaffold-owns.test.js +154 -0
  9. package/dist/__tests__/e2e/scaffold-owns.test.js.map +1 -0
  10. package/dist/__tests__/global-setup.d.ts +7 -0
  11. package/dist/__tests__/global-setup.d.ts.map +1 -0
  12. package/dist/__tests__/global-setup.js +16 -0
  13. package/dist/__tests__/global-setup.js.map +1 -0
  14. package/dist/__tests__/live/claude-code.live.test.d.ts +20 -0
  15. package/dist/__tests__/live/claude-code.live.test.d.ts.map +1 -0
  16. package/dist/__tests__/live/claude-code.live.test.js +136 -0
  17. package/dist/__tests__/live/claude-code.live.test.js.map +1 -0
  18. package/dist/__tests__/live/zz-debug.test.d.ts +2 -0
  19. package/dist/__tests__/live/zz-debug.test.d.ts.map +1 -0
  20. package/dist/__tests__/live/zz-debug.test.js +4 -0
  21. package/dist/__tests__/live/zz-debug.test.js.map +1 -0
  22. package/dist/__tests__/open-findings.test.d.ts +10 -0
  23. package/dist/__tests__/open-findings.test.d.ts.map +1 -0
  24. package/dist/__tests__/open-findings.test.js +37 -0
  25. package/dist/__tests__/open-findings.test.js.map +1 -0
  26. package/dist/__tests__/spec-testing-sync.test.d.ts +10 -0
  27. package/dist/__tests__/spec-testing-sync.test.d.ts.map +1 -0
  28. package/dist/__tests__/spec-testing-sync.test.js +57 -0
  29. package/dist/__tests__/spec-testing-sync.test.js.map +1 -0
  30. package/dist/bindings/__tests__/hook-command.test.d.ts +9 -0
  31. package/dist/bindings/__tests__/hook-command.test.d.ts.map +1 -0
  32. package/dist/bindings/__tests__/hook-command.test.js +88 -0
  33. package/dist/bindings/__tests__/hook-command.test.js.map +1 -0
  34. package/dist/bindings/__tests__/mod-plugin.test.d.ts +9 -0
  35. package/dist/bindings/__tests__/mod-plugin.test.d.ts.map +1 -0
  36. package/dist/bindings/__tests__/mod-plugin.test.js +164 -0
  37. package/dist/bindings/__tests__/mod-plugin.test.js.map +1 -0
  38. package/dist/bindings/claude-code.d.ts +52 -1
  39. package/dist/bindings/claude-code.d.ts.map +1 -1
  40. package/dist/bindings/claude-code.js +306 -68
  41. package/dist/bindings/claude-code.js.map +1 -1
  42. package/dist/bindings/index.d.ts +7 -0
  43. package/dist/bindings/index.d.ts.map +1 -1
  44. package/dist/bindings/index.js +26 -7
  45. package/dist/bindings/index.js.map +1 -1
  46. package/dist/bindings/types.d.ts +6 -0
  47. package/dist/bindings/types.d.ts.map +1 -1
  48. package/dist/bindings/types.js.map +1 -1
  49. package/dist/cli/__tests__/cli.test.d.ts +1 -1
  50. package/dist/cli/__tests__/cli.test.js +1 -1
  51. package/dist/cli/index.js +118 -78
  52. package/dist/cli/index.js.map +1 -1
  53. package/dist/docs/content.d.ts.map +1 -1
  54. package/dist/docs/content.js +39 -3
  55. package/dist/docs/content.js.map +1 -1
  56. package/dist/docs/teach.d.ts.map +1 -1
  57. package/dist/docs/teach.js +36 -0
  58. package/dist/docs/teach.js.map +1 -1
  59. package/dist/import/__tests__/import.test.js +21 -9
  60. package/dist/import/__tests__/import.test.js.map +1 -1
  61. package/dist/import/claude-code.d.ts.map +1 -1
  62. package/dist/import/claude-code.js +128 -44
  63. package/dist/import/claude-code.js.map +1 -1
  64. package/dist/import/serializer.d.ts.map +1 -1
  65. package/dist/import/serializer.js +10 -0
  66. package/dist/import/serializer.js.map +1 -1
  67. package/dist/parser/__tests__/mod-hooks.test.d.ts +10 -0
  68. package/dist/parser/__tests__/mod-hooks.test.d.ts.map +1 -0
  69. package/dist/parser/__tests__/mod-hooks.test.js +136 -0
  70. package/dist/parser/__tests__/mod-hooks.test.js.map +1 -0
  71. package/dist/parser/ast.d.ts +29 -2
  72. package/dist/parser/ast.d.ts.map +1 -1
  73. package/dist/parser/ast.js.map +1 -1
  74. package/dist/parser/index.d.ts +6 -1
  75. package/dist/parser/index.d.ts.map +1 -1
  76. package/dist/parser/index.js +76 -22
  77. package/dist/parser/index.js.map +1 -1
  78. package/dist/parser/paths.d.ts +15 -0
  79. package/dist/parser/paths.d.ts.map +1 -0
  80. package/dist/parser/paths.js +34 -0
  81. package/dist/parser/paths.js.map +1 -0
  82. package/dist/parser/run.d.ts +24 -0
  83. package/dist/parser/run.d.ts.map +1 -0
  84. package/dist/parser/run.js +55 -0
  85. package/dist/parser/run.js.map +1 -0
  86. package/dist/parser/validator.d.ts +12 -0
  87. package/dist/parser/validator.d.ts.map +1 -1
  88. package/dist/parser/validator.js +218 -2
  89. package/dist/parser/validator.js.map +1 -1
  90. package/dist/scaffold/__tests__/safety.test.d.ts +11 -0
  91. package/dist/scaffold/__tests__/safety.test.d.ts.map +1 -0
  92. package/dist/scaffold/__tests__/safety.test.js +184 -0
  93. package/dist/scaffold/__tests__/safety.test.js.map +1 -0
  94. package/dist/scaffold/__tests__/scaffold.test.js +2 -1
  95. package/dist/scaffold/__tests__/scaffold.test.js.map +1 -1
  96. package/dist/scaffold/__tests__/settings-merge.test.js +40 -9
  97. package/dist/scaffold/__tests__/settings-merge.test.js.map +1 -1
  98. package/dist/scaffold/incremental.d.ts +49 -13
  99. package/dist/scaffold/incremental.d.ts.map +1 -1
  100. package/dist/scaffold/incremental.js +235 -95
  101. package/dist/scaffold/incremental.js.map +1 -1
  102. package/dist/scaffold/manifest.d.ts +8 -1
  103. package/dist/scaffold/manifest.d.ts.map +1 -1
  104. package/dist/scaffold/manifest.js +32 -8
  105. package/dist/scaffold/manifest.js.map +1 -1
  106. package/dist/scaffold/merge.d.ts +15 -4
  107. package/dist/scaffold/merge.d.ts.map +1 -1
  108. package/dist/scaffold/merge.js +109 -18
  109. package/dist/scaffold/merge.js.map +1 -1
  110. package/dist/scaffold/types.d.ts +17 -0
  111. package/dist/scaffold/types.d.ts.map +1 -1
  112. package/dist/visualizer/__tests__/gate-connectors.test.d.ts +2 -0
  113. package/dist/visualizer/__tests__/gate-connectors.test.d.ts.map +1 -0
  114. package/dist/visualizer/__tests__/gate-connectors.test.js +88 -0
  115. package/dist/visualizer/__tests__/gate-connectors.test.js.map +1 -0
  116. package/dist/visualizer/index.js +41 -4
  117. package/dist/visualizer/index.js.map +1 -1
  118. package/package.json +1 -1
  119. package/spec/grammar.md +20 -4
  120. package/spec/testing.md +81 -0
  121. package/spec/validation.md +6 -2
@@ -1,20 +1,58 @@
1
1
  /**
2
2
  * Incremental scaffold orchestrator.
3
3
  *
4
- * Computes a plan of file actions (create, update, delete, unchanged, conflict)
5
- * by comparing freshly generated files against what is on disk and what was
6
- * previously tracked in the scaffold manifest.
4
+ * Computes a plan of file actions (create, update, delete, unchanged, conflict,
5
+ * blocked) by comparing freshly generated files against what is on disk and
6
+ * what was previously tracked in the scaffold manifest.
7
+ *
8
+ * The rule the plan enforces: scaffold only changes what it owns. A file is
9
+ * owned when the manifest records it. Anything else on disk — a hand-written
10
+ * skill, a settings file, a symlink into another repo — is a conflict (kept
11
+ * unless --force) or blocked (never touched). The first scaffold used to skip
12
+ * this plan and write everything; it overwrote real files and, following a
13
+ * symlink, files in a second repository.
7
14
  *
8
15
  * @module
9
16
  */
10
- import { chmodSync, existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
17
+ import { chmodSync, existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, rmdirSync, unlinkSync, writeFileSync, } from "node:fs";
11
18
  import { dirname, join } from "node:path";
19
+ import { hashContent } from "./manifest.js";
12
20
  import { mergeAgentFile, shouldOverwriteScript, deepMergeJson, deepMergeSettingsJson, } from "./merge.js";
21
+ export { unsafePathReason } from "../parser/paths.js";
22
+ import { unsafePathReason } from "../parser/paths.js";
23
+ /**
24
+ * The first symlink between `basePath` and the file, or null. Scaffold never
25
+ * writes through one: a linked skill folder belongs to somewhere else.
26
+ */
27
+ function symlinkOnPath(basePath, relPath) {
28
+ let cur = basePath;
29
+ for (const seg of relPath.split("/")) {
30
+ cur = join(cur, seg);
31
+ try {
32
+ if (lstatSync(cur).isSymbolicLink())
33
+ return cur.slice(basePath.length + 1);
34
+ }
35
+ catch {
36
+ return null; // does not exist yet — nothing further down can be a link
37
+ }
38
+ }
39
+ return null;
40
+ }
41
+ function isDirectory(absPath) {
42
+ try {
43
+ return lstatSync(absPath).isDirectory();
44
+ }
45
+ catch {
46
+ return false;
47
+ }
48
+ }
13
49
  /**
14
50
  * Compute an incremental scaffold plan.
15
51
  *
16
52
  * Compares generated files against what exists on disk and the previous
17
- * manifest to determine the minimal set of file operations needed.
53
+ * manifest to determine the minimal set of file operations needed. Used for
54
+ * the first scaffold too (manifest null): every existing file is then
55
+ * unmanaged and therefore a conflict, never an overwrite.
18
56
  *
19
57
  * @param basePath - Absolute path to the project root
20
58
  * @param target - Binding target name (e.g. "claude-code")
@@ -29,9 +67,26 @@ export function computeIncrementalPlan(basePath, target, generatedFiles, manifes
29
67
  for (const file of generatedFiles) {
30
68
  generatedMap.set(file.path, file);
31
69
  }
70
+ // Everything this topology writes or wrote: hooks whose command names one of
71
+ // these paths belong to it; every other hook in settings.json is the user's.
72
+ const ownedPaths = [...generatedMap.keys(), ...Object.keys(manifest?.files ?? {})];
32
73
  // Process each generated file
33
74
  for (const file of generatedFiles) {
75
+ const unsafe = unsafePathReason(file.path);
76
+ if (unsafe) {
77
+ actions.push({ type: "blocked", path: file.path, detail: unsafe, unsafe: true });
78
+ continue;
79
+ }
80
+ const link = symlinkOnPath(basePath, file.path);
81
+ if (link) {
82
+ actions.push({ type: "blocked", path: file.path, detail: `symlink at ${link} — never written through` });
83
+ continue;
84
+ }
34
85
  const absPath = join(basePath, file.path);
86
+ if (isDirectory(absPath)) {
87
+ actions.push({ type: "blocked", path: file.path, detail: "a directory exists at this path" });
88
+ continue;
89
+ }
35
90
  const category = file.category ?? "machine";
36
91
  const onDisk = existsSync(absPath);
37
92
  if (!onDisk) {
@@ -43,8 +98,46 @@ export function computeIncrementalPlan(basePath, target, generatedFiles, manifes
43
98
  });
44
99
  continue;
45
100
  }
101
+ if (file.createOnly) {
102
+ actions.push({ type: "kept", path: file.path, detail: "the user's own file; created only when missing" });
103
+ continue;
104
+ }
46
105
  const existingContent = readFileSync(absPath, "utf-8");
47
106
  const manifestEntry = manifest?.files[file.path] ?? null;
107
+ if (existingContent === file.content) {
108
+ actions.push({ type: "unchanged", path: file.path });
109
+ continue;
110
+ }
111
+ // Config files merge whether or not scaffold made them: the merge keeps
112
+ // every key, hook and rule the user wrote.
113
+ if (category === "shared-config") {
114
+ const isSettings = /(^|\/)settings\.json$/.test(file.path);
115
+ const merged = isSettings
116
+ ? deepMergeSettingsJson(existingContent, file.content, ownedPaths)
117
+ : deepMergeJson(existingContent, file.content);
118
+ if (merged === existingContent) {
119
+ actions.push({ type: "unchanged", path: file.path });
120
+ }
121
+ else {
122
+ actions.push({
123
+ type: "update",
124
+ path: file.path,
125
+ content: merged,
126
+ detail: "config merged",
127
+ });
128
+ }
129
+ continue;
130
+ }
131
+ // Not in the manifest: a file scaffold did not create. Never overwrite it.
132
+ if (!manifestEntry) {
133
+ actions.push({
134
+ type: "conflict",
135
+ path: file.path,
136
+ content: file.content,
137
+ detail: "exists, not created by scaffold",
138
+ });
139
+ continue;
140
+ }
48
141
  switch (category) {
49
142
  case "agent": {
50
143
  const merged = mergeAgentFile(existingContent, file.content, target);
@@ -61,145 +154,192 @@ export function computeIncrementalPlan(basePath, target, generatedFiles, manifes
61
154
  }
62
155
  break;
63
156
  }
64
- case "script": {
65
- const manifestHash = manifestEntry?.hash ?? "";
66
- if (shouldOverwriteScript(existingContent, manifestHash)) {
67
- // User hasn't edited — safe to overwrite
68
- if (file.content === existingContent) {
69
- actions.push({ type: "unchanged", path: file.path });
70
- }
71
- else {
72
- actions.push({
73
- type: "update",
74
- path: file.path,
75
- content: file.content,
76
- detail: "script regenerated",
77
- });
78
- }
79
- }
80
- else {
81
- // User has edited — conflict
82
- actions.push({
83
- type: "conflict",
84
- path: file.path,
85
- content: file.content,
86
- detail: "user edited",
87
- });
88
- }
89
- break;
90
- }
91
- case "shared-config": {
92
- // settings.json needs the DOMAIN-AWARE merge, not the generic one.
93
- // The generic `deepMergeJson` keeps the existing value whenever a key
94
- // exists on both sides and either side is not a plain object — and
95
- // `hooks[event]` is an ARRAY. So adding a hook to an event the file
96
- // already declares silently dropped it, and removing a hook was
97
- // impossible. `deepMergeSettingsJson` unions permissions, merges env,
98
- // and lets the topology own `hooks` outright (including deleting it).
99
- // It was written and fully tested but never reachable until now.
100
- const isSettings = /(^|\/)settings\.json$/.test(file.path);
101
- const merged = isSettings
102
- ? deepMergeSettingsJson(existingContent, file.content)
103
- : deepMergeJson(existingContent, file.content);
104
- if (merged === existingContent) {
105
- actions.push({ type: "unchanged", path: file.path });
106
- }
107
- else {
157
+ case "script":
158
+ case "machine":
159
+ default: {
160
+ // Overwrite only what is still exactly as scaffold left it. CLAUDE.md,
161
+ // commands and crontab.fragment used to be overwritten on every run,
162
+ // edits and all.
163
+ if (shouldOverwriteScript(existingContent, manifestEntry.hash)) {
108
164
  actions.push({
109
165
  type: "update",
110
166
  path: file.path,
111
- content: merged,
112
- detail: "config merged",
167
+ content: file.content,
168
+ detail: category === "script" ? "script regenerated" : "config updated",
169
+ ...(file.executable ? { executable: true } : {}),
113
170
  });
114
171
  }
115
- break;
116
- }
117
- case "machine":
118
- default: {
119
- if (file.content === existingContent) {
120
- actions.push({ type: "unchanged", path: file.path });
121
- }
122
172
  else {
123
173
  actions.push({
124
- type: "update",
174
+ type: "conflict",
125
175
  path: file.path,
126
176
  content: file.content,
127
- detail: "config updated",
177
+ detail: "user edited",
128
178
  });
129
179
  }
130
180
  break;
131
181
  }
132
182
  }
133
183
  }
134
- // Check for files in manifest that are no longer generated (deletions)
184
+ // Files in the manifest that are no longer generated
135
185
  if (manifest) {
136
- for (const manifestPath of Object.keys(manifest.files)) {
137
- if (!generatedMap.has(manifestPath)) {
138
- actions.push({ type: "delete", path: manifestPath });
186
+ for (const [manifestPath, entry] of Object.entries(manifest.files)) {
187
+ if (generatedMap.has(manifestPath))
188
+ continue;
189
+ if (unsafePathReason(manifestPath))
190
+ continue;
191
+ const absPath = join(basePath, manifestPath);
192
+ if (!existsSync(absPath))
193
+ continue;
194
+ if (symlinkOnPath(basePath, manifestPath)) {
195
+ actions.push({ type: "blocked", path: manifestPath, detail: "symlink — never deleted through" });
196
+ continue;
197
+ }
198
+ if (hashContent(readFileSync(absPath, "utf-8")) !== entry.hash) {
199
+ actions.push({ type: "blocked", path: manifestPath, detail: "no longer generated, but edited — kept" });
200
+ continue;
139
201
  }
202
+ actions.push({ type: "delete", path: manifestPath });
140
203
  }
141
204
  }
142
205
  return actions;
143
206
  }
207
+ /** Remove now-empty directories from `absDir` up to (not including) `basePath`. */
208
+ function removeEmptyDirs(basePath, absDir) {
209
+ let cur = absDir;
210
+ while (cur.startsWith(basePath + "/") && cur !== basePath) {
211
+ try {
212
+ if (readdirSync(cur).length > 0)
213
+ return;
214
+ rmdirSync(cur);
215
+ }
216
+ catch {
217
+ return;
218
+ }
219
+ cur = dirname(cur);
220
+ }
221
+ }
144
222
  /**
145
223
  * Execute a set of file actions against the filesystem.
146
224
  *
225
+ * Refuses outright when the plan holds an unsafe path, so a bad plan writes
226
+ * nothing at all. A single failed write is recorded and the rest proceed, so
227
+ * the caller can still write a manifest that matches the disk.
228
+ *
147
229
  * @param basePath - Absolute path to the project root
148
230
  * @param actions - File actions computed by {@link computeIncrementalPlan}
149
231
  * @param options - Execution options
150
- * @returns Counts of each action type performed
232
+ * @returns Counts of each action type performed, plus what was written
151
233
  */
152
234
  export function executeActions(basePath, actions, options) {
153
- const counts = { created: 0, updated: 0, deleted: 0, unchanged: 0, conflicts: 0 };
235
+ const unsafe = actions.filter((a) => a.type === "blocked" && a.unsafe);
236
+ if (unsafe.length > 0) {
237
+ throw new Error(`refusing to write: ${unsafe.length} unsafe path(s): ` +
238
+ unsafe.map((a) => `${a.path}`).join(", "));
239
+ }
240
+ const result = {
241
+ created: 0,
242
+ updated: 0,
243
+ deleted: 0,
244
+ unchanged: 0,
245
+ conflicts: 0,
246
+ blocked: 0,
247
+ written: new Map(),
248
+ removed: [],
249
+ failures: [],
250
+ };
251
+ const write = (path, content, executable) => {
252
+ const absPath = join(basePath, path);
253
+ try {
254
+ mkdirSync(dirname(absPath), { recursive: true });
255
+ writeFileSync(absPath, content, "utf-8");
256
+ if (executable)
257
+ chmodSync(absPath, 0o755);
258
+ result.written.set(path, content);
259
+ return true;
260
+ }
261
+ catch (err) {
262
+ result.failures.push({ path, error: err.message });
263
+ return false;
264
+ }
265
+ };
154
266
  for (const action of actions) {
155
- const absPath = join(basePath, action.path);
156
267
  switch (action.type) {
157
268
  case "create": {
158
- const dir = dirname(absPath);
159
- if (!existsSync(dir)) {
160
- mkdirSync(dir, { recursive: true });
161
- }
162
- writeFileSync(absPath, action.content, "utf-8");
163
- if (action.executable)
164
- chmodSync(absPath, 0o755);
165
- counts.created++;
269
+ if (write(action.path, action.content, action.executable))
270
+ result.created++;
166
271
  break;
167
272
  }
168
273
  case "update": {
169
- const dir = dirname(absPath);
170
- if (!existsSync(dir)) {
171
- mkdirSync(dir, { recursive: true });
172
- }
173
- writeFileSync(absPath, action.content, "utf-8");
174
- if (action.executable)
175
- chmodSync(absPath, 0o755);
176
- counts.updated++;
274
+ if (write(action.path, action.content, action.executable))
275
+ result.updated++;
177
276
  break;
178
277
  }
179
278
  case "delete": {
279
+ const absPath = join(basePath, action.path);
180
280
  if (options.prune && existsSync(absPath)) {
181
- unlinkSync(absPath);
281
+ try {
282
+ unlinkSync(absPath);
283
+ result.removed.push(action.path);
284
+ removeEmptyDirs(basePath, dirname(absPath));
285
+ }
286
+ catch (err) {
287
+ result.failures.push({ path: action.path, error: err.message });
288
+ }
182
289
  }
183
- counts.deleted++;
290
+ result.deleted++;
184
291
  break;
185
292
  }
186
293
  case "conflict": {
187
- if (options.force) {
188
- const dir = dirname(absPath);
189
- if (!existsSync(dir)) {
190
- mkdirSync(dir, { recursive: true });
191
- }
192
- writeFileSync(absPath, action.content, "utf-8");
193
- }
194
- counts.conflicts++;
294
+ if (options.force)
295
+ write(action.path, action.content);
296
+ result.conflicts++;
297
+ break;
298
+ }
299
+ case "blocked": {
300
+ result.blocked++;
301
+ break;
302
+ }
303
+ case "kept": {
304
+ result.unchanged++;
195
305
  break;
196
306
  }
197
307
  case "unchanged": {
198
- counts.unchanged++;
308
+ result.unchanged++;
199
309
  break;
200
310
  }
201
311
  }
202
312
  }
203
- return counts;
313
+ return result;
314
+ }
315
+ /**
316
+ * The manifest after a run: exactly the files scaffold now owns, hashed as
317
+ * they are on disk.
318
+ *
319
+ * Owned = written or unchanged this run, plus earlier entries for files the
320
+ * run left alone (an edited file keeps its old hash, so it stays a conflict;
321
+ * an unpruned leftover stays tracked, so a later --prune can still remove it).
322
+ * A pre-existing file scaffold did not write is never claimed.
323
+ */
324
+ export function nextManifestFiles(basePath, actions, generatedFiles, previous, result) {
325
+ const categoryOf = new Map(generatedFiles.map((f) => [f.path, f.category ?? "machine"]));
326
+ const files = {};
327
+ const removed = new Set(result.removed);
328
+ for (const action of actions) {
329
+ const prev = previous?.files[action.path];
330
+ const category = categoryOf.get(action.path) ?? prev?.category ?? "machine";
331
+ const written = result.written.get(action.path);
332
+ if (written !== undefined) {
333
+ files[action.path] = { hash: hashContent(written), category };
334
+ }
335
+ else if (action.type === "unchanged") {
336
+ const onDisk = readFileSync(join(basePath, action.path), "utf-8");
337
+ files[action.path] = { hash: hashContent(onDisk), category };
338
+ }
339
+ else if (prev && !removed.has(action.path)) {
340
+ files[action.path] = prev;
341
+ }
342
+ }
343
+ return files;
204
344
  }
205
345
  //# sourceMappingURL=incremental.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"incremental.js","sourceRoot":"","sources":["../../src/scaffold/incremental.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"incremental.js","sourceRoot":"","sources":["../../src/scaffold/incremental.ts"],"names":[],"mappings":"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"}
@@ -17,10 +17,17 @@ export declare function getManifestPath(target: string): string;
17
17
  /**
18
18
  * Read an existing scaffold manifest from disk.
19
19
  * Returns `null` if the manifest does not exist or cannot be parsed.
20
+ *
21
+ * With `source` (the .at file name), returns only that topology's manifest:
22
+ * two topologies scaffolded into one project used to share one manifest, so
23
+ * the second treated the first one's files as its own — overwriting its
24
+ * crontab and, with --prune, deleting its scripts.
20
25
  */
21
- export declare function readManifest(basePath: string, target: string): ScaffoldManifest | null;
26
+ export declare function readManifest(basePath: string, target: string, source?: string): ScaffoldManifest | null;
22
27
  /**
23
28
  * Write a scaffold manifest to disk, creating parent directories as needed.
29
+ * Never replaces another topology's manifest: when the shared file belongs to
30
+ * a different source, this one goes beside it.
24
31
  */
25
32
  export declare function writeManifest(basePath: string, target: string, manifest: ScaffoldManifest): void;
26
33
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/scaffold/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAInD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAkBtD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,gBAAgB,GAAG,IAAI,CAUzB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,gBAAgB,GACzB,IAAI,CAON;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/scaffold/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAInD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAkBtD;AAmBD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,gBAAgB,GAAG,IAAI,CAMzB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,gBAAgB,GACzB,IAAI,CAWN;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD"}
@@ -36,26 +36,50 @@ export function getManifestPath(target) {
36
36
  }
37
37
  }
38
38
  /**
39
- * Read an existing scaffold manifest from disk.
40
- * Returns `null` if the manifest does not exist or cannot be parsed.
39
+ * Where one topology's manifest lives when the shared one belongs to another
40
+ * topology: `.scaffold-manifest.<source>.json` beside it.
41
41
  */
42
- export function readManifest(basePath, target) {
43
- const manifestPath = join(basePath, getManifestPath(target));
44
- if (!existsSync(manifestPath))
42
+ function perSourcePath(target, source) {
43
+ return getManifestPath(target).replace(/\.json$/, `.${source.replace(/[^A-Za-z0-9_.-]/g, "_")}.json`);
44
+ }
45
+ function readJson(path) {
46
+ if (!existsSync(path))
45
47
  return null;
46
48
  try {
47
- const raw = readFileSync(manifestPath, "utf-8");
48
- return JSON.parse(raw);
49
+ return JSON.parse(readFileSync(path, "utf-8"));
49
50
  }
50
51
  catch {
51
52
  return null;
52
53
  }
53
54
  }
55
+ /**
56
+ * Read an existing scaffold manifest from disk.
57
+ * Returns `null` if the manifest does not exist or cannot be parsed.
58
+ *
59
+ * With `source` (the .at file name), returns only that topology's manifest:
60
+ * two topologies scaffolded into one project used to share one manifest, so
61
+ * the second treated the first one's files as its own — overwriting its
62
+ * crontab and, with --prune, deleting its scripts.
63
+ */
64
+ export function readManifest(basePath, target, source) {
65
+ const shared = readJson(join(basePath, getManifestPath(target)));
66
+ if (!source)
67
+ return shared;
68
+ const own = readJson(join(basePath, perSourcePath(target, source)));
69
+ if (own)
70
+ return own;
71
+ return shared && shared.source === source ? shared : null;
72
+ }
54
73
  /**
55
74
  * Write a scaffold manifest to disk, creating parent directories as needed.
75
+ * Never replaces another topology's manifest: when the shared file belongs to
76
+ * a different source, this one goes beside it.
56
77
  */
57
78
  export function writeManifest(basePath, target, manifest) {
58
- const manifestPath = join(basePath, getManifestPath(target));
79
+ const sharedPath = join(basePath, getManifestPath(target));
80
+ const shared = readJson(sharedPath);
81
+ const ownPath = join(basePath, perSourcePath(target, manifest.source));
82
+ const manifestPath = existsSync(ownPath) || (shared && shared.source !== manifest.source) ? ownPath : sharedPath;
59
83
  const dir = dirname(manifestPath);
60
84
  if (!existsSync(dir)) {
61
85
  mkdirSync(dir, { recursive: true });
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/scaffold/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAI1C,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,aAAa;YAChB,OAAO,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QAC5C,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QAC3C,KAAK,YAAY;YACf,OAAO,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QAC5C,KAAK,aAAa;YAChB,OAAO,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QAC5C,KAAK,UAAU;YACb,OAAO,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;QAC9C,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAC1C;YACE,4CAA4C;YAC5C,OAAO,iBAAiB,CAAC;IAC7B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,QAAgB,EAChB,MAAc;IAEd,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7D,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAgB,EAChB,MAAc,EACd,QAA0B;IAE1B,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAClC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACjF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC"}
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/scaffold/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAI1C,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,aAAa;YAChB,OAAO,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QAC5C,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QAC3C,KAAK,YAAY;YACf,OAAO,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QAC5C,KAAK,aAAa;YAChB,OAAO,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QAC5C,KAAK,UAAU;YACb,OAAO,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;QAC9C,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAC1C;YACE,4CAA4C;YAC5C,OAAO,iBAAiB,CAAC;IAC7B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,MAAc,EAAE,MAAc;IACnD,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;AACxG,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAqB,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAC1B,QAAgB,EAChB,MAAc,EACd,MAAe;IAEf,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACpE,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IACpB,OAAO,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAgB,EAChB,MAAc,EACd,QAA0B;IAE1B,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACvE,MAAM,YAAY,GAChB,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;IAC9F,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAClC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACjF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC"}
@@ -52,17 +52,28 @@ export declare function deepMergeJson(existingRaw: string, generatedRaw: string)
52
52
  /**
53
53
  * Merge settings.json files with domain-aware logic for Claude Code settings.
54
54
  *
55
+ * The user's file is the base; scaffold only adds or replaces what it owns.
56
+ *
55
57
  * Rules:
56
- * - permissions.allow: union-merge (deduplicated)
57
- * - permissions.deny: union-merge (deduplicated)
58
+ * - permissions: every existing key is kept (ask, defaultMode,
59
+ * additionalDirectories, ...); allow, deny and ask arrays are
60
+ * union-merged; a generated scalar is added only where none exists
58
61
  * - env: shallow-merge (generated wins on key conflict)
59
- * - hooks: rewritten entirely from generated (topology owns hooks)
62
+ * - hooks: a hook group is the topology's when one of its commands names a
63
+ * path in `ownedPaths`; those are replaced by the generated hooks, and
64
+ * every other group — the user's — is kept. Without `ownedPaths`, nothing
65
+ * existing is treated as owned, so nothing is removed
60
66
  * - All other top-level keys: existing wins (user-only keys preserved)
61
67
  *
68
+ * This used to rebuild permissions from allow/deny alone and replace hooks
69
+ * wholesale, so a re-scaffold deleted the user's own hooks, ask rules and
70
+ * defaultMode, and two topologies in one repo deleted each other's hooks.
71
+ *
62
72
  * @param existingRaw - Current settings.json content on disk (JSON string, or empty string)
63
73
  * @param generatedRaw - Freshly generated settings.json content (JSON string)
74
+ * @param ownedPaths - Paths this topology writes or wrote (generated + manifest)
64
75
  * @returns Merged JSON string
65
76
  * @throws {Error} if existingRaw is non-empty and is invalid JSON
66
77
  */
67
- export declare function deepMergeSettingsJson(existingRaw: string, generatedRaw: string): string;
78
+ export declare function deepMergeSettingsJson(existingRaw: string, generatedRaw: string, ownedPaths?: string[]): string;
68
79
  //# sourceMappingURL=merge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/scaffold/merge.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAuBH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,MAAM,CA4CR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,GACnB,OAAO,CAET;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAc/E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAmEvF"}
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/scaffold/merge.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAuBH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,MAAM,CA4CR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,GACnB,OAAO,CAET;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAgB/E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,UAAU,GAAE,MAAM,EAAO,GACxB,MAAM,CA+ER"}