aw-spec-cli 0.1.13 → 0.1.15

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 (30) hide show
  1. package/assets/.appweaver/STACK-PROFILES.md +1 -1
  2. package/assets/.appweaver/orchestrator/orchestrator.py +5 -0
  3. package/assets/.appweaver/orchestrator/rev-templates/domain-rule-bindings.skeleton.md +10 -3
  4. package/assets/.appweaver/orchestrator/rev-templates/tech-rule-bindings.skeleton.md +38 -11
  5. package/assets/.appweaver/orchestrator/workflows/aw-spec-adopt.orch.yaml +2 -1
  6. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-design.orch.yaml +607 -123
  7. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice.orch.yaml +625 -66
  8. package/assets/.appweaver/orchestrator/workflows/aw-spec-implement-ui.orch.yaml +407 -134
  9. package/assets/.appweaver/orchestrator/workflows/aw-spec-implement.orch.yaml +452 -143
  10. package/assets/.appweaver/orchestrator/workflows/aw-spec-onboard.orch.yaml +78 -14
  11. package/assets/.appweaver/orchestrator/workflows/aw-spec-plan-ui.orch.yaml +597 -0
  12. package/assets/.appweaver/orchestrator/workflows/aw-spec-plan.orch.yaml +688 -0
  13. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-feature.orch.yaml +3 -3
  14. package/assets/.appweaver/orchestrator/workflows/aw-spec-specify.orch.yaml +23 -23
  15. package/assets/.appweaver/orchestrator/workflows/aw-spec-story-plan.orch.yaml +945 -0
  16. package/assets/.appweaver/orchestrator/workflows/aw-spec-sync-stories.orch.yaml +1040 -0
  17. package/assets/.appweaver/scripts/bash/aw-spec-actions.sh +2069 -28
  18. package/assets/.appweaver/scripts/bash/aw-xref.sh +2 -1
  19. package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +1973 -13
  20. package/assets/.appweaver/scripts/powershell/aw-xref.ps1 +2 -1
  21. package/assets/.appweaver/scripts/python/aw-xref.py +246 -20
  22. package/assets/.appweaver/templates/design-template.md +88 -54
  23. package/assets/.appweaver/templates/spec-template.md +12 -10
  24. package/assets/.appweaver/templates/story-template.md +48 -8
  25. package/assets/.appweaver/templates/ui-design-template.md +71 -39
  26. package/assets/guardrails/projects/dotnet-default-project/domain-rule-bindings.md +19 -7
  27. package/assets/guardrails/projects/dotnet-default-project/tech-rule-bindings.md +35 -26
  28. package/package.json +1 -1
  29. package/assets/.appweaver/orchestrator/workflows/aw-spec-design-ui.orch.yaml +0 -386
  30. package/assets/.appweaver/orchestrator/workflows/aw-spec-design.orch.yaml +0 -382
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # feature = AGGREGATE (e.g. Order). This is the FIRST step of the spec-anchored
5
5
  # pipeline: it fixes the aggregate boundary BEFORE any spec/design exists, so the
6
- # feature's single spec.md + design.md and every command (CreateOrder/UpdateOrder =
6
+ # feature's single spec.md + its per-lane plans and every command (CreateOrder/UpdateOrder =
7
7
  # user stories) hang off one directory. It replaces guessing the aggregate out of prose in
8
8
  # `specify` — that is why finding #1 (feature=aggregate) is enforced here, not hoped for.
9
9
  #
@@ -19,7 +19,7 @@
19
19
  # list-features (specs/ ∪ OKF aggregates) → user_select (existing | "+ create new") → [ask name] → set-feature
20
20
  #
21
21
  # Persists .appweaver/feature.json {"feature_directory":"specs/<Feature>"} so every
22
- # later command operates on it: the forward loop (specify/design/analyze-design/implement/
22
+ # later command operates on it: the forward loop (specify/plan/analyze-design/implement/
23
23
  # build/analyze-slice/run/deploy) and the CR loop (analyze-delta-design/implement-delta/
