aw-spec-cli 0.1.16 → 0.1.17
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/DESIGN-FORMAT.md +18 -18
- package/assets/.appweaver/ORCH-DIALECT.md +1 -3
- package/assets/.appweaver/RULE-PARTITION.md +29 -13
- package/assets/.appweaver/STACK-PROFILES.md +10 -9
- package/assets/.appweaver/orchestrator/.state/smoke.state.json +32 -0
- package/assets/.appweaver/orchestrator/AGENT-PROFILE.md +4 -1
- package/assets/.appweaver/orchestrator/modules/delta-plan.orch.yaml +251 -0
- package/assets/.appweaver/orchestrator/modules/delta-spec.orch.yaml +104 -35
- package/assets/.appweaver/orchestrator/orchestrator.py +5 -4
- package/assets/.appweaver/orchestrator/rev-templates/delta-design-template.skeleton.md +94 -36
- package/assets/.appweaver/orchestrator/rev-templates/design-template.skeleton.md +1 -1
- package/assets/.appweaver/orchestrator/rev-templates/domain-model-template.skeleton.md +115 -0
- package/assets/.appweaver/orchestrator/rev-templates/domain-rule-bindings.skeleton.md +2 -9
- package/assets/.appweaver/orchestrator/rev-templates/tech-rule-bindings.skeleton.md +16 -40
- package/assets/.appweaver/orchestrator/rev-templates/ui-delta-design-template.skeleton.md +38 -17
- package/assets/.appweaver/orchestrator/rev-templates/ui-design-template.skeleton.md +8 -8
- package/assets/.appweaver/orchestrator/workflows/aw-spec-adopt.orch.yaml +10 -11
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan-delta.orch.yaml +673 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan.orch.yaml +535 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice-delta.orch.yaml +643 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice.orch.yaml +84 -701
- package/assets/.appweaver/orchestrator/workflows/aw-spec-build.orch.yaml +4 -4
- package/assets/.appweaver/orchestrator/workflows/aw-spec-characterize.orch.yaml +7 -7
- package/assets/.appweaver/orchestrator/workflows/aw-spec-close-delta.orch.yaml +16 -14
- package/assets/.appweaver/orchestrator/workflows/aw-spec-constitution.orch.yaml +2 -2
- package/assets/.appweaver/orchestrator/workflows/aw-spec-finalize-delta.orch.yaml +243 -144
- package/assets/.appweaver/orchestrator/workflows/aw-spec-implement.orch.yaml +877 -578
- package/assets/.appweaver/orchestrator/workflows/aw-spec-inventory.orch.yaml +4 -4
- package/assets/.appweaver/orchestrator/workflows/aw-spec-onboard.orch.yaml +32 -91
- package/assets/.appweaver/orchestrator/workflows/aw-spec-parity.orch.yaml +2 -2
- package/assets/.appweaver/orchestrator/workflows/aw-spec-plan.orch.yaml +836 -514
- package/assets/.appweaver/orchestrator/workflows/aw-spec-run.orch.yaml +2 -2
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-bounded-context.orch.yaml +132 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-feature.orch.yaml +38 -5
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-stack.orch.yaml +3 -3
- package/assets/.appweaver/orchestrator/workflows/aw-spec-specify.orch.yaml +271 -979
- package/assets/.appweaver/scripts/bash/aw-spec-actions.sh +1085 -3385
- package/assets/.appweaver/scripts/bash/aw-xref.sh +1 -2
- package/assets/.appweaver/scripts/bash/common.sh +47 -0
- package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +914 -3220
- package/assets/.appweaver/scripts/powershell/aw-xref.ps1 +1 -2
- package/assets/.appweaver/scripts/python/aw-payload-parity.py +19 -3
- package/assets/.appweaver/scripts/python/aw-stack.py +6 -2
- package/assets/.appweaver/scripts/python/aw-xref.py +86 -350
- package/assets/.appweaver/templates/constitution-ui-template.md +1 -1
- package/assets/.appweaver/templates/delta-design-template.md +120 -30
- package/assets/.appweaver/templates/delta-domain-model-template.md +81 -0
- package/assets/.appweaver/templates/delta-spec-template.md +43 -17
- package/assets/.appweaver/templates/design-template.md +68 -98
- package/assets/.appweaver/templates/domain-model-template.md +130 -0
- package/assets/.appweaver/templates/okf-concept-template.md +2 -2
- package/assets/.appweaver/templates/source-map-template.md +3 -3
- package/assets/.appweaver/templates/spec-template.md +100 -122
- package/assets/.appweaver/templates/ui-delta-design-template.md +159 -0
- package/assets/.appweaver/templates/ui-design-template.md +46 -75
- package/assets/guardrails/projects/dotnet-default-project/domain-rule-bindings.md +7 -18
- package/assets/guardrails/projects/dotnet-default-project/tech-rule-bindings.md +34 -39
- package/assets/guardrails/requirement-spec.txt +2 -2
- package/assets/guardrails/technology/dotnet-webapi/testing.md +1 -1
- package/package.json +1 -1
- package/assets/.appweaver/orchestrator/modules/delta-design.orch.yaml +0 -105
- package/assets/.appweaver/orchestrator/modules/spec-state-gate.orch.yaml +0 -87
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-delta-design.orch.yaml +0 -251
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-design.orch.yaml +0 -813
- package/assets/.appweaver/orchestrator/workflows/aw-spec-implement-delta.orch.yaml +0 -253
- package/assets/.appweaver/orchestrator/workflows/aw-spec-implement-ui.orch.yaml +0 -663
- package/assets/.appweaver/orchestrator/workflows/aw-spec-plan-ui.orch.yaml +0 -600
- package/assets/.appweaver/orchestrator/workflows/aw-spec-story-plan.orch.yaml +0 -1147
- package/assets/.appweaver/orchestrator/workflows/aw-spec-sync-stories.orch.yaml +0 -1121
- 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
|
|
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
|
|
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
|
|
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
|
|
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 +
|
|
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 /
|
|
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 +
|
|
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
|
|
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 +
|
|
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 /
|
|
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
|
|
6
|
-
# close-delta ARCHIVES the change + bumps the version
|
|
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 →
|
|
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
|
|
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 +
|
|
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,
|
|
27
|
-
# by one deterministic mechanism. Before,
|
|
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
|
|
31
|
-
# Change History
|
|
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,
|
|
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
|
-
#
|
|
136
|
-
# same mechanism. Previously
|
|
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,
|
|
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
|
|
727
|
-
next: "Loaded per concern — /appweaver specify loads constitution.domain.md;
|
|
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."
|