aw-spec-cli 0.1.25 → 0.1.27
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/assets/.agents/skills/appweaver/SKILL.md +7 -47
- package/assets/.appweaver/ORCH-DIALECT.md +13 -9
- package/assets/.appweaver/RULE-PARTITION.md +3 -3
- package/assets/.appweaver/STACK-PROFILES.md +188 -101
- package/assets/.appweaver/domain.json +1 -1
- package/assets/.appweaver/orchestrator/AGENT-PROFILE.md +38 -10
- package/assets/.appweaver/orchestrator/LAUNCHER.md +88 -0
- package/assets/.appweaver/orchestrator/README.md +120 -53
- package/assets/.appweaver/orchestrator/adapters/claude_agent_sdk.py +1 -1
- package/assets/.appweaver/orchestrator/modules/domain-select.orch.yaml +6 -4
- package/assets/.appweaver/orchestrator/modules/foundation-lane.orch.yaml +237 -0
- package/assets/.appweaver/orchestrator/modules/foundation-pack.orch.yaml +349 -0
- package/assets/.appweaver/orchestrator/modules/foundation-spec.orch.yaml +381 -0
- package/assets/.appweaver/orchestrator/modules/lane-gate.orch.yaml +4 -4
- package/assets/.appweaver/orchestrator/modules/tech-select.orch.yaml +3 -3
- package/assets/.appweaver/orchestrator/orchestrator.py +162 -63
- package/assets/.appweaver/orchestrator/rev-templates/domain-constitution.skeleton.md +2 -2
- package/assets/.appweaver/orchestrator/rev-templates/domain-requirements.skeleton.md +2 -2
- package/assets/.appweaver/orchestrator/rev-templates/domain-rule-bindings.skeleton.md +5 -5
- package/assets/.appweaver/orchestrator/rev-templates/frontend-rule-file.skeleton.md +1 -1
- package/assets/.appweaver/orchestrator/rev-templates/tech-rule-bindings.skeleton.md +14 -14
- package/assets/.appweaver/orchestrator/rev-templates/technical-constitution.skeleton.md +2 -2
- package/assets/.appweaver/orchestrator/rev-templates/technical-rule-file.skeleton.md +1 -1
- package/assets/.appweaver/orchestrator/rev-templates/ui-constitution.skeleton.md +3 -3
- package/assets/.appweaver/orchestrator/workflows/_smoke.orch.yaml +41 -3
- package/assets/.appweaver/orchestrator/workflows/aw-spec-add-component.orch.yaml +1 -1
- package/assets/.appweaver/orchestrator/workflows/aw-spec-adopt.orch.yaml +13 -13
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice-delta.orch.yaml +3 -3
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice.orch.yaml +3 -3
- package/assets/.appweaver/orchestrator/workflows/aw-spec-build.orch.yaml +4 -4
- package/assets/.appweaver/orchestrator/workflows/aw-spec-characterize.orch.yaml +2 -2
- package/assets/.appweaver/orchestrator/workflows/aw-spec-constitution.orch.yaml +61 -12
- package/assets/.appweaver/orchestrator/workflows/aw-spec-foundation.orch.yaml +172 -293
- package/assets/.appweaver/orchestrator/workflows/aw-spec-implement.orch.yaml +29 -28
- package/assets/.appweaver/orchestrator/workflows/aw-spec-onboard.orch.yaml +53 -53
- package/assets/.appweaver/orchestrator/workflows/aw-spec-parity.orch.yaml +2 -2
- package/assets/.appweaver/orchestrator/workflows/aw-spec-plan.orch.yaml +3 -3
- package/assets/.appweaver/orchestrator/workflows/aw-spec-run.orch.yaml +4 -4
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-bounded-context.orch.yaml +26 -2
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-domain.orch.yaml +21 -15
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-stack.orch.yaml +14 -14
- package/assets/.appweaver/orchestrator/workflows/aw-spec-specify.orch.yaml +2 -2
- package/assets/.appweaver/orchestrator/workflows/aw-spec-ui-model.orch.yaml +3 -3
- package/assets/.appweaver/orchestrator/workflows/aw-spec-ui-prototype.orch.yaml +6 -6
- package/assets/.appweaver/scripts/bash/aw-spec-actions.sh +284 -128
- package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +224 -70
- package/assets/.appweaver/scripts/python/aw-foundation.py +809 -20
- package/assets/.appweaver/scripts/python/aw-inventory.py +28 -21
- package/assets/.appweaver/scripts/python/aw-plan-coverage.py +2 -2
- package/assets/.appweaver/scripts/python/aw-rev-constitution.py +6 -6
- package/assets/.appweaver/scripts/python/aw-stack.py +195 -89
- package/assets/.appweaver/stack-profiles/angular.json +2 -1
- package/assets/.appweaver/stack-profiles/blazor-wasm.json +2 -1
- package/assets/.appweaver/stack-profiles/dotnet-webapi.json +16 -3
- package/assets/.appweaver/stack-profiles/go-chi.json +6 -1
- package/assets/.appweaver/stack-profiles/java-spring.json +12 -5
- package/assets/.appweaver/stack-profiles/nextjs.json +2 -1
- package/assets/.appweaver/stack-profiles/node-express.json +8 -2
- package/assets/.appweaver/stack-profiles/python-fastapi.json +9 -2
- package/assets/.appweaver/stack-profiles/react-vite.json +2 -1
- package/assets/.appweaver/stack-profiles/sveltekit.json +2 -1
- package/assets/.appweaver/stack-profiles/vue-vite.json +2 -1
- package/assets/.appweaver/stacks.json +37 -1
- package/assets/.appweaver/templates/constitution-ui-template.md +2 -2
- package/assets/.claude/skills/appweaver/SKILL.md +7 -46
- package/assets/foundations/dotnet/ModularMonolith/ModularMonolith.Reference.rules.json +31 -0
- package/assets/foundations/dotnet/VerticalSlice/VerticalSlice.Reference.rules.json +16 -0
- package/assets/foundations/foundation.spec.template.txt +73 -0
- package/assets/foundations/java/Hexagonal/Hexagonal.pack.txt +1 -1
- package/assets/foundations/java/Hexagonal/unpack-foundation.sh +4 -5
- package/assets/foundations/node/NextAppRouter/NextAppRouter.spec.txt +68 -0
- package/assets/guardrails/README.md +31 -17
- package/assets/guardrails/{projects/dotnet-default-project → project-specific}/domain-rule-bindings.md +5 -5
- package/assets/guardrails/{projects/dotnet-default-project → project-specific}/tech-rule-bindings.md +151 -114
- package/assets/guardrails/technology/dotnet-webapi/PACKAGING.md +58 -4
- package/assets/guardrails/technology/dotnet-webapi/coding-standards.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/dependency-policy.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/folder-structure.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/framework-api-map.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/testing.md +1 -1
- package/assets/guardrails/technology/nextjs/api-client.md +1 -1
- package/assets/guardrails/technology/nextjs/component-architecture.md +1 -1
- package/assets/guardrails/technology/nextjs/component-conventions.md +2 -2
- package/assets/guardrails/technology/nextjs/design-system.md +1 -1
- package/assets/guardrails/technology/nextjs/frontend-testing.md +1 -1
- package/assets/guardrails/technology/nextjs/routing-navigation.md +1 -1
- package/assets/guardrails/technology/nextjs/ui-constitution.md +3 -3
- package/package.json +1 -1
- package/assets/.agents/skills/appweaver-demo/SKILL.md +0 -59
- package/assets/.appweaver/orchestrator/.smoke-out/smoke.md +0 -6
- package/assets/.appweaver/orchestrator/workflows/aw-spec-demo.orch.yaml +0 -100
- package/assets/.claude/skills/appweaver-demo/SKILL.md +0 -59
- package/assets/.kilocode/agent.json +0 -28
- package/assets/.kilocode/workflows/appweaver-demo.md +0 -59
- package/assets/.kilocode/workflows/appweaver.md +0 -55
- /package/assets/guardrails/{projects/dotnet-default-project → project-specific}/domain/domain-requirements.md +0 -0
- /package/assets/guardrails/{projects/dotnet-default-project → project-specific}/frontend/ui-requirements.md +0 -0
- /package/assets/guardrails/{projects/dotnet-default-project → project-specific}/service/technical-requirements.md +0 -0
|
@@ -1,56 +1,16 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "appweaver"
|
|
3
|
-
description: "Parametric launcher
|
|
4
|
-
argument-hint: "<skill> [strategy] [input…] — e.g. 'select-
|
|
5
|
-
compatibility: "Requires .appweaver/orchestrator/ and
|
|
3
|
+
description: "Parametric launcher: run ANY converted aw-spec skill on the aw-orchestrator under one of the 4 strategies (agent [default], spawn, sdk, sdk-apply)."
|
|
4
|
+
argument-hint: "<skill> [strategy] [input…] — e.g. 'select-stack', 'specify spawn Build an order API', 'analyze-slice'"
|
|
5
|
+
compatibility: "Requires .appweaver/orchestrator/ and python3"
|
|
6
6
|
user-invocable: true
|
|
7
7
|
disable-model-invocation: false
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
#
|
|
10
|
+
# AppWeaver launcher
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
Read `.appweaver/orchestrator/LAUNCHER.md` and follow it exactly.
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
- **This agent's transport profile:** `.agents/agent.json`
|
|
14
|
+
Several agents read this folder, so this launcher names no agent: find the row for the agent you are in the profile table of `LAUNCHER.md` — that row is your transport profile. If you have no row, only the `agent` strategy is available.
|
|
16
15
|
|
|
17
|
-
|
|
18
|
-
> so `system` is folded into the prompt — isolation is best-effort). Its
|
|
19
|
-
> `sdk` block declares the SDK the `sdk`/`sdk-apply` strategies import
|
|
20
|
-
> (`google-antigravity`) and the adapter
|
|
21
|
-
> (`.appweaver/orchestrator/adapters/google_antigravity.py`, shared per-SDK)
|
|
22
|
-
> that owns its calling convention.
|
|
23
|
-
|
|
24
|
-
## Execution Steps
|
|
25
|
-
|
|
26
|
-
1. **Parse Arguments** (`<skill> [strategy] [input…]`):
|
|
27
|
-
- `skill` (required): the aw-spec skill name, e.g. `demo`, `select-domain`, `foundation`, `specify`, `design`, `implement`, `build`. Resolve the workflow file `.appweaver/orchestrator/workflows/aw-spec-<skill>.orch.yaml`. If it does not exist, list the available `aw-spec-*.orch.yaml` files in that folder and stop.
|
|
28
|
-
- `strategy` (optional, one of `agent`, `spawn`, `sdk`, `sdk-apply`; default `agent` — YOU fulfill each generation through the checkpoint channel, no profile needed): who executes each generation. Always pass `--strategy <strategy>`.
|
|
29
|
-
- Everything after the strategy is the user input: pass it as `--input "<text>"` (omit when empty).
|
|
30
|
-
- `--agent-profile .agents/agent.json` is required for `spawn`, `sdk`, and `sdk-apply` (`agent` needs no profile). If the SDK package isn't installed, add `--sdk-install`.
|
|
31
|
-
- **Always** pass `--checkpoint .appweaver/orchestrator/.state/<skill>.state.json` — for EVERY strategy. Converted skills contain interactive steps (questions, selections, hooks); the checkpoint is how they reach you and the user. Strategies only govern who generates.
|
|
32
|
-
- `spawn` may also add `--isolation bare|fresh` and `--model <name>`; `sdk`/`sdk-apply` accept `--model <name>`.
|
|
33
|
-
|
|
34
|
-
2. **Run the Interpreter**:
|
|
35
|
-
```bash
|
|
36
|
-
python3 .appweaver/orchestrator/orchestrator.py \
|
|
37
|
-
.appweaver/orchestrator/workflows/aw-spec-<skill>.orch.yaml \
|
|
38
|
-
--strategy <strategy> \
|
|
39
|
-
--checkpoint .appweaver/orchestrator/.state/<skill>.state.json \
|
|
40
|
-
[--agent-profile .agents/agent.json] # spawn, sdk, sdk-apply \
|
|
41
|
-
[--input "<user input>"] \
|
|
42
|
-
--json
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
3. **Handle the Suspend/Resume Loop** — whenever the command exits with code `2`, read the printed `pending` JSON and dispatch on `pending.kind`; fulfill it, write the response to `pending.response_path`, then re-run the SAME command. Repeat until exit `0` (done) or `1` (stopped by a gate).
|
|
46
|
-
- **`ask`** — ask the USER the `prompt` with the listed `options` (use your question tool). Write the chosen answer as PLAIN TEXT to `response_path` (comma-separated values when `multi` is true).
|
|
47
|
-
- **`select`** — ask the USER to pick ONE of `options`; write the chosen value as plain text to `response_path`.
|
|
48
|
-
- **`hook`** — run each MANDATORY hook in `hooks` (each is a slash command of THIS agent) in this conversation; optional hooks at your discretion. Then write `done` to `response_path`.
|
|
49
|
-
- **`author`** — read `system_path` + `user_path` and treat them as your ONLY standards and context. Author the COMPLETE content of the file named in `target` and write it — content ONLY, no commentary, no code fence — to `response_path`. Do NOT write the target file yourself; the interpreter does that.
|
|
50
|
-
- **`agent_generate`** — read `system_path` + `user_path`; perform the task YOURSELF with the listed `tools` within `permission_mode`; write your full final reply — ending with the required ```json fence — to `response_path`.
|
|
51
|
-
- **`agent_query` / `agent_review`** — same as above but READ-ONLY (do not modify files); the reply must end with the required ```json fence.
|
|
52
|
-
- **`apply`** — an isolated generation already decided the changes: read `artifact_path` and write its file contents EXACTLY to the paths it names, then write the confirmation ```json fence to `response_path`.
|
|
53
|
-
- If `pending.note` is present, your previous response was rejected — follow the note and rewrite `response_path`.
|
|
54
|
-
|
|
55
|
-
4. **Report**:
|
|
56
|
-
Report the final JSON (`status`, `outputs`, and any `reason`) to the user. On `stopped`, relay the gate message verbatim — it tells the user what to fix or run first.
|
|
16
|
+
The arguments are the text the user typed after `/appweaver`.
|
|
@@ -8,8 +8,9 @@ step/`outputs:`/`condition:` conventions, but built for
|
|
|
8
8
|
the **orchestrator model**: the interpreter assembles 100% of every model
|
|
9
9
|
payload (system = standards/rules, user = artifacts + task) and a **fresh
|
|
10
10
|
agent** executes it under one of the 4 strategies. Everything here is common
|
|
11
|
-
across agent roots —
|
|
12
|
-
|
|
11
|
+
across agent roots — each agent differs only in its transport profile
|
|
12
|
+
(`agent.json`) and a thin `/appweaver` launcher that points at the shared
|
|
13
|
+
`orchestrator/LAUNCHER.md`.
|
|
13
14
|
|
|
14
15
|
## Layout (the common folder)
|
|
15
16
|
|
|
@@ -19,6 +20,8 @@ transport profile (`agent.json`) and their thin `/appweaver` launcher.
|
|
|
19
20
|
ORCH-DIALECT.md → this doc lives at .appweaver/ORCH-DIALECT.md
|
|
20
21
|
README.md strategies, transports, checkpoint machinery
|
|
21
22
|
AGENT-PROFILE.md profile (agent.json) reference
|
|
23
|
+
LAUNCHER.md the /appweaver instructions every agent's launcher points at,
|
|
24
|
+
with the profile table (which agent → which agent.json)
|
|
22
25
|
adapters/ shared per-SDK adapters (claude_agent_sdk, google_antigravity)
|
|
23
26
|
modules/ shared includable modules (*.orch.yaml): delta-design,
|
|
24
27
|
delta-spec, domain-select, lane-gate, tech-select
|
|
@@ -33,7 +36,7 @@ transport profile (`agent.json`) and their thin `/appweaver` launcher.
|
|
|
33
36
|
|
|
34
37
|
## Execution model (strictly held)
|
|
35
38
|
|
|
36
|
-
1. **Context management is the orchestrator's** — as in `workflows/aw-spec-
|
|
39
|
+
1. **Context management is the orchestrator's** — as in `workflows/aw-spec-specify.orch.yaml`.
|
|
37
40
|
`build_context` REPLACES the per-request envelope; `load_standards`
|
|
38
41
|
maintains the sticky system prefix. Per-step `context:` is THIS request only
|
|
39
42
|
and is never appended onto the envelope. No agent ever assembles its own context.
|
|
@@ -91,15 +94,15 @@ the raw object, not its JSON string.
|
|
|
91
94
|
| `build_context` | engine | REPLACE the per-request envelope: `system:`/`context:` file lists (+ `context_from: <var>` — or a list of vars, appended in order — holding paths a prior step produced, + `vars:`) |
|
|
92
95
|
| `load_standards` | engine | F4 — append to the **sticky standards set** prepended to every system block (dedup, `optional:`, `files:`/`files_from_variable`). This is the byte-stable, prompt-cacheable prefix |
|
|
93
96
|
| `execute_script` | engine | F1 — run a `scripts:` ref (`subcommand:` + `args:`; sh/ps1 via `--os`); stdout's last line = JSON, bound via `outputs[]`; `on_error: continue` tolerates a script that ran and exited non-zero (a JSON object on its last stdout line is still bound, so a gate can show the script's own reason; with none, the outputs bind empty) — never an undeclared ref, which the pre-flight refuses before step 1; cached across resumes; runs for real even in mock transport |
|
|
94
|
-
| `verify_context` | engine | F2 — gates: `required_files` (+`allow_missing`), `require_non_empty` (+`on_empty[_message]`), `require_true` (+`on_false[_message]`), `require_value`+`equals` (+`on_mismatch[_message]`). `stop` raises a terminal stop |
|
|
95
|
-
| `agent_generate` | fresh agent |
|
|
96
|
-
| `agent_review` | fresh agent | payload-only review of `review_of_var`/`review_of` files (inlined into THIS request, never sticky) → `{pass, issues}` |
|
|
97
|
+
| `verify_context` | engine | F2 — gates: `required_files` (+`allow_missing`), `require_non_empty` (+`on_empty[_message]`), `require_true` (+`on_false[_message]`), `require_value`+`equals` (+`on_mismatch[_message]`). Outcomes: `stop` raises a terminal stop; `return` ends the module being included and the caller carries on with the step after its `include` (at the top level it ends the run normally, outputs resolved); `continue` (or the outcome absent, for `on_empty`) carries on. `message_var: <name>` binds a failed gate's resolved message, so a caller that returns or continues can still report why. `--validate` rejects any other outcome |
|
|
98
|
+
| `agent_generate` | fresh agent | code work (`_smoke`'s `gen_file` is the minimal example): agent DECIDES file paths per the loaded standards, writes with its tools, reports `files[]` in the trailing ```json fence; a reported path not on disk is dropped from `files` (and listed in `files_not_written`) before outputs bind, so a `require_non_empty` gate on it proves something was written. `sdk-apply` = read-only generation + invoking agent applies |
|
|
99
|
+
| `agent_review` | fresh agent | payload-only review of `review_of_var`/`review_of` files (inlined into THIS request, never sticky) → `{pass, issues}`; `_smoke`'s `review_file` reviews what `gen_file` reported |
|
|
97
100
|
| `agent_author` | fresh agent | F5 — **authored artifact** (decl `llm_generate`): the INTERPRETER owns `output_target: {type: file, path}`. Generation is payload-only under every strategy (mapped `context:` + sticky envelope + standards are the entire world) and never writes — the ENGINE writes the returned content (sdk-apply degrades to sdk). Optional `context:` (per-request extras), `include_standards: false` (narrow payload), `tools:` (read-only opt-in for a task that names files by path) |
|
|
98
101
|
| `agent_query` | fresh agent | F6 — generic payload-only structured JSON (decl `llm_query`): `schema:` shapes the required fence, `outputs[]` binds it, `mock:` supplies the mock-transport result; one malformed-JSON retry on fresh strategies. Same tools contract as `agent_author` — none unless the step declares `tools:` |
|
|
99
102
|
| `ask` | human (via launcher) | F7 — question: `prompt`, `options`/`options_from`/`options_from_variable`, `multi`, `answer_key`, `answer_var` (default `answer`). Sources in order: cache → `--answer k=v` → `--non-interactive` (first option; all when multi) → checkpoint suspend `ask` → stdin |
|
|
100
103
|
| `user_select` | human (via launcher) | F7 — pick ONE from `options_from_variable`; `preselect_from` (direct-argument fast path), `single_option_confirm`; `--select stepid=v`; binds `selection` + `outputs[]` |
|
|
101
104
|
| `dispatch_hooks` | invoking agent | F8 — suspend kind `hook` with the `hooks_from_variable` list (slash commands of the LAUNCHING agent); logged-only without a checkpoint; never re-fires across resumes |
|
|
102
|
-
| `include` | engine | F9 — run a module `.orch.yaml` inline: shares vars/envelope/standards/scripts/replay-cache; a module's own `scripts:` EXTEND the caller's map by `setdefault`, so the caller's ref wins on a clash and every module can declare what it invokes and still validate standalone; `with:` seeds inputs; cache keys namespaced `inc:<id>/…`; module `Stop` stops the caller |
|
|
105
|
+
| `include` | engine | F9 — run a module `.orch.yaml` inline: shares vars/envelope/standards/scripts/replay-cache; a module's own `scripts:` EXTEND the caller's map by `setdefault`, so the caller's ref wins on a clash and every module can declare what it invokes and still validate standalone; `with:` seeds inputs; cache keys namespaced `inc:<id>/…`; module `Stop` stops the caller, a gate's `return` ends only the module. Vars are SHARED, not scoped: a module included twice (once per lane) resets its own vars first, or the second pass reads the first's answers |
|
|
103
106
|
| `loop` | engine | `while: <cond>` + `max_iterations` (default 5), or F3 foreach `over: "{{list}}"` + `as: item` (binds `item`, `item_index`, `iteration`); `break` (+`condition:`) exits the innermost loop |
|
|
104
107
|
|
|
105
108
|
Decl steps may keep their `parameters:` wrapper — every ported action reads
|
|
@@ -167,5 +170,6 @@ orchestrator.py <workflow.orch.yaml>
|
|
|
167
170
|
reason, before any step runs and before a checkpoint response is ingested.
|
|
168
171
|
Warnings never block.
|
|
169
172
|
- `workflows/_smoke.orch.yaml` exercises every construct with no model and no
|
|
170
|
-
writes outside `.smoke-out
|
|
171
|
-
|
|
173
|
+
writes outside `.smoke-out` — including an `agent_generate` edit step (the
|
|
174
|
+
mock writes `SmokeGenerated.cs`) and an `agent_review` of what it reported:
|
|
175
|
+
run it `--non-interactive` (CI) and with `--checkpoint` (protocol walk-through).
|
|
@@ -126,7 +126,7 @@ lane loads the technical base, the frontend lane loads the UI base. What they sh
|
|
|
126
126
|
- **Which lanes exist is the declaration's answer.** `select-stack` runs first and writes
|
|
127
127
|
`.appweaver/stacks.json`; onboard refuses to start without it. A lane declared there gets its
|
|
128
128
|
half and its rule set, a lane declared `(none)` gets neither, and the scan — pointed at the
|
|
129
|
-
declared
|
|
129
|
+
declared lane root folder — decides what the governance SAYS, never whether the lane exists. A
|
|
130
130
|
declared UI lane whose path holds no recognisable UI source is reported, and its governance is
|
|
131
131
|
authored thin rather than skipped.
|
|
132
132
|
- The **UI half** is authored from the lane's code, not from a map heading, because at onboard
|
|
@@ -190,8 +190,8 @@ lane loads the technical base, the frontend lane loads the UI base. What they sh
|
|
|
190
190
|
|
|
191
191
|
| Map | Reader | Class |
|
|
192
192
|
|---|---|---|
|
|
193
|
-
| `guardrails
|
|
194
|
-
| `guardrails
|
|
193
|
+
| `guardrails/<project>/domain-rule-bindings.md` | `resolve-domain` | domain rule files |
|
|
194
|
+
| `guardrails/<project>/tech-rule-bindings.md` | `resolve-tech` | technical rule files |
|
|
195
195
|
|
|
196
196
|
Each map keys on `## /aw-spec-<command>` headings whose `- ` bullets are workspace-relative
|
|
197
197
|
file paths — pointing into the shared corpora at `guardrails/technology/<stack>/` and
|