@sdd-method/sdd-cli 0.21.0 → 0.23.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 (153) hide show
  1. package/README.md +30 -10
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +5 -3
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/agent-harness.d.ts +20 -0
  6. package/dist/lib/agent-harness.d.ts.map +1 -0
  7. package/dist/lib/agent-harness.js +28 -0
  8. package/dist/lib/agent-harness.js.map +1 -0
  9. package/dist/lib/briefing/index.d.ts +15 -0
  10. package/dist/lib/briefing/index.d.ts.map +1 -0
  11. package/dist/lib/briefing/index.js +13 -0
  12. package/dist/lib/briefing/index.js.map +1 -0
  13. package/dist/lib/briefing/render.d.ts +57 -0
  14. package/dist/lib/briefing/render.d.ts.map +1 -0
  15. package/dist/lib/briefing/render.js +112 -0
  16. package/dist/lib/briefing/render.js.map +1 -0
  17. package/dist/lib/briefing/variables.d.ts +49 -0
  18. package/dist/lib/briefing/variables.d.ts.map +1 -0
  19. package/dist/lib/briefing/variables.js +92 -0
  20. package/dist/lib/briefing/variables.js.map +1 -0
  21. package/dist/lib/bundle.d.ts +57 -2
  22. package/dist/lib/bundle.d.ts.map +1 -1
  23. package/dist/lib/bundle.js +53 -19
  24. package/dist/lib/bundle.js.map +1 -1
  25. package/dist/lib/catalogue/aggregate.d.ts +19 -0
  26. package/dist/lib/catalogue/aggregate.d.ts.map +1 -1
  27. package/dist/lib/catalogue/aggregate.js +88 -0
  28. package/dist/lib/catalogue/aggregate.js.map +1 -1
  29. package/dist/lib/catalogue/build.d.ts.map +1 -1
  30. package/dist/lib/catalogue/build.js +24 -1
  31. package/dist/lib/catalogue/build.js.map +1 -1
  32. package/dist/lib/catalogue/builders/capabilities.d.ts.map +1 -1
  33. package/dist/lib/catalogue/builders/capabilities.js +18 -4
  34. package/dist/lib/catalogue/builders/capabilities.js.map +1 -1
  35. package/dist/lib/catalogue/builders/feature-subscription-channels.d.ts +12 -0
  36. package/dist/lib/catalogue/builders/feature-subscription-channels.d.ts.map +1 -0
  37. package/dist/lib/catalogue/builders/feature-subscription-channels.js +197 -0
  38. package/dist/lib/catalogue/builders/feature-subscription-channels.js.map +1 -0
  39. package/dist/lib/catalogue/builders/index.d.ts +4 -0
  40. package/dist/lib/catalogue/builders/index.d.ts.map +1 -1
  41. package/dist/lib/catalogue/builders/index.js +2 -0
  42. package/dist/lib/catalogue/builders/index.js.map +1 -1
  43. package/dist/lib/catalogue/builders/product-platform-dependencies.d.ts +10 -0
  44. package/dist/lib/catalogue/builders/product-platform-dependencies.d.ts.map +1 -0
  45. package/dist/lib/catalogue/builders/product-platform-dependencies.js +155 -0
  46. package/dist/lib/catalogue/builders/product-platform-dependencies.js.map +1 -0
  47. package/dist/lib/catalogue/canonical-schema.yaml +96 -1
  48. package/dist/lib/catalogue/traceability-loader.d.ts +17 -0
  49. package/dist/lib/catalogue/traceability-loader.d.ts.map +1 -1
  50. package/dist/lib/catalogue/traceability-loader.js +6 -0
  51. package/dist/lib/catalogue/traceability-loader.js.map +1 -1
  52. package/dist/lib/generate-briefing/index.d.ts +22 -0
  53. package/dist/lib/generate-briefing/index.d.ts.map +1 -0
  54. package/dist/lib/generate-briefing/index.js +77 -0
  55. package/dist/lib/generate-briefing/index.js.map +1 -0
  56. package/dist/lib/hooks-seed/copilot.d.ts +93 -0
  57. package/dist/lib/hooks-seed/copilot.d.ts.map +1 -0
  58. package/dist/lib/hooks-seed/copilot.js +167 -0
  59. package/dist/lib/hooks-seed/copilot.js.map +1 -0
  60. package/dist/lib/hooks-seed/index.d.ts +4 -0
  61. package/dist/lib/hooks-seed/index.d.ts.map +1 -1
  62. package/dist/lib/hooks-seed/index.js +2 -0
  63. package/dist/lib/hooks-seed/index.js.map +1 -1
  64. package/dist/lib/hooks-seed/lifecycle-mapping.d.ts +12 -0
  65. package/dist/lib/hooks-seed/lifecycle-mapping.d.ts.map +1 -0
  66. package/dist/lib/hooks-seed/lifecycle-mapping.js +28 -0
  67. package/dist/lib/hooks-seed/lifecycle-mapping.js.map +1 -0
  68. package/dist/lib/init/index.d.ts +6 -4
  69. package/dist/lib/init/index.d.ts.map +1 -1
  70. package/dist/lib/init/index.js +5 -26
  71. package/dist/lib/init/index.js.map +1 -1
  72. package/dist/lib/init/platform.d.ts +9 -0
  73. package/dist/lib/init/platform.d.ts.map +1 -1
  74. package/dist/lib/init/platform.js +8 -2
  75. package/dist/lib/init/platform.js.map +1 -1
  76. package/dist/lib/list/discover.d.ts +28 -0
  77. package/dist/lib/list/discover.d.ts.map +1 -1
  78. package/dist/lib/list/discover.js +27 -11
  79. package/dist/lib/list/discover.js.map +1 -1
  80. package/dist/lib/list/format.d.ts +2 -0
  81. package/dist/lib/list/format.d.ts.map +1 -1
  82. package/dist/lib/list/format.js +44 -4
  83. package/dist/lib/list/format.js.map +1 -1
  84. package/dist/lib/list/index.d.ts +1 -0
  85. package/dist/lib/list/index.d.ts.map +1 -1
  86. package/dist/lib/list/index.js +1 -0
  87. package/dist/lib/list/index.js.map +1 -1
  88. package/dist/lib/lock-file.d.ts +23 -5
  89. package/dist/lib/lock-file.d.ts.map +1 -1
  90. package/dist/lib/lock-file.js +86 -9
  91. package/dist/lib/lock-file.js.map +1 -1
  92. package/dist/lib/pack/builder.d.ts +55 -0
  93. package/dist/lib/pack/builder.d.ts.map +1 -0
  94. package/dist/lib/pack/builder.js +226 -0
  95. package/dist/lib/pack/builder.js.map +1 -0
  96. package/dist/lib/pack/index.d.ts +26 -0
  97. package/dist/lib/pack/index.d.ts.map +1 -0
  98. package/dist/lib/pack/index.js +85 -0
  99. package/dist/lib/pack/index.js.map +1 -0
  100. package/dist/lib/pack/leakage.d.ts +55 -0
  101. package/dist/lib/pack/leakage.d.ts.map +1 -0
  102. package/dist/lib/pack/leakage.js +133 -0
  103. package/dist/lib/pack/leakage.js.map +1 -0
  104. package/dist/lib/pack/schema.d.ts +36 -0
  105. package/dist/lib/pack/schema.d.ts.map +1 -0
  106. package/dist/lib/pack/schema.js +63 -0
  107. package/dist/lib/pack/schema.js.map +1 -0
  108. package/dist/lib/pack/seed.d.ts +46 -0
  109. package/dist/lib/pack/seed.d.ts.map +1 -0
  110. package/dist/lib/pack/seed.js +107 -0
  111. package/dist/lib/pack/seed.js.map +1 -0
  112. package/dist/lib/repo-kind.d.ts +8 -4
  113. package/dist/lib/repo-kind.d.ts.map +1 -1
  114. package/dist/lib/repo-kind.js +10 -2
  115. package/dist/lib/repo-kind.js.map +1 -1
  116. package/dist/lib/sync/briefing-merge.d.ts +34 -0
  117. package/dist/lib/sync/briefing-merge.d.ts.map +1 -0
  118. package/dist/lib/sync/briefing-merge.js +82 -0
  119. package/dist/lib/sync/briefing-merge.js.map +1 -0
  120. package/dist/lib/sync/config.d.ts +33 -0
  121. package/dist/lib/sync/config.d.ts.map +1 -0
  122. package/dist/lib/sync/config.js +40 -0
  123. package/dist/lib/sync/config.js.map +1 -0
  124. package/dist/lib/sync/copilot-hooks-merge.d.ts +30 -0
  125. package/dist/lib/sync/copilot-hooks-merge.d.ts.map +1 -0
  126. package/dist/lib/sync/copilot-hooks-merge.js +96 -0
  127. package/dist/lib/sync/copilot-hooks-merge.js.map +1 -0
  128. package/dist/lib/sync/index.d.ts +40 -3
  129. package/dist/lib/sync/index.d.ts.map +1 -1
  130. package/dist/lib/sync/index.js +186 -26
  131. package/dist/lib/sync/index.js.map +1 -1
  132. package/dist/lib/sync/source-tag.d.ts +5 -0
  133. package/dist/lib/sync/source-tag.d.ts.map +1 -0
  134. package/dist/lib/sync/source-tag.js +34 -0
  135. package/dist/lib/sync/source-tag.js.map +1 -0
  136. package/dist/verbs/generate-briefing.d.ts +3 -0
  137. package/dist/verbs/generate-briefing.d.ts.map +1 -0
  138. package/dist/verbs/generate-briefing.js +28 -0
  139. package/dist/verbs/generate-briefing.js.map +1 -0
  140. package/dist/verbs/init.d.ts.map +1 -1
  141. package/dist/verbs/init.js +11 -8
  142. package/dist/verbs/init.js.map +1 -1
  143. package/dist/verbs/list.d.ts.map +1 -1
  144. package/dist/verbs/list.js +3 -1
  145. package/dist/verbs/list.js.map +1 -1
  146. package/dist/verbs/pack.d.ts +3 -0
  147. package/dist/verbs/pack.d.ts.map +1 -0
  148. package/dist/verbs/pack.js +35 -0
  149. package/dist/verbs/pack.js.map +1 -0
  150. package/dist/verbs/sync.d.ts.map +1 -1
  151. package/dist/verbs/sync.js +56 -15
  152. package/dist/verbs/sync.js.map +1 -1
  153. package/package.json +2 -2