24
24
  # finalize-delta/close-delta — the standalone `cr` is retired; specify and design author
25
25
  # the delta docs themselves).
@@ -124,5 +124,5 @@ outputs:
124
124
  feature_dir: "{{feature_dir}}"
125
125
  created: "{{created}}"
126
126
  spec_exists: "{{spec_exists}}"
127
- note: "Active feature set in .appweaver/feature.json — the aggregate boundary for its single spec.md + design.md."
127
+ note: "Active feature set in .appweaver/feature.json — the aggregate boundary for its single spec.md and the per-lane plans derived from it (backend-plan.md / frontend-plan.md)."
128
128
  next: "/appweaver specify <what this feature does> (authors {{feature_dir}}/spec.md; each operation = a user story)"
@@ -4,12 +4,12 @@
4
4
  # Spec-anchored pipeline, spec phase. feature = AGGREGATE (picked/created by
5
5
  # /appweaver select-feature, which sets .appweaver/feature.json). specify does
6
6
  # NOT guess or create the feature — it CONSUMES the active one, and is phase-pure
7
- # (spec side only; the single design.md is the `design` phase).
7
+ # (spec side only; the per-lane plans are the `plan` / `plan-ui` phases).
8
8
  #
9
9
  # specify writes ONE artifact: spec.md, plus the Change History row that records what
10
10
  # it wrote. It does not touch stories/. The spec is the CONTRACT; a story is an
11
11
  # execution SLICE over it, and the two directions between them each have their own
12
- # workflow — /appweaver update-stories refreshes the backlog after the spec moves,
12
+ # workflow — /appweaver sync-stories refreshes the backlog after the spec moves,
13
13
  # /appweaver update-spec folds a hand-edited story back into the contract. Keeping
14
14
  # specify story-blind is what stops the spec->story rule having two implementations.
15
15
  #
@@ -32,7 +32,7 @@
32
32
  # bootstrap diffs the finished document against nothing, which yields every id it
33
33
  # carries and is exactly the v1.0 row's content. A row the model declared could omit a
34
34
  # requirement the quality loop rewrote on its way past, and an omitted id is silent —
35
- # update-stories would never learn it moved.
35
+ # sync-stories would never learn it moved.
36
36
  # 2. The row and the hash are written by ONE call (ledger-append), so a row can never
37
37
  # exist without the hash that proves the body it describes.
38
38
  # 3. The ledger is checked on ENTRY, not only stamped on exit. A spec hand-edited with
@@ -42,11 +42,11 @@
42
42
  # Launch: /appweaver specify [strategy] <what the feature needs, or what changes>
43
43
  # e.g. /appweaver specify Customers place an order for one or more items
44
44
  # Prereq: /appweaver select-feature (sets the active aggregate)
45
- # Next: /appweaver update-stories (turns the new/changed requirements into stories)
45
+ # Next: /appweaver sync-stories (turns the new/changed requirements into stories)
46
46
  # =============================================================================
47
47
 
48
48
  name: aw-spec-specify
49
- description: Author or extend the specification of the ACTIVE feature (aggregate). The first call writes spec.md from the template; a later call edits spec.md in place, adding the requirements the input describes and amending the ones it changes. Both paths run the checklist/clarify/validate converge loop over spec.md. An extend appends a Change History row whose requirement ids are COMPUTED from a before/after diff, and re-baselines the ledger hash. Writes no stories — /appweaver update-stories owns the backlog. Spec phase only; design is separate.
49
+ description: Author or extend the specification of the ACTIVE feature (aggregate). The first call writes spec.md from the template; a later call edits spec.md in place, adding the requirements the input describes and amending the ones it changes. Both paths run the checklist/clarify/validate converge loop over spec.md. An extend appends a Change History row whose requirement ids are COMPUTED from a before/after diff, and re-baselines the ledger hash. Writes no stories — /appweaver sync-stories owns the backlog. Spec phase only; design is separate.
50
50
  version: 3.4.0
