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
|
@@ -1,386 +0,0 @@
|
|
|
1
|
-
# =============================================================================
|
|
2
|
-
# aw-spec-design-ui (orchestrator) — the FRONTEND LANE's Design phase
|
|
3
|
-
#
|
|
4
|
-
# Authors ONE high-level UI design document per feature — specs/<Aggregate>/design.ui.md
|
|
5
|
-
# — the frontend lane's twin of design.md and the MEDIATOR between the spec and the
|
|
6
|
-
# frontend code. Its sections are the experience, not the four clean-architecture
|
|
7
|
-
# layers: navigation & screen structure · client state · component structure ·
|
|
8
|
-
# interaction & flow · contract binding · cross-cutting · traceability, plus the same
|
|
9
|
-
# two deferral ledgers (DA-n / WA-n). `implement-ui` GENERATES the components from it.
|
|
10
|
-
# See .appweaver/DESIGN-FORMAT.md ("Frontend lane variant") +
|
|
11
|
-
# .appweaver/templates/ui-design-template.md.
|
|
12
|
-
#
|
|
13
|
-
# WHY A SEPARATE COMMAND, NOT A UI BRANCH INSIDE `design`. The two lanes are governed
|
|
14
|
-
# by different constitution halves, take their rules from different map headings, and
|
|
15
|
-
# own disjoint source paths. Keying the rule maps on `## /aw-spec-design-ui` gives the
|
|
16
|
-
# lane its own rule set for zero mechanism change; a UI section inside design.md would
|
|
17
|
-
# put the lane's structure under the service lane's rules and hand this phase the whole
|
|
18
|
-
# service design to read.
|
|
19
|
-
#
|
|
20
|
-
# THE LANE BOUNDARY IS §5. This phase reads the WHOLE spec — the experience is stated
|
|
21
|
-
# there, as UX- standards and as the interaction its user stories imply — but only the
|
|
22
|
-
# service's PUBLISHED SURFACE: the spec's IC- ids and, where design.md exists, the API
|
|
23
|
-
# contracts it states. No table, handler or persistence choice crosses that line.
|
|
24
|
-
# design.md is OPTIONAL context for exactly that reason: a UI-only project authors §5
|
|
25
|
-
# from the spec's IC- surface and records a DA-n. (⌛ B-11 replaces the optional
|
|
26
|
-
# design.md with design-contract.md, the projection `design` will emit — the prompt's
|
|
27
|
-
# rule does not change when it does.)
|
|
28
|
-
#
|
|
29
|
-
# UX- LIVES HERE AND ONLY HERE. design.md deliberately excludes the spec's Experience
|
|
30
|
-
# Standards — the service design realises no experience standard — so a UX- that reaches
|
|
31
|
-
# neither design is a dropped requirement. §7 Traceability is where that is caught.
|
|
32
|
-
#
|
|
33
|
-
# TEMPLATE-DRIVEN AUTHORING (greenfield-safe), the same pair `design` uses:
|
|
34
|
-
# • GREENFIELD (default) — the experience template shipped at
|
|
35
|
-
# .appweaver/templates/ui-design-template.md. Sections §0–§9 as above.
|
|
36
|
-
# • BROWNFIELD — when /appweaver onboard has GENERATED the code-derived
|
|
37
|
-
# `ui-design-template` override (reverse-engineered from the repo's own UI source;
|
|
38
|
-
# override_active), a NEW feature added to an existing app is authored with the
|
|
39
|
-
# as-built composition axes instead, so it slots into the lane already there.
|
|
40
|
-
#
|
|
41
|
-
# BOOTSTRAP ONLY. The trigger is design.ui.md's OWN existence, symmetric with how
|
|
42
|
-
# `design` keys off design.md. No design.ui.md ⇒ author the master. One already there
|
|
43
|
-
# ⇒ the change is a DELTA, and ⌛ `delta-design-ui` owns that record — this command
|
|
44
|
-
# stops rather than overwrite a master finalize-delta is the sole writer of.
|
|
45
|
-
#
|
|
46
|
-
# Forward path: select-stack → select-domain → constitution → select-feature →
|
|
47
|
-
# specify → design-ui → ⌛ analyze-design-ui → implement-ui → build
|
|
48
|
-
#
|
|
49
|
-
# Launch: /appweaver design-ui [guidance]
|
|
50
|
-
# Prereq: /appweaver specify (the spec is this phase's only domain input)
|
|
51
|
-
# =============================================================================
|
|
52
|
-
|
|
53
|
-
name: aw-spec-design-ui
|
|
54
|
-
description: "Author the frontend lane's single high-level design.ui.md from the spec — the experience twin of design.md, and the MEDIATOR between spec.md and the code implement-ui generates. Sections are navigation & screen structure, client state, component structure, interaction & flow, contract binding, cross-cutting, traceability and the two deferral ledgers. Technology-agnostic: no framework, router, state library or component library appears; the stack binds at implement-ui. Realises the spec's UX- Experience Standards, which design.md excludes by contract. The service lane enters only at §5 Contract Binding, as its published surface. Authoring is template-driven — the shipped experience template by default, or the code-derived as-built structure when onboard installed it as the ui-design-template override. Bootstrap only: an existing design.ui.md means the change is a delta and routes to delta-design-ui."
|
|
55
|
-
version: 1.0.0
|
|
56
|
-
agent_agnostic: true
|
|
57
|
-
dialect: aw-spec.orchestrator/v1
|
|
58
|
-
|
|
59
|
-
inputs:
|
|
60
|
-
user_input:
|
|
61
|
-
description: Optional design guidance (flow preferences, screen decomposition hints, constraints).
|
|
62
|
-
required: false
|
|
63
|
-
bind: USER_INPUT
|
|
64
|
-
|
|
65
|
-
scripts:
|
|
66
|
-
actions:
|
|
67
|
-
sh: .appweaver/scripts/bash/aw-spec-actions.sh
|
|
68
|
-
ps1: .appweaver/scripts/powershell/aw-spec-actions.ps1
|
|
69
|
-
|
|
70
|
-
# Sticky standards seed = the UNIVERSAL always-on rule only (ai-rules). The lane's
|
|
71
|
-
# FRONTEND rule files are CONFIGURATION, loaded per-command from
|
|
72
|
-
# guardrails/projects/<project>/tech-rule-bindings.md under `## /aw-spec-design-ui` by the
|
|
73
|
-
# tech-select module. Per the rule-partition this phase loads NO domain rule file —
|
|
74
|
-
# the domain reaches it as spec ids, exactly as it reaches design.md. The lane's
|
|
75
|
-
# ratified base arrives via constitution.ui.md (referred to directly, as-is — NOT
|
|
76
|
-
# mapped). (missing files skipped at assembly time)
|
|
77
|
-
standards:
|
|
78
|
-
- { path: .appweaver/ai-rules.md } # kit-resident: the universal operating rules, every flow
|
|
79
|
-
|
|
80
|
-
vars:
|
|
81
|
-
ui_design_mode: "bootstrap_gf" # resolved below → bootstrap_gf | bootstrap_bf
|
|
82
|
-
ui_is_delta: "no" # "yes" ⇒ design.ui.md already exists ⇒ the change is a delta
|
|
83
|
-
version: ""
|
|
84
|
-
|
|
85
|
-
workflow:
|
|
86
|
-
|
|
87
|
-
# 0. FRONTEND rule files → sticky standards (configuration, not hardcoded).
|
|
88
|
-
# No blocking gate: a project that has not mapped the heading soft-continues,
|
|
89
|
-
# because constitution.ui.md still carries the lane's ratified base.
|
|
90
|
-
- id: tech_select
|
|
91
|
-
action: include
|
|
92
|
-
module: .appweaver/orchestrator/modules/tech-select.orch.yaml
|
|
93
|
-
with: { command: aw-spec-design-ui }
|
|
94
|
-
|
|
95
|
-
# 1. The lane must EXIST. This phase writes a document, not code, so it asks the
|
|
96
|
-
# declaration whether there is a frontend lane at all — not the lane-gate module,
|
|
97
|
-
# whose on-disk check would refuse a greenfield project that has declared `web/`
|
|
98
|
-
# but not scaffolded it yet. A UI design is authored before the UI exists; that is
|
|
99
|
-
# the point of designing.
|
|
100
|
-
- id: lane_resolve
|
|
101
|
-
action: execute_script
|
|
102
|
-
on_error: continue # never crash raw on an undeclared lane — the gate below explains it
|
|
103
|
-
script: { ref: actions }
|
|
104
|
-
subcommand: lane-resolve
|
|
105
|
-
outputs:
|
|
106
|
-
- { name: fe_declared, from: "$.frontend_declared" }
|
|
107
|
-
- { name: lane_id, from: "$.frontend_lane_id" }
|
|
108
|
-
- { name: lane_title, from: "$.frontend_title" }
|
|
109
|
-
- { name: lane_language, from: "$.frontend_language" }
|
|
110
|
-
- { name: lane_ecosystem, from: "$.frontend_ecosystem" }
|
|
111
|
-
- { name: lane_root, from: "$.frontend_source_path" }
|
|
112
|
-
|
|
113
|
-
- id: require_lane
|
|
114
|
-
action: verify_context
|
|
115
|
-
require_true: fe_declared
|
|
116
|
-
on_false: stop
|
|
117
|
-
on_false_message: "No frontend lane is declared in .appweaver/stacks.json, so there is no experience to design. Run /appweaver select-stack and declare the UI stack plus its source path, then re-run design-ui. A project that genuinely has no UI designs the service lane alone with /appweaver design."
|
|
118
|
-
|
|
119
|
-
# 2. Resolve the current feature and require its spec — this phase's only domain input.
|
|
120
|
-
- id: feature_paths
|
|
121
|
-
action: execute_script
|
|
122
|
-
on_error: continue # never crash raw on 'no feature set' — the gate below explains it
|
|
123
|
-
script: { ref: actions }
|
|
124
|
-
subcommand: feature-paths
|
|
125
|
-
outputs:
|
|
126
|
-
- { name: feature_dir, from: "$.feature_dir" }
|
|
127
|
-
- { name: spec_file, from: "$.spec_file" }
|
|
128
|
-
- { name: spec_exists, from: "$.spec_exists" }
|
|
129
|
-
- { name: service_design, from: "$.design_file" }
|
|
130
|
-
- { name: ui_design_exists, from: "$.ui_design_exists" }
|
|
131
|
-
|
|
132
|
-
- id: require_feature
|
|
133
|
-
action: verify_context
|
|
134
|
-
require_non_empty: feature_dir
|
|
135
|
-
on_empty: stop
|
|
136
|
-
on_empty_message: "No active feature. Run /appweaver select-feature first (pick or create the aggregate, e.g. Order), then re-run design-ui."
|
|
137
|
-
|
|
138
|
-
- id: verify_spec
|
|
139
|
-
action: verify_context
|
|
140
|
-
require_true: spec_exists
|
|
141
|
-
on_false: stop
|
|
142
|
-
on_false_message: "No spec.md for the current feature. Run /appweaver specify first — the spec is this phase's only domain input, and its Experience Standards (UX-) are what design.ui.md realises."
|
|
143
|
-
|
|
144
|
-
# 2a. BOOTSTRAP ONLY. design.ui.md's own existence is the delta trigger, symmetric
|
|
145
|
-
# with design's design.md trigger. Stop rather than overwrite the master: it is
|
|
146
|
-
# finalize-delta's to write, and ⌛ delta-design-ui owns the change record.
|
|
147
|
-
# The flag is carried as a literal string because the two readers disagree on a
|
|
148
|
-
# JSON boolean: a `condition:` resolves it through json.dumps ("false"), while
|
|
149
|
-
# `require_value` reads the variable raw (str(False) -> "False"). Setting a
|
|
150
|
-
# string under a condition keeps both readings the same one.
|
|
151
|
-
- id: mark_delta
|
|
152
|
-
condition: "{{ui_design_exists}} == true"
|
|
153
|
-
action: set
|
|
154
|
-
vars: { ui_is_delta: "yes" }
|
|
155
|
-
|
|
156
|
-
- id: refuse_delta
|
|
157
|
-
action: verify_context
|
|
158
|
-
require_value: ui_is_delta
|
|
159
|
-
equals: "no"
|
|
160
|
-
on_mismatch: stop
|
|
161
|
-
on_mismatch_message: "design.ui.md already exists for this feature, so a change to it is a DELTA, not a re-bootstrap — the master is finalize-delta's to write. ⌛ /appweaver delta-design-ui, which owns the delta-design.ui.md record, is not built yet. To regenerate the master from scratch instead, delete specs/<Feature>/design.ui.md first."
|
|
162
|
-
|
|
163
|
-
# 3. Read the version so the authored header is stamped consistently with its siblings.
|
|
164
|
-
- id: read_change
|
|
165
|
-
action: execute_script
|
|
166
|
-
on_error: continue
|
|
167
|
-
script: { ref: actions }
|
|
168
|
-
subcommand: version-read
|
|
169
|
-
args: ["--feature-dir", "{{feature_dir}}"]
|
|
170
|
-
outputs:
|
|
171
|
-
- { name: version, from: "$.version" }
|
|
172
|
-
|
|
173
|
-
# 4. Scaffold design.ui.md from the LANE's template pair (--lane ui resolves
|
|
174
|
-
# ui-design-template → design.ui.md, so no caller can write the service template
|
|
175
|
-
# under the UI lane's filename). Idempotent; the delta refusal above already
|
|
176
|
-
# guarantees it is a create.
|
|
177
|
-
- id: ui_design_scaffold
|
|
178
|
-
action: execute_script
|
|
179
|
-
script: { ref: actions }
|
|
180
|
-
subcommand: design-scaffold
|
|
181
|
-
args: ["--feature-dir", "{{feature_dir}}", "--lane", "ui"]
|
|
182
|
-
outputs:
|
|
183
|
-
- { name: ui_design_doc, from: "$.design_doc" }
|
|
184
|
-
- { name: ui_override, from: "$.override_active" } # true ⇒ onboard installed the code-derived template
|
|
185
|
-
|
|
186
|
-
# 4a. Resolve the authoring MODE. Ordered override rather than a branch — the engine
|
|
187
|
-
# has no compound conditions: state the greenfield default, let the code-derived
|
|
188
|
-
# override replace it.
|
|
189
|
-
- id: mode_brownfield
|
|
190
|
-
condition: "{{ui_override}} == true"
|
|
191
|
-
action: set
|
|
192
|
-
vars: { ui_design_mode: "bootstrap_bf" }
|
|
193
|
-
|
|
194
|
-
# 5. Pre-execution hooks.
|
|
195
|
-
- id: resolve_pre_hooks
|
|
196
|
-
action: execute_script
|
|
197
|
-
script: { ref: actions }
|
|
198
|
-
subcommand: resolve-hooks
|
|
199
|
-
args: ["--phase", "before_design_ui"]
|
|
200
|
-
outputs:
|
|
201
|
-
- { name: before_hooks, from: "$.hooks" }
|
|
202
|
-
- id: dispatch_pre_hooks
|
|
203
|
-
action: dispatch_hooks
|
|
204
|
-
hooks_from_variable: before_hooks
|
|
205
|
-
|
|
206
|
-
# ═══════════ GREENFIELD — the shipped experience template (§0–§9) ═══════════
|
|
207
|
-
# build_context REPLACES the per-request envelope; the sticky frontend standards
|
|
208
|
-
# stay prepended. The ENGINE writes ui_design_doc.
|
|
209
|
-
- id: ctx_ui_design
|
|
210
|
-
condition: "{{ui_design_mode}} == bootstrap_gf"
|
|
211
|
-
action: build_context
|
|
212
|
-
context:
|
|
213
|
-
- { path: "{{ui_design_doc}}" } # the copied template = section structure
|
|
214
|
-
- { path: "{{spec_file}}" } # the source of truth (UX/US/FR/CN/DC/IC/SC)
|
|
215
|
-
- { path: .appweaver/DESIGN-FORMAT.md } # the design-doc contract + its frontend lane variant
|
|
216
|
-
- { path: .appweaver/memory/constitution.ui.md, optional: true } # the lane's ratified UX-* base — optional: a lane may be declared before it is ratified
|
|
217
|
-
- { path: "{{service_design}}", optional: true } # §5 ONLY — the service's published surface, never its internals
|
|
218
|
-
- id: gen_ui_design
|
|
219
|
-
condition: "{{ui_design_mode}} == bootstrap_gf"
|
|
220
|
-
action: agent_author
|
|
221
|
-
output_target: { type: file, path: "{{ui_design_doc}}" }
|
|
222
|
-
task: |
|
|
223
|
-
Author the MASTER UI design (the target design.ui.md in context) for this
|
|
224
|
-
feature's EXPERIENCE by filling out the template from the feature spec + the
|
|
225
|
-
loaded frontend standards. This is the frontend lane's MEDIATOR between the spec
|
|
226
|
-
and the components `implement-ui` will generate. Guidance: {{USER_INPUT}}
|
|
227
|
-
Rules:
|
|
228
|
-
- THE SPEC IS THE ONLY DOMAIN INPUT. You have the spec + frontend standards, and
|
|
229
|
-
NO domain rule files. The domain arrives as spec ids only — realise them, and
|
|
230
|
-
invent no domain rule the spec omits (an unavoidable new concept → §8 DA-n).
|
|
231
|
-
- Keep the template's section order and headings: §0 Design Overview, §1
|
|
232
|
-
Navigation & Screen Structure, §2 Client State, §3 Component Structure, §4
|
|
233
|
-
Interaction & Flow, §5 Contract Binding, §6 Cross-Cutting, §7 Traceability,
|
|
234
|
-
§8 Assumptions, §9 Workarounds, Change History.
|
|
235
|
-
- REALISE THE SPEC'S EXPERIENCE CONTENT:
|
|
236
|
-
• Experience Standards (UX-) are THIS document's to realise — design.md
|
|
237
|
-
excludes them by contract, so a UX- with no home here is a DROPPED
|
|
238
|
-
requirement, not a tidy omission. Every UX- gets a §7 row.
|
|
239
|
-
• Experience Scope (actors · channels · device/browser/AT floors) bounds §1
|
|
240
|
-
and §6 — design for the floors the spec names and no more.
|
|
241
|
-
• Each User Story (US-) gets a screen home in §1 and a flow in §4. A US- with
|
|
242
|
-
no screen is a coverage failure.
|
|
243
|
-
• Interaction-state requirements are ordinary FR- ids (the EARS
|
|
244
|
-
unwanted-behaviour form). Each one gets a §4 row.
|
|
245
|
-
- REALISE THE LIFTED CONSTRAINTS, each citing its spec id:
|
|
246
|
-
• CN- → §6 Authorization surface and the §1 access conditions (what is hidden
|
|
247
|
-
vs disabled vs enforced server-side — the client never becomes the authority).
|
|
248
|
-
• DC- → §2 "what must NOT be held" and the §6 data-exposure row: what may not
|
|
249
|
-
reach the client, its logs, its storage or its URLs.
|
|
250
|
-
• IC-/SC- → §5 binding rows and the §6 performance row respectively.
|
|
251
|
-
- §4 INTERACTION & FLOW AND §6 CROSS-CUTTING ARE NEVER OMITTED, however thin the
|
|
252
|
-
feature. Loading, empty, error, permission-denied and in-flight states, plus
|
|
253
|
-
validation timing, focus placement and keyboard reachability, are where most UI
|
|
254
|
-
defects live. A state the UI can reach that the spec does not describe is a SPEC
|
|
255
|
-
gap: log it as a §8 DA-n and say it routes to `specify`; never invent the
|
|
256
|
-
requirement here.
|
|
257
|
-
- §5 IS THE LANE BOUNDARY. Bind against the service's PUBLISHED surface only —
|
|
258
|
-
the spec's IC- ids, and where design.md is in context, the API contracts it
|
|
259
|
-
states. CITE those contracts; do NOT restate, re-derive or contradict them, and
|
|
260
|
-
introduce NO server-side behaviour, persistence assumption or handler detail.
|
|
261
|
-
Anything the experience needs that the surface does not offer is a CONTRACT
|
|
262
|
-
DELTA raised back to the service lane under "Contract deltas needed" — never a
|
|
263
|
-
workaround in the client. Where no service design is in context, bind from the
|
|
264
|
-
spec's IC- surface and record that as a §8 DA-n.
|
|
265
|
-
- CONSTITUTION-MANDATED CROSS-CUTTING (from the loaded UI constitution, NOT the
|
|
266
|
-
spec): a NON-NEGOTIABLE UX principle you must apply that has no per-feature spec
|
|
267
|
-
id. APPLY it, and because it is not spec-derived, LOG it as a §8 DA-n whose
|
|
268
|
-
basis cites the mandating principle ("per constitution.ui.md UX-<n>"); set the
|
|
269
|
-
corresponding §6 row's "Serves" to that DA-n. Do NOT fabricate a spec UX- for
|
|
270
|
-
it, and do NOT leave it uncited.
|
|
271
|
-
- TECHNOLOGY-AGNOSTIC: name no framework, router, state library, component library
|
|
272
|
-
or styling approach. Describe a component by its RESPONSIBILITY, its INPUTS as
|
|
273
|
-
field shapes, the EVENTS it raises and the STATES it can be in; describe routing
|
|
274
|
-
as a conceptual shape. The framework binds at `implement-ui`. Do NOT include
|
|
275
|
-
file placement, naming conventions or test mechanics — those are the UI
|
|
276
|
-
constitution's and `implement-ui`'s, identical for every feature.
|
|
277
|
-
- The header's Lane field is `{{lane_id}}`. That identifier is the ONLY thing you
|
|
278
|
-
are told about the lane: its framework and language are deliberately withheld,
|
|
279
|
-
because a design that knows them starts naming them.
|
|
280
|
-
- STAY IN THE LANE'S SCOPE. This feature's screens only. The app shell, global
|
|
281
|
-
layout and the design system belong to no single feature: cite them under
|
|
282
|
-
"Screens this feature does NOT own" / "Reused from the design system", and do
|
|
283
|
-
not claim or redesign them here.
|
|
284
|
-
- §7 TRACEABILITY IS THE SPINE — fill it completely, both ways: a row for EVERY
|
|
285
|
-
UX-, US-, and for every CN-/DC-/IC-/SC- with an experience obligation, so no
|
|
286
|
-
lifted constraint is silently dropped; and no UI element without a spec reason.
|
|
287
|
-
- Fill the two ledgers: §8 Assumptions (DA-n, to clarify later) and §9 Workarounds
|
|
288
|
-
(WA-n, to clear later). Empty → "None (as of v1.0)".
|
|
289
|
-
- This is v1.0: set the initial Change History row. No component code anywhere.
|
|
290
|
-
|
|
291
|
-
# ═══ BROWNFIELD — code-derived template, NEW feature in an EXISTING app ════
|
|
292
|
-
# Same contract as above (technology-agnostic, spec is the only domain input, full §7
|
|
293
|
-
# and both ledgers), with ONE difference: the STRUCTURE follows the code-derived
|
|
294
|
-
# template's own composition axes and the lane's as-built conventions, so a new
|
|
295
|
-
# feature slots into the app already there instead of introducing a second convention.
|
|
296
|
-
# Runs only when onboard generated the ui-design-template override.
|
|
297
|
-
- id: ctx_ui_design_brownfield
|
|
298
|
-
condition: "{{ui_design_mode}} == bootstrap_bf"
|
|
299
|
-
action: build_context
|
|
300
|
-
context:
|
|
301
|
-
- { path: "{{ui_design_doc}}" } # the scaffolded CODE-DERIVED template = as-built section structure
|
|
302
|
-
- { path: "{{spec_file}}" } # the source of truth (UX/US/FR/CN/DC/IC/SC)
|
|
303
|
-
- { path: .appweaver/DESIGN-FORMAT.md } # the design-doc contract + its frontend lane variant
|
|
304
|
-
- { path: .appweaver/memory/constitution.ui.md, optional: true } # the lane's UX-* base, reversed by onboard from this same UI
|
|
305
|
-
- { path: knowledge/architecture/frontend.md, optional: true } # the as-built UI architecture + the SHARED surface no slice owns
|
|
306
|
-
- { path: "{{service_design}}", optional: true } # §5 ONLY — the service's published surface, never its internals
|
|
307
|
-
- id: gen_ui_design_brownfield
|
|
308
|
-
condition: "{{ui_design_mode}} == bootstrap_bf"
|
|
309
|
-
action: agent_author
|
|
310
|
-
output_target: { type: file, path: "{{ui_design_doc}}" }
|
|
311
|
-
task: |
|
|
312
|
-
Author the MASTER UI design (the target design.ui.md in context — it is this
|
|
313
|
-
project's CODE-DERIVED UI design template) for this NEW feature being added to an
|
|
314
|
-
EXISTING frontend, by filling the template from the feature spec + the loaded
|
|
315
|
-
frontend standards. It is the MEDIATOR between the spec and the components
|
|
316
|
-
`implement-ui` will generate. Guidance: {{USER_INPUT}}
|
|
317
|
-
Rules:
|
|
318
|
-
- THE SPEC IS THE ONLY DOMAIN INPUT. You have the spec + frontend standards + the
|
|
319
|
-
lane's as-built architecture reference, and NO domain rule files. The domain
|
|
320
|
-
arrives as spec ids only; an unavoidable new concept is an Assumption (DA-n).
|
|
321
|
-
- STRUCTURE FOLLOWS THE TEMPLATE AND THE LANE AS-BUILT, not a fixed screen
|
|
322
|
-
taxonomy. Keep the template's own section order and headings, and create one
|
|
323
|
-
component subsection per composition axis THIS feature actually needs, titled
|
|
324
|
-
with the lane's OWN name for it. ALIGN this feature to the app already there —
|
|
325
|
-
read the as-built architecture reference in context and MATCH its screen
|
|
326
|
-
organisation, its state and data-fetching placement and its styling approach, so
|
|
327
|
-
the feature slots in rather than introducing a second convention.
|
|
328
|
-
- KEEP THE NEUTRAL ANCHORS the template pins: the navigation/screen inventory, the
|
|
329
|
-
client-state table, the interaction-and-flow section, the cross-cutting table
|
|
330
|
-
and the traceability spine exist in every UI design, whatever the axes are
|
|
331
|
-
called. INTERACTION & FLOW and CROSS-CUTTING are NEVER omitted, however thin the
|
|
332
|
-
feature — loading, empty, error, permission-denied and in-flight states, focus
|
|
333
|
-
placement and keyboard reachability are where most UI defects live.
|
|
334
|
-
- REALISE THE SPEC'S EXPERIENCE CONTENT: every Experience Standard (UX-) gets a
|
|
335
|
-
traceability row (design.md excludes them by contract, so this is their only
|
|
336
|
-
home), every User Story a screen and a flow, every interaction-state FR- a flow
|
|
337
|
-
row. Realise the lifted constraints citing their ids — CN- as the authorization
|
|
338
|
-
surface and access conditions, DC- as what may not reach the client or its logs,
|
|
339
|
-
storage and URLs, IC- as binding rows, SC- as the performance decision.
|
|
340
|
-
- THE LANE BOUNDARY: bind against the service's PUBLISHED surface only — the
|
|
341
|
-
spec's IC- ids and, where design.md is in context, the API contracts it states.
|
|
342
|
-
Cite them; do not restate, re-derive or contradict them, and introduce no
|
|
343
|
-
server-side behaviour. What the experience needs and the surface lacks is a
|
|
344
|
-
contract delta raised back to the service lane, never a client workaround.
|
|
345
|
-
- CONSTITUTION-MANDATED CROSS-CUTTING with no per-feature spec id: apply it, and
|
|
346
|
-
log it as a DA-n citing the mandating principle ("per constitution.ui.md
|
|
347
|
-
UX-<n>"). Do not fabricate a spec id for it and do not leave it uncited.
|
|
348
|
-
- TECHNOLOGY-AGNOSTIC: name no framework, router, state library, component library
|
|
349
|
-
or styling approach — responsibilities, field shapes, events and states only.
|
|
350
|
-
Naming the lane's as-built CONVENTION is not naming a framework; naming the
|
|
351
|
-
library that implements it is. The framework binds at `implement-ui`.
|
|
352
|
-
- The header's Lane field is `{{lane_id}}`. That identifier is the ONLY thing you
|
|
353
|
-
are told about the lane: its framework and language are deliberately withheld,
|
|
354
|
-
because a design that knows them starts naming them.
|
|
355
|
-
- THE SHARED SURFACE (app shell, global layout, design system) belongs to no
|
|
356
|
-
feature. Cite it; do not copy it in and do not claim it here.
|
|
357
|
-
- Fill the traceability spine completely, both ways, and both ledgers —
|
|
358
|
-
Assumptions (DA-n) and Workarounds (WA-n), "None (as of v1.0)" when empty.
|
|
359
|
-
- This is v1.0: set the initial Change History row. No component code anywhere.
|
|
360
|
-
|
|
361
|
-
# ═══════════ HANDOFF — authoring only; the gate is a SEPARATE stage ════════
|
|
362
|
-
# ⌛ /appweaver analyze-design-ui — the spec↔design.ui.md conformance gate (every
|
|
363
|
-
# UX-/US-/FR- with an experience obligation realised here) — is not built yet.
|
|
364
|
-
# Until it is, review §7 Traceability by hand before generating: it is the only
|
|
365
|
-
# two-way check that a UX- did not fall between the two designs.
|
|
366
|
-
# → /appweaver implement-ui generates the components from this document alone.
|
|
367
|
-
|
|
368
|
-
# 6. Post-execution hooks.
|
|
369
|
-
- id: resolve_post_hooks
|
|
370
|
-
action: execute_script
|
|
371
|
-
script: { ref: actions }
|
|
372
|
-
subcommand: resolve-hooks
|
|
373
|
-
args: ["--phase", "after_design_ui"]
|
|
374
|
-
outputs:
|
|
375
|
-
- { name: after_hooks, from: "$.hooks" }
|
|
376
|
-
- id: dispatch_post_hooks
|
|
377
|
-
action: dispatch_hooks
|
|
378
|
-
hooks_from_variable: after_hooks
|
|
379
|
-
|
|
380
|
-
outputs:
|
|
381
|
-
feature_dir: "{{feature_dir}}"
|
|
382
|
-
ui_design_doc: "{{ui_design_doc}}"
|
|
383
|
-
lane_id: "{{lane_id}}"
|
|
384
|
-
lane_root: "{{lane_root}}"
|
|
385
|
-
version: "{{version}}"
|
|
386
|
-
next: "design.ui.md authored for the {{lane_id}} lane at {{ui_design_doc}}. Review §7 Traceability by hand — ⌛ /appweaver analyze-design-ui (the spec↔design.ui.md gate) is not built yet, and §7 is the only two-way check that a UX- did not fall between design.md and design.ui.md. Then /appweaver implement-ui, which generates the components from this document alone. A later change to it is a delta: ⌛ /appweaver delta-design-ui."
|