package/README.md CHANGED
@@ -3,7 +3,8 @@
3
3
  Method-layer CLI for the SDD method's SDD repository lifecycle.
4
4
 
5
5
  **Status:** v0.3.0. All four verbs shipped across all three profiles; the
6
- companion `generate-claude-md` verb lands alongside.
6
+ companion `generate-briefing` verb lands alongside (replaces the v0.3–v0.21
7
+ `generate-claude-md` per ADR 0148).
7
8
 
8
9
  ## What this is
9
10
 
@@ -12,11 +13,11 @@ uses to manage SDD repositories. It has four verbs and three profiles:
12
13
 
13
14
  | Verb | Behaviour | v0.3.0 |
14
15
  |---|---|---|
15
- | `init --profile {platform\|application\|integration}` | Scaffold a new SDD repository: render profile-specific manifests, apply the method baseline, write CLAUDE.md, `git init`, run post-bootstrap validation | Native TS |
16
- | `sync` | Pull the latest upstream method baseline into an existing SDD repository | Native TS |
16
+ | `init --profile {platform\|application\|integration}` | Scaffold a new SDD repository: render profile-specific manifests, apply the method baseline, emit `agent-instructions.md` + harness wrapper (per ADR 0148), `git init`, run post-bootstrap validation | Native TS |
17
+ | `sync` | Pull the latest upstream method baseline into an existing SDD repository (refreshes `agent-instructions.md` + the harness wrapper's method-managed block) | Native TS |
17
18
  | `validate` | Run the method-level validation suite for this SDD repository (profile-aware dispatch; platform suite = 7 core + optional `docs-all` wrapper) | TS dispatch over bundled + target-repo bash validators |
18
19
  | `list` | Enumerate SDD repositories discoverable in the workspace (text or JSON output; profile filter) | Native TS |
19
- | `generate-claude-md` | Regenerate CLAUDE.md for an existing SDD repo using the v0.3.0 native renderer | Native TS |
20
+ | `generate-briefing` | Regenerate `agent-instructions.md` + the harness wrapper for an existing SDD repo (no bundle sync) | Native TS |
20
21
  | `mcp serve` | Start a local stdio Model Context Protocol (MCP) server exposing the SDD as resources and tools (ADR 0128, Phase 1) | Native TS |
21
22
 
22
23
  Every verb is local git + filesystem. No authentication, no network calls,
@@ -71,14 +72,33 @@ sdd-cli list --workspace-root ~/Projects/contextua-applications \
71
72
  --workspace-root ~/Projects/contextua-integrations
72
73
  sdd-cli list --profile integration --format json
73
74
 
74
- # Regenerate CLAUDE.md for an existing repo
75
- sdd-cli generate-claude-md --app-id self-service-admin \
76
- --platform-name "Contextua" --allow-existing
75
+ # Regenerate the briefing files (agent-instructions.md + CLAUDE.md / AGENTS.md)
76
+ sdd-cli generate-briefing --agent-harness claude-code --allow-overwrite
77
77
  ```
78
78
 
79
- ### CLAUDE.md output scope
79
+ ### Briefing layer (`agent-instructions.md` + harness wrapper)
80
80
 
81
- `sdd-cli init` and `sdd-cli generate-claude-md` ship a **native TypeScript renderer** for CLAUDE.md. Output is a minimal, stable subset focused on repo identity, lifecycle commands, and the managed-path reminder. It is deliberately narrower than the upstream bash generators (`generate-app-claude-md.sh`, `generate-integration-claude-md.sh`) this keeps the `commander`-only runtime-dep promise by avoiding `yq` as a host prerequisite. Partners who want the richer bash output can still run those scripts directly from an sdd-method clone.
81
+ Per [ADR 0148](https://github.com/tomfosteruk/sdd-method/blob/main/docs/method/adr/ADR%200148:%20Method-Defined%20Agent%20Briefing%20Layer.md), `sdd-cli init` and `sdd-cli sync` emit two files at the SDD root:
82
+
83
+ - **`agent-instructions.md`** — fully method-managed, harness-neutral briefing. Overwritten unconditionally on every sync.
84
+ - **The harness wrapper** — `CLAUDE.md` under `--agent-harness claude-code`, `AGENTS.md` under `--agent-harness github-copilot-cli`. Thin pointer with `<!-- method-managed: begin/end -->` markers. The method-managed block is refreshed on sync; adopter content below survives.
85
+
86
+ Templates ship in the bundle at `orchestration/templates/briefing/`. Older bundles that pre-date ADR 0148 sync without emitting these files (graceful skip with a log line).
87
+
88
+ **Migration note (v0.21.x → v0.22.0):** the legacy `generate-claude-md` verb retired in favour of `generate-briefing`. The v0.3–v0.21 native CLAUDE.md renderer is gone — its rich-content shape is replaced by the upstream template-driven thin-pointer shape. Adopters with hand-edited CLAUDE.md files will see sync refuse the wrapper rewrite without `--allow-overwrite` on first run; rehome any custom content below the `method-managed: end` marker before sync, or pass `--allow-overwrite` after backing up.
89
+
90
+ ### Agent-harness selection (`--agent-harness`)
91
+
92
+ Per [ADR 0141](https://github.com/tomfosteruk/sdd-method/blob/main/docs/method/adr/ADR%200141:%20Agent-Harness-Neutral%20Skills%20and%20Hooks.md), `sdd-cli init` and `sdd-cli sync` accept `--agent-harness <name>` to drive which hook configuration gets emitted. Supported values:
93
+
94
+ | Value | Hooks surface | MCP surface |
95
+ |---|---|---|
96
+ | `claude-code` (default, reference) | `.claude/settings.json` `hooks` block — `PreToolUse` method-guard + `SessionStart` ADR-structure check | `.claude/settings.json` `mcpServers` block |
97
+ | `github-copilot-cli` | `.github/hooks/pre-tool-use.json` + `.github/hooks/session-start.json` (per `docs/method/methods/hook-contracts.md`) | not yet wired — ADR 0150 Phase 3 lands the Copilot-CLI MCP surface |
98
+
99
+ Adopters using Cursor / Cline / Aider / custom harnesses implement the portable contracts themselves per ADR 0141 §4.5 — see `docs/method/onboarding/agent-harness-adopter-responsibility.md` in the method baseline.
100
+
101
+ **Behavioural delta:** the flag now defaults to `claude-code` when omitted, where previous versions left it unset (no hooks seeded). The first `sdd-cli sync` after upgrading on an existing repo will start refreshing the Claude hooks block. The dedupe pre-pass shipped in v0.12.2 collapses any unmarked hand-rolled entries that match the method shape, so adopters on v0.12.2+ get sentinel-tagged-in-place rather than duplicates. Adopters on sdd-cli &lt; v0.12.2 should `npm install -g @sdd-method/sdd-cli@latest` before re-syncing.
82
102
 
83
103
  ## MCP server (Phase 1)
84
104
 
@@ -137,7 +157,7 @@ npm install -g @sdd-method/sdd-cli
137
157
  npm install
138
158
  npm run build # tsc -> dist/
139
159
  npm run typecheck # tsc --noEmit
140
- npm run test # vitest: unit + parity + sync + init + validate + list + generate-claude-md + credential-free
160
+ npm run test # vitest: unit + parity + sync + init + validate + list + generate-briefing + briefing + credential-free
141
161
  ```
142
162
 
143
163
  Node.js 20 LTS or later is required.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAgBA,wBAAsB,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAahE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiBA,wBAAsB,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAahE"}
package/dist/index.js CHANGED
@@ -1,10 +1,11 @@
1
1
  import { Command, CommanderError } from "commander";
2
2
  import { getPackageVersion } from "./lib/package-version.js";
3
3
  import { registerCatalogue } from "./verbs/catalogue.js";
4
- import { registerGenerateClaudeMd } from "./verbs/generate-claude-md.js";
4
+ import { registerGenerateBriefing } from "./verbs/generate-briefing.js";
5
5
  import { registerInit } from "./verbs/init.js";
6
6
  import { registerList } from "./verbs/list.js";
7
7
  import { registerMcp } from "./verbs/mcp.js";
8
+ import { registerPack } from "./verbs/pack.js";
8
9
  import { registerPlan } from "./verbs/plan.js";
9
10
  import { registerSync } from "./verbs/sync.js";
10
11
  import { registerValidate } from "./verbs/validate.js";
@@ -29,7 +30,7 @@ function buildProgram() {
29
30
  const program = new Command();
30
31
  program
31
32
  .name("sdd-cli")
32
- .description("Method-layer CLI for SDD repository lifecycle — init, sync, validate, list, plan, generate-claude-md.")
33
+ .description("Method-layer CLI for SDD repository lifecycle — init, sync, validate, list, plan, generate-briefing.")
33
34
  .version(getPackageVersion(), "-v, --version")
34
35
  .addHelpText("after", `\nSpec: ${SPEC_URL}`)
35
36
  .exitOverride()
@@ -42,9 +43,10 @@ function buildProgram() {
42
43
  registerValidate(program);
43
44
  registerList(program);
44
45
  registerPlan(program);
45
- registerGenerateClaudeMd(program);
46
+ registerGenerateBriefing(program);
46
47
  registerMcp(program);
47
48
  registerCatalogue(program);
49
+ registerPack(program);
48
50
  for (const { verb, summary } of NOT_YET_IMPLEMENTED) {
49
51
  registerNotYetImplemented(program, verb, summary);
50
52
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,QAAQ,GACZ,8FAA8F,CAAC;AAEjG,MAAM,mBAAmB,GAAqD,EAAE,CAAC;AAEjF,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAuB;IAC/C,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAE/B,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,uBAAuB,CAAC,GAAG,CAAC;YAAE,OAAO;QACzC,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CACV,uGAAuG,CACxG;SACA,OAAO,CAAC,iBAAiB,EAAE,EAAE,eAAe,CAAC;SAC7C,WAAW,CAAC,OAAO,EAAE,WAAW,QAAQ,EAAE,CAAC;SAC3C,YAAY,EAAE;SACd,eAAe,CAAC;QACf,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;QAC5C,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;KAC7C,CAAC,CAAC;IAEL,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1B,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAClC,WAAW,CAAC,OAAO,CAAC,CAAC;IACrB,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC3B,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,mBAAmB,EAAE,CAAC;QACpD,yBAAyB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,yBAAyB,CAChC,OAAgB,EAChB,IAAY,EACZ,OAAe;IAEf,OAAO;SACJ,OAAO,CAAC,IAAI,CAAC;SACb,WAAW,CAAC,GAAG,OAAO,uBAAuB,CAAC;SAC9C,kBAAkB,EAAE;SACpB,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,IAAI,KAAK,CACb,SAAS,IAAI,iCAAiC,QAAQ,8BAA8B,CACrF,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAY;IAC3C,IAAI,CAAC,CAAC,GAAG,YAAY,cAAc,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,OAAO,CACL,GAAG,CAAC,IAAI,KAAK,gBAAgB;QAC7B,GAAG,CAAC,IAAI,KAAK,yBAAyB;QACtC,GAAG,CAAC,IAAI,KAAK,mBAAmB,CACjC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Agent-harness identifiers — the value space of `--agent-harness` on
3
+ * `sdd-cli init` and `sdd-cli sync` per ADR 0141 §4.6.
4
+ *
5
+ * Claude Code is the reference implementation per ADR 0141 §4.4 and
6
+ * the default. GitHub Copilot CLI is the second reference per
7
+ * `docs/method/methods/hook-contracts.md`. Adopters using a different
8
+ * harness implement the portable contracts themselves per ADR 0141 §4.5.
9
+ */
10
+ export declare const AGENT_HARNESSES: readonly ["claude-code", "github-copilot-cli"];
11
+ export type AgentHarness = (typeof AGENT_HARNESSES)[number];
12
+ export declare const DEFAULT_AGENT_HARNESS: AgentHarness;
13
+ export declare function isAgentHarness(value: string): value is AgentHarness;
14
+ /**
15
+ * Resolve an optional CLI input to a concrete harness, falling back to
16
+ * the reference default when unset. Throws on an unsupported value so
17
+ * the CLI can surface a clear error to the caller.
18
+ */
19
+ export declare function resolveAgentHarness(input: string | undefined): AgentHarness;
20
+ //# sourceMappingURL=agent-harness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-harness.d.ts","sourceRoot":"","sources":["../../src/lib/agent-harness.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,eAAO,MAAM,eAAe,gDAAiD,CAAC;AAE9E,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,eAAO,MAAM,qBAAqB,EAAE,YAA4B,CAAC;AAEjE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,YAAY,CAEnE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,CAQ3E"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Agent-harness identifiers — the value space of `--agent-harness` on
3
+ * `sdd-cli init` and `sdd-cli sync` per ADR 0141 §4.6.
4
+ *
5
+ * Claude Code is the reference implementation per ADR 0141 §4.4 and
6
+ * the default. GitHub Copilot CLI is the second reference per
7
+ * `docs/method/methods/hook-contracts.md`. Adopters using a different
8
+ * harness implement the portable contracts themselves per ADR 0141 §4.5.
9
+ */
10
+ export const AGENT_HARNESSES = ["claude-code", "github-copilot-cli"];
11
+ export const DEFAULT_AGENT_HARNESS = "claude-code";
12
+ export function isAgentHarness(value) {
13
+ return AGENT_HARNESSES.includes(value);
14
+ }
15
+ /**
16
+ * Resolve an optional CLI input to a concrete harness, falling back to
17
+ * the reference default when unset. Throws on an unsupported value so
18
+ * the CLI can surface a clear error to the caller.
19
+ */
20
+ export function resolveAgentHarness(input) {
21
+ if (input === undefined)
22
+ return DEFAULT_AGENT_HARNESS;
23
+ if (!isAgentHarness(input)) {
24
+ throw new Error(`Unsupported --agent-harness "${input}". Supported: ${AGENT_HARNESSES.join(", ")}.`);
25
+ }
26
+ return input;
27
+ }
28
+ //# sourceMappingURL=agent-harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-harness.js","sourceRoot":"","sources":["../../src/lib/agent-harness.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,aAAa,EAAE,oBAAoB,CAAU,CAAC;AAI9E,MAAM,CAAC,MAAM,qBAAqB,GAAiB,aAAa,CAAC;AAEjE,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAQ,eAAqC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAyB;IAC3D,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,qBAAqB,CAAC;IACtD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,gCAAgC,KAAK,iBAAiB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACpF,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Public facade for the briefing layer (ADR 0148).
3
+ *
4
+ * `agent-instructions.md` is the harness-neutral canonical briefing
5
+ * (fully method-managed; sync overwrites unconditionally). Harness
6
+ * wrappers (`CLAUDE.md`, `AGENTS.md`, …) are thin pointers with a
7
+ * `<!-- method-managed: begin/end -->` block at the top; adopter
8
+ * content below survives sync via the existing `writeMarkedBlockFile`
9
+ * machinery.
10
+ */
11
+ export { AGENT_INSTRUCTIONS_REL_PATH, BRIEFING_TEMPLATE_ROOT, WRAPPER_BLOCK_BEGIN, WRAPPER_BLOCK_END, extractWrapperBlock, findUnresolvedPlaceholders, harnessWrapperOutputPath, renderAgentInstructions, renderHarnessWrapper, substitute, } from "./render.js";
12
+ export type { RenderResult } from "./render.js";
13
+ export { resolveBriefingVariables } from "./variables.js";
14
+ export type { BriefingVariables, ResolveVariablesOptions } from "./variables.js";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/briefing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,EACpB,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,YAAY,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Public facade for the briefing layer (ADR 0148).
3
+ *
4
+ * `agent-instructions.md` is the harness-neutral canonical briefing
5
+ * (fully method-managed; sync overwrites unconditionally). Harness
6
+ * wrappers (`CLAUDE.md`, `AGENTS.md`, …) are thin pointers with a
7
+ * `<!-- method-managed: begin/end -->` block at the top; adopter
8
+ * content below survives sync via the existing `writeMarkedBlockFile`
9
+ * machinery.
10
+ */
11
+ export { AGENT_INSTRUCTIONS_REL_PATH, BRIEFING_TEMPLATE_ROOT, WRAPPER_BLOCK_BEGIN, WRAPPER_BLOCK_END, extractWrapperBlock, findUnresolvedPlaceholders, harnessWrapperOutputPath, renderAgentInstructions, renderHarnessWrapper, substitute, } from "./render.js";
12
+ export { resolveBriefingVariables } from "./variables.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/briefing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,EACpB,UAAU,GACX,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Renderer for the briefing-layer templates per ADR 0148 + Phase 4 of
3
+ * `adopt-agent-instructions-briefing-layer.md`.
4
+ *
5
+ * Templates ship via the method baseline bundle and land at
6
+ * `<target>/orchestration/templates/briefing/...` after sync's
7
+ * `copyManagedFiles` step. Both `sdd-cli init` and `sdd-cli sync` read
8
+ * the on-disk templates and substitute the four canonical variables.
9
+ *
10
+ * Substitution is a deliberate Handlebars *subset* — `{{var}}` only,
11
+ * no helpers / conditionals / partials. Keeps the runtime-dep
12
+ * allowlist clean (no Handlebars package) and matches the template
13
+ * shapes shipped upstream.
14
+ */
15
+ import type { AgentHarness } from "../agent-harness.js";
16
+ import type { BriefingVariables } from "./variables.js";
17
+ export declare const BRIEFING_TEMPLATE_ROOT = "orchestration/templates/briefing";
18
+ export declare const AGENT_INSTRUCTIONS_REL_PATH = "agent-instructions.md";
19
+ /** Output filename per harness — e.g. `CLAUDE.md` or `AGENTS.md`. */
20
+ export declare function harnessWrapperOutputPath(harness: AgentHarness): string;
21
+ /**
22
+ * Marker pair the wrapper templates use to delimit the method-managed
23
+ * region. The wrapper sync path slices this region out of the freshly
24
+ * rendered template and hands it to `writeMarkedBlockFile`.
25
+ */
26
+ export declare const WRAPPER_BLOCK_BEGIN = "<!-- method-managed: begin -->";
27
+ export declare const WRAPPER_BLOCK_END = "<!-- method-managed: end -->";
28
+ /**
29
+ * Substitute the four canonical variables into a template string. Any
30
+ * `{{var}}` placeholder whose name is not in the variable set is left
31
+ * verbatim — callers may pre-check for leftovers if strict rendering
32
+ * is desired.
33
+ */
34
+ export declare function substitute(template: string, vars: BriefingVariables): string;
35
+ /**
36
+ * Find any unresolved `{{var}}` placeholders. Returns the set of
37
+ * placeholder names (de-duplicated). Callers use this to decide
38
+ * whether to warn or hard-fail on a stale template.
39
+ */
40
+ export declare function findUnresolvedPlaceholders(rendered: string): string[];
41
+ export interface RenderResult {
42
+ readonly content: string;
43
+ readonly unresolved: readonly string[];
44
+ }
45
+ export declare function renderAgentInstructions(targetRepo: string, vars: BriefingVariables): Promise<RenderResult | null>;
46
+ export declare function renderHarnessWrapper(targetRepo: string, harness: AgentHarness, vars: BriefingVariables): Promise<RenderResult | null>;
47
+ /**
48
+ * Extract the method-managed slice (begin marker through end marker,
49
+ * inclusive) from a fully-rendered wrapper template. Used by the sync
50
+ * flow to drive marker-aware merge while preserving adopter content
51
+ * around the block.
52
+ *
53
+ * Throws when the markers aren't both found — that's a template-
54
+ * authoring bug, not an adopter-side issue.
55
+ */
56
+ export declare function extractWrapperBlock(rendered: string): string;
57
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/lib/briefing/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,eAAO,MAAM,sBAAsB,qCAAqC,CAAC;AACzE,eAAO,MAAM,2BAA2B,0BAA0B,CAAC;AAenE,qEAAqE;AACrE,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAEtE;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,mCAAmC,CAAC;AACpE,eAAO,MAAM,iBAAiB,iCAAiC,CAAC;AAEhE;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,iBAAiB,GACtB,MAAM,CAUR;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAMrE;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAO9B;AAED,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAI9B;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAU5D"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Renderer for the briefing-layer templates per ADR 0148 + Phase 4 of
3
+ * `adopt-agent-instructions-briefing-layer.md`.
4
+ *
5
+ * Templates ship via the method baseline bundle and land at
6
+ * `<target>/orchestration/templates/briefing/...` after sync's
7
+ * `copyManagedFiles` step. Both `sdd-cli init` and `sdd-cli sync` read
8
+ * the on-disk templates and substitute the four canonical variables.
9
+ *
10
+ * Substitution is a deliberate Handlebars *subset* — `{{var}}` only,
11
+ * no helpers / conditionals / partials. Keeps the runtime-dep
12
+ * allowlist clean (no Handlebars package) and matches the template
13
+ * shapes shipped upstream.
14
+ */
15
+ import { access, readFile } from "node:fs/promises";
16
+ import { join } from "node:path";
17
+ export const BRIEFING_TEMPLATE_ROOT = "orchestration/templates/briefing";
18
+ export const AGENT_INSTRUCTIONS_REL_PATH = "agent-instructions.md";
19
+ const HARNESS_WRAPPER_TEMPLATE = {
20
+ "claude-code": {
21
+ templateRel: "claude-code/CLAUDE.md.hbs",
22
+ outputRel: "CLAUDE.md",
23
+ },
24
+ "github-copilot-cli": {
25
+ templateRel: "github-copilot-cli/AGENTS.md.hbs",
26
+ outputRel: "AGENTS.md",
27
+ },
28
+ };
29
+ /** Output filename per harness — e.g. `CLAUDE.md` or `AGENTS.md`. */
30
+ export function harnessWrapperOutputPath(harness) {
31
+ return HARNESS_WRAPPER_TEMPLATE[harness].outputRel;
32
+ }
33
+ /**
34
+ * Marker pair the wrapper templates use to delimit the method-managed
35
+ * region. The wrapper sync path slices this region out of the freshly
36
+ * rendered template and hands it to `writeMarkedBlockFile`.
37
+ */
38
+ export const WRAPPER_BLOCK_BEGIN = "<!-- method-managed: begin -->";
39
+ export const WRAPPER_BLOCK_END = "<!-- method-managed: end -->";
40
+ /**
41
+ * Substitute the four canonical variables into a template string. Any
42
+ * `{{var}}` placeholder whose name is not in the variable set is left
43
+ * verbatim — callers may pre-check for leftovers if strict rendering
44
+ * is desired.
45
+ */
46
+ export function substitute(template, vars) {
47
+ const map = {
48
+ sdd_name: vars.sdd_name,
49
+ repo_kind: vars.repo_kind,
50
+ baseline_version: vars.baseline_version,
51
+ sync_date: vars.sync_date,
52
+ };
53
+ return template.replace(/\{\{\s*([a-z_][a-z0-9_]*)\s*\}\}/g, (full, key) => {
54
+ return key in map ? map[key] : full;
55
+ });
56
+ }
57
+ /**
58
+ * Find any unresolved `{{var}}` placeholders. Returns the set of
59
+ * placeholder names (de-duplicated). Callers use this to decide
60
+ * whether to warn or hard-fail on a stale template.
61
+ */
62
+ export function findUnresolvedPlaceholders(rendered) {
63
+ const found = new Set();
64
+ for (const m of rendered.matchAll(/\{\{\s*([a-z_][a-z0-9_]*)\s*\}\}/g)) {
65
+ found.add(m[1]);
66
+ }
67
+ return [...found];
68
+ }
69
+ export async function renderAgentInstructions(targetRepo, vars) {
70
+ const templatePath = join(targetRepo, BRIEFING_TEMPLATE_ROOT, "agent-instructions.md.hbs");
71
+ return renderFromPath(templatePath, vars);
72
+ }
73
+ export async function renderHarnessWrapper(targetRepo, harness, vars) {
74
+ const { templateRel } = HARNESS_WRAPPER_TEMPLATE[harness];
75
+ const templatePath = join(targetRepo, BRIEFING_TEMPLATE_ROOT, templateRel);
76
+ return renderFromPath(templatePath, vars);
77
+ }
78
+ /**
79
+ * Extract the method-managed slice (begin marker through end marker,
80
+ * inclusive) from a fully-rendered wrapper template. Used by the sync
81
+ * flow to drive marker-aware merge while preserving adopter content
82
+ * around the block.
83
+ *
84
+ * Throws when the markers aren't both found — that's a template-
85
+ * authoring bug, not an adopter-side issue.
86
+ */
87
+ export function extractWrapperBlock(rendered) {
88
+ const beginIdx = rendered.indexOf(WRAPPER_BLOCK_BEGIN);
89
+ const endIdx = rendered.indexOf(WRAPPER_BLOCK_END, beginIdx);
90
+ if (beginIdx === -1 || endIdx === -1) {
91
+ throw new Error("Wrapper template missing method-managed markers: " +
92
+ `expected ${WRAPPER_BLOCK_BEGIN} ... ${WRAPPER_BLOCK_END} (template-authoring bug)`);
93
+ }
94
+ return rendered.slice(beginIdx, endIdx + WRAPPER_BLOCK_END.length);
95
+ }
96
+ async function renderFromPath(templatePath, vars) {
97
+ if (!(await fileExists(templatePath)))
98
+ return null;
99
+ const raw = await readFile(templatePath, "utf8");
100
+ const content = substitute(raw, vars);
101
+ return { content, unresolved: findUnresolvedPlaceholders(content) };
102
+ }
103
+ async function fileExists(path) {
104
+ try {
105
+ await access(path);
106
+ return true;
107
+ }
108
+ catch {
109
+ return false;
110
+ }
111
+ }
112
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/lib/briefing/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Variable resolution for the briefing layer per ADR 0148 §4.1 + the
3
+ * Phase 4 setup notes in `adopt-agent-instructions-briefing-layer.md`.
4
+ *
5
+ * The four variables are sourced from target-repo state:
6
+ *
7
+ * sdd_name basename(targetRepo) — overridden by
8
+ * `.sdd/sdd-manifest.yaml::sdd_id` when present.
9
+ * repo_kind `.sdd-repo-kind` content (platform-product /
10
+ * application-product / integration-product /
11
+ * reverse-corpus).
12
+ * baseline_version forward-base bundle's `bundle_version` from
13
+ * `method-baseline.lock`.
14
+ * sync_date caller-supplied ISO date (today for init/sync).
15
+ *
16
+ * No new YAML parser added — the manifest is a single optional scalar
17
+ * read; existing scalar-line parser in src/lib/bundle.ts is the
18
+ * precedent for this style.
19
+ */
20
+ import { type RepoKind } from "../repo-kind.js";
21
+ export interface BriefingVariables {
22
+ readonly sdd_name: string;
23
+ readonly repo_kind: RepoKind;
24
+ readonly baseline_version: string;
25
+ readonly sync_date: string;
26
+ }
27
+ export interface ResolveVariablesOptions {
28
+ readonly targetRepo: string;
29
+ /**
30
+ * ISO date (YYYY-MM-DD) to record in the rendered briefing as the
31
+ * sync_date. Caller passes the canonical timestamp for the operation
32
+ * (init's or sync's now). Defaults to today's date in UTC.
33
+ */
34
+ readonly syncDate?: string;
35
+ /**
36
+ * Optional repo_kind override for init flows where the marker file
37
+ * may not exist yet at resolve time. When set, skips the
38
+ * `.sdd-repo-kind` read.
39
+ */
40
+ readonly repoKindOverride?: RepoKind;
41
+ /**
42
+ * Optional baseline_version override. Sync uses this to pass the
43
+ * incoming bundle's version directly so the renderer doesn't have
44
+ * to wait for `method-baseline.lock` to be updated.
45
+ */
46
+ readonly baselineVersionOverride?: string;
47
+ }
48
+ export declare function resolveBriefingVariables(opts: ResolveVariablesOptions): Promise<BriefingVariables>;
49
+ //# sourceMappingURL=variables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variables.d.ts","sourceRoot":"","sources":["../../../src/lib/briefing/variables.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC;IACrC;;;;OAIG;IACH,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAC3C;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,iBAAiB,CAAC,CAS5B"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Variable resolution for the briefing layer per ADR 0148 §4.1 + the
3
+ * Phase 4 setup notes in `adopt-agent-instructions-briefing-layer.md`.
4
+ *
5
+ * The four variables are sourced from target-repo state:
6
+ *
7
+ * sdd_name basename(targetRepo) — overridden by
8
+ * `.sdd/sdd-manifest.yaml::sdd_id` when present.
9
+ * repo_kind `.sdd-repo-kind` content (platform-product /
10
+ * application-product / integration-product /
11
+ * reverse-corpus).
12
+ * baseline_version forward-base bundle's `bundle_version` from
13
+ * `method-baseline.lock`.
14
+ * sync_date caller-supplied ISO date (today for init/sync).
15
+ *
16
+ * No new YAML parser added — the manifest is a single optional scalar
17
+ * read; existing scalar-line parser in src/lib/bundle.ts is the
18
+ * precedent for this style.
19
+ */
20
+ import { access, readFile } from "node:fs/promises";
21
+ import { basename, join } from "node:path";
22
+ import { readLockFile } from "../lock-file.js";
23
+ import { readRepoKind } from "../repo-kind.js";
24
+ export async function resolveBriefingVariables(opts) {
25
+ const sdd_name = await resolveSddName(opts.targetRepo);
26
+ const repo_kind = opts.repoKindOverride ?? (await requireRepoKind(opts.targetRepo));
27
+ const baseline_version = opts.baselineVersionOverride ??
28
+ (await resolveBaselineVersion(opts.targetRepo));
29
+ const sync_date = opts.syncDate ?? todayIso();
30
+ return { sdd_name, repo_kind, baseline_version, sync_date };
31
+ }
32
+ async function resolveSddName(targetRepo) {
33
+ const fromManifest = await tryReadSddManifestId(targetRepo);
34
+ if (fromManifest !== null)
35
+ return fromManifest;
36
+ return basename(targetRepo);
37
+ }
38
+ async function tryReadSddManifestId(targetRepo) {
39
+ const path = join(targetRepo, ".sdd", "sdd-manifest.yaml");
40
+ if (!(await fileExists(path)))
41
+ return null;
42
+ let raw;
43
+ try {
44
+ raw = await readFile(path, "utf8");
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ // Single-scalar line parse, matching bundle.ts style. The catalogue
50
+ // surface uses a full YAML loader elsewhere; here we only want one
51
+ // optional field, so this stays dependency-light.
52
+ for (const line of raw.split("\n")) {
53
+ const m = /^sdd_id: (.+)$/.exec(line.trim());
54
+ if (m) {
55
+ const value = m[1].trim().replace(/^["']|["']$/g, "");
56
+ if (value.length > 0)
57
+ return value;
58
+ }
59
+ }
60
+ return null;
61
+ }
62
+ async function requireRepoKind(targetRepo) {
63
+ const kind = await readRepoKind(targetRepo);
64
+ if (!kind) {
65
+ throw new Error(`Cannot resolve briefing variables: .sdd-repo-kind missing at ${targetRepo}`);
66
+ }
67
+ return kind;
68
+ }
69
+ async function resolveBaselineVersion(targetRepo) {
70
+ const lock = await readLockFile(targetRepo);
71
+ if (!lock) {
72
+ throw new Error(`Cannot resolve baseline_version: method-baseline.lock missing at ${targetRepo}`);
73
+ }
74
+ const forwardBase = lock.bundles.find((b) => b.isForwardBase);
75
+ if (!forwardBase) {
76
+ throw new Error(`Cannot resolve baseline_version: no forward-base bundle in method-baseline.lock at ${targetRepo}`);
77
+ }
78
+ return forwardBase.bundleVersion;
79
+ }
80
+ function todayIso() {
81
+ return new Date().toISOString().slice(0, 10);
82
+ }
83
+ async function fileExists(path) {
84
+ try {
85
+ await access(path);
86
+ return true;
87
+ }
88
+ catch {
89
+ return false;
90
+ }
91
+ }
92
+ //# sourceMappingURL=variables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variables.js","sourceRoot":"","sources":["../../../src/lib/briefing/variables.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,31 @@
1
- import { type BundleName } from "./repo-kind.js";
2
1
  export declare const MANIFEST_FILE = "BUNDLE_MANIFEST.yaml";
3
2
  export declare const MANAGED_PATHS_FILE = "MANAGED_PATHS.txt";
4
3
  export declare const PAYLOAD_DIR = "payload";
4
+ /**
5
+ * Reference to a forward base bundle. Adopter packs declare this to
6
+ * pin the sdd-method bundle they layer over.
7
+ */
8
+ export interface ForwardBaseRef {
9
+ bundle: string;
10
+ minimumVersion: string;
11
+ sourceRepo: string;
12
+ }
13
+ /**
14
+ * Reference to another adopter pack. Vertical extensions declare this
15
+ * to pin the base pack they require.
16
+ */
17
+ export interface PackRef {
18
+ name: string;
19
+ version: string;
20
+ }
5
21
  export interface BundleManifest {
6
- bundleName: BundleName;
22
+ /**
23
+ * For sdd-method forward-base bundles, this is one of the known
24
+ * `BundleName` enum values (validated). For adopter packs (per ADR
25
+ * 0151), this is an arbitrary string naming the pack — the closed
26
+ * enum applies only to forward bases.
27
+ */
28
+ bundleName: string;
7
29
  bundleVersion: string;
8
30
  sourceCommit: string;
9
31
  /**
@@ -15,6 +37,39 @@ export interface BundleManifest {
15
37
  * `minimum_sdd_cli_version:`.
16
38
  */
17
39
  minimumSddCliVersion?: string;
40
+ /**
41
+ * Whether this bundle is a forward base or an additive layer. Forward
42
+ * bases set `.sdd-repo-kind`, claim `managed_paths` for the profile's
43
+ * core, and own the agent-harness wiring. Adopter packs (per ADR 0151)
44
+ * and the reverse-extension-baseline are additive — they layer on top.
45
+ *
46
+ * Defaults to true when absent (legacy sdd-method forward bases pre-
47
+ * dating ADR 0151 omit the field; their forward-base status is
48
+ * inferred from the closed `BundleName` enum via `isBundleName`).
49
+ */
50
+ isForwardBase: boolean;
51
+ /**
52
+ * Forward base this pack layers over. Required for non-forward-base
53
+ * bundles per ADR 0151 §4.2; absent for forward bases themselves.
54
+ */
55
+ requiresForwardBase?: ForwardBaseRef;
56
+ /**
57
+ * Another adopter pack this pack depends on. Used by vertical
58
+ * extensions (per ADR 0151 §4.3) to declare their base-pack
59
+ * dependency.
60
+ */
61
+ requiresPack?: PackRef;
62
+ /**
63
+ * Adopter repo name that produced this bundle. Carried into the
64
+ * consumer's lock file as `produced_by_adopter` for provenance.
65
+ * Absent for sdd-method forward-base bundles.
66
+ */
67
+ producedByAdopter?: string;
68
+ /**
69
+ * Free-form scope slug from the seed file. Surfaced in `sdd-cli list`
70
+ * output for human-readable diagnostics. Absent for legacy bundles.
71
+ */
72
+ scope?: string;
18
73
  }
19
74
  export interface Bundle {
20
75
  manifest: BundleManifest;