aw-spec-cli 0.1.16 → 0.1.18

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 (70) hide show
  1. package/assets/.appweaver/DESIGN-FORMAT.md +18 -18
  2. package/assets/.appweaver/ORCH-DIALECT.md +1 -3
  3. package/assets/.appweaver/RULE-PARTITION.md +29 -13
  4. package/assets/.appweaver/STACK-PROFILES.md +10 -9
  5. package/assets/.appweaver/orchestrator/.state/smoke.state.json +32 -0
  6. package/assets/.appweaver/orchestrator/AGENT-PROFILE.md +4 -1
  7. package/assets/.appweaver/orchestrator/modules/delta-plan.orch.yaml +251 -0
  8. package/assets/.appweaver/orchestrator/modules/delta-spec.orch.yaml +104 -35
  9. package/assets/.appweaver/orchestrator/orchestrator.py +5 -4
  10. package/assets/.appweaver/orchestrator/rev-templates/delta-design-template.skeleton.md +94 -36
  11. package/assets/.appweaver/orchestrator/rev-templates/design-template.skeleton.md +1 -1
  12. package/assets/.appweaver/orchestrator/rev-templates/domain-model-template.skeleton.md +115 -0
  13. package/assets/.appweaver/orchestrator/rev-templates/domain-rule-bindings.skeleton.md +2 -9
  14. package/assets/.appweaver/orchestrator/rev-templates/tech-rule-bindings.skeleton.md +16 -40
  15. package/assets/.appweaver/orchestrator/rev-templates/ui-delta-design-template.skeleton.md +38 -17
  16. package/assets/.appweaver/orchestrator/rev-templates/ui-design-template.skeleton.md +8 -8
  17. package/assets/.appweaver/orchestrator/workflows/aw-spec-adopt.orch.yaml +10 -11
  18. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan-delta.orch.yaml +673 -0
  19. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan.orch.yaml +535 -0
  20. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice-delta.orch.yaml +643 -0
  21. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice.orch.yaml +84 -701
  22. package/assets/.appweaver/orchestrator/workflows/aw-spec-build.orch.yaml +4 -4
  23. package/assets/.appweaver/orchestrator/workflows/aw-spec-characterize.orch.yaml +7 -7
  24. package/assets/.appweaver/orchestrator/workflows/aw-spec-close-delta.orch.yaml +16 -14
  25. package/assets/.appweaver/orchestrator/workflows/aw-spec-constitution.orch.yaml +2 -2
  26. package/assets/.appweaver/orchestrator/workflows/aw-spec-finalize-delta.orch.yaml +243 -144
  27. package/assets/.appweaver/orchestrator/workflows/aw-spec-implement.orch.yaml +877 -578
  28. package/assets/.appweaver/orchestrator/workflows/aw-spec-inventory.orch.yaml +4 -4
  29. package/assets/.appweaver/orchestrator/workflows/aw-spec-onboard.orch.yaml +32 -91
  30. package/assets/.appweaver/orchestrator/workflows/aw-spec-parity.orch.yaml +2 -2
  31. package/assets/.appweaver/orchestrator/workflows/aw-spec-plan.orch.yaml +836 -514
  32. package/assets/.appweaver/orchestrator/workflows/aw-spec-run.orch.yaml +2 -2
  33. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-bounded-context.orch.yaml +132 -0
  34. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-feature.orch.yaml +38 -5
  35. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-stack.orch.yaml +3 -3
  36. package/assets/.appweaver/orchestrator/workflows/aw-spec-specify.orch.yaml +271 -979
  37. package/assets/.appweaver/scripts/bash/aw-spec-actions.sh +1085 -3385
  38. package/assets/.appweaver/scripts/bash/aw-xref.sh +1 -2
  39. package/assets/.appweaver/scripts/bash/common.sh +47 -0
  40. package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +914 -3220
  41. package/assets/.appweaver/scripts/powershell/aw-xref.ps1 +1 -2
  42. package/assets/.appweaver/scripts/python/aw-payload-parity.py +19 -3
  43. package/assets/.appweaver/scripts/python/aw-stack.py +6 -2
  44. package/assets/.appweaver/scripts/python/aw-xref.py +86 -350
  45. package/assets/.appweaver/templates/constitution-ui-template.md +1 -1
  46. package/assets/.appweaver/templates/delta-design-template.md +120 -30
  47. package/assets/.appweaver/templates/delta-domain-model-template.md +81 -0
  48. package/assets/.appweaver/templates/delta-spec-template.md +43 -17
  49. package/assets/.appweaver/templates/design-template.md +68 -98
  50. package/assets/.appweaver/templates/domain-model-template.md +130 -0
  51. package/assets/.appweaver/templates/okf-concept-template.md +2 -2
  52. package/assets/.appweaver/templates/source-map-template.md +3 -3
  53. package/assets/.appweaver/templates/spec-template.md +100 -122
  54. package/assets/.appweaver/templates/ui-delta-design-template.md +159 -0
  55. package/assets/.appweaver/templates/ui-design-template.md +46 -75
  56. package/assets/guardrails/projects/dotnet-default-project/domain-rule-bindings.md +7 -18
  57. package/assets/guardrails/projects/dotnet-default-project/tech-rule-bindings.md +34 -39
  58. package/assets/guardrails/requirement-spec.txt +2 -2
  59. package/assets/guardrails/technology/dotnet-webapi/testing.md +1 -1
  60. package/package.json +1 -1
  61. package/assets/.appweaver/orchestrator/modules/delta-design.orch.yaml +0 -105
  62. package/assets/.appweaver/orchestrator/modules/spec-state-gate.orch.yaml +0 -87
  63. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-delta-design.orch.yaml +0 -251
  64. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-design.orch.yaml +0 -813
  65. package/assets/.appweaver/orchestrator/workflows/aw-spec-implement-delta.orch.yaml +0 -253
  66. package/assets/.appweaver/orchestrator/workflows/aw-spec-implement-ui.orch.yaml +0 -663
  67. package/assets/.appweaver/orchestrator/workflows/aw-spec-plan-ui.orch.yaml +0 -600
  68. package/assets/.appweaver/orchestrator/workflows/aw-spec-story-plan.orch.yaml +0 -1147
  69. package/assets/.appweaver/orchestrator/workflows/aw-spec-sync-stories.orch.yaml +0 -1121
  70. package/assets/.appweaver/templates/story-template.md +0 -178