51
51
  agent_agnostic: true
52
52
  dialect: aw-spec.orchestrator/v1
@@ -101,7 +101,7 @@ vars:
101
101
  disturbed_csv: "" # which of them
102
102
  disturbed_ids: "" # the same, as a list — the options of the per-requirement ask
103
103
  disturbed_stories: "" # the open stories citing those ids
104
- disturbed_flying: "" # the subset already past story-spec — a follow-on, not an edit
104
+ disturbed_flying: "" # the subset already past story-plan — a follow-on, not an edit
105
105
  may_change: "" # the requirements the author approved for amendment
106
106
  approved_csv: "" # the same, normalised
107
107
  preserve_csv: "" # disturbed minus approved — restored and re-expressed additively
@@ -239,7 +239,7 @@ workflow:
239
239
  story, never an "As a … I want …" block, never a Given/When/Then acceptance
240
240
  scenario, and never a section for any of those. A story is an execution slice
241
241
  that lives beside this file in stories/ and cites the ids below; it is written
242
- by /appweaver update-stories, not here. Design and code trace to the ids in
242
+ by /appweaver sync-stories, not here. Design and code trace to the ids in
243
243
  this document, which is what lets the backlog churn without disturbing them.
244
244
  - SPECIFY IS THE ONLY PHASE THAT READS THE DOMAIN RULES. Design and implement
245
245
  work from the spec/design, never the domain docs — so this spec is the SOLE
@@ -291,7 +291,7 @@ workflow:
291
291
  read this section — so a bound the SERVICE must meet stays a CN-, cross-referenced.
292
292
  HIGH-LEVEL ONLY, and this is the rule that matters most: every entry is a standard
293
293
  the whole product holds to, checkable on ANY surface. NEVER a screen, page, layout,
294
- navigation model, component or visual-design choice — the prototype and design.ui.md
294
+ navigation model, component or visual-design choice — the prototype and frontend-plan.md
295
295
  settle those, and an entry satisfiable only one way is a design decision smuggled
296
296
  into the spec. A per-feature interaction BEHAVIOUR stays an EARS FR-n; only the
297
297
  standard that governs every such behaviour is a UX-n.
@@ -301,7 +301,7 @@ workflow:
301
301
  "Requirements changed" cell as the template has them. The kit rewrites that row
302
302
  from the finished document, so ids listed here are discarded — the same rule that
303
303
  makes every later version row an observation rather than a claim. Leave its Stories cell as "—";
304
- update-stories fills that in when it raises the backlog.
304
+ sync-stories fills that in when it raises the backlog.
305
305
  - LEAVE THE "## Story Coverage" BLOCK ALONE, placeholder row and all. Everything
306
306
  between the AW:COVERAGE markers is generated from the stories/ directory after
307
307
  this step; anything written there by hand is discarded at the next write.
@@ -328,7 +328,7 @@ workflow:
328
328
  #
329
329
  # unledgered_edit spec.md was hand-edited and no Change History row was added.
330
330
  # Appending this run's row would bump the version past that edit
331
- # without ever naming its ids, so update-stories could not
331
+ # without ever naming its ids, so sync-stories could not
332
332
  # reconcile it and every story citing it stays silently stale.
333
333
  # delta_open a change is open AND its delta-spec has been authored, so a delta
334
334
  # is measured against this master. Temporary — the guard retires with
@@ -474,7 +474,7 @@ workflow:
474
474
  - {{covered_note}}
475
475
  - THIS DOCUMENT HOLDS NO USER STORIES. Do not add an "As a … I want …" block, a
476
476
  Given/When/Then acceptance scenario, or a section for either. Stories live in
477
- stories/ beside this file and are written by /appweaver update-stories.
477
+ stories/ beside this file and are written by /appweaver sync-stories.
478
478
  - DO NOT TOUCH the "**Version**" header or the "## Change History" table, and leave everything between the AW:COVERAGE markers exactly as it is. Both are
