@orchestrator-claude/definitions 3.32.1 → 3.33.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 +113 -0
- package/agents/debug-sidecar.md +1 -1
- package/agents/doc-sidecar.md +1 -1
- package/agents/test-sidecar.md +1 -1
- package/dist/cli.js +78 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/DiffCommand.js +1 -1
- package/dist/commands/DiffCommand.js.map +1 -1
- package/dist/commands/InstallCommand.d.ts +41 -0
- package/dist/commands/InstallCommand.d.ts.map +1 -0
- package/dist/commands/InstallCommand.js +253 -0
- package/dist/commands/InstallCommand.js.map +1 -0
- package/dist/http/ApiClient.d.ts +5 -0
- package/dist/http/ApiClient.d.ts.map +1 -1
- package/dist/http/ApiClient.js.map +1 -1
- package/dist/install/DevCheckoutDetector.d.ts +66 -0
- package/dist/install/DevCheckoutDetector.d.ts.map +1 -0
- package/dist/install/DevCheckoutDetector.js +150 -0
- package/dist/install/DevCheckoutDetector.js.map +1 -0
- package/dist/install/HooksWirer.d.ts +29 -0
- package/dist/install/HooksWirer.d.ts.map +1 -0
- package/dist/install/HooksWirer.js +80 -0
- package/dist/install/HooksWirer.js.map +1 -0
- package/dist/install/LocalDiffReporter.d.ts +25 -0
- package/dist/install/LocalDiffReporter.d.ts.map +1 -0
- package/dist/install/LocalDiffReporter.js +50 -0
- package/dist/install/LocalDiffReporter.js.map +1 -0
- package/dist/install/Materializer.d.ts +67 -0
- package/dist/install/Materializer.d.ts.map +1 -0
- package/dist/install/Materializer.js +196 -0
- package/dist/install/Materializer.js.map +1 -0
- package/dist/install/McpRegistrar.d.ts +63 -0
- package/dist/install/McpRegistrar.d.ts.map +1 -0
- package/dist/install/McpRegistrar.js +114 -0
- package/dist/install/McpRegistrar.js.map +1 -0
- package/dist/install/ProcessRunner.d.ts +25 -0
- package/dist/install/ProcessRunner.d.ts.map +1 -0
- package/dist/install/ProcessRunner.js +41 -0
- package/dist/install/ProcessRunner.js.map +1 -0
- package/dist/install/ProjectSettingsNeutralizer.d.ts +39 -0
- package/dist/install/ProjectSettingsNeutralizer.d.ts.map +1 -0
- package/dist/install/ProjectSettingsNeutralizer.js +100 -0
- package/dist/install/ProjectSettingsNeutralizer.js.map +1 -0
- package/dist/install/types.d.ts +52 -0
- package/dist/install/types.d.ts.map +1 -0
- package/dist/install/types.js +8 -0
- package/dist/install/types.js.map +1 -0
- package/dist/manifest/ManifestLoader.d.ts.map +1 -1
- package/dist/manifest/ManifestLoader.js +3 -2
- package/dist/manifest/ManifestLoader.js.map +1 -1
- package/dist/manifest/types.d.ts +3 -0
- package/dist/manifest/types.d.ts.map +1 -1
- package/dist/scripts/bundle-hooks.d.ts +39 -0
- package/dist/scripts/bundle-hooks.d.ts.map +1 -0
- package/dist/scripts/bundle-hooks.js +165 -0
- package/dist/scripts/bundle-hooks.js.map +1 -0
- package/dist/scripts/generate-manifest.d.ts +22 -3
- package/dist/scripts/generate-manifest.d.ts.map +1 -1
- package/dist/scripts/generate-manifest.js +78 -35
- package/dist/scripts/generate-manifest.js.map +1 -1
- package/hooks/dangling-guard.mjs +7426 -0
- package/hooks/dangling-guard.ts +223 -6
- package/hooks/gate-guardian.mjs +463 -0
- package/hooks/lib/additional-directories-sync.ts +295 -0
- package/hooks/lib/api-client.ts +388 -7
- package/hooks/lib/session-selection.ts +81 -0
- package/hooks/mailbox-listener.mjs +259 -0
- package/hooks/post-compact.mjs +7931 -0
- package/hooks/post-implement.mjs +238 -0
- package/hooks/session-start.mjs +8234 -0
- package/hooks/session-start.ts +264 -23
- package/hooks/sprint-registry.mjs +59 -0
- package/hooks/subagent-start.mjs +289 -0
- package/hooks/subagent-stop.mjs +7793 -0
- package/hooks/subagent-stop.ts +4 -2
- package/hooks/user-prompt.mjs +329 -0
- package/hooks/workflow-guard.mjs +7805 -0
- package/hooks/workflow-guard.ts +360 -119
- package/hooks-settings-template.json +63 -0
- package/manifest.json +54 -68
- package/mcp-servers.json +48 -0
- package/package.json +10 -4
- package/personas/auditor-compliance.md +104 -0
- package/personas/cfo-conservador.md +88 -0
- package/personas/designer-perfeccionista.md +104 -0
- package/personas/diretor-cetico-fmcg.md +80 -0
- package/personas/engenheiro-cetico-construcao.md +107 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiClient.d.ts","sourceRoot":"","sources":["../../src/http/ApiClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,KAAK,CAAgB;gBAEjB,OAAO,EAAE,gBAAgB;IAKrC;;OAEG;IACG,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB3D;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IASjG;;OAEG;IACG,sBAAsB,IAAI,OAAO,CAAC;QACtC,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACjE,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACjE,KAAK,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAChE,SAAS,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACpE,EAAE,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC9D,CAAC;YAIY,OAAO;CAqBtB"}
|
|
1
|
+
{"version":3,"file":"ApiClient.d.ts","sourceRoot":"","sources":["../../src/http/ApiClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,KAAK,CAAgB;gBAEjB,OAAO,EAAE,gBAAgB;IAKrC;;OAEG;IACG,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB3D;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IASjG;;OAEG;IACG,sBAAsB,IAAI,OAAO,CAAC;QACtC,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACjE,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACjE,KAAK,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAChE,SAAS,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACpE,QAAQ,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACnE,EAAE,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC9D,CAAC;YAIY,OAAO;CAqBtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiClient.js","sourceRoot":"","sources":["../../src/http/ApiClient.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,SAAS;IACH,OAAO,CAAS;IACzB,KAAK,CAAgB;IAE7B,YAAY,OAAyB;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,KAAa,EAAE,QAAgB;QACzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,oBAAoB,EAAE;YAChE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;SAC1C,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;QAC1D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,OAAoB,EAAE,IAA0C;QACzE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,0BAA0B,EAAE;YAC9D,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;SAC3C,CAAC,CAAC;QAEH,OAAO,QAAsB,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,sBAAsB;
|
|
1
|
+
{"version":3,"file":"ApiClient.js","sourceRoot":"","sources":["../../src/http/ApiClient.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,SAAS;IACH,OAAO,CAAS;IACzB,KAAK,CAAgB;IAE7B,YAAY,OAAyB;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,KAAa,EAAE,QAAgB;QACzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,oBAAoB,EAAE;YAChE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;SAC1C,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;QAC1D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,OAAoB,EAAE,IAA0C;QACzE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,0BAA0B,EAAE;YAC9D,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;SAC3C,CAAC,CAAC;QAEH,OAAO,QAAsB,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,sBAAsB;QAQ1B,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,8BAA8B,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAQ,CAAC;IACtF,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,IAAiB;QACnD,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QAEF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC;QACpD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;YACrD,GAAG,IAAI;YACP,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,GAAI,IAAI,CAAC,OAA8C,EAAE;SACjF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,MAAM,IAAI,IAAI,MAAM,IAAI,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DevCheckoutDetector — read-only dual-condition heuristic (RF-002 / spec
|
|
3
|
+
* §5.1, ADR-004) for the "inverted precedence" risk between `.claude/agents`
|
|
4
|
+
* (project-scope) and `.claude/skills` (user-scope, per Claude Code's
|
|
5
|
+
* documentation): once the installer lands, `~/.claude/agents` resolves from
|
|
6
|
+
* the distributed package while `<repo>/.claude/agents` remains the authored
|
|
7
|
+
* source — they can diverge silently.
|
|
8
|
+
*
|
|
9
|
+
* Detection requires BOTH conditions (reduces false-positives, risk R-6):
|
|
10
|
+
* (i) walk-up from `cwd` to the nearest ancestor `package.json` whose
|
|
11
|
+
* `name` matches the orchestrator monorepo root package
|
|
12
|
+
* (`@orchestrator-cli/core` — confirmed via direct Read of
|
|
13
|
+
* `/home/cmac/workOrch-Claude/orchestrator/package.json`, plan
|
|
14
|
+
* §11 Verify-Before-Assert);
|
|
15
|
+
* (ii) that same ancestor's `.claude/agents/*.md` contains REAL files
|
|
16
|
+
* (never symlinks — `lstatSync(...).isSymbolicLink()`, distinguishing
|
|
17
|
+
* authored files from the C6/TD-204 INTERIM per-file symlinks) whose
|
|
18
|
+
* slug (basename without `.md`) collides with `manifestSlugs`.
|
|
19
|
+
*
|
|
20
|
+
* Never mutates anything — `detect()` only reads `package.json` and lists
|
|
21
|
+
* `.claude/agents/`. This module is purely read-only by design.
|
|
22
|
+
*
|
|
23
|
+
* ---
|
|
24
|
+
* MEASURED WARNING TEXT (TASK-036/AC-007 gate — CLOSED, S385):
|
|
25
|
+
* `DEV_CHECKOUT_WARNING_REASON` previously named the precedence risk
|
|
26
|
+
* WITHOUT asserting a verified direction ("provisional" — Universal
|
|
27
|
+
* Invariant 6 forbids hard-coding an unverified claim about third-party CLI
|
|
28
|
+
* behavior). `scripts/probes/ac007-precedence-probe.ts` (TASK-035) has since
|
|
29
|
+
* run the AC-007 gate for real (TASK-036): isolated `CLAUDE_CONFIG_DIR` probe
|
|
30
|
+
* (S382 method), 3/3 deterministic runs per axis, real-`~/.claude`
|
|
31
|
+
* hard-isolation-gate verified unchanged. **Verdict: CONFIRMS the documented
|
|
32
|
+
* claim** — agents resolve by PROJECT-scope, skills resolve by USER-scope.
|
|
33
|
+
* The precedence direction is NOT inverted. The text below now states this
|
|
34
|
+
* as measured fact and names the real practical risk it implies: the two
|
|
35
|
+
* scopes can still silently DRIFT APART over time (a project-scope skill
|
|
36
|
+
* edit has no effect on a live session until `orch-defs install` refreshes
|
|
37
|
+
* `~/.claude/skills`, unless the file happens to be an INTERIM symlink —
|
|
38
|
+
* C6/TD-204), independent of the (now-settled) precedence-direction
|
|
39
|
+
* question. Raw probe output: `tests/install/fixtures/
|
|
40
|
+
* ac007-precedence-probe-output.md`.
|
|
41
|
+
*/
|
|
42
|
+
import type { DetectionResult } from './types.js';
|
|
43
|
+
export declare class DevCheckoutDetector {
|
|
44
|
+
private readonly manifestSlugs;
|
|
45
|
+
constructor(manifestSlugs: string[]);
|
|
46
|
+
/**
|
|
47
|
+
* Read-only detection. Never throws on a missing `.claude/agents`
|
|
48
|
+
* directory or a missing/unparseable ancestor `package.json` — those
|
|
49
|
+
* cases simply resolve to `'clean-install'`.
|
|
50
|
+
*/
|
|
51
|
+
detect(cwd: string): DetectionResult;
|
|
52
|
+
/**
|
|
53
|
+
* Walks up from `cwd` looking for the nearest ancestor directory whose
|
|
54
|
+
* `package.json` has `name === MONOREPO_PACKAGE_NAME` (§5.1: "presença de
|
|
55
|
+
* package.json na raiz do cwd, ou ancestral via walk-up").
|
|
56
|
+
*/
|
|
57
|
+
private findAncestorWithMatchingPackageName;
|
|
58
|
+
private hasMatchingName;
|
|
59
|
+
/**
|
|
60
|
+
* Real (non-symlink) `.claude/agents/*.md` files at `root` whose slug
|
|
61
|
+
* (basename without `.md`) collides with `manifestSlugs`.
|
|
62
|
+
*/
|
|
63
|
+
private findMatchingRealAgentSlugs;
|
|
64
|
+
private cleanInstall;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=DevCheckoutDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DevCheckoutDetector.d.ts","sourceRoot":"","sources":["../../src/install/DevCheckoutDetector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA4BlD,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,MAAM,EAAE;IAEpD;;;;OAIG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe;IAkBpC;;;;OAIG;IACH,OAAO,CAAC,mCAAmC;IAiB3C,OAAO,CAAC,eAAe;IASvB;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IA4BlC,OAAO,CAAC,YAAY;CAOrB"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DevCheckoutDetector — read-only dual-condition heuristic (RF-002 / spec
|
|
3
|
+
* §5.1, ADR-004) for the "inverted precedence" risk between `.claude/agents`
|
|
4
|
+
* (project-scope) and `.claude/skills` (user-scope, per Claude Code's
|
|
5
|
+
* documentation): once the installer lands, `~/.claude/agents` resolves from
|
|
6
|
+
* the distributed package while `<repo>/.claude/agents` remains the authored
|
|
7
|
+
* source — they can diverge silently.
|
|
8
|
+
*
|
|
9
|
+
* Detection requires BOTH conditions (reduces false-positives, risk R-6):
|
|
10
|
+
* (i) walk-up from `cwd` to the nearest ancestor `package.json` whose
|
|
11
|
+
* `name` matches the orchestrator monorepo root package
|
|
12
|
+
* (`@orchestrator-cli/core` — confirmed via direct Read of
|
|
13
|
+
* `/home/cmac/workOrch-Claude/orchestrator/package.json`, plan
|
|
14
|
+
* §11 Verify-Before-Assert);
|
|
15
|
+
* (ii) that same ancestor's `.claude/agents/*.md` contains REAL files
|
|
16
|
+
* (never symlinks — `lstatSync(...).isSymbolicLink()`, distinguishing
|
|
17
|
+
* authored files from the C6/TD-204 INTERIM per-file symlinks) whose
|
|
18
|
+
* slug (basename without `.md`) collides with `manifestSlugs`.
|
|
19
|
+
*
|
|
20
|
+
* Never mutates anything — `detect()` only reads `package.json` and lists
|
|
21
|
+
* `.claude/agents/`. This module is purely read-only by design.
|
|
22
|
+
*
|
|
23
|
+
* ---
|
|
24
|
+
* MEASURED WARNING TEXT (TASK-036/AC-007 gate — CLOSED, S385):
|
|
25
|
+
* `DEV_CHECKOUT_WARNING_REASON` previously named the precedence risk
|
|
26
|
+
* WITHOUT asserting a verified direction ("provisional" — Universal
|
|
27
|
+
* Invariant 6 forbids hard-coding an unverified claim about third-party CLI
|
|
28
|
+
* behavior). `scripts/probes/ac007-precedence-probe.ts` (TASK-035) has since
|
|
29
|
+
* run the AC-007 gate for real (TASK-036): isolated `CLAUDE_CONFIG_DIR` probe
|
|
30
|
+
* (S382 method), 3/3 deterministic runs per axis, real-`~/.claude`
|
|
31
|
+
* hard-isolation-gate verified unchanged. **Verdict: CONFIRMS the documented
|
|
32
|
+
* claim** — agents resolve by PROJECT-scope, skills resolve by USER-scope.
|
|
33
|
+
* The precedence direction is NOT inverted. The text below now states this
|
|
34
|
+
* as measured fact and names the real practical risk it implies: the two
|
|
35
|
+
* scopes can still silently DRIFT APART over time (a project-scope skill
|
|
36
|
+
* edit has no effect on a live session until `orch-defs install` refreshes
|
|
37
|
+
* `~/.claude/skills`, unless the file happens to be an INTERIM symlink —
|
|
38
|
+
* C6/TD-204), independent of the (now-settled) precedence-direction
|
|
39
|
+
* question. Raw probe output: `tests/install/fixtures/
|
|
40
|
+
* ac007-precedence-probe-output.md`.
|
|
41
|
+
*/
|
|
42
|
+
import { existsSync, lstatSync, readFileSync, readdirSync } from 'node:fs';
|
|
43
|
+
import { dirname, join, resolve } from 'node:path';
|
|
44
|
+
/** Root package name of the orchestrator monorepo (Verify-Before-Assert, plan §11). */
|
|
45
|
+
const MONOREPO_PACKAGE_NAME = '@orchestrator-cli/core';
|
|
46
|
+
/**
|
|
47
|
+
* DEFINITIVE (measured — see module JSDoc / TASK-036 gate, S385). Names the
|
|
48
|
+
* precedence direction as a settled, empirically-confirmed fact and the
|
|
49
|
+
* real practical risk it implies (silent drift), not a hypothetical.
|
|
50
|
+
*/
|
|
51
|
+
const DEV_CHECKOUT_WARNING_REASON = 'Dev-checkout detectado: este cwd pertence ao monorepo orchestrator e ' +
|
|
52
|
+
'`.claude/agents/` contém arquivos reais cujos slugs colidem com o ' +
|
|
53
|
+
'manifest do pacote. Precedência MEDIDA empiricamente (AC-007/TASK-036, ' +
|
|
54
|
+
'gate S385, 3/3 runs determinísticos por eixo, probe isolado): agents ' +
|
|
55
|
+
'resolvem por PROJECT-scope (edições locais neste repo têm efeito ' +
|
|
56
|
+
'imediato numa sessão live) e skills resolvem por USER-scope ' +
|
|
57
|
+
'(`~/.claude/skills`) — editar um skill aqui NÃO afeta uma sessão live ' +
|
|
58
|
+
'até rodar `orch-defs install` novamente, a menos que o arquivo esteja ' +
|
|
59
|
+
'symlinkado (INTERIM/C6-TD-204). Isso CONFIRMA a direção documentada ' +
|
|
60
|
+
'pelo Claude Code (não é uma precedência invertida) — o risco real é a ' +
|
|
61
|
+
'divergência SILENCIOSA entre as duas cópias ao longo do tempo, não a ' +
|
|
62
|
+
'direção da precedência em si.';
|
|
63
|
+
export class DevCheckoutDetector {
|
|
64
|
+
manifestSlugs;
|
|
65
|
+
constructor(manifestSlugs) {
|
|
66
|
+
this.manifestSlugs = manifestSlugs;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Read-only detection. Never throws on a missing `.claude/agents`
|
|
70
|
+
* directory or a missing/unparseable ancestor `package.json` — those
|
|
71
|
+
* cases simply resolve to `'clean-install'`.
|
|
72
|
+
*/
|
|
73
|
+
detect(cwd) {
|
|
74
|
+
const monorepoRoot = this.findAncestorWithMatchingPackageName(cwd);
|
|
75
|
+
if (!monorepoRoot) {
|
|
76
|
+
return this.cleanInstall();
|
|
77
|
+
}
|
|
78
|
+
const matchedSlugs = this.findMatchingRealAgentSlugs(monorepoRoot);
|
|
79
|
+
if (matchedSlugs.length === 0) {
|
|
80
|
+
return this.cleanInstall();
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
mode: 'dev-checkout',
|
|
84
|
+
matchedSlugs,
|
|
85
|
+
reason: DEV_CHECKOUT_WARNING_REASON,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Walks up from `cwd` looking for the nearest ancestor directory whose
|
|
90
|
+
* `package.json` has `name === MONOREPO_PACKAGE_NAME` (§5.1: "presença de
|
|
91
|
+
* package.json na raiz do cwd, ou ancestral via walk-up").
|
|
92
|
+
*/
|
|
93
|
+
findAncestorWithMatchingPackageName(cwd) {
|
|
94
|
+
let current = resolve(cwd);
|
|
95
|
+
while (true) {
|
|
96
|
+
const packageJsonPath = join(current, 'package.json');
|
|
97
|
+
if (existsSync(packageJsonPath) && this.hasMatchingName(packageJsonPath)) {
|
|
98
|
+
return current;
|
|
99
|
+
}
|
|
100
|
+
const parent = dirname(current);
|
|
101
|
+
if (parent === current) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
current = parent;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
hasMatchingName(packageJsonPath) {
|
|
108
|
+
try {
|
|
109
|
+
const parsed = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
110
|
+
return parsed.name === MONOREPO_PACKAGE_NAME;
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Real (non-symlink) `.claude/agents/*.md` files at `root` whose slug
|
|
118
|
+
* (basename without `.md`) collides with `manifestSlugs`.
|
|
119
|
+
*/
|
|
120
|
+
findMatchingRealAgentSlugs(root) {
|
|
121
|
+
const agentsDir = join(root, '.claude', 'agents');
|
|
122
|
+
if (!existsSync(agentsDir)) {
|
|
123
|
+
return [];
|
|
124
|
+
}
|
|
125
|
+
const manifestSlugSet = new Set(this.manifestSlugs);
|
|
126
|
+
const matched = [];
|
|
127
|
+
for (const name of readdirSync(agentsDir)) {
|
|
128
|
+
if (!name.endsWith('.md')) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
const filePath = join(agentsDir, name);
|
|
132
|
+
if (lstatSync(filePath).isSymbolicLink()) {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
const slug = name.slice(0, -'.md'.length);
|
|
136
|
+
if (manifestSlugSet.has(slug)) {
|
|
137
|
+
matched.push(slug);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return matched;
|
|
141
|
+
}
|
|
142
|
+
cleanInstall() {
|
|
143
|
+
return {
|
|
144
|
+
mode: 'clean-install',
|
|
145
|
+
matchedSlugs: [],
|
|
146
|
+
reason: 'Nenhuma condição de dev-checkout detectada (package.json não corresponde ao monorepo, ou nenhum agent real com slug colidente).',
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=DevCheckoutDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DevCheckoutDetector.js","sourceRoot":"","sources":["../../src/install/DevCheckoutDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { HooksTemplate } from './types.js';
|
|
2
|
+
type HooksBlock = HooksTemplate['hooks'];
|
|
3
|
+
export declare class HooksWirer {
|
|
4
|
+
private readonly template;
|
|
5
|
+
private readonly targetSettingsPath;
|
|
6
|
+
constructor(template: HooksTemplate, targetSettingsPath: string);
|
|
7
|
+
wire(): {
|
|
8
|
+
merged: boolean;
|
|
9
|
+
hooksBlock: HooksBlock;
|
|
10
|
+
};
|
|
11
|
+
private readExistingSettings;
|
|
12
|
+
/**
|
|
13
|
+
* Turns every relative `command` path in the template (e.g.
|
|
14
|
+
* `hooks/session-start.mjs`) into a runnable shell command anchored at
|
|
15
|
+
* `targetRoot` (`dirname(targetSettingsPath)`).
|
|
16
|
+
*
|
|
17
|
+
* TASK-043 (RFC-040 installer, hook bundling): the template now references
|
|
18
|
+
* pre-bundled, self-contained ESM `.mjs` files (esbuild, build-time —
|
|
19
|
+
* `bundle-hooks.ts`), so the command is a plain `node <path>` — no `npx
|
|
20
|
+
* tsx` (and no node_modules resolution) required at all on the install
|
|
21
|
+
* target. This is the fix for the AC-008 probe's `MODULE_NOT_FOUND`
|
|
22
|
+
* finding: a fresh install target has no node_modules for `tsx` to resolve
|
|
23
|
+
* a raw `.ts` hook's non-builtin imports against.
|
|
24
|
+
*/
|
|
25
|
+
private resolveTemplateHooks;
|
|
26
|
+
private writeSettings;
|
|
27
|
+
}
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=HooksWirer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HooksWirer.d.ts","sourceRoot":"","sources":["../../src/install/HooksWirer.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,KAAK,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;AAOzC,qBAAa,UAAU;IAEnB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBADlB,QAAQ,EAAE,aAAa,EACvB,kBAAkB,EAAE,MAAM;IAG7C,IAAI,IAAI;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,UAAU,CAAA;KAAE;IAenD,OAAO,CAAC,oBAAoB;IAQ5B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,oBAAoB;IAkB5B,OAAO,CAAC,aAAa;CAItB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HooksWirer - read-modify-write merge of the (pre-filtered, ADR-006) hooks
|
|
3
|
+
* template into a target `settings.json` (RF-005).
|
|
4
|
+
*
|
|
5
|
+
* Non-destructive at two levels (TASK-013):
|
|
6
|
+
* 1. Root of the JSON document — every non-`hooks` key already present
|
|
7
|
+
* (`env`, `permissions`, ...) is preserved untouched.
|
|
8
|
+
* 2. Inside the `hooks` object — any event key NOT managed by this
|
|
9
|
+
* template (e.g. a foreign plugin's event) is preserved untouched;
|
|
10
|
+
* only the template's own event keys are (re)written, so re-running
|
|
11
|
+
* `wire()` is idempotent for those keys (no duplication).
|
|
12
|
+
*
|
|
13
|
+
* `targetSettingsPath` is injected (ADR-004) — never resolved internally.
|
|
14
|
+
* `targetRoot` (the directory commands are prefixed with) is derived from
|
|
15
|
+
* `dirname(targetSettingsPath)`, since the template stores bare relative
|
|
16
|
+
* paths (e.g. `hooks/session-start.mjs`, a bundled artifact since TASK-043)
|
|
17
|
+
* that only become a runnable command once joined with the install target
|
|
18
|
+
* root.
|
|
19
|
+
*/
|
|
20
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
21
|
+
import { dirname, join } from 'node:path';
|
|
22
|
+
export class HooksWirer {
|
|
23
|
+
template;
|
|
24
|
+
targetSettingsPath;
|
|
25
|
+
constructor(template, targetSettingsPath) {
|
|
26
|
+
this.template = template;
|
|
27
|
+
this.targetSettingsPath = targetSettingsPath;
|
|
28
|
+
}
|
|
29
|
+
wire() {
|
|
30
|
+
const existingSettings = this.readExistingSettings();
|
|
31
|
+
const resolvedTemplateHooks = this.resolveTemplateHooks();
|
|
32
|
+
const mergedHooks = {
|
|
33
|
+
...(existingSettings.hooks ?? {}),
|
|
34
|
+
...resolvedTemplateHooks,
|
|
35
|
+
};
|
|
36
|
+
const mergedSettings = { ...existingSettings, hooks: mergedHooks };
|
|
37
|
+
this.writeSettings(mergedSettings);
|
|
38
|
+
return { merged: true, hooksBlock: mergedHooks };
|
|
39
|
+
}
|
|
40
|
+
readExistingSettings() {
|
|
41
|
+
if (!existsSync(this.targetSettingsPath)) {
|
|
42
|
+
return {};
|
|
43
|
+
}
|
|
44
|
+
const raw = readFileSync(this.targetSettingsPath, 'utf-8');
|
|
45
|
+
return JSON.parse(raw);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Turns every relative `command` path in the template (e.g.
|
|
49
|
+
* `hooks/session-start.mjs`) into a runnable shell command anchored at
|
|
50
|
+
* `targetRoot` (`dirname(targetSettingsPath)`).
|
|
51
|
+
*
|
|
52
|
+
* TASK-043 (RFC-040 installer, hook bundling): the template now references
|
|
53
|
+
* pre-bundled, self-contained ESM `.mjs` files (esbuild, build-time —
|
|
54
|
+
* `bundle-hooks.ts`), so the command is a plain `node <path>` — no `npx
|
|
55
|
+
* tsx` (and no node_modules resolution) required at all on the install
|
|
56
|
+
* target. This is the fix for the AC-008 probe's `MODULE_NOT_FOUND`
|
|
57
|
+
* finding: a fresh install target has no node_modules for `tsx` to resolve
|
|
58
|
+
* a raw `.ts` hook's non-builtin imports against.
|
|
59
|
+
*/
|
|
60
|
+
resolveTemplateHooks() {
|
|
61
|
+
const targetRoot = dirname(this.targetSettingsPath);
|
|
62
|
+
const resolved = {};
|
|
63
|
+
for (const [eventName, groups] of Object.entries(this.template.hooks)) {
|
|
64
|
+
resolved[eventName] = groups.map((group) => ({
|
|
65
|
+
matcher: group.matcher,
|
|
66
|
+
hooks: group.hooks.map((hook) => ({
|
|
67
|
+
type: hook.type,
|
|
68
|
+
command: `node ${join(targetRoot, hook.command)}`,
|
|
69
|
+
timeout: hook.timeout,
|
|
70
|
+
})),
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
return resolved;
|
|
74
|
+
}
|
|
75
|
+
writeSettings(settings) {
|
|
76
|
+
mkdirSync(dirname(this.targetSettingsPath), { recursive: true });
|
|
77
|
+
writeFileSync(this.targetSettingsPath, JSON.stringify(settings, null, 2));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=HooksWirer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HooksWirer.js","sourceRoot":"","sources":["../../src/install/HooksWirer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAU1C,MAAM,OAAO,UAAU;IAEF;IACA;IAFnB,YACmB,QAAuB,EACvB,kBAA0B;QAD1B,aAAQ,GAAR,QAAQ,CAAe;QACvB,uBAAkB,GAAlB,kBAAkB,CAAQ;IAC1C,CAAC;IAEJ,IAAI;QACF,MAAM,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACrD,MAAM,qBAAqB,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE1D,MAAM,WAAW,GAAe;YAC9B,GAAG,CAAC,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC;YACjC,GAAG,qBAAqB;SACzB,CAAC;QACF,MAAM,cAAc,GAAkB,EAAE,GAAG,gBAAgB,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QAElF,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;QAEnC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;IACnD,CAAC;IAEO,oBAAoB;QAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACzC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;IAC1C,CAAC;IAED;;;;;;;;;;;;OAYG;IACK,oBAAoB;QAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAe,EAAE,CAAC;QAEhC,KAAK,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACtE,QAAQ,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC3C,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAChC,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,QAAQ,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;oBACjD,OAAO,EAAE,IAAI,CAAC,OAAO;iBACtB,CAAC,CAAC;aACJ,CAAC,CAAC,CAAC;QACN,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,aAAa,CAAC,QAAuB;QAC3C,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,aAAa,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ManifestLoader } from '../manifest/ManifestLoader.js';
|
|
2
|
+
import type { DefinitionCategory } from '../manifest/types.js';
|
|
3
|
+
export interface LocalDiffEntry {
|
|
4
|
+
slug: string;
|
|
5
|
+
category: DefinitionCategory;
|
|
6
|
+
file: string;
|
|
7
|
+
status: 'new' | 'updated' | 'unchanged';
|
|
8
|
+
}
|
|
9
|
+
export interface LocalDiffResult {
|
|
10
|
+
entries: LocalDiffEntry[];
|
|
11
|
+
hasChanges: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare class LocalDiffReporter {
|
|
14
|
+
private readonly loader;
|
|
15
|
+
private readonly targetRoot;
|
|
16
|
+
constructor(loader: ManifestLoader, targetRoot: string);
|
|
17
|
+
/**
|
|
18
|
+
* Pure read comparison — never mutates `stagingDir` nor `targetRoot`.
|
|
19
|
+
* Iterates exclusively via `loader.getAllEntries()` (same R-7 discipline
|
|
20
|
+
* as `Materializer`), never `package.json.files`.
|
|
21
|
+
*/
|
|
22
|
+
report(stagingDir: string): LocalDiffResult;
|
|
23
|
+
private statusFor;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=LocalDiffReporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocalDiffReporter.d.ts","sourceRoot":"","sources":["../../src/install/LocalDiffReporter.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,GAAG,SAAS,GAAG,WAAW,CAAC;CACzC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBADV,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,MAAM;IAGrC;;;;OAIG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe;IAc3C,OAAO,CAAC,SAAS;CAYlB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LocalDiffReporter - compares staged content (the output of
|
|
3
|
+
* `Materializer.stage()`) against what is CURRENTLY installed at
|
|
4
|
+
* `targetRoot`, for the `--dry-run` operations plan (RF-008, AC-011).
|
|
5
|
+
*
|
|
6
|
+
* ADR-005: reaproveita apenas o *shape* de `DiffEntry` (`category`/`slug`/
|
|
7
|
+
* `status`) de `DiffCommand`, NUNCA a classe em si — `DiffCommand` compara o
|
|
8
|
+
* manifest local contra uma API HTTP remota (`ApiClient.getDefinitionsMetadata()`);
|
|
9
|
+
* este módulo compara dois DIRETÓRIOS LOCAIS (staging vs. `targetRoot`), uma
|
|
10
|
+
* fonte de dados fundamentalmente diferente. Nenhuma dependência de
|
|
11
|
+
* `ApiClient` é introduzida aqui — puro filesystem, funciona mesmo offline.
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
export class LocalDiffReporter {
|
|
16
|
+
loader;
|
|
17
|
+
targetRoot;
|
|
18
|
+
constructor(loader, targetRoot) {
|
|
19
|
+
this.loader = loader;
|
|
20
|
+
this.targetRoot = targetRoot;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Pure read comparison — never mutates `stagingDir` nor `targetRoot`.
|
|
24
|
+
* Iterates exclusively via `loader.getAllEntries()` (same R-7 discipline
|
|
25
|
+
* as `Materializer`), never `package.json.files`.
|
|
26
|
+
*/
|
|
27
|
+
report(stagingDir) {
|
|
28
|
+
const entries = this.loader.getAllEntries().map((entry) => ({
|
|
29
|
+
slug: entry.slug,
|
|
30
|
+
category: entry.category,
|
|
31
|
+
file: entry.file,
|
|
32
|
+
status: this.statusFor(entry.file, stagingDir),
|
|
33
|
+
}));
|
|
34
|
+
return {
|
|
35
|
+
entries,
|
|
36
|
+
hasChanges: entries.some((entry) => entry.status !== 'unchanged'),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
statusFor(relativeFile, stagingDir) {
|
|
40
|
+
const targetPath = join(this.targetRoot, relativeFile);
|
|
41
|
+
if (!existsSync(targetPath)) {
|
|
42
|
+
return 'new';
|
|
43
|
+
}
|
|
44
|
+
const stagedPath = join(stagingDir, relativeFile);
|
|
45
|
+
const stagedContent = existsSync(stagedPath) ? readFileSync(stagedPath, 'utf-8') : '';
|
|
46
|
+
const targetContent = readFileSync(targetPath, 'utf-8');
|
|
47
|
+
return targetContent === stagedContent ? 'unchanged' : 'updated';
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=LocalDiffReporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocalDiffReporter.js","sourceRoot":"","sources":["../../src/install/LocalDiffReporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAgBjC,MAAM,OAAO,iBAAiB;IAET;IACA;IAFnB,YACmB,MAAsB,EACtB,UAAkB;QADlB,WAAM,GAAN,MAAM,CAAgB;QACtB,eAAU,GAAV,UAAU,CAAQ;IAClC,CAAC;IAEJ;;;;OAIG;IACH,MAAM,CAAC,UAAkB;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC1D,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC;SAC/C,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,OAAO;YACP,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC;SAClE,CAAC;IACJ,CAAC;IAEO,SAAS,CAAC,YAAoB,EAAE,UAAkB;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACvD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAClD,MAAM,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,MAAM,aAAa,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAExD,OAAO,aAAa,KAAK,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,CAAC;CACF"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Materializer - stage→verify→swap atomic materialization of manifest
|
|
3
|
+
* entries into the target filesystem root (RF-001, ADR-001/ADR-003/ADR-004).
|
|
4
|
+
*
|
|
5
|
+
* Never mutates `targetRoot` directly: `stage()` writes to an isolated
|
|
6
|
+
* sibling staging directory (the `~/.claude.install-tmp-<pid>/` pattern);
|
|
7
|
+
* only `swap()` touches `targetRoot`, via an atomic rename per category
|
|
8
|
+
* (falling back to copy+remove across filesystem boundaries, ADR-003).
|
|
9
|
+
*/
|
|
10
|
+
import type { ManifestLoader } from '../manifest/ManifestLoader.js';
|
|
11
|
+
import type { DefinitionCategory, DefinitionEntry } from '../manifest/types.js';
|
|
12
|
+
export declare class Materializer {
|
|
13
|
+
private readonly loader;
|
|
14
|
+
private readonly targetRoot;
|
|
15
|
+
constructor(loader: ManifestLoader, targetRoot: string);
|
|
16
|
+
/**
|
|
17
|
+
* Stages every manifested definition entry into an isolated sibling
|
|
18
|
+
* directory (never `targetRoot`). Iterates exclusively via
|
|
19
|
+
* `loader.getAllEntries()` — never `package.json.files` (R-7 regression,
|
|
20
|
+
* spec finding 2.4.1: the dead `workflows` entry).
|
|
21
|
+
*/
|
|
22
|
+
stage(): Promise<{
|
|
23
|
+
stagingDir: string;
|
|
24
|
+
entries: Array<DefinitionEntry & {
|
|
25
|
+
category: DefinitionCategory;
|
|
26
|
+
}>;
|
|
27
|
+
}>;
|
|
28
|
+
/**
|
|
29
|
+
* Recomputes the SHA-256 checksum of every staged file against the
|
|
30
|
+
* manifest. Pure read-only comparison — never mutates `targetRoot`, so
|
|
31
|
+
* aborting after a failed `verify()` is always safe.
|
|
32
|
+
*/
|
|
33
|
+
verify(stagingDir: string): {
|
|
34
|
+
valid: boolean;
|
|
35
|
+
mismatches: DefinitionEntry[];
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Atomically renames each staged category directory into `targetRoot`
|
|
39
|
+
* (ADR-003). Removes an INTERIM symlink at the target category before
|
|
40
|
+
* writing (FA-002) — never writes through it. Cleans up the staging
|
|
41
|
+
* directory in a `finally`, whether swap succeeds or aborts partway
|
|
42
|
+
* (ADR-003 consequence).
|
|
43
|
+
*/
|
|
44
|
+
swap(stagingDir: string): Promise<{
|
|
45
|
+
filesWritten: number;
|
|
46
|
+
filesUnchanged: number;
|
|
47
|
+
}>;
|
|
48
|
+
/**
|
|
49
|
+
* Recursively copies skill asset files that are NOT covered by any
|
|
50
|
+
* manifest entry (spec finding 2.4.2 / risk R-5) — e.g.
|
|
51
|
+
* `skills/<slug>/scripts/*.js`, never scanned by generate-manifest.ts,
|
|
52
|
+
* which only tracks a single `.md` level directly under each skill
|
|
53
|
+
* directory (no recursion into subdirectories).
|
|
54
|
+
*/
|
|
55
|
+
copySkillAssets(stagingDir: string): Promise<string[]>;
|
|
56
|
+
private countChanges;
|
|
57
|
+
private stagingDirPath;
|
|
58
|
+
private swapCategory;
|
|
59
|
+
/**
|
|
60
|
+
* Removes whatever currently occupies `targetPath` before the atomic
|
|
61
|
+
* rename. An INTERIM symlink (dev-checkout, FA-002) is unlinked directly —
|
|
62
|
+
* never followed/recursed into — so its link target is left untouched.
|
|
63
|
+
*/
|
|
64
|
+
private removeExistingTarget;
|
|
65
|
+
private walkRecursive;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=Materializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Materializer.d.ts","sourceRoot":"","sources":["../../src/install/Materializer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkBH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAMhF,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBADV,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,MAAM;IAGrC;;;;;OAKG;IACG,KAAK,IAAI,OAAO,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,KAAK,CAAC,eAAe,GAAG;YAAE,QAAQ,EAAE,kBAAkB,CAAA;SAAE,CAAC,CAAC;KACpE,CAAC;IAkBF;;;;OAIG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,eAAe,EAAE,CAAA;KAAE;IAoB7E;;;;;;OAMG;IACG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;IAkBzF;;;;;;OAMG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAoC5D,OAAO,CAAC,YAAY;IAsBpB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,YAAY;IAsBpB;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,aAAa;CAetB"}
|