@@ -7,14 +7,14 @@
7
7
  #
8
8
  # 1.1.0 — the slice's file list now comes from the OKF concept's `source_files`
9
9
  # (`aw-xref concept-paths`) instead of the retired `design-paths` scan for
10
- # ```lang path=… fences, a convention the tech-agnostic design.md no longer carries;
10
+ # ```lang path=… fences, a convention the tech-agnostic backend-plan.md no longer carries;
11
11
  # and the tail step records fix-loop files in that concept instead of copying file
12
12
  # bodies back into design fences (`design-reconcile`, likewise retired).
13
13
  #
14
14
  # 1.2.0 — TECHNICAL RULES ONLY: the `domain-select` include is REMOVED. Build repairs
15
15
  # compile errors against design intent — a purely technical job — and the domain never
16
16
  # reaches this stage anyway (specify is the domain's sole carrier into the pipeline;
17
- # build reads code and design.md, never the spec or the domain docs). The include was
17
+ # build reads code and backend-plan.md, never the spec or the domain docs). The include was
18
18
  # also inert: no shipped domain-rule-bindings.md carries a "## /aw-spec-build" heading, so
19
19
  # `resolve-domain` — which keys `rulemap_exists` off the FILE, not the heading —
20
20
  # returned `candidates: []` and every load step skipped. On a CONFIGURED project it was
@@ -87,7 +87,7 @@ workflow:
87
87
  with: { require: backend, command: "/appweaver build" }