479
479
  written by the kit after this step, from a diff of what you actually changed —
480
480
  editing them here produces a duplicate row and a version nothing agrees on.
@@ -651,7 +651,7 @@ workflow:
651
651
  # Asked, not decided, and RECORD IS FIRST on purpose. spec.md is already written by this
652
652
  # point: a run that refuses the ledger row leaves a document with no row, which is the
653
653
  # `unledgered_edit` state the next run refuses outright. Recording a red spec is honest
654
- # and recoverable — the row names what moved, so update-stories still works, and the
654
+ # and recoverable — the row names what moved, so sync-stories still works, and the
655
655
  # failures are in the checklist file. Stopping is the safer-feeling option that costs
656
656
  # more, so the prompt says what it costs and how to undo it.
657
657
  - id: quality_ask
@@ -691,7 +691,7 @@ workflow:
691
691
  # diff for the reason this file opens with: a row the model DECLARED can omit an id it
692
692
  # moved, and an omitted id is silent. v1.0 was the one exception — written by the
693
693
  # author from a template whose placeholder reads "FR-001…FR-00n", so nothing
694
- # downstream could trust it and update-stories had to be told to enumerate from the
694
+ # downstream could trust it and sync-stories had to be told to enumerate from the
695
695
  # document instead. Diffing against no snapshot yields every id the finished spec
696
696
  # carries, which is exactly the v1.0 row's content, so the first row is now derived
697
697
  # the same way as the rest and the special case downstream goes away.
@@ -784,7 +784,7 @@ workflow:
784
784
  # two outcomes differ sharply for the people downstream —
785
785
  #
786
786
  # amend the contract moves. Every open story citing it goes stale, and
787
- # update-stories reconciles them: edited in place if no story-spec
787
+ # sync-stories reconciles them: edited in place if no story plan
788
788
  # exists yet, carried by a follow-on if one does (§5.5).
789
789
  # add the amended requirements go back to how they read, and the change is
790
790
  # expressed as new requirements alongside them. Nobody's work goes
@@ -803,10 +803,10 @@ workflow:
803
803
  This change MODIFIED or REMOVED requirements that people have open stories against.
804
804
  Requirements: {{disturbed_csv}}
805
805
  Open stories: {{disturbed_stories}}
806
- Already in flight (story-spec exists): {{disturbed_flying}}
806
+ Already in flight (story plan exists): {{disturbed_flying}}
807
807
  Pick the ones this change MAY alter. Each one you pick moves the contract: its open
808
- stories go stale, and update-stories reconciles them — editing a story in place, or
809
- minting a follow-on where a story-spec already exists. Each one you LEAVE OUT is put
808
+ stories go stale, and sync-stories reconciles them — editing a story in place, or
809
+ minting a follow-on where a story plan already exists. Each one you LEAVE OUT is put
810
810
  back exactly as it read, and the change it was carrying is expressed as a new
811
811
  requirement alongside it, so the work already under way stays correct.
812
812
  Which may be changed?
@@ -1024,7 +1024,7 @@ workflow:
1024
1024
  # It announces rather than stops. spec.md is already written by this point, so a stop
1025
1025
  # here leaves a document on disk with no ledger row, which is the state the next run's
1026
1026
  # tripwire refuses. Announcing keeps the ledger row honest — the violated ids ARE in
1027
- # it, so update-stories still reconciles their stories — and moves them out of the
1027
+ # it, so sync-stories still reconciles their stories — and moves them out of the
1028
1028
  # "preserved" column of the report into a column that says what actually happened.
1029
1029
  - id: ext_restore_check
1030
1030
  condition: "{{preserve_count}} != 0"
@@ -1045,7 +1045,7 @@ workflow:
1045
1045
  on_false_message: >
1046
1046
  The re-authoring did NOT restore {{violated_csv}} — you declined to change these and
1047
1047
  they moved anyway. They are recorded in this version's Change History row, so
