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.
- package/README.md +5 -5
- package/dist/__tests__/e2e/roundtrip.test.d.ts +16 -0
- package/dist/__tests__/e2e/roundtrip.test.d.ts.map +1 -0
- package/dist/__tests__/e2e/roundtrip.test.js +178 -0
- package/dist/__tests__/e2e/roundtrip.test.js.map +1 -0
- package/dist/__tests__/e2e/scaffold-owns.test.d.ts +10 -0
- package/dist/__tests__/e2e/scaffold-owns.test.d.ts.map +1 -0
- package/dist/__tests__/e2e/scaffold-owns.test.js +154 -0
- package/dist/__tests__/e2e/scaffold-owns.test.js.map +1 -0
- package/dist/__tests__/global-setup.d.ts +7 -0
- package/dist/__tests__/global-setup.d.ts.map +1 -0
- package/dist/__tests__/global-setup.js +16 -0
- package/dist/__tests__/global-setup.js.map +1 -0
- package/dist/__tests__/live/claude-code.live.test.d.ts +20 -0
- package/dist/__tests__/live/claude-code.live.test.d.ts.map +1 -0
- package/dist/__tests__/live/claude-code.live.test.js +136 -0
- package/dist/__tests__/live/claude-code.live.test.js.map +1 -0
- package/dist/__tests__/live/zz-debug.test.d.ts +2 -0
- package/dist/__tests__/live/zz-debug.test.d.ts.map +1 -0
- package/dist/__tests__/live/zz-debug.test.js +4 -0
- package/dist/__tests__/live/zz-debug.test.js.map +1 -0
- package/dist/__tests__/open-findings.test.d.ts +10 -0
- package/dist/__tests__/open-findings.test.d.ts.map +1 -0
- package/dist/__tests__/open-findings.test.js +37 -0
- package/dist/__tests__/open-findings.test.js.map +1 -0
- package/dist/__tests__/spec-testing-sync.test.d.ts +10 -0
- package/dist/__tests__/spec-testing-sync.test.d.ts.map +1 -0
- package/dist/__tests__/spec-testing-sync.test.js +57 -0
- package/dist/__tests__/spec-testing-sync.test.js.map +1 -0
- package/dist/bindings/__tests__/hook-command.test.d.ts +9 -0
- package/dist/bindings/__tests__/hook-command.test.d.ts.map +1 -0
- package/dist/bindings/__tests__/hook-command.test.js +88 -0
- package/dist/bindings/__tests__/hook-command.test.js.map +1 -0
- package/dist/bindings/__tests__/mod-plugin.test.d.ts +9 -0
- package/dist/bindings/__tests__/mod-plugin.test.d.ts.map +1 -0
- package/dist/bindings/__tests__/mod-plugin.test.js +164 -0
- package/dist/bindings/__tests__/mod-plugin.test.js.map +1 -0
- package/dist/bindings/claude-code.d.ts +52 -1
- package/dist/bindings/claude-code.d.ts.map +1 -1
- package/dist/bindings/claude-code.js +306 -68
- package/dist/bindings/claude-code.js.map +1 -1
- package/dist/bindings/index.d.ts +7 -0
- package/dist/bindings/index.d.ts.map +1 -1
- package/dist/bindings/index.js +26 -7
- package/dist/bindings/index.js.map +1 -1
- package/dist/bindings/types.d.ts +6 -0
- package/dist/bindings/types.d.ts.map +1 -1
- package/dist/bindings/types.js.map +1 -1
- package/dist/cli/__tests__/cli.test.d.ts +1 -1
- package/dist/cli/__tests__/cli.test.js +1 -1
- package/dist/cli/index.js +118 -78
- package/dist/cli/index.js.map +1 -1
- package/dist/docs/content.d.ts.map +1 -1
- package/dist/docs/content.js +39 -3
- package/dist/docs/content.js.map +1 -1
- package/dist/docs/teach.d.ts.map +1 -1
- package/dist/docs/teach.js +36 -0
- package/dist/docs/teach.js.map +1 -1
- package/dist/import/__tests__/import.test.js +21 -9
- package/dist/import/__tests__/import.test.js.map +1 -1
- package/dist/import/claude-code.d.ts.map +1 -1
- package/dist/import/claude-code.js +128 -44
- package/dist/import/claude-code.js.map +1 -1
- package/dist/import/serializer.d.ts.map +1 -1
- package/dist/import/serializer.js +10 -0
- package/dist/import/serializer.js.map +1 -1
- package/dist/parser/__tests__/mod-hooks.test.d.ts +10 -0
- package/dist/parser/__tests__/mod-hooks.test.d.ts.map +1 -0
- package/dist/parser/__tests__/mod-hooks.test.js +136 -0
- package/dist/parser/__tests__/mod-hooks.test.js.map +1 -0
- package/dist/parser/ast.d.ts +29 -2
- package/dist/parser/ast.d.ts.map +1 -1
- package/dist/parser/ast.js.map +1 -1
- package/dist/parser/index.d.ts +6 -1
- package/dist/parser/index.d.ts.map +1 -1
- package/dist/parser/index.js +76 -22
- package/dist/parser/index.js.map +1 -1
- package/dist/parser/paths.d.ts +15 -0
- package/dist/parser/paths.d.ts.map +1 -0
- package/dist/parser/paths.js +34 -0
- package/dist/parser/paths.js.map +1 -0
- package/dist/parser/run.d.ts +24 -0
- package/dist/parser/run.d.ts.map +1 -0
- package/dist/parser/run.js +55 -0
- package/dist/parser/run.js.map +1 -0
- package/dist/parser/validator.d.ts +12 -0
- package/dist/parser/validator.d.ts.map +1 -1
- package/dist/parser/validator.js +218 -2
- package/dist/parser/validator.js.map +1 -1
- package/dist/scaffold/__tests__/safety.test.d.ts +11 -0
- package/dist/scaffold/__tests__/safety.test.d.ts.map +1 -0
- package/dist/scaffold/__tests__/safety.test.js +184 -0
- package/dist/scaffold/__tests__/safety.test.js.map +1 -0
- package/dist/scaffold/__tests__/scaffold.test.js +2 -1
- package/dist/scaffold/__tests__/scaffold.test.js.map +1 -1
- package/dist/scaffold/__tests__/settings-merge.test.js +40 -9
- package/dist/scaffold/__tests__/settings-merge.test.js.map +1 -1
- package/dist/scaffold/incremental.d.ts +49 -13
- package/dist/scaffold/incremental.d.ts.map +1 -1
- package/dist/scaffold/incremental.js +235 -95
- package/dist/scaffold/incremental.js.map +1 -1
- package/dist/scaffold/manifest.d.ts +8 -1
- package/dist/scaffold/manifest.d.ts.map +1 -1
- package/dist/scaffold/manifest.js +32 -8
- package/dist/scaffold/manifest.js.map +1 -1
- package/dist/scaffold/merge.d.ts +15 -4
- package/dist/scaffold/merge.d.ts.map +1 -1
- package/dist/scaffold/merge.js +109 -18
- package/dist/scaffold/merge.js.map +1 -1
- package/dist/scaffold/types.d.ts +17 -0
- package/dist/scaffold/types.d.ts.map +1 -1
- package/dist/visualizer/__tests__/gate-connectors.test.d.ts +2 -0
- package/dist/visualizer/__tests__/gate-connectors.test.d.ts.map +1 -0
- package/dist/visualizer/__tests__/gate-connectors.test.js +88 -0
- package/dist/visualizer/__tests__/gate-connectors.test.js.map +1 -0
- package/dist/visualizer/index.js +41 -4
- package/dist/visualizer/index.js.map +1 -1
- package/package.json +1 -1
- package/spec/grammar.md +20 -4
- package/spec/testing.md +81 -0
- 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
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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:
|
|
112
|
-
detail: "config
|
|
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: "
|
|
174
|
+
type: "conflict",
|
|
125
175
|
path: file.path,
|
|
126
176
|
content: file.content,
|
|
127
|
-
detail: "
|
|
177
|
+
detail: "user edited",
|
|
128
178
|
});
|
|
129
179
|
}
|
|
130
180
|
break;
|
|
131
181
|
}
|
|
132
182
|
}
|
|
133
183
|
}
|
|
134
|
-
//
|
|
184
|
+
// Files in the manifest that are no longer generated
|
|
135
185
|
if (manifest) {
|
|
136
|
-
for (const manifestPath of Object.
|
|
137
|
-
if (
|
|
138
|
-
|
|
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
|
|
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
|
-
|
|
159
|
-
|
|
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
|
-
|
|
170
|
-
|
|
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
|
-
|
|
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
|
-
|
|
290
|
+
result.deleted++;
|
|
184
291
|
break;
|
|
185
292
|
}
|
|
186
293
|
case "conflict": {
|
|
187
|
-
if (options.force)
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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
|
-
|
|
308
|
+
result.unchanged++;
|
|
199
309
|
break;
|
|
200
310
|
}
|
|
201
311
|
}
|
|
202
312
|
}
|
|
203
|
-
return
|
|
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;
|
|
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
|
-
*
|
|
40
|
-
*
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
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
|
|
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,
|
|
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"}
|
package/dist/scaffold/merge.d.ts
CHANGED
|
@@ -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
|
|
57
|
-
*
|
|
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:
|
|
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,
|
|
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"}
|