@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.
Files changed (87) hide show
  1. package/README.md +113 -0
  2. package/agents/debug-sidecar.md +1 -1
  3. package/agents/doc-sidecar.md +1 -1
  4. package/agents/test-sidecar.md +1 -1
  5. package/dist/cli.js +78 -0
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/DiffCommand.js +1 -1
  8. package/dist/commands/DiffCommand.js.map +1 -1
  9. package/dist/commands/InstallCommand.d.ts +41 -0
  10. package/dist/commands/InstallCommand.d.ts.map +1 -0
  11. package/dist/commands/InstallCommand.js +253 -0
  12. package/dist/commands/InstallCommand.js.map +1 -0
  13. package/dist/http/ApiClient.d.ts +5 -0
  14. package/dist/http/ApiClient.d.ts.map +1 -1
  15. package/dist/http/ApiClient.js.map +1 -1
  16. package/dist/install/DevCheckoutDetector.d.ts +66 -0
  17. package/dist/install/DevCheckoutDetector.d.ts.map +1 -0
  18. package/dist/install/DevCheckoutDetector.js +150 -0
  19. package/dist/install/DevCheckoutDetector.js.map +1 -0
  20. package/dist/install/HooksWirer.d.ts +29 -0
  21. package/dist/install/HooksWirer.d.ts.map +1 -0
  22. package/dist/install/HooksWirer.js +80 -0
  23. package/dist/install/HooksWirer.js.map +1 -0
  24. package/dist/install/LocalDiffReporter.d.ts +25 -0
  25. package/dist/install/LocalDiffReporter.d.ts.map +1 -0
  26. package/dist/install/LocalDiffReporter.js +50 -0
  27. package/dist/install/LocalDiffReporter.js.map +1 -0
  28. package/dist/install/Materializer.d.ts +67 -0
  29. package/dist/install/Materializer.d.ts.map +1 -0
  30. package/dist/install/Materializer.js +196 -0
  31. package/dist/install/Materializer.js.map +1 -0
  32. package/dist/install/McpRegistrar.d.ts +63 -0
  33. package/dist/install/McpRegistrar.d.ts.map +1 -0
  34. package/dist/install/McpRegistrar.js +114 -0
  35. package/dist/install/McpRegistrar.js.map +1 -0
  36. package/dist/install/ProcessRunner.d.ts +25 -0
  37. package/dist/install/ProcessRunner.d.ts.map +1 -0
  38. package/dist/install/ProcessRunner.js +41 -0
  39. package/dist/install/ProcessRunner.js.map +1 -0
  40. package/dist/install/ProjectSettingsNeutralizer.d.ts +39 -0
  41. package/dist/install/ProjectSettingsNeutralizer.d.ts.map +1 -0
  42. package/dist/install/ProjectSettingsNeutralizer.js +100 -0
  43. package/dist/install/ProjectSettingsNeutralizer.js.map +1 -0
  44. package/dist/install/types.d.ts +52 -0
  45. package/dist/install/types.d.ts.map +1 -0
  46. package/dist/install/types.js +8 -0
  47. package/dist/install/types.js.map +1 -0
  48. package/dist/manifest/ManifestLoader.d.ts.map +1 -1
  49. package/dist/manifest/ManifestLoader.js +3 -2
  50. package/dist/manifest/ManifestLoader.js.map +1 -1
  51. package/dist/manifest/types.d.ts +3 -0
  52. package/dist/manifest/types.d.ts.map +1 -1
  53. package/dist/scripts/bundle-hooks.d.ts +39 -0
  54. package/dist/scripts/bundle-hooks.d.ts.map +1 -0
  55. package/dist/scripts/bundle-hooks.js +165 -0
  56. package/dist/scripts/bundle-hooks.js.map +1 -0
  57. package/dist/scripts/generate-manifest.d.ts +22 -3
  58. package/dist/scripts/generate-manifest.d.ts.map +1 -1
  59. package/dist/scripts/generate-manifest.js +78 -35
  60. package/dist/scripts/generate-manifest.js.map +1 -1
  61. package/hooks/dangling-guard.mjs +7426 -0
  62. package/hooks/dangling-guard.ts +223 -6
  63. package/hooks/gate-guardian.mjs +463 -0
  64. package/hooks/lib/additional-directories-sync.ts +295 -0
  65. package/hooks/lib/api-client.ts +388 -7
  66. package/hooks/lib/session-selection.ts +81 -0
  67. package/hooks/mailbox-listener.mjs +259 -0
  68. package/hooks/post-compact.mjs +7931 -0
  69. package/hooks/post-implement.mjs +238 -0
  70. package/hooks/session-start.mjs +8234 -0
  71. package/hooks/session-start.ts +264 -23
  72. package/hooks/sprint-registry.mjs +59 -0
  73. package/hooks/subagent-start.mjs +289 -0
  74. package/hooks/subagent-stop.mjs +7793 -0
  75. package/hooks/subagent-stop.ts +4 -2
  76. package/hooks/user-prompt.mjs +329 -0
  77. package/hooks/workflow-guard.mjs +7805 -0
  78. package/hooks/workflow-guard.ts +360 -119
  79. package/hooks-settings-template.json +63 -0
  80. package/manifest.json +54 -68
  81. package/mcp-servers.json +48 -0
  82. package/package.json +10 -4
  83. package/personas/auditor-compliance.md +104 -0
  84. package/personas/cfo-conservador.md +88 -0
  85. package/personas/designer-perfeccionista.md +104 -0
  86. package/personas/diretor-cetico-fmcg.md +80 -0
  87. 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;QAO1B,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"}
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"}