88
88
 
89
89
  # The slice's source files, from its OKF concept — what the fix loop below is handed.
90
- # This replaces the retired `design-paths` fence scan: the tech-agnostic design.md
90
+ # This replaces the retired `design-paths` fence scan: the tech-agnostic backend-plan.md
91
91
  # carries no ```lang path=… code blocks, so that scan returned nothing and the fixer
92
92
  # was told to "fix the source files in context" with an EMPTY context. `source_files`
93
93
  # is the maintained answer (implement writes it, analyze-slice merges fixes into it).
@@ -158,7 +158,7 @@ workflow:
158
158
 
159
159
  # Record what the fix loop touched in the slice's OKF concept. This replaces the retired
160
160
  # `design-reconcile` step, which copied on-disk file bodies back into the design doc's
161
- # path-tagged fences — meaningless now that design.md describes contracts, not code (and
161
+ # path-tagged fences — meaningless now that backend-plan.md describes contracts, not code (and
162
162
  # a silent no-op for as long as that has been true). The fix loop can CREATE files that
163
163
  # implement never recorded, so the knowledge index, not the design prose, is what has to
164
164
  # be caught up. UNION (--merge), never replace: fixed_files holds only what this loop
@@ -1,7 +1,7 @@
1
1
  # =============================================================================
2
2
  # aw-spec-characterize (orchestrator) — B2 of the Brownfield Pipeline
3
3
  #
4
- # The REGRESSION FENCE. After a slice is adopted (spec.md + design.md +
4
+ # The REGRESSION FENCE. After a slice is adopted (spec.md + backend-plan.md +
5
5
  # source-map.md), pin what the legacy code CURRENTLY DOES as golden-master /
6
6
  # characterization tests — observed behaviour asserted AS-IS, bugs and quirks
7
7
  # included. These are NOT correctness claims; they are the missing behaviour
@@ -18,7 +18,7 @@
18
18
  # item via the CR delta loop — never a silent drift.
19
19
  #
20
20
  # Characterize GENERATES tests only; it does NOT modify production code and does
21
- # NOT change spec.md / design.md.
21
+ # NOT change spec.md / backend-plan.md.
22
22
  #
23
23
  # EXISTING TESTS. A legacy repo usually already has some. They are not a fence — they
24
24
  # assert INTENDED behaviour, which is exactly what brownfield cannot assume. So before
@@ -34,7 +34,7 @@
34
34
  # every run (never appended), so it always reflects the CURRENT scan and can never go stale.
35
35
  #
36
36
  # Launch: /appweaver characterize [strategy] [focus/guidance]
37
- # Prereq: /appweaver adopt <Aggregate> (spec.md + design.md + source-map.md),
37
+ # Prereq: /appweaver adopt <Aggregate> (spec.md + backend-plan.md + source-map.md),
38
38
  # and a scaffolded project (/appweaver foundation) to host + run tests.
39
39
  # =============================================================================
40
40
 
@@ -118,7 +118,7 @@ workflow:
118
118
  action: verify_context
119
119
  require_true: design_exists
120
120
  on_false: stop
121
- on_false_message: "No design.md for the current feature. Run /appweaver adopt <Aggregate> (or /appweaver design) first."
121
+ on_false_message: "No backend-plan.md for the current feature. Run /appweaver adopt <Aggregate> (or /appweaver plan) first."
122
122
 
123
123
  # 1b. Require the ADOPT source-map sidecar — characterize fences an ADOPTED
124
124
  # legacy slice (its as-built quirks + owned source files live here).
@@ -188,8 +188,8 @@ workflow:
188
188
  - { path: "{{design_file}}" }
189
189
  - id: scan_existing_tests
190
190
  action: agent_query
191
- tools: Read,Glob,Grep # no test list is supplied — it globs the tree; empty results make characterize write duplicate golden-masters
192
191
  include_standards: false
192
+ tools: Read,Glob,Grep # no test list is supplied — it globs the tree; empty results make characterize write duplicate golden-masters
193
193
  schema:
