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.
- package/assets/.appweaver/STACK-PROFILES.md +1 -1
- package/assets/.appweaver/orchestrator/orchestrator.py +5 -0
- package/assets/.appweaver/orchestrator/rev-templates/domain-rule-bindings.skeleton.md +10 -3
- package/assets/.appweaver/orchestrator/rev-templates/tech-rule-bindings.skeleton.md +38 -11
- package/assets/.appweaver/orchestrator/workflows/aw-spec-adopt.orch.yaml +2 -1
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-design.orch.yaml +607 -123
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice.orch.yaml +625 -66
- package/assets/.appweaver/orchestrator/workflows/aw-spec-implement-ui.orch.yaml +407 -134
- package/assets/.appweaver/orchestrator/workflows/aw-spec-implement.orch.yaml +452 -143
- package/assets/.appweaver/orchestrator/workflows/aw-spec-onboard.orch.yaml +78 -14
- package/assets/.appweaver/orchestrator/workflows/aw-spec-plan-ui.orch.yaml +597 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-plan.orch.yaml +688 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-feature.orch.yaml +3 -3
- package/assets/.appweaver/orchestrator/workflows/aw-spec-specify.orch.yaml +23 -23
- package/assets/.appweaver/orchestrator/workflows/aw-spec-story-plan.orch.yaml +945 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-sync-stories.orch.yaml +1040 -0
- package/assets/.appweaver/scripts/bash/aw-spec-actions.sh +2069 -28
- package/assets/.appweaver/scripts/bash/aw-xref.sh +2 -1
- package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +1973 -13
- package/assets/.appweaver/scripts/powershell/aw-xref.ps1 +2 -1
- package/assets/.appweaver/scripts/python/aw-xref.py +246 -20
- package/assets/.appweaver/templates/design-template.md +88 -54
- package/assets/.appweaver/templates/spec-template.md +12 -10
- package/assets/.appweaver/templates/story-template.md +48 -8
- package/assets/.appweaver/templates/ui-design-template.md +71 -39
- package/assets/guardrails/projects/dotnet-default-project/domain-rule-bindings.md +19 -7
- package/assets/guardrails/projects/dotnet-default-project/tech-rule-bindings.md +35 -26
- package/package.json +1 -1
- package/assets/.appweaver/orchestrator/workflows/aw-spec-design-ui.orch.yaml +0 -386
- 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 +
|
|
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/
|
|
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
|
|
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
|
|
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
|
|
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
|
-
#
|
|
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
|
|
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
|
|
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-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
#
|
|
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
|
|
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
|
|
809
|
-
minting a follow-on where a story
|
|
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
|
|
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
|
|
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
|
-
#
|
|
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
|
|
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
|
|
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
|
|
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."
|