aw-spec-cli 0.1.26 → 0.1.28
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 +11 -12
- package/assets/.appweaver/STACK-PROFILES.md +260 -108
- package/assets/.appweaver/domain.json +1 -1
- package/assets/.appweaver/interpreter/run-skill.py +28 -7
- 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/delta-plan.orch.yaml +17 -7
- 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 +392 -0
- package/assets/.appweaver/orchestrator/modules/foundation-spec.orch.yaml +548 -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/delta-design-template.skeleton.md +5 -4
- package/assets/.appweaver/orchestrator/rev-templates/design-template.skeleton.md +3 -1
- 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 +21 -13
- package/assets/.appweaver/orchestrator/rev-templates/frontend-rule-file.skeleton.md +1 -1
- package/assets/.appweaver/orchestrator/rev-templates/tech-rule-bindings.skeleton.md +28 -31
- 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/rev-templates/ui-delta-design-template.skeleton.md +4 -1
- package/assets/.appweaver/orchestrator/rev-templates/ui-design-template.skeleton.md +6 -4
- 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 +17 -16
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan-delta.orch.yaml +7 -1
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan.orch.yaml +7 -1
- 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-deploy.orch.yaml +1 -1
- package/assets/.appweaver/orchestrator/workflows/aw-spec-foundation.orch.yaml +172 -293
- package/assets/.appweaver/orchestrator/workflows/aw-spec-implement.orch.yaml +253 -44
- package/assets/.appweaver/orchestrator/workflows/aw-spec-onboard.orch.yaml +72 -71
- package/assets/.appweaver/orchestrator/workflows/aw-spec-parity.orch.yaml +2 -2
- package/assets/.appweaver/orchestrator/workflows/aw-spec-plan.orch.yaml +38 -14
- 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 +3 -3
- 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 +371 -131
- package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +293 -76
- package/assets/.appweaver/scripts/python/aw-foundation.py +885 -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 +676 -99
- 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 +18 -3
- package/assets/.appweaver/stack-profiles/go-chi.json +6 -1
- package/assets/.appweaver/stack-profiles/java-spring.json +14 -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 +40 -1
- package/assets/.appweaver/templates/constitution-ui-template.md +2 -2
- package/assets/.appweaver/templates/delta-design-template.md +7 -5
- package/assets/.appweaver/templates/design-template.md +3 -0
- package/assets/.appweaver/templates/ui-delta-design-template.md +1 -1
- package/assets/.appweaver/templates/ui-design-template.md +6 -4
- package/assets/.claude/skills/appweaver/SKILL.md +7 -46
- package/assets/foundations/dotnet/ModularMonolith/ModularMonolith.Reference.rules.json +31 -0
- package/assets/foundations/dotnet/ModularMonolith/ModularMonolith.lane.json +6 -0
- package/assets/foundations/dotnet/VerticalSlice/VerticalSlice.Reference.rules.json +16 -0
- package/assets/foundations/dotnet/VerticalSlice/VerticalSlice.lane.json +6 -0
- package/assets/foundations/foundation.spec.template.txt +98 -0
- package/assets/foundations/java/Hexagonal/Hexagonal.lane.json +6 -0
- package/assets/foundations/java/Hexagonal/Hexagonal.pack.txt +8 -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 +25 -13
- package/assets/guardrails/project-specific/tech-rule-bindings.md +296 -0
- package/assets/guardrails/technology/dotnet-webapi/PACKAGING.md +58 -4
- package/assets/guardrails/technology/dotnet-webapi/api-versioning.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/auditing.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/authorization.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/clean-architecture.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/coding-standards.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/cqrs.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/data-classification.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/dependency-policy.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/eventing.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/modular-monolith.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/persistence.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/testing.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/vertical-slices.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/zero-trust.md +1 -1
- package/assets/guardrails/technology/nextjs/accessibility-implementation.md +1 -1
- package/assets/guardrails/technology/nextjs/api-client.md +1 -1
- package/assets/guardrails/technology/nextjs/api-integration.dotnet-webapi.md +1 -1
- package/assets/guardrails/technology/nextjs/api-integration.java-spring.md +1 -1
- package/assets/guardrails/technology/nextjs/auth-session.md +1 -1
- package/assets/guardrails/technology/nextjs/client-security.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/error-handling.md +1 -1
- package/assets/guardrails/technology/nextjs/forms-and-validation.md +1 -1
- package/assets/guardrails/technology/nextjs/frontend-testing.md +1 -1
- package/assets/guardrails/technology/nextjs/i18n.md +1 -1
- package/assets/guardrails/technology/nextjs/observability.md +1 -1
- package/assets/guardrails/technology/nextjs/performance-budgets.md +1 -1
- package/assets/guardrails/technology/nextjs/routing-navigation.md +1 -1
- package/assets/guardrails/technology/nextjs/state-management.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/tech-rule-bindings.md +0 -271
- /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
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# kind: frontend
|
|
2
|
+
# profiles: nextjs
|
|
3
|
+
# title: Next.js App Router base (TypeScript, ESLint, Vitest) built from this spec
|
|
4
|
+
|
|
5
|
+
# Next.js App Router foundation — frontend lane
|
|
6
|
+
|
|
7
|
+
## Purpose
|
|
8
|
+
A clean, building Next.js frontend for the lane: App Router, TypeScript in strict mode,
|
|
9
|
+
ESLint, a token-based design-system layer and a working test setup. No business screens —
|
|
10
|
+
/appweaver implement adds those per feature later, from frontend-plan.md.
|
|
11
|
+
|
|
12
|
+
## Create
|
|
13
|
+
Run at the repository root, naming the lane root folder, so the app lands directly in that
|
|
14
|
+
folder (not in a folder inside or beside it):
|
|
15
|
+
- `npx create-next-app@latest <lane root folder without trailing slash> --typescript --eslint --app --no-src-dir --import-alias "@/*" --use-npm --no-tailwind --yes`
|
|
16
|
+
Set `"name"` in package.json to the project name in lower-kebab form
|
|
17
|
+
(e.g. AppWeaver.Health -> appweaver-health).
|
|
18
|
+
|
|
19
|
+
## Packages
|
|
20
|
+
Development dependencies:
|
|
21
|
+
- vitest, @vitejs/plugin-react, jsdom
|
|
22
|
+
- @testing-library/react, @testing-library/jest-dom, @testing-library/user-event
|
|
23
|
+
- vitest-axe (accessibility assertions)
|
|
24
|
+
|
|
25
|
+
## Layout
|
|
26
|
+
Under the lane root folder (create empty folders with a .gitkeep):
|
|
27
|
+
```
|
|
28
|
+
app/ App Router — layout.tsx, page.tsx, loading.tsx, error.tsx, not-found.tsx
|
|
29
|
+
components/ design-system compositions, presentational only
|
|
30
|
+
features/ one folder per spec feature (empty at start)
|
|
31
|
+
lib/api/ the generated contract client (empty at start — never hand-written)
|
|
32
|
+
lib/ cross-feature client utilities
|
|
33
|
+
locales/ locale catalogues — en.json to start
|
|
34
|
+
styles/tokens.css the semantic design tokens
|
|
35
|
+
tests/ component, integration and accessibility tests
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Starter files
|
|
39
|
+
- `styles/tokens.css` — semantic CSS custom properties only (`--color-surface`,
|
|
40
|
+
`--color-text`, `--color-muted`, `--color-danger`, `--space-1..6`, `--radius-1..3`,
|
|
41
|
+
`--font-body`), with a `prefers-color-scheme: dark` block. Imported once by
|
|
42
|
+
`app/layout.tsx`; no literal colour anywhere else.
|
|
43
|
+
- `app/layout.tsx` — html `lang` from the default locale, the tokens import, a skip-to-content
|
|
44
|
+
link, `<main id="main">`.
|
|
45
|
+
- `app/page.tsx` — a server component rendering the app name and one line of text.
|
|
46
|
+
- `app/loading.tsx`, `app/error.tsx` (client component with a retry button), `app/not-found.tsx`.
|
|
47
|
+
- `components/Button.tsx` — one presentational component styled only with tokens, as the
|
|
48
|
+
pattern later components follow.
|
|
49
|
+
- `lib/env.ts` — reads `NEXT_PUBLIC_API_BASE_URL` once and exports it typed; nothing else
|
|
50
|
+
reads `process.env`.
|
|
51
|
+
- `locales/en.json` — the strings the starter pages use.
|
|
52
|
+
- `.env.example` — `NEXT_PUBLIC_API_BASE_URL=http://localhost:5000`.
|
|
53
|
+
Remove the create-next-app demo content (the default page body, its CSS module and images).
|
|
54
|
+
|
|
55
|
+
## Configuration
|
|
56
|
+
- `tsconfig.json`: `"strict": true`, keep the `@/*` alias.
|
|
57
|
+
- `vitest.config.ts`: jsdom environment, the React plugin, `tests/setup.ts` as setup file
|
|
58
|
+
(registers jest-dom and vitest-axe matchers), the `@/*` alias.
|
|
59
|
+
- package.json scripts: `dev`, `build`, `start`, `lint` (from create-next-app), plus
|
|
60
|
+
`"test": "vitest run"` and `"typecheck": "tsc --noEmit"`.
|
|
61
|
+
|
|
62
|
+
## Tests
|
|
63
|
+
- `tests/page.test.tsx` — renders the home page and asserts the app name is shown.
|
|
64
|
+
- `tests/button.a11y.test.tsx` — renders `Button` and asserts no axe violations.
|
|
65
|
+
|
|
66
|
+
## Done when
|
|
67
|
+
`npm install`, `npm run build`, `npm test` and `npm run lint` all pass in the lane root
|
|
68
|
+
folder, and `npm run dev` serves the home page at http://localhost:3000.
|
|
@@ -13,27 +13,39 @@ guardrails/
|
|
|
13
13
|
├── domain/<industry>/ domain rules — vary by industry, never by stack
|
|
14
14
|
│ ├── healthcare/
|
|
15
15
|
│ └── pharma/
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
16
|
+
├── project-specific/ the project's own rules — what it SELECTS from the corpora
|
|
17
|
+
│ ├── tech-rule-bindings.md → technology/{{backend_stack}}/ + technology/{{frontend_stack}}/
|
|
18
|
+
│ ├── domain-rule-bindings.md → domain/healthcare/
|
|
19
|
+
│ ├── service/technical-requirements.md PROJECT-SUPPLIED
|
|
20
|
+
│ ├── frontend/ui-requirements.md PROJECT-SUPPLIED
|
|
21
|
+
│ └── domain/domain-requirements.md PROJECT-SUPPLIED
|
|
22
|
+
└── brf-<name>/ a project `onboard` reverse-engineers from existing code
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
`
|
|
27
|
-
|
|
25
|
+
**The active project is the folder `.appweaver/domain.json` names** — `project-specific` as shipped,
|
|
26
|
+
and `brf-<name>` once `onboard` has run, because onboard creates that folder and writes its name
|
|
27
|
+
there. No sequence selects a project. To use another one, copy `project-specific/` to a new folder
|
|
28
|
+
here, change the `guardrails/project-specific/` paths inside its two maps to the new folder, and run
|
|
29
|
+
the optional `/appweaver select-domain <name>` — it lists the folders here that hold a map and
|
|
30
|
+
writes the one picked into `domain.json` (editing `"domain"` by hand does the same). It never
|
|
31
|
+
creates a folder. Re-run `/appweaver constitution` after switching so the constitution follows.
|
|
32
|
+
`resolve-tech` and `resolve-domain` read the active project's two maps. **To change what a command
|
|
33
|
+
loads, edit the map — never a workflow.** The folder names `technology/` and `domain/` are the only
|
|
28
34
|
vocabulary here: a project's maps may point anywhere, in any combination.
|
|
29
35
|
|
|
30
|
-
**A directory under `
|
|
31
|
-
`list-domains` enforces that, exactly as `foundations/` requires a `*.pack.txt
|
|
36
|
+
**A directory under `guardrails/` is a project only if it carries a rule map.** Both shells'
|
|
37
|
+
`list-domains` enforces that, exactly as `foundations/` requires a `*.pack.txt` or `*.spec.txt` — the
|
|
38
|
+
corpora `technology/` and `domain/` carry no map, so they are never taken for a project. Either map
|
|
32
39
|
qualifies, because `onboard` writes the domain map several steps before the technical one.
|
|
33
40
|
|
|
34
|
-
**
|
|
41
|
+
**The technical map names no stack.** Every path in `project-specific/tech-rule-bindings.md` writes
|
|
42
|
+
its stack directory as `{{backend_stack}}` or `{{frontend_stack}}`, resolved from the lanes in
|
|
43
|
+
`.appweaver/stacks.json`, so the same map serves a .NET repo and a Spring one. A corpus that lacks a
|
|
44
|
+
mapped file reports it as missing and loads nothing in its place.
|
|
45
|
+
|
|
46
|
+
**A brownfield project owns its rules outright.** `project-specific/` above holds only three
|
|
35
47
|
files because it maps the rest from the shared corpora. A project `onboard` reverse-engineers —
|
|
36
|
-
`
|
|
48
|
+
`brf-<name>/` — holds everything: the domain set in `domain/`, the technical set in
|
|
37
49
|
`service/`, the lane set in `frontend/`, and its own charter at `domain/domain-constitution.md`,
|
|
38
50
|
named the way an industry corpus names its charter. Both maps still sit at the project root, and
|
|
39
51
|
nothing a project owns is written outside its own folder — which is what lets two onboarded
|
|
@@ -91,7 +103,7 @@ is what lists it. Infer the tier from the folder and the fold breaks.
|
|
|
91
103
|
`stacks.json` and a rule folder are the same word.
|
|
92
104
|
- **An industry** — create `domain/<industry>/`, author the overlays, point a project's
|
|
93
105
|
`domain-rule-bindings.md` at it. The technical map needs no edit.
|
|
94
|
-
- **A project** —
|
|
106
|
+
- **A project** — fill in `project-specific/`: repoint the bullets and replace the three
|
|
95
107
|
project-supplied files. Nothing outside that folder changes.
|
|
96
108
|
|
|
97
109
|
## Files — technical (`technology/dotnet-webapi/`)
|
|
@@ -214,8 +226,10 @@ Everything this tree once held that governance does not load left it on 2026-08-
|
|
|
214
226
|
`foundations/<stack>/`:
|
|
215
227
|
|
|
216
228
|
- **Scaffold corpora** — `foundations/dotnet/ModularMonolith/` and `foundations/dotnet/VerticalSlice/`:
|
|
217
|
-
a `<Name>.pack.txt` payload and the scripts that pack and unpack it
|
|
218
|
-
|
|
229
|
+
a `<Name>.pack.txt` payload and the scripts that pack and unpack it; and specs —
|
|
230
|
+
`foundations/node/NextAppRouter/NextAppRouter.spec.txt` — that describe a project an agent
|
|
231
|
+
builds into the lane. Both read by `/appweaver foundation`; the shape of a spec is
|
|
232
|
+
`foundations/foundation.spec.template.txt`.
|
|
219
233
|
- **Framework component runbooks** — `foundations/dotnet/components/`: the integration contracts
|
|
220
234
|
`/appweaver add-component` follows when wiring an opt-in component into a scaffolded project.
|
|
221
235
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# project-specific — Command → Domain-Rule-File Map
|
|
2
2
|
|
|
3
3
|
Per-command list of the **domain** rule files this project loads (via `resolve-domain`
|
|
4
4
|
+ the `domain-select` module, into the sticky standards set) for the spec-anchored
|
|
@@ -19,8 +19,8 @@ through the spec/design (as CN-/DC-/IC- ids).
|
|
|
19
19
|
- To govern a different industry, repoint these bullets at another
|
|
20
20
|
`guardrails/domain/<industry>/` corpus — `guardrails/domain/pharma/` also ships. Nothing
|
|
21
21
|
else changes: the technical map, the workflows and the engine are untouched.
|
|
22
|
-
- This file is the **canonical domain mapping** for this project;
|
|
23
|
-
|
|
22
|
+
- This file is the **canonical domain mapping** for this project; it is used whenever
|
|
23
|
+
`.appweaver/domain.json` names `project-specific`, which it does by default.
|
|
24
24
|
|
|
25
25
|
---
|
|
26
26
|
|
|
@@ -49,12 +49,12 @@ through the spec/design (as CN-/DC-/IC- ids).
|
|
|
49
49
|
- guardrails/domain/healthcare/zero-trust.domain.md
|
|
50
50
|
- guardrails/domain/healthcare/ai-rules.domain.md
|
|
51
51
|
- guardrails/domain/healthcare/folder-structure.domain.md
|
|
52
|
-
- guardrails/
|
|
52
|
+
- guardrails/project-specific/domain/domain-requirements.md
|
|
53
53
|
|
|
54
54
|
## /aw-spec-specify
|
|
55
55
|
<!-- The FULL domain set. Specify models the domain COMPLETELY and LIFTS the constraint
|
|
56
56
|
overlays into the spec's CN-/DC-/IC- sections (design/implement never see these files). -->
|
|
57
|
-
- guardrails/
|
|
57
|
+
- guardrails/project-specific/domain/domain-requirements.md
|
|
58
58
|
- guardrails/domain/healthcare/domain-driven-design.domain.md
|
|
59
59
|
- guardrails/domain/healthcare/clinical-terms.md
|
|
60
60
|
- guardrails/domain/healthcare/terminology.md
|
|
@@ -74,12 +74,22 @@ through the spec/design (as CN-/DC-/IC- ids).
|
|
|
74
74
|
- guardrails/domain/healthcare/api-versioning.domain.md
|
|
75
75
|
- guardrails/domain/healthcare/vertical-slices.domain.md
|
|
76
76
|
|
|
77
|
-
## /aw-spec-plan
|
|
78
|
-
_None —
|
|
77
|
+
## /aw-spec-plan-backend
|
|
78
|
+
_None — the service lane of plan loads no domain file. Domain reaches it only through the spec
|
|
79
|
+
(BR-/CN-/DC-/IC-) and the context's domain-model.md._
|
|
79
80
|
|
|
80
|
-
## /aw-spec-
|
|
81
|
-
_None —
|
|
82
|
-
|
|
81
|
+
## /aw-spec-plan-frontend
|
|
82
|
+
_None — the frontend lane of plan loads no domain file. Domain reaches it only through the spec
|
|
83
|
+
and the context's domain-model.md._
|
|
84
|
+
|
|
85
|
+
## /aw-spec-implement-backend
|
|
86
|
+
_None — the service lane of implement loads no domain file. Domain reaches it only through
|
|
87
|
+
backend-plan.md and the context's domain-model.md. Framework components are added separately via
|
|
88
|
+
`/appweaver add-component`._
|
|
89
|
+
|
|
90
|
+
## /aw-spec-implement-frontend
|
|
91
|
+
_None — the frontend lane of implement loads no domain file. Domain reaches it only through
|
|
92
|
+
frontend-plan.md and the context's domain-model.md._
|
|
83
93
|
|
|
84
94
|
## /aw-spec-gate
|
|
85
95
|
<!-- Conformance checklist for the gates (analyze-plan · analyze-slice): the domain-derived
|
|
@@ -106,10 +116,12 @@ components are added separately via `/appweaver add-component`._
|
|
|
106
116
|
|
|
107
117
|
| Command | Domain rule files | Role |
|
|
108
118
|
|---|---|---|
|
|
109
|
-
| /aw-spec-constitution |
|
|
119
|
+
| /aw-spec-constitution | 16 | domain principles (XVI+) — the industry constitution + standard industry rules + the project's own requirements |
|
|
110
120
|
| /aw-spec-specify | 19 | author into spec (lift → CN-/DC-/IC-) |
|
|
111
|
-
| /aw-spec-plan | 0 | none — spec
|
|
112
|
-
| /aw-spec-
|
|
121
|
+
| /aw-spec-plan-backend | 0 | none — the spec and the domain model carry the domain |
|
|
122
|
+
| /aw-spec-plan-frontend | 0 | none — the spec and the domain model carry the domain |
|
|
123
|
+
| /aw-spec-implement-backend | 0 | none — backend-plan.md and the domain model carry the domain |
|
|
124
|
+
| /aw-spec-implement-frontend | 0 | none — frontend-plan.md and the domain model carry the domain |
|
|
113
125
|
| /aw-spec-gate | 14 | conformance checklist (validate, don't author) |
|
|
114
126
|
|
|
115
127
|
> Retired in the orchestrator pipeline: the prose `/aw-spec-plan` phase, `/aw-spec-tasks`,
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
# project-specific — Command → Technical-Rule-File Map
|
|
2
|
+
|
|
3
|
+
Per-command list of the **technical** rule files this project loads (via `resolve-tech` +
|
|
4
|
+
the `tech-select` module, into the sticky standards set) for the spec-anchored
|
|
5
|
+
orchestrator pipeline. This is the technical counterpart of `domain-rule-bindings.md`
|
|
6
|
+
(which maps the DOMAIN rule files).
|
|
7
|
+
|
|
8
|
+
**The model:** the technical rule files are CONFIGURATION — tune this map, not the
|
|
9
|
+
workflows. They live in the **shared technology corpora**, one folder per stack, and this
|
|
10
|
+
map is what binds a project to them. The ratified output (`constitution.technical.md`) is
|
|
11
|
+
NOT listed here — every consumer refers to it directly, as-is.
|
|
12
|
+
|
|
13
|
+
- All paths are workspace-relative. This project maps two stack corpora:
|
|
14
|
+
`guardrails/technology/{{backend_stack}}/` (the service) and
|
|
15
|
+
`guardrails/technology/{{frontend_stack}}/` (the frontend lane). Both are **standard rules
|
|
16
|
+
shared by every project that maps them**, and neither is domain-specific. The frontend corpus is
|
|
17
|
+
read by four headings — `## /aw-spec-ui-constitution` ratifies the lane's base,
|
|
18
|
+
`## /aw-spec-plan-frontend` / `## /aw-spec-implement-frontend` carry the detail rules under
|
|
19
|
+
it, and `## /aw-spec-foundation-frontend` is what a spec-built scaffold of the lane follows.
|
|
20
|
+
- `plan`, `implement` and `foundation` are keyed per lane KIND, not per command: each runs
|
|
21
|
+
both lanes in one run and loads one set or the other for each — `## /aw-spec-<command>-backend`
|
|
22
|
+
for the service lane, `## /aw-spec-<command>-frontend` for the frontend lane. `foundation`
|
|
23
|
+
loads its set only when the lane is built from a spec — a pack is unpacked as-is.
|
|
24
|
+
- The two files this project authors — `service/technical-requirements.md` and
|
|
25
|
+
`frontend/ui-requirements.md` — live beside this map. They are the only mapped technical
|
|
26
|
+
files expected to differ between two projects on the same stacks.
|
|
27
|
+
- A corpus's `examples/` folder holds the worked `<SampleProjectName>` sample for the
|
|
28
|
+
rule file beside it, split out so a phase can load the rules without the sample code. The
|
|
29
|
+
code-generating phases map both; `## /aw-spec-constitution` maps the rules alone, because a
|
|
30
|
+
thin authority document has no use for sample code.
|
|
31
|
+
- `resolve-tech --command <name>` collects the `- ` bullets under `## /<name>`.
|
|
32
|
+
- **Every stack directory below is a placeholder**, resolved from the lanes in
|
|
33
|
+
`.appweaver/stacks.json`: `{{backend_stack}}` is the service lane's stack and
|
|
34
|
+
`{{frontend_stack}}` the frontend lane's (`{{stack}}`, `{{backend_ecosystem}}` and
|
|
35
|
+
`{{frontend_ecosystem}}` are also available). `guardrails/technology/{{backend_stack}}/persistence.md`
|
|
36
|
+
reads as `dotnet-webapi/` in a .NET repo and `java-spring/` in a Spring one, so this one map
|
|
37
|
+
serves whatever stacks the project declares. A placeholder for an undeclared lane skips
|
|
38
|
+
that bullet, so a backend-only repo loads no frontend rules. A resolved path with no file
|
|
39
|
+
on disk is reported as missing and loads nothing in its place. The bullets were written
|
|
40
|
+
against the `dotnet-webapi` and `nextjs` corpora; another stack's corpus may hold only
|
|
41
|
+
part of them. See STACK-PROFILES.md §7a.
|
|
42
|
+
- Adding a stack is adding a corpus under `guardrails/technology/<stack>/` with the same file
|
|
43
|
+
names — the placeholders then reach it with no change to this map, and no workflow, script
|
|
44
|
+
or engine change is involved.
|
|
45
|
+
- This file is the **canonical technical mapping** for this project; it is used whenever
|
|
46
|
+
`.appweaver/domain.json` names `project-specific`, which it does by default.
|
|
47
|
+
- A command with no heading here loads no mapped technical file (only the workflow's
|
|
48
|
+
universal `ai-rules.md` seed + `constitution.technical.md`, referred to directly).
|
|
49
|
+
- `## /aw-spec-specify` is the one **modelling-methodology** slot (see the rule partition):
|
|
50
|
+
a domain-agnostic way of *modelling*, never a technology choice. Everything below it is a
|
|
51
|
+
HOW-phase technical set.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## /aw-spec-specify
|
|
56
|
+
<!-- MODELLING METHODOLOGY ONLY, in two halves. Specify is the domain phase: the single kind
|
|
57
|
+
of technical input it may take is a domain-agnostic way of MODELLING, never a technology
|
|
58
|
+
choice. Do NOT add an architecture / persistence / codegen file here — that would break
|
|
59
|
+
specify's domain purity (design/implement own those). The domain's own DDD overlay
|
|
60
|
+
(domain-driven-design.domain.md) arrives separately via domain-rule-bindings.
|
|
61
|
+
|
|
62
|
+
1. THE DOMAIN MODEL — DDD tactical patterns, plus the same methodology worked through
|
|
63
|
+
in code as the example beside it.
|
|
64
|
+
2. THE EXPERIENCE MODEL — the ux/ rules that govern how specify states the experience:
|
|
65
|
+
Experience Scope, and the project-wide Experience Standards it lifts as UX- ids for
|
|
66
|
+
prototype / design-ui / implement-ui to author and verify against. These are
|
|
67
|
+
methodology, not visual design; each file's own "What must NOT appear" section is
|
|
68
|
+
what keeps screens out of the spec.
|
|
69
|
+
|
|
70
|
+
⚠ The ux/ files sit in a DOMAIN corpus folder but are TECHNICAL-tier inputs: a file's
|
|
71
|
+
tier is the map that lists it, not the folder it lives in. guardrails/domain/healthcare/
|
|
72
|
+
ihe-conformance.md under ## /aw-spec-plan-backend is the same pattern. Unmapping them does not
|
|
73
|
+
make the spec's Experience Standards section disappear — the section is unconditional and
|
|
74
|
+
resolves to "None" — it removes the methodology specify fills it from. -->
|
|
75
|
+
- guardrails/technology/{{backend_stack}}/domain-driven-design.md
|
|
76
|
+
- guardrails/technology/{{backend_stack}}/examples/domain-driven-design.md
|
|
77
|
+
- guardrails/domain/healthcare/ux/journey-mapping.md
|
|
78
|
+
- guardrails/domain/healthcare/ux/interaction-states.md
|
|
79
|
+
- guardrails/domain/healthcare/ux/accessibility-standards.md
|
|
80
|
+
- guardrails/domain/healthcare/ux/content-design.md
|
|
81
|
+
|
|
82
|
+
## /aw-spec-plan-backend
|
|
83
|
+
<!-- The technical/architecture rule files the design author works from (alongside the
|
|
84
|
+
spec and constitution.technical.md), each followed by its worked example. NO domain file
|
|
85
|
+
here — domain reaches design only as spec ids (BR-/CN-/DC-/IC-). -->
|
|
86
|
+
- guardrails/technology/{{backend_stack}}/clean-architecture.md
|
|
87
|
+
- guardrails/technology/{{backend_stack}}/cqrs.md
|
|
88
|
+
- guardrails/technology/{{backend_stack}}/eventing.md
|
|
89
|
+
- guardrails/technology/{{backend_stack}}/modular-monolith.md
|
|
90
|
+
- guardrails/technology/{{backend_stack}}/vertical-slices.md
|
|
91
|
+
- guardrails/technology/{{backend_stack}}/persistence.md
|
|
92
|
+
- guardrails/technology/{{backend_stack}}/folder-structure.md
|
|
93
|
+
- guardrails/technology/{{backend_stack}}/testing.md
|
|
94
|
+
- guardrails/technology/{{backend_stack}}/api-versioning.md
|
|
95
|
+
- guardrails/technology/{{backend_stack}}/zero-trust.md
|
|
96
|
+
- guardrails/technology/{{backend_stack}}/authorization.md
|
|
97
|
+
- guardrails/technology/{{backend_stack}}/authorization-matrix.md
|
|
98
|
+
- guardrails/technology/{{backend_stack}}/auditing.md
|
|
99
|
+
- guardrails/technology/{{backend_stack}}/data-classification.md
|
|
100
|
+
- guardrails/domain/healthcare/ihe-conformance.md
|
|
101
|
+
- guardrails/technology/{{backend_stack}}/examples/clean-architecture.md
|
|
102
|
+
- guardrails/technology/{{backend_stack}}/examples/cqrs.md
|
|
103
|
+
- guardrails/technology/{{backend_stack}}/examples/eventing.md
|
|
104
|
+
- guardrails/technology/{{backend_stack}}/examples/vertical-slices.md
|
|
105
|
+
- guardrails/technology/{{backend_stack}}/examples/persistence.md
|
|
106
|
+
- guardrails/technology/{{backend_stack}}/examples/api-versioning.md
|
|
107
|
+
- guardrails/technology/{{backend_stack}}/examples/zero-trust.md
|
|
108
|
+
- guardrails/technology/{{backend_stack}}/examples/authorization.md
|
|
109
|
+
- guardrails/technology/{{backend_stack}}/examples/auditing.md
|
|
110
|
+
|
|
111
|
+
## /aw-spec-plan-frontend
|
|
112
|
+
<!-- The FRONTEND LANE's design phase. Its own heading, not a branch of ## /aw-spec-plan-backend:
|
|
113
|
+
the two lanes are governed by different constitution halves and own disjoint source
|
|
114
|
+
paths, so keying the map on a heading of its own gives the lane its own rule set for zero
|
|
115
|
+
mechanism change. NO domain file here — the domain reaches design.ui.md as spec ids,
|
|
116
|
+
exactly as it reaches design.md. The lane's ratified base (constitution.ui.md) is
|
|
117
|
+
referred to directly and is NOT mapped.
|
|
118
|
+
|
|
119
|
+
THE SERVICE LANE ENTERS THROUGH ONE FILE. api-integration.{{backend_stack}}.md is the
|
|
120
|
+
CROSS-LANE pairing rule set — what the service guarantees (paging shape, concurrency
|
|
121
|
+
token, error codes, redaction, caching, CORS) and what the client therefore must do.
|
|
122
|
+
It is named for the service stack and mapped through the placeholder, so ONE bullet
|
|
123
|
+
serves every backend: it resolves to api-integration.dotnet-webapi.md in a .NET repo and to
|
|
124
|
+
api-integration.java-spring.md in a Spring repo — both authored — and to a REPORTED
|
|
125
|
+
missing file for a backend whose pairing nobody has written yet, rather than silently
|
|
126
|
+
loading one stack's assumptions into another. A repo with no backend lane skips the
|
|
127
|
+
bullet entirely. No other service-lane file is mapped here: design.ui.md consumes the
|
|
128
|
+
published surface, never the service's internals. -->
|
|
129
|
+
- guardrails/technology/{{frontend_stack}}/component-architecture.md
|
|
130
|
+
- guardrails/technology/{{frontend_stack}}/routing-navigation.md
|
|
131
|
+
- guardrails/technology/{{frontend_stack}}/state-management.md
|
|
132
|
+
- guardrails/technology/{{frontend_stack}}/error-handling.md
|
|
133
|
+
- guardrails/technology/{{frontend_stack}}/forms-and-validation.md
|
|
134
|
+
- guardrails/technology/{{frontend_stack}}/auth-session.md
|
|
135
|
+
- guardrails/technology/{{frontend_stack}}/design-system.md
|
|
136
|
+
- guardrails/technology/{{frontend_stack}}/accessibility-implementation.md
|
|
137
|
+
- guardrails/technology/{{frontend_stack}}/i18n.md
|
|
138
|
+
- guardrails/technology/{{frontend_stack}}/performance-budgets.md
|
|
139
|
+
- guardrails/technology/{{frontend_stack}}/api-integration.{{backend_stack}}.md
|
|
140
|
+
|
|
141
|
+
## /aw-spec-implement-backend
|
|
142
|
+
<!-- The FRAMEWORK / code-generation rule files the SERVICE lane's generator builds against
|
|
143
|
+
(alongside backend-plan.md and constitution.technical.md). It is loaded on BOTH paths,
|
|
144
|
+
master and delta: a change's code follows the same rules as the master it changes.
|
|
145
|
+
NO domain file — domain reaches implement only through the plan (on the delta path, the
|
|
146
|
+
master backend-plan.md + the change's delta plan). clean-architecture/cqrs are planning
|
|
147
|
+
concerns; component wiring is a separate /appweaver add-component step. -->
|
|
148
|
+
- guardrails/technology/{{backend_stack}}/coding-standards.md
|
|
149
|
+
- guardrails/technology/{{backend_stack}}/dependency-policy.md
|
|
150
|
+
- guardrails/technology/{{backend_stack}}/folder-structure.md
|
|
151
|
+
- guardrails/technology/{{backend_stack}}/framework-api-map.md
|
|
152
|
+
- guardrails/technology/{{backend_stack}}/testing.md
|
|
153
|
+
- guardrails/technology/{{backend_stack}}/PACKAGING.md
|
|
154
|
+
|
|
155
|
+
## /aw-spec-implement-frontend
|
|
156
|
+
<!-- The FRONTEND LANE's code-generation set — the HOW that lane of `implement` builds
|
|
157
|
+
against, alongside frontend-plan.md and constitution.ui.md. It is loaded on BOTH paths,
|
|
158
|
+
master and delta, as the service lane's set is. NO domain file
|
|
159
|
+
(domain reached the lane through spec -> frontend-plan.md), and NO service-lane file
|
|
160
|
+
beyond the pairing rules below — this lane never writes outside its declared lane root folder.
|
|
161
|
+
|
|
162
|
+
EIGHT FILES ARE MAPPED FOR BOTH LANE PHASES on purpose. error-handling,
|
|
163
|
+
forms-and-validation, auth-session, design-system, accessibility-implementation, i18n,
|
|
164
|
+
performance-budgets and the api-integration pairing each carry a DESIGN half and an
|
|
165
|
+
IMPLEMENT half of one rule: the design decides the states, the affordances and the
|
|
166
|
+
targets; this phase realises them. A rule read by only one of the two loses the
|
|
167
|
+
pairing, and the half that goes unread is always the one that then goes unbuilt. -->
|
|
168
|
+
- guardrails/technology/{{frontend_stack}}/component-conventions.md
|
|
169
|
+
- guardrails/technology/{{frontend_stack}}/api-client.md
|
|
170
|
+
- guardrails/technology/{{frontend_stack}}/api-integration.{{backend_stack}}.md
|
|
171
|
+
- guardrails/technology/{{frontend_stack}}/auth-session.md
|
|
172
|
+
- guardrails/technology/{{frontend_stack}}/client-security.md
|
|
173
|
+
- guardrails/technology/{{frontend_stack}}/error-handling.md
|
|
174
|
+
- guardrails/technology/{{frontend_stack}}/forms-and-validation.md
|
|
175
|
+
- guardrails/technology/{{frontend_stack}}/design-system.md
|
|
176
|
+
- guardrails/technology/{{frontend_stack}}/accessibility-implementation.md
|
|
177
|
+
- guardrails/technology/{{frontend_stack}}/i18n.md
|
|
178
|
+
- guardrails/technology/{{frontend_stack}}/performance-budgets.md
|
|
179
|
+
- guardrails/technology/{{frontend_stack}}/observability.md
|
|
180
|
+
- guardrails/technology/{{frontend_stack}}/frontend-testing.md
|
|
181
|
+
|
|
182
|
+
## /aw-spec-build
|
|
183
|
+
<!-- The compile/fix reference set: the layering + coding rules the fixer respects when
|
|
184
|
+
repairing compile errors against the design intent, plus the layering example it repairs
|
|
185
|
+
towards. NO domain file (build loads domain rules separately via domain-select) and no
|
|
186
|
+
constitution.technical here. -->
|
|
187
|
+
- guardrails/technology/{{backend_stack}}/clean-architecture.md
|
|
188
|
+
- guardrails/technology/{{backend_stack}}/coding-standards.md
|
|
189
|
+
- guardrails/technology/{{backend_stack}}/examples/clean-architecture.md
|
|
190
|
+
|
|
191
|
+
## /aw-spec-analyze-slice
|
|
192
|
+
<!-- The design↔code conformance gate's TECHNICAL checklist: the code + tests are
|
|
193
|
+
validated against these (alongside the DOMAIN gate overlays, loaded separately via
|
|
194
|
+
resolve-domain `## /aw-spec-gate`). Validation input only — never authoring. -->
|
|
195
|
+
- guardrails/technology/{{backend_stack}}/testing.md
|
|
196
|
+
- guardrails/technology/{{backend_stack}}/coding-standards.md
|
|
197
|
+
- guardrails/technology/{{backend_stack}}/framework-api-map.md
|
|
198
|
+
|
|
199
|
+
## /aw-spec-constitution
|
|
200
|
+
<!-- What the TECHNICAL half of the split constitution ratifies into
|
|
201
|
+
constitution.technical.md: the technology base, then the STANDARD technical rules for
|
|
202
|
+
this industry — the same corpus design and implement build against, so a ratified
|
|
203
|
+
principle can cite the rule it governs — and last the PROJECT-SUPPLIED file the project
|
|
204
|
+
team authors. Loaded BEFORE the technical half and before domain-select, so the
|
|
205
|
+
technical author stays domain-free (the seam). NO domain file here: the domain half's
|
|
206
|
+
sources are the domain map's ## /aw-spec-constitution. NO examples/ file either — the
|
|
207
|
+
ratified half is one declarative line and a `→` pointer per principle, so sample code is
|
|
208
|
+
weight without a reader. -->
|
|
209
|
+
- guardrails/technology/{{backend_stack}}/technology-constitution.md
|
|
210
|
+
- guardrails/technology/{{backend_stack}}/clean-architecture.md
|
|
211
|
+
- guardrails/technology/{{backend_stack}}/modular-monolith.md
|
|
212
|
+
- guardrails/technology/{{backend_stack}}/vertical-slices.md
|
|
213
|
+
- guardrails/technology/{{backend_stack}}/domain-driven-design.md
|
|
214
|
+
- guardrails/technology/{{backend_stack}}/cqrs.md
|
|
215
|
+
- guardrails/technology/{{backend_stack}}/persistence.md
|
|
216
|
+
- guardrails/technology/{{backend_stack}}/eventing.md
|
|
217
|
+
- guardrails/technology/{{backend_stack}}/folder-structure.md
|
|
218
|
+
- guardrails/technology/{{backend_stack}}/testing.md
|
|
219
|
+
- guardrails/technology/{{backend_stack}}/zero-trust.md
|
|
220
|
+
- guardrails/technology/{{backend_stack}}/authorization.md
|
|
221
|
+
- guardrails/technology/{{backend_stack}}/auditing.md
|
|
222
|
+
- guardrails/technology/{{backend_stack}}/data-classification.md
|
|
223
|
+
- guardrails/technology/{{backend_stack}}/api-versioning.md
|
|
224
|
+
- guardrails/technology/{{backend_stack}}/coding-standards.md
|
|
225
|
+
- guardrails/technology/{{backend_stack}}/dependency-policy.md
|
|
226
|
+
- guardrails/project-specific/service/technical-requirements.md
|
|
227
|
+
|
|
228
|
+
## /aw-spec-ui-constitution
|
|
229
|
+
<!-- What the UI half ratifies into constitution.ui.md as a UX-* principle series: the
|
|
230
|
+
standard frontend rules for this industry, then the PROJECT-SUPPLIED file. This heading
|
|
231
|
+
is also the AUTHORITATIVE signal that the project HAS a frontend lane — with no heading
|
|
232
|
+
here the constitution command skips the UI half and creates no file at all. Domain-free,
|
|
233
|
+
and loaded before domain-select for the same reason as the set above. -->
|
|
234
|
+
- guardrails/technology/{{frontend_stack}}/ui-constitution.md
|
|
235
|
+
- guardrails/project-specific/frontend/ui-requirements.md
|
|
236
|
+
|
|
237
|
+
## /aw-spec-run
|
|
238
|
+
<!-- Execution / data migration: the persistence rules the migration step generates against,
|
|
239
|
+
plus their worked example. NO domain file; run does not reference constitution.technical.md. -->
|
|
240
|
+
- guardrails/technology/{{backend_stack}}/persistence.md
|
|
241
|
+
- guardrails/technology/{{backend_stack}}/examples/persistence.md
|
|
242
|
+
|
|
243
|
+
## /aw-spec-foundation-backend
|
|
244
|
+
<!-- What `foundation` builds the SERVICE lane's base project against when the operator picks
|
|
245
|
+
a spec ([spec] or [manual spec]) instead of a pack. A pack is verified against these rules
|
|
246
|
+
when it is made; a spec build is not, so the agent gets them as standards and follows them
|
|
247
|
+
wherever the spec is silent. The set is the SHAPE of a base project — stack base, folder
|
|
248
|
+
structure, packages, coding and test conventions, the framework's own types, and the
|
|
249
|
+
project team's technical requirements — not the architecture/persistence detail set plan
|
|
250
|
+
and implement load for features. NO domain file: a scaffold has no domain yet. -->
|
|
251
|
+
- guardrails/technology/{{backend_stack}}/technology-constitution.md
|
|
252
|
+
- guardrails/technology/{{backend_stack}}/folder-structure.md
|
|
253
|
+
- guardrails/technology/{{backend_stack}}/dependency-policy.md
|
|
254
|
+
- guardrails/technology/{{backend_stack}}/coding-standards.md
|
|
255
|
+
- guardrails/technology/{{backend_stack}}/framework-api-map.md
|
|
256
|
+
- guardrails/technology/{{backend_stack}}/testing.md
|
|
257
|
+
- guardrails/project-specific/service/technical-requirements.md
|
|
258
|
+
|
|
259
|
+
## /aw-spec-foundation-frontend
|
|
260
|
+
<!-- The same for the FRONTEND lane: the lane base (ui-constitution, which carries the
|
|
261
|
+
mandatory frontend folder structure), how components are split and named, routing, the
|
|
262
|
+
design system, the generated API client the lane talks to the service through, the test
|
|
263
|
+
setup, and the project team's ui-requirements. Loaded INSTEAD of the backend set, never
|
|
264
|
+
on top of it — foundation swaps the standards between the two lanes. -->
|
|
265
|
+
- guardrails/technology/{{frontend_stack}}/ui-constitution.md
|
|
266
|
+
- guardrails/technology/{{frontend_stack}}/component-architecture.md
|
|
267
|
+
- guardrails/technology/{{frontend_stack}}/component-conventions.md
|
|
268
|
+
- guardrails/technology/{{frontend_stack}}/routing-navigation.md
|
|
269
|
+
- guardrails/technology/{{frontend_stack}}/design-system.md
|
|
270
|
+
- guardrails/technology/{{frontend_stack}}/api-client.md
|
|
271
|
+
- guardrails/technology/{{frontend_stack}}/frontend-testing.md
|
|
272
|
+
- guardrails/project-specific/frontend/ui-requirements.md
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## Quick reference (command → technical file count)
|
|
277
|
+
|
|
278
|
+
| Command | Technical rule files | Role |
|
|
279
|
+
|---|---|---|
|
|
280
|
+
| /aw-spec-specify | 6 | the modelling methodology the spec is expressed in: DDD for the domain model (+ its example), and the four ux/ rules for the experience model it lifts as UX- ids — no technology |
|
|
281
|
+
| /aw-spec-plan-backend | 24 | architecture/security/interop the design author mediates the spec against, each with its example |
|
|
282
|
+
| /aw-spec-plan-frontend | 11 | the frontend lane's design set — composition, routing, client state, interaction states, forms, auth surface, design system, accessibility, i18n, performance, and the cross-lane API pairing the UI design author works from (from spec.md) |
|
|
283
|
+
| /aw-spec-implement-backend | 6 | governance/architecture the SERVICE lane builds against (from backend-plan.md), both paths |
|
|
284
|
+
| /aw-spec-implement-frontend | 13 | the FRONTEND lane's code-generation set (from frontend-plan.md), both paths — conventions, the generated client + its service pairing, auth, client security, states, forms, design system, accessibility, i18n, performance, observability and testing |
|
|
285
|
+
| /aw-spec-build | 3 | layering + coding rules the compile-fixer respects, + the layering example |
|
|
286
|
+
| /aw-spec-analyze-slice | 3 | testing + coding rules and the framework API map the design↔code gate validates against |
|
|
287
|
+
| /aw-spec-constitution | 18 | what the technical half ratifies — the technology base, the standard technical rules, and the project team's technical-requirements.md |
|
|
288
|
+
| /aw-spec-ui-constitution | 2 | what the frontend lane's half ratifies — the UI base + the project team's ui-requirements.md — and the signal that the lane exists |
|
|
289
|
+
| /aw-spec-run | 2 | persistence rules the execution / data-migration step generates against, + its example |
|
|
290
|
+
| /aw-spec-foundation-backend | 7 | what `foundation` builds the service lane's base project against when it is built from a spec rather than unpacked from a pack |
|
|
291
|
+
| /aw-spec-foundation-frontend | 8 | the same for the frontend lane — loaded instead of the backend set, never on top of it |
|
|
292
|
+
|
|
293
|
+
> All migrated workflows are on this map. The conformance-gate workflows **analyze-plan**
|
|
294
|
+
> and **analyze-plan-delta** are intentionally NOT here — they validate the plans / the delta
|
|
295
|
+
> against the spec + DOMAIN gate overlays only (domain-rule-bindings `## /aw-spec-gate`), with no
|
|
296
|
+
> technical gate checklist.
|
|
@@ -162,12 +162,63 @@ AAABAAE...
|
|
|
162
162
|
|
|
163
163
|
---
|
|
164
164
|
|
|
165
|
+
## The rule file (`<pack name>.rules.json`)
|
|
166
|
+
|
|
167
|
+
Every file in a pack is unpacked as packed, and a file that is already there is replaced. A
|
|
168
|
+
pack that needs some files treated otherwise ships a rule file beside it, named after the
|
|
169
|
+
pack: `VerticalSlice.rules.json` for `VerticalSlice.pack.txt`,
|
|
170
|
+
`VerticalSlice.Reference.rules.json` for `VerticalSlice.Reference.pack.txt`. Without one, the
|
|
171
|
+
pack unpacks exactly as described above.
|
|
172
|
+
|
|
173
|
+
```json
|
|
174
|
+
{
|
|
175
|
+
"format": "aw-spec-pack-rules/v1",
|
|
176
|
+
"rules": [
|
|
177
|
+
{
|
|
178
|
+
"path": "src/AppWeaver.VerticalSlice.Service/Infrastructure/ApplicationDbContext.cs",
|
|
179
|
+
"action": "merge",
|
|
180
|
+
"note": "why this file is merged — for the reader only",
|
|
181
|
+
"instruction": [
|
|
182
|
+
"Produce one ApplicationDbContext based on the EXISTING file:",
|
|
183
|
+
"- insert every INCOMING `public DbSet<...>` property right after the class's opening brace;",
|
|
184
|
+
"- keep everything else in the EXISTING file unchanged."
|
|
185
|
+
]
|
|
186
|
+
},
|
|
187
|
+
{ "path": "src/AppWeaver.VerticalSlice.Service/Features/", "action": "replace" }
|
|
188
|
+
]
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
- **`path`** is written as the pack holds it, sentinel included, and is renamed the way the
|
|
193
|
+
pack's files are — one rule file serves every app name. A path ending in `/` covers every
|
|
194
|
+
pack file under that folder; a rule for a file wins over its folder's rule.
|
|
195
|
+
- **`action`** is `merge` or `replace`. `replace` writes the pack's file over the existing one,
|
|
196
|
+
which is also what happens to every file no rule names. `merge` applies only when the file is
|
|
197
|
+
already there (from the base project, or from the lane before a re-unpack); otherwise the
|
|
198
|
+
pack's file is simply written.
|
|
199
|
+
- **`instruction`** (required for `merge`; a string or a list of lines) tells the merging
|
|
200
|
+
agent how to combine the two versions. It sees the **EXISTING** file — the one in the lane
|
|
201
|
+
before this pack was unpacked — and the **INCOMING** file — the pack's own, with the sentinel
|
|
202
|
+
already renamed — and returns the merged file; the engine writes it.
|
|
203
|
+
- **`note`** is optional and ignored by the kit.
|
|
204
|
+
|
|
205
|
+
A rule file that does not parse, or a rule with an unknown action or a merge with no
|
|
206
|
+
instruction, stops that pack before anything is written: the base pack reports the lane "not
|
|
207
|
+
scaffolded", and a broken reference rule file leaves the sample out with the reason. A rule
|
|
208
|
+
whose path the pack does not hold is reported in the lane's line — a sign the pack changed
|
|
209
|
+
and the rule file was not updated with it.
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
165
213
|
## How scaffolding consumes the bundle
|
|
166
214
|
|
|
167
|
-
`/appweaver foundation
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
215
|
+
`/appweaver foundation` unpacks the pack a lane picks into that lane's **lane root folder**
|
|
216
|
+
(`backend/` by default) with `unpack-foundation.ps1` (or `.sh`), which reads the sentinel from
|
|
217
|
+
the pack header, derives the four target case forms, and writes the renamed files. Before it
|
|
218
|
+
runs, the pack's rule file is read and every file to be merged is put aside; after it, each
|
|
219
|
+
merge runs as its rule says. A reference sample, when the pack ships one and the operator
|
|
220
|
+
wants it, goes on top the same way with its own rule file. The steps are in
|
|
221
|
+
`.appweaver/orchestrator/modules/foundation-pack.orch.yaml`.
|
|
171
222
|
|
|
172
223
|
```powershell
|
|
173
224
|
./unpack-foundation.ps1 -PackFile ./VerticalSlice.pack.txt -TargetAppName AppWeaver.Health -OutDir ../../../
|
|
@@ -182,3 +233,6 @@ defined in `.appweaver/orchestrator/workflows/aw-spec-foundation.orch.yaml`.
|
|
|
182
233
|
- [ ] No `bin/obj/.vs` or local `.db` files committed into the pack.
|
|
183
234
|
- [ ] `pack-foundation.ps1` reported a non-zero sentinel hit count.
|
|
184
235
|
- [ ] `VerticalSlice.pack.txt` regenerated and committed after any change.
|
|
236
|
+
- [ ] Each pack's rule file names every file that must be merged rather than replaced (for a
|
|
237
|
+
reference sample: every file it shares with the base pack that is not a straight
|
|
238
|
+
replacement), and no rule names a path the pack no longer holds.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# API Versioning Policy
|
|
2
2
|
|
|
3
|
-
> Pure technology (domain-agnostic) — domain (e.g. FHIR) versioning in [[api-versioning.domain]]. Commands: `/aw-spec-plan`.
|
|
3
|
+
> Pure technology (domain-agnostic) — domain (e.g. FHIR) versioning in [[api-versioning.domain]]. Commands: `/aw-spec-plan-backend`.
|
|
4
4
|
|
|
5
5
|
## REST versioning
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Auditing & Observability Standards
|
|
2
2
|
|
|
3
|
-
> Pure technology (domain-agnostic) — domain audit additions in [[auditing.domain]]. NON-NEGOTIABLE. Commands: `/aw-spec-plan`.
|
|
3
|
+
> Pure technology (domain-agnostic) — domain audit additions in [[auditing.domain]]. NON-NEGOTIABLE. Commands: `/aw-spec-plan-backend`.
|
|
4
4
|
|
|
5
5
|
## Observability baseline
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Authorization Standards
|
|
2
2
|
|
|
3
|
-
> Pure technology (domain-agnostic) — domain roles & matrix in [[authorization.domain]]. NON-NEGOTIABLE. Commands: `/aw-spec-plan`.
|
|
3
|
+
> Pure technology (domain-agnostic) — domain roles & matrix in [[authorization.domain]]. NON-NEGOTIABLE. Commands: `/aw-spec-plan-backend`.
|
|
4
4
|
|
|
5
5
|
## Authorization model
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Clean Architecture Standards
|
|
2
2
|
|
|
3
|
-
> Pure technology (domain-agnostic). NON-NEGOTIABLE. Commands: `/aw-spec-plan`, `/aw-spec-build`.
|
|
3
|
+
> Pure technology (domain-agnostic). NON-NEGOTIABLE. Commands: `/aw-spec-plan-backend`, `/aw-spec-build`.
|
|
4
4
|
|
|
5
5
|
## Dependency direction
|
|
6
6
|
|