1048
- /appweaver update-stories will reconcile the stories citing them rather than leaving
1048
+ /appweaver sync-stories will reconcile the stories citing them rather than leaving
1049
1049
  them silently stale; check that the wording it landed on is one you can live with.
1050
1050
 
1051
1051
  # 10h. Re-read the affected stories from the FINAL document. After a restore, the
@@ -1087,7 +1087,7 @@ workflow:
1087
1087
  # 11. One call writes the row, bumps the version, stamps the header and re-hashes, so
1088
1088
  # a row cannot exist without the hash that proves the body it describes. Skipped
1089
1089
  # when the run changed no requirement — a version that names no ids is a bump
1090
- # update-stories can do nothing with.
1090
+ # sync-stories can do nothing with.
1091
1091
  - id: ext_ledger_append
1092
1092
  condition: "{{change_count}} != 0"
1093
1093
  action: execute_script
@@ -1105,7 +1105,7 @@ workflow:
1105
1105
  #
1106
1106
  # Deliberately OUTSIDE the ledger. The hash guards the CONTRACT, and coverage is a
1107
1107
  # projection of the backlog — spec-check, spec-diff and ledger-append all cut this
1108
- # block out before they look. That is what lets user-story and update-stories write
1108
+ # block out before they look. That is what lets user-story and sync-stories write
1109
1109
  # it too without a story creation reading as an unledgered spec edit, or a story
1110
1110
  # raised against FR-003 reading as FR-003 having changed.
1111
1111
  #
@@ -1172,7 +1172,7 @@ outputs:
1172
1172
  spec_file: "{{spec_file}}"
1173
1173
  version: "{{version}}"
1174
1174
  requirements_changed: "{{changed_csv}}" # every class — what the ledger row records
1175
- requirements_for_stories: "{{story_ids_csv}}" # the FR-/BR- subset — what update-stories acts on
1175
+ requirements_for_stories: "{{story_ids_csv}}" # the FR-/BR- subset — what sync-stories acts on
1176
1176
  requirements_removed: "{{removed_csv}}"
1177
1177
  requirements_amended: "{{modified_csv}}" # what finally stands amended, ask or no ask
1178
1178
  requirements_preserved: "{{held_csv}}" # the ones the restore actually put back
@@ -1183,4 +1183,4 @@ outputs:
1183
1183
  stories_disturbed: "{{disturbed_stories}}"
1184
1184
  checklist_file: "{{checklist_file}}"
1185
1185
  checklist_quality: "{{checklist_passed}}/{{checklist_total}} items passing"
1186
- next: "spec.md is at {{version}}. Run /appweaver update-stories — it raises or refreshes the backlog for the requirements this run touched that a story can cite ({{story_ids_csv}}), and nothing else keeps the contract and its stories in step. That is the FR-/BR- subset of requirements_changed on purpose: the ledger row records every class this run moved, but only these are slices of work. Then /appweaver design authors design.md from the spec. READ THE FIELDS ABOVE BEFORE YOU DO: requirements_removed orphans every story citing them and needs deciding by hand; requirements_not_restored moved despite you declining them; requirements_reissued point at something other than what cited them before; open_change will be merged into this document by finalize-delta; and checklist_quality is what the spec actually scored."
1186
+ next: "spec.md is at {{version}}. Run /appweaver sync-stories — it raises or refreshes the backlog for the requirements this run touched that a story can cite ({{story_ids_csv}}), and nothing else keeps the contract and its stories in step. That is the FR-/BR- subset of requirements_changed on purpose: the ledger row records every class this run moved, but only these are slices of work. Then /appweaver plan authors or conforms backend-plan.md to this spec version, and names the /appweaver plan-ui follow-up when a frontend lane is declared. READ THE FIELDS ABOVE BEFORE YOU DO: requirements_removed orphans every story citing them and needs deciding by hand; requirements_not_restored moved despite you declining them; requirements_reissued point at something other than what cited them before; open_change will be merged into this document by finalize-delta; and checklist_quality is what the spec actually scored."