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.
Files changed (67) hide show
  1. package/assets/.amp/agent.json +22 -0
  2. package/assets/.amp/settings-edit.json +5 -0
  3. package/assets/.amp/settings-read.json +12 -0
  4. package/assets/.appweaver/DESIGN-FORMAT.md +9 -0
  5. package/assets/.appweaver/STACK-PROFILES.md +102 -15
  6. package/assets/.appweaver/orchestrator/modules/delta-plan.orch.yaml +40 -18
  7. package/assets/.appweaver/orchestrator/modules/delta-spec.orch.yaml +56 -4
  8. package/assets/.appweaver/orchestrator/modules/lane-gate.orch.yaml +17 -1
  9. package/assets/.appweaver/orchestrator/rev-templates/ui-design-template.skeleton.md +12 -3
  10. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan-delta.orch.yaml +289 -24
  11. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan.orch.yaml +370 -85
  12. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice-delta.orch.yaml +349 -65
  13. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice.orch.yaml +39 -7
  14. package/assets/.appweaver/orchestrator/workflows/aw-spec-build.orch.yaml +63 -4
  15. package/assets/.appweaver/orchestrator/workflows/aw-spec-finalize-delta.orch.yaml +5 -4
  16. package/assets/.appweaver/orchestrator/workflows/aw-spec-implement.orch.yaml +430 -138
  17. package/assets/.appweaver/orchestrator/workflows/aw-spec-plan.orch.yaml +392 -76
  18. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-lane.orch.yaml +104 -0
  19. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-stack.orch.yaml +20 -3
  20. package/assets/.appweaver/orchestrator/workflows/aw-spec-specify.orch.yaml +26 -3
  21. package/assets/.appweaver/scripts/bash/aw-spec-actions.sh +314 -44
  22. package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +249 -20
  23. package/assets/.appweaver/scripts/powershell/aw-xref.ps1 +17 -2
  24. package/assets/.appweaver/scripts/python/aw-plangate.py +109 -19
  25. package/assets/.appweaver/scripts/python/aw-stack.py +1295 -9
  26. package/assets/.appweaver/templates/delta-design-template.md +7 -5
  27. package/assets/.appweaver/templates/delta-spec-template.md +2 -0
  28. package/assets/.appweaver/templates/design-template.md +17 -0
  29. package/assets/.appweaver/templates/ui-design-template.md +19 -4
  30. package/assets/.augment/agent.json +22 -0
  31. package/assets/.augment/commands/appweaver.md +12 -0
  32. package/assets/.cline/agent.json +22 -0
  33. package/assets/.clinerules/workflows/appweaver.md +7 -0
  34. package/assets/.codex/agent.json +22 -0
  35. package/assets/.continue/agent.json +22 -0
  36. package/assets/.continue/prompts/appweaver.md +13 -0
  37. package/assets/.cursor/agent.json +22 -0
  38. package/assets/.cursor/commands/appweaver.md +7 -0
  39. package/assets/.devin/agent.json +22 -0
  40. package/assets/.devin/workflows/appweaver.md +11 -0
  41. package/assets/.factory/agent.json +22 -0
  42. package/assets/.factory/commands/appweaver.md +12 -0
  43. package/assets/.gemini/agent.json +22 -0
  44. package/assets/.github/prompts/appweaver.prompt.md +13 -0
  45. package/assets/.kilo/agent.json +28 -0
  46. package/assets/.kilo/agents/appweaver-edit.md +12 -0
  47. package/assets/.kilo/agents/appweaver-read.md +12 -0
  48. package/assets/.kilo/commands/appweaver.md +11 -0
  49. package/assets/.kiro/agent.json +22 -0
  50. package/assets/.kiro/skills/appweaver/SKILL.md +12 -0
  51. package/assets/.opencode/agent.json +22 -0
  52. package/assets/.opencode/agents/appweaver-edit.md +12 -0
  53. package/assets/.opencode/agents/appweaver-read.md +13 -0
  54. package/assets/.opencode/commands/appweaver.md +11 -0
  55. package/assets/.roo/agent.json +22 -0
  56. package/assets/.roo/commands/appweaver.md +12 -0
  57. package/dist/commands/init.d.ts.map +1 -1
  58. package/dist/commands/init.js +14 -1
  59. package/dist/commands/init.js.map +1 -1
  60. package/dist/utils/config.d.ts.map +1 -1
  61. package/dist/utils/config.js +14 -0
  62. package/dist/utils/config.js.map +1 -1
  63. package/dist/utils/copy-assets.d.ts +16 -3
  64. package/dist/utils/copy-assets.d.ts.map +1 -1
  65. package/dist/utils/copy-assets.js +29 -14
  66. package/dist/utils/copy-assets.js.map +1 -1
  67. 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.6.0
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). Replaces the retired
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: "{{be_declared}} == true"
571
+ condition: "{{be_working}} == true"
541
572
  action: set
542
573
  vars: { wiring_ok: "false" }
543
574
 
544
575
  - id: wiring_loop
545
- condition: "{{be_declared}} == true"
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 EVERY declared lane's own build command, fix compile errors against the design intent, then record the touched files in the slice's knowledge concept. 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.
37
- version: 1.3.0
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.json` — the sha256 of spec.md, the context's domain-model.md and each lane
45
- # plan it read, and its verdict — and `implement` reads it through plan-gate-check before any
46
- # lane generates, refusing a master run whose plans are no longer the ones the gate checked. So after this merge the
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.