194
194
  duplicates: [ { behaviour: "<observable behaviour>", spec_id: "<US-/FR-/BR- id>", existing_test: "<file:test-name>", seam: "<endpoint|handler|domain|persistence>", source_file: "<production file it covers>" } ]
195
195
  drift: [ { existing_test: "<file:test-name>", asserts: "<what the test expects>", code_actually: "<what the code does>", source_file: "<production file it covers>", spec_id: "<US-/FR-/BR- id, or ->", test_state: "<failing|ignored|inconclusive>" } ]
@@ -327,7 +327,7 @@ workflow:
327
327
  Generate CHARACTERIZATION / golden-master tests for this adopted slice that
328
328
  pin what the legacy code CURRENTLY DOES — the regression fence. READ the
329
329
  slice's PRODUCTION code (the files listed in source-map.md, in context) and
330
- OBSERVE its actual behaviour; the spec.md + design.md (in context) frame the
330
+ OBSERVE its actual behaviour; the spec.md + backend-plan.md (in context) frame the
331
331
  observable surface. Guidance: {{USER_INPUT}}
332
332
  Rules:
333
333
  - ASSERT OBSERVED BEHAVIOUR, AS-IS. Capture what the code returns/emits/persists
@@ -349,7 +349,7 @@ workflow:
349
349
  - BIND THE STACK + test framework from the constitution + the project's EXISTING
350
350
  test project conventions; place files in the test tree per folder-structure and
351
351
  match the surrounding test style. Reuse existing fixtures/builders.
352
- - Do NOT modify any PRODUCTION code — tests only. Do NOT edit spec.md / design.md.
352
+ - Do NOT modify any PRODUCTION code — tests only. Do NOT edit spec.md / backend-plan.md.
353
353
  If a behaviour is genuinely non-deterministic (time, random, external I/O),
354
354
  pin it via the seam the code already exposes (clock/port) or assert the stable
355
355
  shape; note it in the test rather than asserting a flaky value.
@@ -2,14 +2,14 @@
2
2
  # aw-spec-close-delta (orchestrator) — ARCHIVE the change + bump the version
3
3
  #
4
4
  # The last of the five CR stages, and the counterpart of finalize-delta:
5
- # finalize-delta MERGES the delta into the master docs (the change stays OPEN)
6
- # close-delta ARCHIVES the change + bumps the version (the change is CLOSED)
5
+ # finalize-delta MERGES the delta into spec.md + domain-model.md (the change stays OPEN)
6
+ # close-delta ARCHIVES the change + bumps the version (the change is CLOSED)
7
7
  #
8
- # specify → design → analyze-delta-design → implement-delta → build
8
+ # specify → plan → analyze-plan-delta → implement → build → analyze-slice-delta
9
9
  # → finalize-delta → analyze-slice → close-delta ← you are here
10
10
  #
11
11
  # WHY THE SPLIT. finalize-delta used to do both. Merging first lets analyze-slice run
12
- # against a master spec.md/design.md that ALREADY carries the change — so its fix loops
12
+ # against a master spec.md + domain-model.md that ALREADY carry the change — so its fix loops
13
13
  # repair code against the true, current requirements with no delta-awareness needed. But
14
14
  # if the close travelled with the merge, a red analyze-slice would land on a change that
15
15
  # was already archived and version-bumped: the only remedy would be a NEW change to
@@ -19,17 +19,19 @@
19
19
  #
20
20
  # This stage AUTHORS nothing and generates NO code — no model is invoked. It moves
21
21
  # changes/<id>/ into changes/archive/, bumps the minor version, clears active_change,
22
- # and STAMPS that version into the `**Version**:` header of spec.md + design.md — the
22
+ # and STAMPS that version into the `**Version**:` header of spec.md + backend-plan.md — the
23
23
  # single irreversible act of the CR loop, deliberately isolated in a stage of its own.
24
24
  #
