aw-spec-cli 0.1.29 → 0.1.31
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/.amp/agent.json +22 -0
- package/assets/.amp/settings-edit.json +5 -0
- package/assets/.amp/settings-read.json +12 -0
- package/assets/.appweaver/DESIGN-FORMAT.md +9 -0
- package/assets/.appweaver/STACK-PROFILES.md +102 -15
- package/assets/.appweaver/orchestrator/modules/delta-plan.orch.yaml +40 -18
- package/assets/.appweaver/orchestrator/modules/delta-spec.orch.yaml +56 -4
- package/assets/.appweaver/orchestrator/modules/lane-gate.orch.yaml +17 -1
- package/assets/.appweaver/orchestrator/rev-templates/ui-design-template.skeleton.md +12 -3
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan-delta.orch.yaml +289 -24
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan.orch.yaml +370 -85
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice-delta.orch.yaml +349 -65
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice.orch.yaml +39 -7
- package/assets/.appweaver/orchestrator/workflows/aw-spec-build.orch.yaml +63 -4
- package/assets/.appweaver/orchestrator/workflows/aw-spec-finalize-delta.orch.yaml +5 -4
- package/assets/.appweaver/orchestrator/workflows/aw-spec-implement.orch.yaml +430 -138
- package/assets/.appweaver/orchestrator/workflows/aw-spec-plan.orch.yaml +392 -76
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-lane.orch.yaml +104 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-stack.orch.yaml +20 -3
- package/assets/.appweaver/orchestrator/workflows/aw-spec-specify.orch.yaml +26 -3
- package/assets/.appweaver/scripts/bash/aw-spec-actions.sh +314 -44
- package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +249 -20
- package/assets/.appweaver/scripts/powershell/aw-xref.ps1 +17 -2
- package/assets/.appweaver/scripts/python/aw-plangate.py +109 -19
- package/assets/.appweaver/scripts/python/aw-stack.py +1295 -9
- package/assets/.appweaver/templates/delta-design-template.md +7 -5
- package/assets/.appweaver/templates/delta-spec-template.md +2 -0
- package/assets/.appweaver/templates/design-template.md +17 -0
- package/assets/.appweaver/templates/ui-design-template.md +19 -4
- package/assets/.augment/agent.json +22 -0
- package/assets/.augment/commands/appweaver.md +12 -0
- package/assets/.cline/agent.json +22 -0
- package/assets/.clinerules/workflows/appweaver.md +7 -0
- package/assets/.codex/agent.json +22 -0
- package/assets/.continue/agent.json +22 -0
- package/assets/.continue/prompts/appweaver.md +13 -0
- package/assets/.cursor/agent.json +22 -0
- package/assets/.cursor/commands/appweaver.md +7 -0
- package/assets/.devin/agent.json +22 -0
- package/assets/.devin/workflows/appweaver.md +11 -0
- package/assets/.factory/agent.json +22 -0
- package/assets/.factory/commands/appweaver.md +12 -0
- package/assets/.gemini/agent.json +22 -0
- package/assets/.github/prompts/appweaver.prompt.md +13 -0
- package/assets/.kilo/agent.json +28 -0
- package/assets/.kilo/agents/appweaver-edit.md +12 -0
- package/assets/.kilo/agents/appweaver-read.md +12 -0
- package/assets/.kilo/commands/appweaver.md +11 -0
- package/assets/.kiro/agent.json +22 -0
- package/assets/.kiro/skills/appweaver/SKILL.md +12 -0
- package/assets/.opencode/agent.json +22 -0
- package/assets/.opencode/agents/appweaver-edit.md +12 -0
- package/assets/.opencode/agents/appweaver-read.md +13 -0
- package/assets/.opencode/commands/appweaver.md +11 -0
- package/assets/.roo/agent.json +22 -0
- package/assets/.roo/commands/appweaver.md +12 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +14 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +14 -0
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/copy-assets.d.ts +16 -3
- package/dist/utils/copy-assets.d.ts.map +1 -1
- package/dist/utils/copy-assets.js +29 -14
- package/dist/utils/copy-assets.js.map +1 -1
- package/package.json +1 -1
|
@@ -65,13 +65,20 @@
|
|
|
65
65
|
# score the WHOLE slice, against masters that carry the change, with the fix loops and the
|
|
66
66
|
# referrer blast radius.
|
|
67
67
|
#
|
|
68
|
+
# THE WORKING LANE. Only the lanes the developer on this machine works on (.appweaver/
|
|
69
|
+
# lane.json — select-stack writes the default, select-lane narrows it) are tested, fixed and
|
|
70
|
+
# scored. A backend developer's gate is not failed by the frontend's tests, its fix loops are
|
|
71
|
+
# never handed the frontend's files, and the composition pass — the service lane's container
|
|
72
|
+
# — runs only for a developer who works on the backend. With the default (every declared
|
|
73
|
+
# lane) every lane is tested, as before.
|
|
74
|
+
#
|
|
68
75
|
# Launch: /appweaver analyze-slice [strategy]
|
|
69
76
|
# Prereq: /appweaver build (compiled code for the active feature).
|
|
70
77
|
# =============================================================================
|
|
71
78
|
|
|
72
79
|
name: aw-spec-analyze-slice
|
|
73
80
|
description: The design↔code conformance gate — run the slice's tests against its acceptance criteria, check the code against the domain gate overlays AND the bounded context's domain-model.md (every invariant the slice's own aggregate section states must be enforced as written; one another aggregate owns is reported, not blocking), verify the change did not break any referring aggregate (the OKF referrer blast radius) and write a triage report before stopping if it did, refresh + review its OKF concept, and record every fix in it. Sits after finalize-delta on the change path, so the two masters it scores against already carry the change, and before close-delta, so a red gate leaves the change open and recoverable.
|
|
74
|
-
version: 2.
|
|
81
|
+
version: 2.7.0
|
|
75
82
|
agent_agnostic: true
|
|
76
83
|
dialect: aw-spec.orchestrator/v1
|
|
77
84
|
|
|
@@ -117,8 +124,13 @@ vars:
|
|
|
117
124
|
wiring_ok: "true"
|
|
118
125
|
unbound: ""
|
|
119
126
|
be_declared: "false"
|
|
127
|
+
be_working: "false" # the backend is a lane this developer works on — .appweaver/lane.json
|
|
120
128
|
be_lane_id: ""
|
|
121
129
|
be_source_path: ""
|
|
130
|
+
working_lane: ""
|
|
131
|
+
working_kind: "" # one kind when the developer works on one lane of two, else empty — every declared lane
|
|
132
|
+
working_root: ""
|
|
133
|
+
working_test_path: ""
|
|
122
134
|
wiring_notes: ""
|
|
123
135
|
# The integrity fence blocks through this, not through `integrity_ok` — a fence skipped
|
|
124
136
|
# because there were no tests to run must not read as a broken referrer.
|
|
@@ -244,8 +256,24 @@ workflow:
|
|
|
244
256
|
- { name: active_change, from: "$.active_change" }
|
|
245
257
|
- { name: has_change, from: "$.has_change" }
|
|
246
258
|
|
|
259
|
+
# THE WORKING LANES — which lanes this developer's gate tests, fixes and scores. Read with
|
|
260
|
+
# --feature-dir, so a lane the feature records no surface in is not worked either.
|
|
261
|
+
- id: working_lanes
|
|
262
|
+
action: execute_script
|
|
263
|
+
on_error: continue
|
|
264
|
+
script: { ref: actions }
|
|
265
|
+
subcommand: lane-resolve
|
|
266
|
+
args: ["--feature-dir", "{{feature_dir}}"]
|
|
267
|
+
outputs:
|
|
268
|
+
- { name: working_lane, from: "$.working_lane" }
|
|
269
|
+
- { name: working_kind, from: "$.working_kind" }
|
|
270
|
+
- { name: working_root, from: "$.working_root" }
|
|
271
|
+
- { name: working_test_path, from: "$.working_test_path" }
|
|
272
|
+
- { name: be_working, from: "$.backend_working" }
|
|
273
|
+
|
|
247
274
|
# The slice's source files, from its OKF concept — the context all three passes below
|
|
248
|
-
# work over (test fix loop, integrity triage, conformance).
|
|
275
|
+
# work over (test fix loop, integrity triage, conformance). `--under` keeps the working
|
|
276
|
+
# lane's own two subtrees when the developer works on one lane of two. Replaces the retired
|
|
249
277
|
# `design-paths` fence scan: backend-plan.md is tech-agnostic prose with no ```lang path=…
|
|
250
278
|
# code blocks, so that scan returned nothing and every pass ran on an EMPTY file list.
|
|
251
279
|
# Read-only, exits 0 with paths=[] when there is no concept yet; on_error: continue so
|
|
@@ -255,7 +283,7 @@ workflow:
|
|
|
255
283
|
on_error: continue
|
|
256
284
|
script: { ref: xref }
|
|
257
285
|
subcommand: concept-paths
|
|
258
|
-
args: ["--feature-dir", "{{feature_dir}}"]
|
|
286
|
+
args: ["--feature-dir", "{{feature_dir}}", "--under", "{{working_root}}", "--under", "{{working_test_path}}"]
|
|
259
287
|
outputs:
|
|
260
288
|
- { name: all_paths, from: "$.paths" }
|
|
261
289
|
- { name: paths_missing, from: "$.missing" }
|
|
@@ -287,7 +315,7 @@ workflow:
|
|
|
287
315
|
# to make tests pass, and it can only repair THIS feature (its design + spec are
|
|
288
316
|
# what is in context) — so referring aggregates are deliberately NOT in this run;
|
|
289
317
|
# they are verified read-only by the integrity gate below.
|
|
290
|
-
args: ["--feature-dir", "{{feature_dir}}", "--scope", "slice"]
|
|
318
|
+
args: ["--feature-dir", "{{feature_dir}}", "--scope", "slice", "--kind", "{{working_kind}}"]
|
|
291
319
|
outputs:
|
|
292
320
|
- { name: test_ok, from: "$.fence_green" }
|
|
293
321
|
- { name: test_tool, from: "$.tool" }
|
|
@@ -527,6 +555,9 @@ workflow:
|
|
|
527
555
|
# It reads FILES, so the query declares tools — the composition root is shared
|
|
528
556
|
# infrastructure and is often not among the slice's own concept paths. Registration by
|
|
529
557
|
# assembly scan or convention counts; assuming one without finding it does not.
|
|
558
|
+
#
|
|
559
|
+
# It runs for a developer who WORKS ON the backend lane: the container is that lane's,
|
|
560
|
+
# and its fix writes there.
|
|
530
561
|
- id: lane_resolve
|
|
531
562
|
action: execute_script
|
|
532
563
|
on_error: continue
|
|
@@ -537,12 +568,12 @@ workflow:
|
|
|
537
568
|
- { name: be_lane_id, from: "$.backend_lane_id" }
|
|
538
569
|
- { name: be_source_path, from: "$.backend_source_path" }
|
|
539
570
|
- id: wiring_arm
|
|
540
|
-
condition: "{{
|
|
571
|
+
condition: "{{be_working}} == true"
|
|
541
572
|
action: set
|
|
542
573
|
vars: { wiring_ok: "false" }
|
|
543
574
|
|
|
544
575
|
- id: wiring_loop
|
|
545
|
-
condition: "{{
|
|
576
|
+
condition: "{{be_working}} == true"
|
|
546
577
|
action: loop
|
|
547
578
|
while: "{{wiring_ok}} != true"
|
|
548
579
|
max_iterations: 2
|
|
@@ -648,7 +679,7 @@ workflow:
|
|
|
648
679
|
on_error: continue
|
|
649
680
|
script: { ref: actions }
|
|
650
681
|
subcommand: test-run
|
|
651
|
-
args: ["--feature-dir", "{{feature_dir}}", "--scope", "slice", "--also", "{{referrer_csv}}"]
|
|
682
|
+
args: ["--feature-dir", "{{feature_dir}}", "--scope", "slice", "--also", "{{referrer_csv}}", "--kind", "{{working_kind}}"]
|
|
652
683
|
outputs:
|
|
653
684
|
- { name: integrity_ok, from: "$.fence_green" }
|
|
654
685
|
- { name: integrity_log, from: "$.log_tail" }
|
|
@@ -809,6 +840,7 @@ workflow:
|
|
|
809
840
|
outputs:
|
|
810
841
|
feature_dir: "{{feature_dir}}"
|
|
811
842
|
bounded_context: "{{context}}"
|
|
843
|
+
working_lane: "{{working_lane}}" # the lane(s) tested, fixed and scored — .appweaver/lane.json
|
|
812
844
|
# The second master this gate scored against — the RESOLVED path, which context-paths
|
|
813
845
|
# reports whether or not the file is there. `model_scored` is the one that says whether
|
|
814
846
|
# it actually reached the passes: false means the conformance pass checked the gate
|
|
@@ -29,12 +29,25 @@
|
|
|
29
29
|
# lane declared, a lane with no lane root folder, a lane root folder that is not on disk, and two
|
|
30
30
|
# lanes claiming overlapping subtrees all still stop the run.
|
|
31
31
|
#
|
|
32
|
+
# 1.4.0 — THE WORKING LANE. Only the lanes the developer on this machine works on
|
|
33
|
+
# (.appweaver/lane.json — select-stack writes the default, select-lane narrows it) are
|
|
34
|
+
# compiled, checked on disk and handed to the fix loop. A backend developer's build is not
|
|
35
|
+
# stopped by a frontend lane that is not scaffolded yet, nor failed by its compile errors,
|
|
36
|
+
# and its fix loop is never handed the frontend's files. With the default (every declared
|
|
37
|
+
# lane) every lane is compiled, as before.
|
|
38
|
+
#
|
|
39
|
+
# 1.5.0 — THE BACKEND PUBLISHES ITS API DOCUMENT. After a green compile, a developer who
|
|
40
|
+
# works on the service lane exports its API document again (contract-export: start the
|
|
41
|
+
# service, save what it serves under contracts/ in its lane root folder, stop it), so the
|
|
42
|
+
# committed document follows the fixes this loop made. The frontend lane reads that
|
|
43
|
+
# document and never starts the service. A failed export warns and the build stays green.
|
|
44
|
+
#
|
|
32
45
|
# Launch: /appweaver build [strategy]
|
|
33
46
|
# =============================================================================
|
|
34
47
|
|
|
35
48
|
name: aw-spec-build
|
|
36
|
-
description: Compile the feature by running
|
|
37
|
-
version: 1.
|
|
49
|
+
description: Compile the feature by running the build command of every lane the developer works on (.appweaver/lane.json — every declared lane by default), fix compile errors against the design intent, then record the touched files in the slice's knowledge concept; a developer who works on the service lane then re-exports its API document (contracts/openapi.json), which the frontend lane reads from the commit. Backend-only, frontend-only and full-stack projects all compile here — the gate requires a lane declaration, not a lane of a particular kind. Loads TECHNICAL rules only (tech-rule-bindings) — no domain rules reach this stage.
|
|
50
|
+
version: 1.5.0
|
|
38
51
|
agent_agnostic: true
|
|
39
52
|
dialect: aw-spec.orchestrator/v1
|
|
40
53
|
|
|
@@ -57,6 +70,16 @@ standards:
|
|
|
57
70
|
|
|
58
71
|
vars:
|
|
59
72
|
build_ok: "false"
|
|
73
|
+
working_kind: "" # one kind when the developer works on one lane of two, else empty — every declared lane
|
|
74
|
+
working_root: ""
|
|
75
|
+
working_test_path: ""
|
|
76
|
+
be_working: "false" # the service lane is declared and this developer works on it — it publishes the API document
|
|
77
|
+
contract_ok: ""
|
|
78
|
+
export_doc: ""
|
|
79
|
+
contract_reason: ""
|
|
80
|
+
contract_log: ""
|
|
81
|
+
contract_already: "false"
|
|
82
|
+
contract_fresh: "true"
|
|
60
83
|
|
|
61
84
|
workflow:
|
|
62
85
|
|
|
@@ -98,6 +121,8 @@ workflow:
|
|
|
98
121
|
with: { require: "", command: "/appweaver build" }
|
|
99
122
|
|
|
100
123
|
# The slice's source files, from its OKF concept — what the fix loop below is handed.
|
|
124
|
+
# `--under` keeps the working lane's own two subtrees when the developer works on one
|
|
125
|
+
# lane of two; both are empty otherwise, and the slice's whole file list is kept.
|
|
101
126
|
# This replaces the retired `design-paths` fence scan: the tech-agnostic backend-plan.md
|
|
102
127
|
# carries no ```lang path=… code blocks, so that scan returned nothing and the fixer
|
|
103
128
|
# was told to "fix the source files in context" with an EMPTY context. `source_files`
|
|
@@ -109,7 +134,7 @@ workflow:
|
|
|
109
134
|
on_error: continue
|
|
110
135
|
script: { ref: xref }
|
|
111
136
|
subcommand: concept-paths
|
|
112
|
-
args: ["--feature-dir", "{{feature_dir}}"]
|
|
137
|
+
args: ["--feature-dir", "{{feature_dir}}", "--under", "{{working_root}}", "--under", "{{working_test_path}}"]
|
|
113
138
|
outputs:
|
|
114
139
|
- { name: all_paths, from: "$.paths" }
|
|
115
140
|
- { name: paths_missing, from: "$.missing" }
|
|
@@ -136,7 +161,7 @@ workflow:
|
|
|
136
161
|
on_error: continue
|
|
137
162
|
script: { ref: actions }
|
|
138
163
|
subcommand: build-compile
|
|
139
|
-
args: ["--feature-dir", "{{feature_dir}}"]
|
|
164
|
+
args: ["--feature-dir", "{{feature_dir}}", "--kind", "{{working_kind}}"]
|
|
140
165
|
outputs:
|
|
141
166
|
- { name: build_ok, from: "$.ok" }
|
|
142
167
|
- { name: build_tool, from: "$.tool" }
|
|
@@ -167,6 +192,38 @@ workflow:
|
|
|
167
192
|
on_false: stop
|
|
168
193
|
on_false_message: "Build still failing after 3 fix attempts. Last log: {{build_log}}"
|
|
169
194
|
|
|
195
|
+
# THE API DOCUMENT, published from the code that just compiled — by the developer who
|
|
196
|
+
# works on the service lane, so the frontend developer reads it from the commit instead of
|
|
197
|
+
# starting the service. Advisory: a failed export warns and the build stays green.
|
|
198
|
+
- id: contract_export
|
|
199
|
+
condition: "{{be_working}} == true"
|
|
200
|
+
action: execute_script
|
|
201
|
+
on_error: continue
|
|
202
|
+
script: { ref: actions }
|
|
203
|
+
subcommand: contract-export
|
|
204
|
+
outputs:
|
|
205
|
+
- { name: contract_ok, from: "$.ok" }
|
|
206
|
+
- { name: export_doc, from: "$.doc" }
|
|
207
|
+
- { name: contract_reason, from: "$.reason" }
|
|
208
|
+
- { name: contract_already, from: "$.already_running" }
|
|
209
|
+
- { name: contract_log, from: "$.log_tail" }
|
|
210
|
+
- id: warn_contract_export
|
|
211
|
+
condition: "{{be_working}} == true"
|
|
212
|
+
action: verify_context
|
|
213
|
+
require_true: contract_ok
|
|
214
|
+
on_false: continue
|
|
215
|
+
on_false_message: "API DOCUMENT NOT EXPORTED — {{contract_reason}}. The build is green; only the published document is out of date. The service lane is started with its `contract_run` command and its document fetched from its `contract` URL, both read from .appweaver/stacks.json or else its stack profile — correct them there, start anything the service needs, and re-run build. Service output: {{contract_log}}"
|
|
216
|
+
- id: contract_stale_flag
|
|
217
|
+
condition: "{{contract_already}} == true"
|
|
218
|
+
action: set
|
|
219
|
+
vars: { contract_fresh: "false" }
|
|
220
|
+
- id: warn_contract_stale
|
|
221
|
+
condition: "{{be_working}} == true"
|
|
222
|
+
action: verify_context
|
|
223
|
+
require_true: contract_fresh
|
|
224
|
+
on_false: continue
|
|
225
|
+
on_false_message: "WARNING — the API document was {{contract_reason}}. Stop that service and re-run build to export the code as it is now."
|
|
226
|
+
|
|
170
227
|
# Record what the fix loop touched in the slice's OKF concept. This replaces the retired
|
|
171
228
|
# `design-reconcile` step, which copied on-disk file bodies back into the design doc's
|
|
172
229
|
# path-tagged fences — meaningless now that backend-plan.md describes contracts, not code (and
|
|
@@ -205,4 +262,6 @@ outputs:
|
|
|
205
262
|
# Declared in the concept but absent on disk — index drift worth an operator's eye
|
|
206
263
|
# (a file moved or deleted without re-running the owning slice). Advisory, never gated.
|
|
207
264
|
stale_source_files: "{{paths_missing}}"
|
|
265
|
+
working_lane: "{{working_lane}}" # the lane(s) compiled — .appweaver/lane.json
|
|
266
|
+
api_document: "{{export_doc}}" # the service's API document, exported after the green compile — commit it for the frontend lane
|
|
208
267
|
next: "/appweaver analyze-slice"
|
|
@@ -40,10 +40,11 @@
|
|
|
40
40
|
# drift. What this stage must NOT do is hide that by merging a delta plan: the plan would
|
|
41
41
|
# then agree with the spec without any run of `plan` ever having derived it.
|
|
42
42
|
#
|
|
43
|
-
# ✅ THE DETECTION IS BUILT (2026-09-14). Every master-mode analyze-plan run leaves
|
|
44
|
-
# `.aw-plan-gate
|
|
45
|
-
#
|
|
46
|
-
# lane generates, refusing a
|
|
43
|
+
# ✅ THE DETECTION IS BUILT (2026-09-14). Every master-mode analyze-plan run leaves a receipt
|
|
44
|
+
# per gated lane, `.aw-plan-gate.<lane>.json` — the sha256 of spec.md, the context's
|
|
45
|
+
# domain-model.md and that lane's plan, and that lane's verdict — and `implement` reads it
|
|
46
|
+
# through plan-gate-check before the lane generates, refusing a lane whose plan is no longer
|
|
47
|
+
# the one the gate checked. So after this merge the
|
|
47
48
|
# plans are not merely "visibly behind": the next `implement` on the master path says so and
|
|
48
49
|
# stops, naming `plan main`. A feature with no receipt has never been gated since the receipt
|
|
49
50
|
# existed and is reported, never refused.
|