@groundnuty/macf 0.2.0-rc.1 → 0.2.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.
- package/dist/.build-info.json +2 -2
- package/dist/cli/claude-sh.d.ts.map +1 -1
- package/dist/cli/claude-sh.js +12 -4
- package/dist/cli/claude-sh.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +8 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/rules-refresh.d.ts.map +1 -1
- package/dist/cli/commands/rules-refresh.js +5 -1
- package/dist/cli/commands/rules-refresh.js.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +8 -1
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/index.js +2 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/settings-writer.d.ts +84 -4
- package/dist/cli/settings-writer.d.ts.map +1 -1
- package/dist/cli/settings-writer.js +182 -4
- package/dist/cli/settings-writer.js.map +1 -1
- package/dist/cli/version-resolver.d.ts.map +1 -1
- package/dist/cli/version-resolver.js +15 -2
- package/dist/cli/version-resolver.js.map +1 -1
- package/dist/package-version.d.ts +2 -0
- package/dist/package-version.d.ts.map +1 -0
- package/dist/package-version.js +26 -0
- package/dist/package-version.js.map +1 -0
- package/package.json +2 -2
- package/plugin/rules/check-before-propose.md +86 -0
- package/plugin/rules/codify-at-correction-time.md +92 -0
- package/plugin/rules/coordination.md +17 -0
- package/plugin/rules/delegation-template.md +250 -0
- package/plugin/rules/execute-on-directive.md +71 -0
- package/plugin/rules/gh-token-attribution-traps.md +157 -0
- package/plugin/rules/mention-routing-hygiene.md +105 -0
- package/plugin/rules/model-era-compatibility.md +94 -0
- package/plugin/rules/observability-wiring.md +60 -0
- package/plugin/rules/peer-dynamic.md +205 -0
- package/plugin/rules/pr-discipline.md +245 -0
- package/plugin/rules/verify-before-claim.md +131 -0
|
@@ -21,11 +21,27 @@
|
|
|
21
21
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
22
22
|
import { join, resolve } from 'node:path';
|
|
23
23
|
/**
|
|
24
|
-
* The command path written into settings.json.
|
|
25
|
-
*
|
|
26
|
-
*
|
|
24
|
+
* The command path written into settings.json. Uses
|
|
25
|
+
* `$CLAUDE_PROJECT_DIR` (substituted by Claude Code at hook-dispatch
|
|
26
|
+
* time to the workspace root) rather than a workspace-relative path
|
|
27
|
+
* because Claude Code invokes hooks with cwd = the tool's spawn dir.
|
|
28
|
+
* If the agent has `cd`'d into a subdir before a Bash call, a
|
|
29
|
+
* relative path resolves against the subdir and the script is "not
|
|
30
|
+
* found" — generating noise and (worse) silently skipping the
|
|
31
|
+
* attribution-trap check (#140). See macf#232 for the bug report and
|
|
32
|
+
* macf-devops-toolkit `74c0af2` / macf-science-agent `cf7cbcf` /
|
|
33
|
+
* macf-testbed `1e3ee8e` for the precedent fix landings on workspace
|
|
34
|
+
* templates the day this was filed.
|
|
35
|
+
*
|
|
36
|
+
* Migration: `installGhTokenHook` re-writes the entry on every call,
|
|
37
|
+
* matching prior MACF entries by `check-gh-token.sh` basename
|
|
38
|
+
* (`isMacfManagedCommand`) — so the legacy relative-path form is
|
|
39
|
+
* dropped + replaced with the absolute form on the next `macf init` /
|
|
40
|
+
* `macf update` / `macf rules refresh` cycle. No legacy-pattern list
|
|
41
|
+
* is needed (unlike `MACF_LEGACY_FD_PATTERNS` which compares strings
|
|
42
|
+
* literally) because the basename matcher is path-agnostic.
|
|
27
43
|
*/
|
|
28
|
-
export const MACF_HOOK_COMMAND = '
|
|
44
|
+
export const MACF_HOOK_COMMAND = '$CLAUDE_PROJECT_DIR/.claude/scripts/check-gh-token.sh';
|
|
29
45
|
/**
|
|
30
46
|
* The hook filename used to identify MACF-managed entries on refresh.
|
|
31
47
|
* Matched by path-end equality (see isMacfManagedCommand) so operator
|
|
@@ -194,6 +210,168 @@ export function installSandboxFdAllowRead(workspaceDir) {
|
|
|
194
210
|
};
|
|
195
211
|
writeFileSync(path, JSON.stringify(updated, null, 2) + '\n');
|
|
196
212
|
}
|
|
213
|
+
/**
|
|
214
|
+
* Canonical MACF-managed `sandbox.excludedCommands` entries.
|
|
215
|
+
*
|
|
216
|
+
* Per macf#211 + claude-code#43454: Claude Code 2.1.92+ has a seccomp
|
|
217
|
+
* regression on Linux that breaks Bash inside the sandbox during the
|
|
218
|
+
* shell's own startup (it reads from `/proc/self/fd/3` even before
|
|
219
|
+
* user-code runs). Adding common dev-loop commands to
|
|
220
|
+
* `excludedCommands` runs them unsandboxed, sidestepping the
|
|
221
|
+
* regression while keeping sandbox protection for everything else.
|
|
222
|
+
*
|
|
223
|
+
* Three command classes:
|
|
224
|
+
*
|
|
225
|
+
* - **Search/read** (`grep`, `rg`, `find`, `head`, `tail`, `cat`,
|
|
226
|
+
* `ls`, `wc`, `sort`, `awk`, `sed`, `diff`, `which`) — Bash tool's
|
|
227
|
+
* primary dev-loop commands; no side effects beyond the file view
|
|
228
|
+
* Claude already has via the `Read` tool.
|
|
229
|
+
* - **Shell wrappers** (`bash:*`, `sh:*`, `xargs:*`) — agent-
|
|
230
|
+
* composed shell pipelines; sandboxed versions fail at zsh-init
|
|
231
|
+
* even when the inner command is a no-op.
|
|
232
|
+
* - **Low-blast-radius filesystem mutations** (`mkdir:*`, `cp:*`,
|
|
233
|
+
* `touch:*`) — non-destructive create/copy. Higher-blast-radius
|
|
234
|
+
* mutations (`rm:*`, `mv:*`) are intentionally NOT in the list:
|
|
235
|
+
* keeping them sandboxed limits accidental damage paths.
|
|
236
|
+
*
|
|
237
|
+
* Plus the build-loop subset that was already canonical pre-#211:
|
|
238
|
+
* `ssh:*`, `scp:*`, `rsync:*`, `devbox:*`, `nix:*`, `git:*`,
|
|
239
|
+
* `gpg:*`, `gpg-agent:*`, `gh:*`, `npx:*`, `npm:*`, `node:*`,
|
|
240
|
+
* `make:*`, `tmux:*`, `jq:*`, `openssl:*`. These were applied by
|
|
241
|
+
* hand in operator workspaces; #211 bundles them into the canonical
|
|
242
|
+
* set so `macf init` / `macf update` install them consistently.
|
|
243
|
+
*
|
|
244
|
+
* Keep this list in lockstep with `plugin/rules/coordination.md`'s
|
|
245
|
+
* sandbox section (the operator-facing doc) — both are sources of
|
|
246
|
+
* truth and any drift confuses operators reading either.
|
|
247
|
+
*/
|
|
248
|
+
export const SANDBOX_EXCLUDED_COMMANDS = [
|
|
249
|
+
// Build-loop / deployment
|
|
250
|
+
'ssh:*',
|
|
251
|
+
'scp:*',
|
|
252
|
+
'rsync:*',
|
|
253
|
+
'devbox:*',
|
|
254
|
+
'nix:*',
|
|
255
|
+
'git:*',
|
|
256
|
+
'gpg:*',
|
|
257
|
+
'gpg-agent:*',
|
|
258
|
+
'gh:*',
|
|
259
|
+
'npx:*',
|
|
260
|
+
'npm:*',
|
|
261
|
+
'node:*',
|
|
262
|
+
'make:*',
|
|
263
|
+
'tmux:*',
|
|
264
|
+
'jq:*',
|
|
265
|
+
'openssl:*',
|
|
266
|
+
// Search/read dev-loop
|
|
267
|
+
'grep:*',
|
|
268
|
+
'rg:*',
|
|
269
|
+
'find:*',
|
|
270
|
+
'head:*',
|
|
271
|
+
'tail:*',
|
|
272
|
+
'cat:*',
|
|
273
|
+
'ls:*',
|
|
274
|
+
'wc:*',
|
|
275
|
+
'sort:*',
|
|
276
|
+
'awk:*',
|
|
277
|
+
'sed:*',
|
|
278
|
+
'diff:*',
|
|
279
|
+
'which:*',
|
|
280
|
+
// Shell wrappers (subprocesses fail at zsh-init under the
|
|
281
|
+
// regression even when the inner command is a no-op)
|
|
282
|
+
'bash:*',
|
|
283
|
+
'sh:*',
|
|
284
|
+
'xargs:*',
|
|
285
|
+
// Low-blast-radius filesystem mutations. `rm:*` + `mv:*`
|
|
286
|
+
// intentionally excluded — keep destructive ops sandboxed.
|
|
287
|
+
'mkdir:*',
|
|
288
|
+
'cp:*',
|
|
289
|
+
'touch:*',
|
|
290
|
+
];
|
|
291
|
+
/**
|
|
292
|
+
* Legacy MACF-managed `sandbox.excludedCommands` entries. Currently
|
|
293
|
+
* empty — #211 is the first managed cycle. Future CLI versions can
|
|
294
|
+
* append here when the canonical set drops a previously-managed
|
|
295
|
+
* command, so `installSandboxExcludedCommands` removes those entries
|
|
296
|
+
* from operator workspaces on next refresh.
|
|
297
|
+
*/
|
|
298
|
+
const MACF_LEGACY_EXCLUDED_COMMANDS = [];
|
|
299
|
+
/**
|
|
300
|
+
* Install (or refresh) the canonical MACF entries in
|
|
301
|
+
* `.claude/settings.json`'s `sandbox.excludedCommands` array.
|
|
302
|
+
* Idempotent: repeated calls don't duplicate.
|
|
303
|
+
*
|
|
304
|
+
* Operator-authored entries are preserved verbatim. Stale MACF-
|
|
305
|
+
* managed entries (anything in MACF_LEGACY_EXCLUDED_COMMANDS) are
|
|
306
|
+
* dropped before the current set is installed; current MACF entries
|
|
307
|
+
* already present in the operator's list are left in their original
|
|
308
|
+
* position rather than re-appended.
|
|
309
|
+
*
|
|
310
|
+
* Opt-out: `MACF_SANDBOX_EXCLUDED_COMMANDS_SKIP=1|true` skips the
|
|
311
|
+
* install entirely. Aligned with the
|
|
312
|
+
* `MACF_SANDBOX_FD_FIX_SKIP` / `MACF_OTEL_DISABLED` family of opt-out
|
|
313
|
+
* env knobs.
|
|
314
|
+
*
|
|
315
|
+
* See macf#211 (this issue), claude-code#43454 (upstream
|
|
316
|
+
* regression), macf#200 / #208 (precedent fd allowRead pattern).
|
|
317
|
+
*/
|
|
318
|
+
export function installSandboxExcludedCommands(workspaceDir) {
|
|
319
|
+
const skip = process.env['MACF_SANDBOX_EXCLUDED_COMMANDS_SKIP'];
|
|
320
|
+
if (skip === '1' || skip === 'true')
|
|
321
|
+
return;
|
|
322
|
+
const absDir = resolve(workspaceDir);
|
|
323
|
+
const claudeDir = join(absDir, '.claude');
|
|
324
|
+
const path = join(claudeDir, 'settings.json');
|
|
325
|
+
mkdirSync(claudeDir, { recursive: true });
|
|
326
|
+
const settings = readSettings(path);
|
|
327
|
+
// Mirror installSandboxFdAllowRead's deep-narrow shape — operator-
|
|
328
|
+
// authored alien shapes default to fresh empty branches.
|
|
329
|
+
const sandboxRaw = settings['sandbox'] ?? {};
|
|
330
|
+
const existing = Array.isArray(sandboxRaw['excludedCommands'])
|
|
331
|
+
? sandboxRaw['excludedCommands'].filter((v) => typeof v === 'string')
|
|
332
|
+
: [];
|
|
333
|
+
// Drop legacy MACF-managed entries, preserve everything else
|
|
334
|
+
// (operator-authored AND current-MACF entries already present).
|
|
335
|
+
const preserved = existing.filter((entry) => !MACF_LEGACY_EXCLUDED_COMMANDS.includes(entry));
|
|
336
|
+
// Merge in the current canonical set. Skip duplicates so an
|
|
337
|
+
// entry the operator already has stays in its original position
|
|
338
|
+
// rather than being re-appended at the end.
|
|
339
|
+
const merged = [...preserved];
|
|
340
|
+
for (const entry of SANDBOX_EXCLUDED_COMMANDS) {
|
|
341
|
+
if (!merged.includes(entry))
|
|
342
|
+
merged.push(entry);
|
|
343
|
+
}
|
|
344
|
+
// Idempotent short-circuit: nothing changed → skip the write.
|
|
345
|
+
const sameLength = merged.length === existing.length;
|
|
346
|
+
const sameContent = sameLength && merged.every((v, i) => v === existing[i]);
|
|
347
|
+
if (sameContent)
|
|
348
|
+
return;
|
|
349
|
+
const updated = {
|
|
350
|
+
...settings,
|
|
351
|
+
sandbox: {
|
|
352
|
+
...sandboxRaw,
|
|
353
|
+
excludedCommands: merged,
|
|
354
|
+
},
|
|
355
|
+
};
|
|
356
|
+
writeFileSync(path, JSON.stringify(updated, null, 2) + '\n');
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Read `.claude/settings.json`'s `sandbox.excludedCommands` array as
|
|
360
|
+
* a list of strings. Returns an empty array if the file doesn't
|
|
361
|
+
* exist or the nested shape is absent/alien. Mirrors
|
|
362
|
+
* `getSandboxAllowRead` — used by `macf doctor` (follow-up under
|
|
363
|
+
* #211 step 2) once it wires the parity check in.
|
|
364
|
+
*/
|
|
365
|
+
export function getSandboxExcludedCommands(workspaceDir) {
|
|
366
|
+
const absDir = resolve(workspaceDir);
|
|
367
|
+
const path = join(absDir, '.claude', 'settings.json');
|
|
368
|
+
const settings = readSettings(path);
|
|
369
|
+
const sandboxRaw = settings['sandbox'] ?? {};
|
|
370
|
+
const list = sandboxRaw['excludedCommands'];
|
|
371
|
+
if (!Array.isArray(list))
|
|
372
|
+
return [];
|
|
373
|
+
return list.filter((v) => typeof v === 'string');
|
|
374
|
+
}
|
|
197
375
|
/**
|
|
198
376
|
* Pattern that identifies MACF-managed skill-permission entries on
|
|
199
377
|
* refresh. Any pattern starting with `Skill(macf-agent:` is
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-writer.js","sourceRoot":"","sources":["../../src/cli/settings-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C
|
|
1
|
+
{"version":3,"file":"settings-writer.js","sourceRoot":"","sources":["../../src/cli/settings-writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-resolver.d.ts","sourceRoot":"","sources":["../../src/cli/version-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;
|
|
1
|
+
{"version":3,"file":"version-resolver.d.ts","sourceRoot":"","sources":["../../src/cli/version-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,eAAe,GAAG,eAAe,GAAG,cAAc,GAAG,kBAAkB,CAAC;AA+BzG,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;QAC1B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;QAC7B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;KAC/B,CAAC;CACH;AAED,eAAO,MAAM,iBAAiB,EAAE,UAgB/B,CAAC;AAEF,eAAO,MAAM,cAAc,QAAoB,CAAC;AAChD,eAAO,MAAM,mBAAmB,QAAuB,CAAC;AAExD,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAW1D;AA4BD;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,WAAW,CAAC,CAgBlE;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,WAAW,CAAC,CA6BrE;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,WAAW,CAAC,CA2BtE;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAmBvE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAQ5E"}
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* fetch failed" message. GitHub fetchers fall back from /releases/latest
|
|
19
19
|
* to /tags so bare-tag versioning (no GitHub Release object) still works.
|
|
20
20
|
*/
|
|
21
|
+
import { PACKAGE_VERSION } from '../package-version.js';
|
|
21
22
|
/**
|
|
22
23
|
* GitHub API headers. Uses `GH_TOKEN` from env if present — raises the
|
|
23
24
|
* anonymous 60 req/h limit to 5000 req/h. Primary #186 fix: operators
|
|
@@ -48,8 +49,20 @@ function classifyGithubError(status) {
|
|
|
48
49
|
return 'invalid_response';
|
|
49
50
|
}
|
|
50
51
|
export const FALLBACK_VERSIONS = {
|
|
51
|
-
cli:
|
|
52
|
-
|
|
52
|
+
cli: PACKAGE_VERSION,
|
|
53
|
+
// Bumped 2026-04-26 (testbed#229 + macf#259): v0.1.0 plugin manifest
|
|
54
|
+
// shipped `mcpServers.macf-agent.command: "node"` against
|
|
55
|
+
// `${CLAUDE_PLUGIN_ROOT}/dist/server.js`, which fails with
|
|
56
|
+
// `Cannot find package '@modelcontextprotocol/sdk'` when Claude Code's
|
|
57
|
+
// plugin loader spawns it (deps land in CLAUDE_PLUGIN_DATA, not
|
|
58
|
+
// PLUGIN_ROOT). v0.2.0 cut over to `npx -y @groundnuty/macf-channel-server`
|
|
59
|
+
// (DR-022 npm-dispatch), which sidesteps dep-resolution entirely.
|
|
60
|
+
// When the version-resolver's network fetch fails (anon GitHub API
|
|
61
|
+
// rate limit, 60 req/h — bites bootstrap scripts that don't preset
|
|
62
|
+
// GH_TOKEN before `macf init`), this fallback was sticking consumers
|
|
63
|
+
// on the broken v0.1.0. Bumped to '0.2.0' so the failure mode lands
|
|
64
|
+
// on a working plugin.
|
|
65
|
+
plugin: '0.2.0',
|
|
53
66
|
actions: 'v1',
|
|
54
67
|
};
|
|
55
68
|
export const SEMVER_PATTERN = /^\d+\.\d+\.\d+$/;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-resolver.js","sourceRoot":"","sources":["../../src/cli/version-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;
|
|
1
|
+
{"version":3,"file":"version-resolver.js","sourceRoot":"","sources":["../../src/cli/version-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-version.d.ts","sourceRoot":"","sources":["../src/package-version.ts"],"names":[],"mappings":"AA0BA,eAAO,MAAM,eAAe,EAAE,MAErB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package version, derived from `package.json` at module load.
|
|
3
|
+
*
|
|
4
|
+
* Structural fix for macf#216 — replaces hardcoded version literals
|
|
5
|
+
* in `cli/index.ts` (commander `.version()`), `version-resolver.ts`
|
|
6
|
+
* (`FALLBACK_VERSIONS.cli` default), and the init-versions test
|
|
7
|
+
* assertion. Without this util, every release bump required editing
|
|
8
|
+
* 4 source literals plus 5 package.json fields; missing any one
|
|
9
|
+
* caused silent drift (seen on macf#215 PR review + macf#219 rc.1
|
|
10
|
+
* bump).
|
|
11
|
+
*
|
|
12
|
+
* Path resolution works for both dev (source loaded from `src/`) and
|
|
13
|
+
* installed (compiled loaded from `dist/`) layouts: one dir up from
|
|
14
|
+
* this file's location lands at the package root where
|
|
15
|
+
* `package.json` lives in both cases.
|
|
16
|
+
*
|
|
17
|
+
* `package.json` is always included in npm-published tarballs
|
|
18
|
+
* regardless of the `files` field, so the runtime read works post-
|
|
19
|
+
* publish for operators consuming `@groundnuty/macf` via npm.
|
|
20
|
+
*/
|
|
21
|
+
import { readFileSync } from 'node:fs';
|
|
22
|
+
import { dirname, join } from 'node:path';
|
|
23
|
+
import { fileURLToPath } from 'node:url';
|
|
24
|
+
const pkgPath = join(dirname(fileURLToPath(import.meta.url)), '..', 'package.json');
|
|
25
|
+
export const PACKAGE_VERSION = JSON.parse(readFileSync(pkgPath, 'utf-8')).version;
|
|
26
|
+
//# sourceMappingURL=package-version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-version.js","sourceRoot":"","sources":["../src/package-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AAEpF,MAAM,CAAC,MAAM,eAAe,GAC1B,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAC1C,CAAC,OAAO,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@groundnuty/macf",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Multi-Agent Coordination Framework CLI — coordinate Claude Code agents via GitHub. Installs as `macf` binary; use `macf init` to set up an agent workspace, `macf update` to refresh rules + version pins.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"test:watch": "vitest"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@groundnuty/macf-core": "0.2.
|
|
38
|
+
"@groundnuty/macf-core": "0.2.1",
|
|
39
39
|
"commander": "^14.0.3",
|
|
40
40
|
"reflect-metadata": "^0.2.2",
|
|
41
41
|
"zod": "^4.0.0"
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Check Before Propose
|
|
2
|
+
|
|
3
|
+
**Before proposing a technical shape, claiming a pattern is broken, or writing code against a memory of how the codebase looks — go read the current state.**
|
|
4
|
+
|
|
5
|
+
Three cognitive shortcuts repeatedly produce bad proposals:
|
|
6
|
+
|
|
7
|
+
1. "I remember how this works" → propose changes → the code moved, proposal is off
|
|
8
|
+
2. "This pattern is broken upstream" → the upstream pattern is fine; our implementation differs
|
|
9
|
+
3. "I'll write the fix" → write it against stale API shape → bash/run → surprised it fails
|
|
10
|
+
|
|
11
|
+
The fix is cheap: open the files, diff against a working peer, read the current convention. A one-minute check beats a twenty-minute unwind.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 1. Check framework convention before proposing a shape
|
|
16
|
+
|
|
17
|
+
Before proposing a technical shape for cross-cutting design (flag naming, config structure, env-var layout, helm values pattern, GitHub Actions step shape, API surface), scan for how the project already does it:
|
|
18
|
+
|
|
19
|
+
- Grep the repo for similar patterns. If there are three existing instances, the fourth should match.
|
|
20
|
+
- Read the framework's own docs / DRs / reference implementations.
|
|
21
|
+
- Check adjacent configs (sibling charts, sibling workflows, sibling modules) for conventions you'd be breaking.
|
|
22
|
+
|
|
23
|
+
For GitHub Actions specifically: step-level `uses:` cannot evaluate `${{ }}` expressions at composition time — it's a static reference. Before proposing `uses: ${{ env.ACTION_REF }}`, check that you're in a job-level or input-level context where expression interpolation runs.
|
|
24
|
+
|
|
25
|
+
For helm charts: before proposing a new `values.yaml` key, check if the chart's `values.schema.json` or existing `README.md` defines a convention. Bitnami charts in particular have strict naming.
|
|
26
|
+
|
|
27
|
+
For language-specific configs: `tsconfig.json`, `pyproject.toml`, `go.mod`, `Cargo.toml` — conventions propagate across files in a project. New keys should match the tone of existing ones.
|
|
28
|
+
|
|
29
|
+
**The rule:** 1 minute of grep saves an embarrassing proposal that requires a subsequent "nvm, that's not how this project does it" turn.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 2. Diff against a working consumer before blaming the pattern
|
|
34
|
+
|
|
35
|
+
When a call to some upstream pattern or library fails, the default hypothesis should be:
|
|
36
|
+
|
|
37
|
+
- **First:** my implementation differs from what works elsewhere
|
|
38
|
+
- **Second** (only after ruling out first): the pattern itself is broken
|
|
39
|
+
|
|
40
|
+
Find a known-working consumer and diff against your invocation:
|
|
41
|
+
|
|
42
|
+
diff <(cat path/to/working-consumer) <(cat path/to/my-call)
|
|
43
|
+
|
|
44
|
+
Or for GitHub Actions: `gh run view` the working consumer's successful run, compare inputs. For helm: compare your `values.yaml` override against an upstream chart's `examples/`. For API calls: run the same call with the working caller's args and yours, compare the error bodies.
|
|
45
|
+
|
|
46
|
+
Claiming "pattern P is broken upstream" is a strong assertion. It should only survive:
|
|
47
|
+
|
|
48
|
+
- A found working consumer elsewhere with comparable inputs → if the working consumer exists, the pattern works; the diff IS the problem
|
|
49
|
+
- Or a dive into the upstream source confirming a recent regression with a commit SHA to cite
|
|
50
|
+
|
|
51
|
+
Without one of those, "pattern is broken" is almost always a misdiagnosis.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## 3. Before writing code against memory, read the file
|
|
56
|
+
|
|
57
|
+
If you "remember" that `src/foo.ts` exports a function `bar` that takes `(a, b)` — before writing code that calls it, read the file. APIs shift. Functions get renamed, arguments reshuffled, return types changed. A proposal that cites function signatures from memory is a proposal that gets written, attempted, failed, reverted.
|
|
58
|
+
|
|
59
|
+
This is the tightest version of the rule for coding work: **Read → Modify → Test**. Not Remember → Modify → Hope. The Read step is 5 seconds. The cost of skipping it is minutes of confused debugging when the memory-cached API doesn't match the current code.
|
|
60
|
+
|
|
61
|
+
For devops work specifically: before writing a helm values override, `helm show values <chart>` to see the current defaults. Before writing a `kubectl patch`, `kubectl get -o yaml` the current object shape. Before writing a `terraform import`, `terraform state show` similar resources to see the expected schema.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 4. Before proposing config for a state surface, check where that state already lives
|
|
66
|
+
|
|
67
|
+
Don't build a parallel config surface when the state already has a home.
|
|
68
|
+
|
|
69
|
+
Example of the trap: an agent proposes adding an `agents.yaml` config file to track which bots are registered — but the bots are already tracked in GitHub App install sets + organization variables + the MACF registry. The proposed file would be a fourth, drift-prone source of truth.
|
|
70
|
+
|
|
71
|
+
Before designing a new config format / env var / secret pattern, ask:
|
|
72
|
+
|
|
73
|
+
- Does GitHub already know this? (App installations, org variables, repo secrets, team membership)
|
|
74
|
+
- Does the cluster already know this? (ConfigMap, Secret, labels on existing resources, helm release notes)
|
|
75
|
+
- Does the registry already know this? (MACF org variables, service catalog, feature flags)
|
|
76
|
+
- Does the filesystem already know this? (existing `.env`, `.gitconfig`, `values.yaml` file)
|
|
77
|
+
|
|
78
|
+
If yes, your new config should either read from the existing source or be built alongside it, not parallel to it.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Why this rule exists
|
|
83
|
+
|
|
84
|
+
The failure mode this rule catches isn't sloppiness — it's the opposite. It's the confident proposal from a well-informed agent whose mental model is slightly stale. The fix isn't to be less confident; it's to cheaply refresh the mental model before spending the confidence.
|
|
85
|
+
|
|
86
|
+
One `grep`, one `gh pr view`, one `helm show values` — then propose. The check adds seconds. The recovery from a misaimed proposal adds minutes of peer time and muddies the thread.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Codify at Correction Time
|
|
2
|
+
|
|
3
|
+
**When peer correction reveals a substrate-discipline gap — write the workbench rule (or in-thread codification) immediately, not later.** Codify-at-correction-time is the substrate's natural Stage-3 mechanism for absorbing peer correction; making it canonical promotes it from emergent property to expected discipline.
|
|
4
|
+
|
|
5
|
+
This rule is the cross-agent canonical version of the `codify-at-decision-time` workbench discipline. They're complementary:
|
|
6
|
+
|
|
7
|
+
- **Decision time** — codify when introducing a new path / file / env var / workaround the canonical rules don't yet acknowledge. Pre-emptive.
|
|
8
|
+
- **Correction time** — codify when peer correction surfaces a gap in your existing application of canonical rules. Post-hoc.
|
|
9
|
+
|
|
10
|
+
Both are species of "make the lesson explicit and durable rather than implicit and fragile."
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## When to fire
|
|
15
|
+
|
|
16
|
+
Within ~2 turns of any of the following:
|
|
17
|
+
|
|
18
|
+
- **Peer surfaces a class-of-slip** in your behavior (not just a single instance — they identify a recurring shape: *"this is the third time you've...")
|
|
19
|
+
- **You concede after pushback** + the concession represents new framing worth preserving past this thread
|
|
20
|
+
- **Your application of a canonical rule misfired** in a way that's not directly addressed by the rule's existing text — you've found the gap before the canonical rule has
|
|
21
|
+
- **A peer's correction lands a useful generalization** of the canonical rule (e.g., "verify-before-claim cuts at every hop, not just the original claim")
|
|
22
|
+
|
|
23
|
+
The trigger is *peer correction surfaces a substrate-discipline pattern*, not just *peer correction happens*. Routine "you got X wrong, fix it" doesn't require codification — only patterns that generalize past this incident.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## How to codify
|
|
28
|
+
|
|
29
|
+
Two surfaces, both useful:
|
|
30
|
+
|
|
31
|
+
### Workbench memory (private, durable across sessions)
|
|
32
|
+
|
|
33
|
+
Write a one-page feedback memory at `~/.claude/projects/.../memory/feedback_<slug>.md` (or your agent's equivalent memory location). Format:
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
name: <one-line rule statement>
|
|
37
|
+
description: <when to apply, why it exists>
|
|
38
|
+
type: feedback
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
<body: rule + when-to-apply + when-NOT + cross-references>
|
|
42
|
+
|
|
43
|
+
The memory loads on session start; future sessions inherit the discipline.
|
|
44
|
+
|
|
45
|
+
### In-thread paper-trail (durable on GitHub, audit-able)
|
|
46
|
+
|
|
47
|
+
If your agent class doesn't have durable workbench memory (e.g., ephemeral testers whose workspace regenerates on bootstrap), or if the lesson belongs in the paper-trail, post the codification as a comment on the thread where it surfaced:
|
|
48
|
+
|
|
49
|
+
Pattern worth noting on my side: [class-of-slip articulated explicitly]. Hit N times in [window]; corrective shape is [what to do differently].
|
|
50
|
+
|
|
51
|
+
The thread becomes the durable substrate-of-codification. Future readers (peers, paper authors, future-you) can audit the codification chain via GitHub's issue history.
|
|
52
|
+
|
|
53
|
+
For research-grade findings: BOTH surfaces. Memory captures the lesson; the paper-trail comment makes it citable.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Multi-agent codification cascades are the goal, not redundant work
|
|
58
|
+
|
|
59
|
+
When peer correction surfaces a substrate-discipline gap, expect multiple agents to independently codify the same lesson, often within minutes of each other. This is feature, not redundancy:
|
|
60
|
+
|
|
61
|
+
- **Cross-agent attestation** of the same meta-rule provides stronger evidence that the lesson generalizes than a single-agent codification
|
|
62
|
+
- **Memory-naming convergence** across agents (similar slugs, similar structure) is a signal that the rule is genuinely general
|
|
63
|
+
- **Codification-mechanism diversity** (memory file, in-thread comment, workbench rule promotion, retroactive-application announcement) is appropriate per agent — each agent's persistence model differs
|
|
64
|
+
|
|
65
|
+
Observed 2026-04-25 / 2026-04-26: 11 codification events across 4 agents (3 substrate + 1 measurement) in ~36 hours, on 3 distinct canonical-rule refinements + the meta-rule itself. Multi-agent codification cascades produced this pattern as a substrate-level emergent property; making the codification habit canonical promotes it from emergent to expected.
|
|
66
|
+
|
|
67
|
+
See `groundnuty/macf-science-agent:insights/2026-04-26-verify-at-every-hop-emitter-receiver-cross-cell.md` for the case study + meta-tally of the events that motivated this rule's promotion.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## When NOT to codify
|
|
72
|
+
|
|
73
|
+
- The correction was for a single instance with no recurring shape (one-off bug ≠ pattern)
|
|
74
|
+
- The lesson is already captured by an existing canonical rule (don't duplicate; reference)
|
|
75
|
+
- The agent's correction was substantively wrong and you're conceding to maintain harmony rather than because the framing is right (push back per `peer-dynamic.md`)
|
|
76
|
+
- Mid-flow on something more important + can defer by ≤1 turn safely
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Apply in real time
|
|
81
|
+
|
|
82
|
+
The discipline isn't aspirational — it's operational on the next decision after codification. If you save the rule at turn N, you're expected to apply it at turn N+1 (or have an explicit reason not to).
|
|
83
|
+
|
|
84
|
+
Observed 2026-04-25: code-agent saved `feedback_verify_at_every_hop_when_citing_peer_evidence.md` at ~18:38Z and applied it the same minute by deferring a fix that would have re-framed peer evidence without re-verification. Codify-at-correction-time + immediate application is the full pattern.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Cross-references
|
|
89
|
+
|
|
90
|
+
- `verify-before-claim.md` §5 — the verify-at-every-hop discipline this rule operationalizes the codification habit for
|
|
91
|
+
- `peer-dynamic.md` — the broader peer-correction protocol this rule extends (correct each other through dialogue → codify the dialogue's lessons)
|
|
92
|
+
- `coordination.md` — the substrate-level coordination protocol that makes peer correction reliable enough for codification cascades to emerge
|
|
@@ -217,6 +217,23 @@ The helper is distributed to every agent workspace by `macf init` and refreshed
|
|
|
217
217
|
|
|
218
218
|
---
|
|
219
219
|
|
|
220
|
+
## Sandbox Configuration (Bash dev-loop unblocking)
|
|
221
|
+
|
|
222
|
+
Claude Code 2.1.92+ has a seccomp regression on Linux ([anthropic/claude-code#43454](https://github.com/anthropics/claude-code/issues/43454)) that breaks Bash tool calls inside the sandbox during the spawned shell's own startup — zsh tries to read `/proc/self/fd/3` before any user-code runs and the regression denies that read. Even with `sandbox.filesystem.allowRead: ["/proc/self/fd"]` in place (per macf#208), the regression still bites because it hits before the allow-rule applies.
|
|
223
|
+
|
|
224
|
+
**Workaround**: add common dev-loop commands to `sandbox.excludedCommands` so they run unsandboxed. The sandbox still gates anything not on the list; only the listed prefixes opt out. `macf init` / `macf update` / `macf rules refresh` install a canonical set per macf#211 — operator-authored entries are preserved on refresh.
|
|
225
|
+
|
|
226
|
+
**Canonical set** (kept in lockstep with `SANDBOX_EXCLUDED_COMMANDS` in `packages/macf/src/cli/settings-writer.ts`):
|
|
227
|
+
|
|
228
|
+
- **Build-loop / deployment**: `ssh:*`, `scp:*`, `rsync:*`, `devbox:*`, `nix:*`, `git:*`, `gpg:*`, `gpg-agent:*`, `gh:*`, `npx:*`, `npm:*`, `node:*`, `make:*`, `tmux:*`, `jq:*`, `openssl:*`
|
|
229
|
+
- **Search/read**: `grep:*`, `rg:*`, `find:*`, `head:*`, `tail:*`, `cat:*`, `ls:*`, `wc:*`, `sort:*`, `awk:*`, `sed:*`, `diff:*`, `which:*`
|
|
230
|
+
- **Shell wrappers**: `bash:*`, `sh:*`, `xargs:*` (subprocess shells fail at zsh-init under the regression even when the inner command is a no-op)
|
|
231
|
+
- **Low-blast-radius fs mutations**: `mkdir:*`, `cp:*`, `touch:*`. **Destructive ops (`rm:*`, `mv:*`) are intentionally NOT in the list** — keeping them sandboxed limits accidental damage paths even though the sandbox is defense-in-depth here.
|
|
232
|
+
|
|
233
|
+
**Opt-out**: `MACF_SANDBOX_EXCLUDED_COMMANDS_SKIP=1` skips the canonical install. Aligned with `MACF_SANDBOX_FD_FIX_SKIP` / `MACF_OTEL_DISABLED` opt-out family. If you want a tighter list (e.g., drop the fs-mutation entries), set the skip flag and curate manually — refresh won't re-add canonical entries you removed.
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
220
237
|
## When to Read vs. Modify These Rules
|
|
221
238
|
|
|
222
239
|
- **Read:** Every session start. These rules define how you coordinate.
|