25
25
  # THE VERSION SPINE LIVES HERE, AND ONLY HERE. The number has three carriers — spec.md's
26
- # header, design.md's header, active_version.json — and all three move in this one step
27
- # by one deterministic mechanism. Before, design.md's header was bumped by the MODEL at
26
+ # header, backend-plan.md's header, active_version.json — and all three move in this one step
27
+ # by one deterministic mechanism. Before, backend-plan.md's header was bumped by the MODEL at
28
28
  # finalize-delta (a stage early, and guessing the target since the number was never
29
29
  # passed into the merge prompt) while spec.md's header was bumped by nobody at all,
30
- # leaving the "living truth" document permanently at v1.0. finalize-delta now writes the
31
- # Change History rows using version-read's `next_version` — the same bump() authority
32
- # this stage applies — and touches neither header.
30
+ # leaving the "living truth" document permanently at v1.0. finalize-delta now writes
31
+ # spec.md's Change History row using version-read's `next_version` — the same bump()
32
+ # authority this stage applies — and touches neither header. It no longer merges the lane
33
+ # plans at all (they are derived from spec.md + domain-model.md), so a plan header stamped
34
+ # here is stating the version the slice ships as, not that the plan was re-derived for it.
33
35
  #
34
36
  # NOTE: nothing MECHANICALLY proves analyze-slice ran green before this point — the
35
37
  # stage boundary is operator-driven, as everywhere else in this pipeline. What IS
@@ -43,7 +45,7 @@
43
45
  # =============================================================================
44
46
 
45
47
  name: aw-spec-close-delta
46
- description: Close the open change — archive changes/<id>/ into changes/archive/, bump the minor version, clear active_change, and stamp that version into the feature's master headers (spec.md, design.md, and design.ui.md where the feature has a UI half), then anchor the close in the OKF freshness log. The final CR stage, run after finalize-delta merged the delta and analyze-slice verified the slice. The sole owner of the version spine; invokes no model and generates no code.
48
+ description: Close the open change — archive changes/<id>/ into changes/archive/, bump the minor version, clear active_change, and stamp that version into the feature's master headers (spec.md, backend-plan.md, and frontend-plan.md where the feature has a UI half), then anchor the close in the OKF freshness log. The final CR stage, run after finalize-delta merged the delta and analyze-slice verified the slice. The sole owner of the version spine; invokes no model and generates no code.
47
49
  version: 1.1.0
48
50
  agent_agnostic: true
49
51
  dialect: aw-spec.orchestrator/v1
@@ -132,8 +134,8 @@ workflow:
132
134
  - { name: archived_dir, from: "$.archived_dir" }
133
135
 
134
136
  # 4b. STAMP the number just computed into the two master headers, so spec.md,
135
- # design.md and active_version.json all carry it from the same instant by the
136
- # same mechanism. Previously design.md's header was bumped by the MODEL back at
137
+ # backend-plan.md and active_version.json all carry it from the same instant by the
138
+ # same mechanism. Previously backend-plan.md's header was bumped by the MODEL back at
137
139
  # finalize-delta (guessing the target — the number was never passed to it) and
138
140
  # spec.md's header was bumped by nobody, so it sat at v1.0 for the life of the
139
141
  # feature. Deterministic and idempotent; only the header value moves.
@@ -178,4 +180,4 @@ outputs:
178
180
  previous_version: "{{previous_version}}"
179
181
  archived_dir: "{{archived_dir}}"
180
182
  stamped_docs: "{{stamped_docs}}"
181
- next: "Change {{active_change}} CLOSED — archived to {{archived_dir}}, version {{previous_version}} -> {{version}}, stamped into {{stamped_count}} master header(s) ({{stamped_docs}}). spec.md, design.md and active_version.json now all read {{version}} — and design.ui.md too where the feature has a UI half ({{stamped_docs}} names what was actually rewritten); the masters describe the shipped state and the feature is free to take a new change. Next: /appweaver run → deploy, or start the next change with /appweaver specify."
183
+ next: "Change {{active_change}} CLOSED — archived to {{archived_dir}}, version {{previous_version}} -> {{version}}, stamped into {{stamped_count}} master header(s) ({{stamped_docs}}). spec.md, backend-plan.md and active_version.json now all read {{version}} — and frontend-plan.md too where the feature has a UI half ({{stamped_docs}} names what was actually rewritten); the masters describe the shipped state and the feature is free to take a new change. Next: /appweaver run → deploy, or start the next change with /appweaver specify."
@@ -723,5 +723,5 @@ outputs:
723
723
  ui_rule_files: "{{ui_rule_files}}"
724
724
  ui_validation_ok: "{{ui_ok}}"
725
725
  ui_validation_issues: "{{ui_issues}}"
726
- note: "Split constitution authored, one half per LANE the project declared in .appweaver/stacks.json. service_lane / ui_lane report which lanes were found there, and the declaration is the ONLY signal read: a half is a lane's standing governance, so a lane declared `(none)` in select-stack gets no half AND no file. constitution.technical.md is the service lane's base (standing input to design + implement); constitution.ui.md is the UI lane's UX-* base (standing input to ui-design + ui-implement); constitution.domain.md is the domain addenda (standing input to specify + a gate checklist), and it is always authored because domain is not a lane — it addends whichever halves exist. All are composed into constitution.md, which now tolerates an absent technical half: a UI-only project's domain half opens the roman-numeral sequence at I instead of continuing one, and numbering_checked reports false because that check has no subject rather than because it silently passed. Mapping ## /aw-spec-ui-constitution supplies the rules the UI half ratifies but no longer creates the lane on its own — a mapped rule set with no declared lane produces a warning naming both fixes. ui_lane false with ui_included true means a lane was retired after its half was authored: the file is left alone and the log says so, because a ratified governance file is never deleted automatically. If a validation_ok is false, the matching validation_issues lists what still needs a manual touch. See each half's Sync Impact Report for its version bump. Suggested commit: 'docs: amend split constitution'."
727
- next: "Loaded per concern — /appweaver specify loads constitution.domain.md; design + implement load constitution.technical.md; ui-design + ui-implement load constitution.ui.md. Re-run /appweaver constitution to amend, including to pick up a lane declared or dropped after this run — re-run /appweaver select-stack first to change which lanes exist."
726
+ note: "Split constitution authored, one half per LANE the project declared in .appweaver/stacks.json. service_lane / ui_lane report which lanes were found there, and the declaration is the ONLY signal read: a half is a lane's standing governance, so a lane declared `(none)` in select-stack gets no half AND no file. constitution.technical.md is the service lane's base (standing input to the SERVICE lane of plan + implement); constitution.ui.md is the UI lane's UX-* base (standing input to their FRONTEND lane); constitution.domain.md is the domain addenda (standing input to specify + a gate checklist), and it is always authored because domain is not a lane — it addends whichever halves exist. All are composed into constitution.md, which now tolerates an absent technical half: a UI-only project's domain half opens the roman-numeral sequence at I instead of continuing one, and numbering_checked reports false because that check has no subject rather than because it silently passed. Mapping ## /aw-spec-ui-constitution supplies the rules the UI half ratifies but no longer creates the lane on its own — a mapped rule set with no declared lane produces a warning naming both fixes. ui_lane false with ui_included true means a lane was retired after its half was authored: the file is left alone and the log says so, because a ratified governance file is never deleted automatically. If a validation_ok is false, the matching validation_issues lists what still needs a manual touch. See each half's Sync Impact Report for its version bump. Suggested commit: 'docs: amend split constitution'."
727
+ next: "Loaded per concern — /appweaver specify loads constitution.domain.md; the SERVICE lane of plan + implement loads constitution.technical.md; their FRONTEND lane loads constitution.ui.md. Re-run /appweaver constitution to amend, including to pick up a lane declared or dropped after this run — re-run /appweaver select-stack first to change which lanes exist."