aw-spec-cli 0.1.8 → 0.1.9
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 +200 -0
- package/assets/.appweaver/ORCH-DIALECT.md +156 -0
- package/assets/.appweaver/RULE-PARTITION.md +175 -0
- package/assets/.appweaver/STACK-PROFILES.md +461 -0
- package/assets/.appweaver/ai-rules.md +180 -0
- package/assets/.appweaver/domain.json +1 -0
- package/assets/.appweaver/extensions/.registry +19 -0
- package/assets/.appweaver/extensions/agent-context/README.md +57 -0
- package/assets/.appweaver/extensions/agent-context/agent-context-config.yml +4 -0
- package/assets/.appweaver/extensions/agent-context/commands/aw-spec.agent-context.update.md +26 -0
- package/assets/.appweaver/extensions/agent-context/extension.yml +37 -0
- package/assets/.appweaver/extensions/agent-context/scripts/bash/update-agent-context.sh +201 -0
- package/assets/.appweaver/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +237 -0
- package/assets/.appweaver/extensions.yml +16 -0
- package/assets/.appweaver/feature.json +3 -0
- package/assets/.appweaver/init-options.json +9 -0
- package/assets/.appweaver/integration.json +15 -0
- package/assets/.appweaver/integrations/aw-spec.manifest.json +9 -0
- package/assets/.appweaver/interpreter/run-skill.py +1176 -0
- package/assets/.appweaver/memory/constitution.md +50 -0
- package/assets/.appweaver/orchestrator/.smoke-out/smoke.md +6 -0
- package/assets/.appweaver/orchestrator/AGENT-PROFILE.md +94 -0
- package/assets/.appweaver/orchestrator/README.md +300 -0
- package/assets/.appweaver/orchestrator/adapters/claude_agent_sdk.py +74 -0
- package/assets/.appweaver/orchestrator/adapters/google_antigravity.py +74 -0
- package/assets/.appweaver/orchestrator/modules/delta-design.orch.yaml +105 -0
- package/assets/.appweaver/orchestrator/modules/delta-spec.orch.yaml +101 -0
- package/assets/.appweaver/orchestrator/modules/domain-select.orch.yaml +90 -0
- package/assets/.appweaver/orchestrator/modules/lane-gate.orch.yaml +126 -0
- package/assets/.appweaver/orchestrator/modules/tech-select.orch.yaml +123 -0
- package/assets/.appweaver/orchestrator/orchestrator.py +1721 -0
- package/assets/.appweaver/orchestrator/rev-templates/ai-rules.reference.md +40 -0
- package/assets/.appweaver/orchestrator/rev-templates/delta-design-template.skeleton.md +101 -0
- package/assets/.appweaver/orchestrator/rev-templates/design-template.skeleton.md +245 -0
- package/assets/.appweaver/orchestrator/rev-templates/domain-constitution.skeleton.md +63 -0
- package/assets/.appweaver/orchestrator/rev-templates/domain-requirements.skeleton.md +48 -0
- package/assets/.appweaver/orchestrator/rev-templates/domain-rule-bindings.skeleton.md +59 -0
- package/assets/.appweaver/orchestrator/rev-templates/domain-rule-file.skeleton.md +39 -0
- package/assets/.appweaver/orchestrator/rev-templates/frontend-rule-file.skeleton.md +63 -0
- package/assets/.appweaver/orchestrator/rev-templates/tech-rule-bindings.skeleton.md +116 -0
- package/assets/.appweaver/orchestrator/rev-templates/technical-constitution.skeleton.md +106 -0
- package/assets/.appweaver/orchestrator/rev-templates/technical-rule-file.skeleton.md +54 -0
- package/assets/.appweaver/orchestrator/rev-templates/ui-constitution.skeleton.md +125 -0
- package/assets/.appweaver/orchestrator/rev-templates/ui-delta-design-template.skeleton.md +123 -0
- package/assets/.appweaver/orchestrator/rev-templates/ui-design-template.skeleton.md +294 -0
- package/assets/.appweaver/orchestrator/workflows/_smoke.orch.yaml +160 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-add-component.orch.yaml +270 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-adopt.orch.yaml +934 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-delta-design.orch.yaml +251 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-design.orch.yaml +265 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice.orch.yaml +437 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-build.orch.yaml +197 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-characterize.orch.yaml +475 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-close-delta.orch.yaml +181 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-constitution.orch.yaml +727 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-demo.orch.yaml +100 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-dependency-tree.orch.yaml +69 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-deploy.orch.yaml +85 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-design-ui.orch.yaml +386 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-design.orch.yaml +382 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-finalize-delta.orch.yaml +462 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-foundation.orch.yaml +265 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-implement-delta.orch.yaml +253 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-implement-ui.orch.yaml +267 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-implement.orch.yaml +287 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-inventory.orch.yaml +238 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-onboard.orch.yaml +1822 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-parity.orch.yaml +293 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-run.orch.yaml +194 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-domain.orch.yaml +83 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-feature.orch.yaml +128 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-stack.orch.yaml +296 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-specify.orch.yaml +439 -0
- package/assets/.appweaver/scripts/bash/aw-inventory.sh +17 -0
- package/assets/.appweaver/scripts/bash/aw-parity.sh +13 -0
- package/assets/.appweaver/scripts/bash/aw-rev-constitution.sh +13 -0
- package/assets/.appweaver/scripts/bash/aw-spec-actions.sh +2626 -0
- package/assets/.appweaver/scripts/bash/aw-xref.sh +15 -0
- package/assets/.appweaver/scripts/bash/common.sh +533 -0
- package/assets/.appweaver/scripts/powershell/aw-inventory.ps1 +17 -0
- package/assets/.appweaver/scripts/powershell/aw-parity.ps1 +13 -0
- package/assets/.appweaver/scripts/powershell/aw-rev-constitution.ps1 +13 -0
- package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +2232 -0
- package/assets/.appweaver/scripts/powershell/aw-xref.ps1 +15 -0
- package/assets/.appweaver/scripts/python/aw-component-catalog.py +121 -0
- package/assets/.appweaver/scripts/python/aw-inventory.py +1180 -0
- package/assets/.appweaver/scripts/python/aw-parity.py +380 -0
- package/assets/.appweaver/scripts/python/aw-rev-constitution.py +329 -0
- package/assets/.appweaver/scripts/python/aw-stack.py +1251 -0
- package/assets/.appweaver/scripts/python/aw-xref.py +1330 -0
- package/assets/.appweaver/scripts/python/validate_okf.py +352 -0
- package/assets/.appweaver/stack-profiles/angular.json +16 -0
- package/assets/.appweaver/stack-profiles/blazor-wasm.json +17 -0
- package/assets/.appweaver/stack-profiles/dotnet-webapi.json +15 -0
- package/assets/.appweaver/stack-profiles/go-chi.json +14 -0
- package/assets/.appweaver/stack-profiles/java-spring.json +16 -0
- package/assets/.appweaver/stack-profiles/nextjs.json +16 -0
- package/assets/.appweaver/stack-profiles/node-express.json +15 -0
- package/assets/.appweaver/stack-profiles/python-fastapi.json +16 -0
- package/assets/.appweaver/stack-profiles/react-vite.json +17 -0
- package/assets/.appweaver/stack-profiles/sveltekit.json +16 -0
- package/assets/.appweaver/stack-profiles/vue-vite.json +17 -0
- package/assets/.appweaver/stacks.json +3 -0
- package/assets/.appweaver/templates/constitution-domain-template.md +116 -0
- package/assets/.appweaver/templates/constitution-technical-template.md +108 -0
- package/assets/.appweaver/templates/constitution-ui-template.md +116 -0
- package/assets/.appweaver/templates/delta-design-template.md +69 -0
- package/assets/.appweaver/templates/delta-spec-template.md +63 -0
- package/assets/.appweaver/templates/design-template.md +383 -0
- package/assets/.appweaver/templates/okf-concept-template.md +114 -0
- package/assets/.appweaver/templates/parity-manifest-template.json +49 -0
- package/assets/.appweaver/templates/source-map-template.md +85 -0
- package/assets/.appweaver/templates/spec-template.md +309 -0
- package/assets/.appweaver/templates/ui-design-template.md +273 -0
- package/assets/foundations/dotnet/ModularMonolith/ModularMonolith.Reference.pack.txt +25248 -0
- package/assets/foundations/dotnet/ModularMonolith/ModularMonolith.pack.txt +5726 -0
- package/assets/foundations/dotnet/ModularMonolith/pack-foundation.ps1 +145 -0
- package/assets/foundations/dotnet/ModularMonolith/pack-foundation.sh +196 -0
- package/assets/foundations/dotnet/ModularMonolith/pack-reference-foundation.ps1 +157 -0
- package/assets/foundations/dotnet/ModularMonolith/pack-reference-foundation.sh +209 -0
- package/assets/foundations/dotnet/ModularMonolith/unpack-foundation.ps1 +126 -0
- package/assets/foundations/dotnet/ModularMonolith/unpack-foundation.sh +217 -0
- package/assets/foundations/dotnet/ModularMonolith/unpack-reference-foundation.ps1 +129 -0
- package/assets/foundations/dotnet/ModularMonolith/unpack-reference-foundation.sh +218 -0
- package/assets/foundations/dotnet/VerticalSlice/VerticalSlice.Reference.pack.txt +19318 -0
- package/assets/foundations/dotnet/VerticalSlice/VerticalSlice.pack.txt +2833 -0
- package/assets/foundations/dotnet/VerticalSlice/pack-foundation.ps1 +145 -0
- package/assets/foundations/dotnet/VerticalSlice/pack-foundation.sh +196 -0
- package/assets/foundations/dotnet/VerticalSlice/pack-reference-foundation.ps1 +157 -0
- package/assets/foundations/dotnet/VerticalSlice/pack-reference-foundation.sh +209 -0
- package/assets/foundations/dotnet/VerticalSlice/unpack-foundation.ps1 +126 -0
- package/assets/foundations/dotnet/VerticalSlice/unpack-foundation.sh +217 -0
- package/assets/foundations/dotnet/VerticalSlice/unpack-reference-foundation.ps1 +129 -0
- package/assets/foundations/dotnet/VerticalSlice/unpack-reference-foundation.sh +218 -0
- package/assets/foundations/dotnet/components/Email/README.md +119 -0
- package/assets/foundations/dotnet/components/Email/ReferenceEndpoints/SendEmailEndpoint.cs +84 -0
- package/assets/foundations/dotnet/components/Email/integration.md +300 -0
- package/assets/foundations/dotnet/components/Jobs/README.md +113 -0
- package/assets/foundations/dotnet/components/Jobs/integration.md +259 -0
- package/assets/foundations/dotnet/components/QrGenerator/README.md +85 -0
- package/assets/foundations/dotnet/components/QrGenerator/ReferenceEndpoints/GenerateQrEndpoint.cs +57 -0
- package/assets/foundations/dotnet/components/QrGenerator/integration.md +230 -0
- package/assets/foundations/dotnet/components/README.md +74 -0
- package/assets/guardrails/README.md +222 -0
- package/assets/guardrails/domain/healthcare/ai-rules.domain.md +34 -0
- package/assets/guardrails/domain/healthcare/api-versioning.domain.md +17 -0
- package/assets/guardrails/domain/healthcare/auditing.domain.md +97 -0
- package/assets/guardrails/domain/healthcare/authorization.domain.md +26 -0
- package/assets/guardrails/domain/healthcare/clinical-terms.md +20 -0
- package/assets/guardrails/domain/healthcare/coding-standards.domain.md +26 -0
- package/assets/guardrails/domain/healthcare/consent.md +19 -0
- package/assets/guardrails/domain/healthcare/cqrs.domain.md +12 -0
- package/assets/guardrails/domain/healthcare/data-classification.domain.md +28 -0
- package/assets/guardrails/domain/healthcare/dependency-policy.domain.md +11 -0
- package/assets/guardrails/domain/healthcare/dicom.md +15 -0
- package/assets/guardrails/domain/healthcare/domain-constitution.md +119 -0
- package/assets/guardrails/domain/healthcare/domain-driven-design.domain.md +28 -0
- package/assets/guardrails/domain/healthcare/eventing.domain.md +18 -0
- package/assets/guardrails/domain/healthcare/fhir.md +36 -0
- package/assets/guardrails/domain/healthcare/folder-structure.domain.md +25 -0
- package/assets/guardrails/domain/healthcare/hipaa.md +34 -0
- package/assets/guardrails/domain/healthcare/hl7.md +15 -0
- package/assets/guardrails/domain/healthcare/ihe-conformance.md +31 -0
- package/assets/guardrails/domain/healthcare/integration-terms.md +21 -0
- package/assets/guardrails/domain/healthcare/persistence.domain.md +20 -0
- package/assets/guardrails/domain/healthcare/terminology.md +30 -0
- package/assets/guardrails/domain/healthcare/testing.domain.md +15 -0
- package/assets/guardrails/domain/healthcare/ux/accessibility-standards.md +36 -0
- package/assets/guardrails/domain/healthcare/ux/content-design.md +32 -0
- package/assets/guardrails/domain/healthcare/ux/interaction-states.md +44 -0
- package/assets/guardrails/domain/healthcare/ux/journey-mapping.md +40 -0
- package/assets/guardrails/domain/healthcare/vertical-slices.domain.md +18 -0
- package/assets/guardrails/domain/healthcare/zero-trust.domain.md +12 -0
- package/assets/guardrails/domain/pharma/ai-rules.domain.md +32 -0
- package/assets/guardrails/domain/pharma/api-versioning.domain.md +20 -0
- package/assets/guardrails/domain/pharma/atc.md +22 -0
- package/assets/guardrails/domain/pharma/auditing.domain.md +90 -0
- package/assets/guardrails/domain/pharma/authorization.domain.md +25 -0
- package/assets/guardrails/domain/pharma/coding-standards.domain.md +28 -0
- package/assets/guardrails/domain/pharma/cqrs.domain.md +16 -0
- package/assets/guardrails/domain/pharma/data-classification.domain.md +24 -0
- package/assets/guardrails/domain/pharma/data-provenance.md +21 -0
- package/assets/guardrails/domain/pharma/dependency-policy.domain.md +11 -0
- package/assets/guardrails/domain/pharma/domain-constitution.md +113 -0
- package/assets/guardrails/domain/pharma/domain-driven-design.domain.md +36 -0
- package/assets/guardrails/domain/pharma/domain-requirements.sample.md +103 -0
- package/assets/guardrails/domain/pharma/eventing.domain.md +18 -0
- package/assets/guardrails/domain/pharma/fhir.md +31 -0
- package/assets/guardrails/domain/pharma/folder-structure.domain.md +26 -0
- package/assets/guardrails/domain/pharma/hl7.md +17 -0
- package/assets/guardrails/domain/pharma/idmp.md +26 -0
- package/assets/guardrails/domain/pharma/integration-terms.md +21 -0
- package/assets/guardrails/domain/pharma/ndc.md +28 -0
- package/assets/guardrails/domain/pharma/persistence.domain.md +23 -0
- package/assets/guardrails/domain/pharma/pharma-terms.md +27 -0
- package/assets/guardrails/domain/pharma/product-lifecycle.domain.md +30 -0
- package/assets/guardrails/domain/pharma/regulatory-compliance.md +19 -0
- package/assets/guardrails/domain/pharma/terminology.md +32 -0
- package/assets/guardrails/domain/pharma/testing.domain.md +19 -0
- package/assets/guardrails/domain/pharma/vertical-slices.domain.md +17 -0
- package/assets/guardrails/domain/pharma/zero-trust.domain.md +12 -0
- package/assets/guardrails/projects/dotnet-default-project/domain/domain-requirements.md +58 -0
- package/assets/guardrails/projects/dotnet-default-project/domain-rule-bindings.md +113 -0
- package/assets/guardrails/projects/dotnet-default-project/frontend/ui-requirements.md +43 -0
- package/assets/guardrails/projects/dotnet-default-project/service/technical-requirements.md +40 -0
- package/assets/guardrails/projects/dotnet-default-project/tech-rule-bindings.md +263 -0
- package/assets/guardrails/requirement-spec.txt +27 -0
- package/assets/guardrails/technology/dotnet-webapi/PACKAGING.md +184 -0
- package/assets/guardrails/technology/dotnet-webapi/api-versioning.md +44 -0
- package/assets/guardrails/technology/dotnet-webapi/auditing.md +96 -0
- package/assets/guardrails/technology/dotnet-webapi/authorization-matrix.md +14 -0
- package/assets/guardrails/technology/dotnet-webapi/authorization.md +39 -0
- package/assets/guardrails/technology/dotnet-webapi/clean-architecture.md +54 -0
- package/assets/guardrails/technology/dotnet-webapi/coding-standards.md +87 -0
- package/assets/guardrails/technology/dotnet-webapi/cqrs.md +63 -0
- package/assets/guardrails/technology/dotnet-webapi/data-classification.md +38 -0
- package/assets/guardrails/technology/dotnet-webapi/dependency-policy.md +40 -0
- package/assets/guardrails/technology/dotnet-webapi/domain-driven-design.md +91 -0
- package/assets/guardrails/technology/dotnet-webapi/eventing.md +57 -0
- package/assets/guardrails/technology/dotnet-webapi/examples/api-versioning.md +75 -0
- package/assets/guardrails/technology/dotnet-webapi/examples/auditing.md +84 -0
- package/assets/guardrails/technology/dotnet-webapi/examples/authorization.md +68 -0
- package/assets/guardrails/technology/dotnet-webapi/examples/clean-architecture.md +37 -0
- package/assets/guardrails/technology/dotnet-webapi/examples/cqrs.md +97 -0
- package/assets/guardrails/technology/dotnet-webapi/examples/domain-driven-design.md +141 -0
- package/assets/guardrails/technology/dotnet-webapi/examples/eventing.md +46 -0
- package/assets/guardrails/technology/dotnet-webapi/examples/persistence.md +207 -0
- package/assets/guardrails/technology/dotnet-webapi/examples/vertical-slices.md +151 -0
- package/assets/guardrails/technology/dotnet-webapi/examples/zero-trust.md +48 -0
- package/assets/guardrails/technology/dotnet-webapi/folder-structure.md +61 -0
- package/assets/guardrails/technology/dotnet-webapi/modular-monolith.md +47 -0
- package/assets/guardrails/technology/dotnet-webapi/persistence.md +82 -0
- package/assets/guardrails/technology/dotnet-webapi/technology-constitution.md +162 -0
- package/assets/guardrails/technology/dotnet-webapi/testing.md +55 -0
- package/assets/guardrails/technology/dotnet-webapi/vertical-slices.md +70 -0
- package/assets/guardrails/technology/dotnet-webapi/zero-trust.md +48 -0
- package/assets/guardrails/technology/java-spring/README.md +62 -0
- package/assets/guardrails/technology/nextjs/accessibility-implementation.md +56 -0
- package/assets/guardrails/technology/nextjs/api-client.md +56 -0
- package/assets/guardrails/technology/nextjs/api-integration.dotnet-webapi.md +174 -0
- package/assets/guardrails/technology/nextjs/api-integration.java-spring.md +203 -0
- package/assets/guardrails/technology/nextjs/auth-session.md +68 -0
- package/assets/guardrails/technology/nextjs/client-security.md +69 -0
- package/assets/guardrails/technology/nextjs/component-architecture.md +60 -0
- package/assets/guardrails/technology/nextjs/component-conventions.md +58 -0
- package/assets/guardrails/technology/nextjs/design-system.md +60 -0
- package/assets/guardrails/technology/nextjs/error-handling.md +72 -0
- package/assets/guardrails/technology/nextjs/forms-and-validation.md +75 -0
- package/assets/guardrails/technology/nextjs/frontend-testing.md +94 -0
- package/assets/guardrails/technology/nextjs/i18n.md +57 -0
- package/assets/guardrails/technology/nextjs/observability.md +67 -0
- package/assets/guardrails/technology/nextjs/performance-budgets.md +66 -0
- package/assets/guardrails/technology/nextjs/routing-navigation.md +52 -0
- package/assets/guardrails/technology/nextjs/state-management.md +70 -0
- package/assets/guardrails/technology/nextjs/ui-constitution.md +166 -0
- package/package.json +1 -1
- package/assets/docs/pharma-constitution.my-ref.md +0 -86
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# aw-spec-foundation (orchestrator) — scaffold a project from a foundation bundle
|
|
3
|
+
#
|
|
4
|
+
# Almost entirely deterministic script orchestration (unpack the verified
|
|
5
|
+
# byte-for-byte bundle, rename the sentinel); the model is used ONLY for the
|
|
6
|
+
# optional DbContext merge when the reference sample is included. That merge
|
|
7
|
+
# is an `agent_author` (decl `llm_generate` port): generation is READ-ONLY
|
|
8
|
+
# under every strategy and the ENGINE writes the merged file, so sdk-apply
|
|
9
|
+
# degrades to sdk. No standards/domain/hooks — pure scaffolding, so the merge
|
|
10
|
+
# runs with include_standards: false and a narrow two-file context.
|
|
11
|
+
#
|
|
12
|
+
# Interactive confirmations (proceed / overwrite / reference sample) ride the
|
|
13
|
+
# checkpoint channel under EVERY strategy.
|
|
14
|
+
#
|
|
15
|
+
# Launch via the parametric skill: /appweaver foundation [strategy]
|
|
16
|
+
# Interactive (no args): LISTS the available foundations to pick from, then ASKS
|
|
17
|
+
# for the app (project) name — both deterministic, no LLM. Fast path still works:
|
|
18
|
+
# /appweaver foundation agent VerticalSlice AppWeaver.Health
|
|
19
|
+
#
|
|
20
|
+
# Headless:
|
|
21
|
+
# python3 .appweaver/orchestrator/orchestrator.py \
|
|
22
|
+
# .appweaver/orchestrator/workflows/aw-spec-foundation.orch.yaml \
|
|
23
|
+
# --checkpoint .appweaver/orchestrator/.state/foundation.state.json \
|
|
24
|
+
# --input "VerticalSlice AppWeaver.Health" --json
|
|
25
|
+
# =============================================================================
|
|
26
|
+
|
|
27
|
+
name: aw-spec-foundation
|
|
28
|
+
description: Scaffold a complete, compiling project — pick from the available foundation bundles and enter the app name, then unpack the verified bundle and rename its sentinel to your app name. Selection is zero-LLM (list + pick + ask).
|
|
29
|
+
version: 1.1.0
|
|
30
|
+
agent_agnostic: true
|
|
31
|
+
dialect: aw-spec.orchestrator/v1
|
|
32
|
+
|
|
33
|
+
inputs:
|
|
34
|
+
user_input:
|
|
35
|
+
description: "Optional fast path: FoundationName [AppName] [OutputDirectory]. Omit to pick a foundation from the list and be asked for the app name."
|
|
36
|
+
required: false
|
|
37
|
+
bind: USER_INPUT
|
|
38
|
+
|
|
39
|
+
scripts:
|
|
40
|
+
actions:
|
|
41
|
+
sh: .appweaver/scripts/bash/aw-spec-actions.sh
|
|
42
|
+
ps1: .appweaver/scripts/powershell/aw-spec-actions.ps1
|
|
43
|
+
|
|
44
|
+
standards:
|
|
45
|
+
- { path: .appweaver/ai-rules.md } # kit-resident: the universal operating rules, every flow
|
|
46
|
+
|
|
47
|
+
vars:
|
|
48
|
+
overwrite: "no" # flipped by ask_overwrite only when the dry run finds collisions
|
|
49
|
+
ref_written: "0" # stays 0 when the reference sample is declined
|
|
50
|
+
stash_found: "false" # true only when the reference flow stashed a DbContext
|
|
51
|
+
app: "" # resolved app name: fast-path 2nd token, else the ask below
|
|
52
|
+
app_typed: "" # app name entered interactively (empty on the fast path)
|
|
53
|
+
|
|
54
|
+
workflow:
|
|
55
|
+
|
|
56
|
+
# 1a. LIST the available foundations (deterministic foundations/<ecosystem>/<Name>/<Name>.pack.txt
|
|
57
|
+
# scan — no LLM), narrowed to the ecosystems the declared lanes belong to. A
|
|
58
|
+
# bundle is a whole compiling project in one ecosystem's build system, so the
|
|
59
|
+
# list a Spring repo is shown and the list a .NET repo is shown are different
|
|
60
|
+
# lists; `all_foundations` keeps the unfiltered set for the gate message below.
|
|
61
|
+
# A direct "Foundation App [out]" argument is parsed here too as an optional
|
|
62
|
+
# fast path (preselect_name / preselect_app / out_dir).
|
|
63
|
+
- id: list_foundations
|
|
64
|
+
action: execute_script
|
|
65
|
+
script: { ref: actions }
|
|
66
|
+
subcommand: foundation-list
|
|
67
|
+
args: ["--args", "{{USER_INPUT}}"]
|
|
68
|
+
outputs:
|
|
69
|
+
- { name: foundations, from: "$.foundations" }
|
|
70
|
+
- { name: foundation_count, from: "$.count" }
|
|
71
|
+
- { name: all_foundations, from: "$.all_foundations" }
|
|
72
|
+
- { name: lane_ecosystems, from: "$.lane_ecosystems" }
|
|
73
|
+
- { name: preselect_name, from: "$.preselect_name" }
|
|
74
|
+
- { name: preselect_app, from: "$.preselect_app" }
|
|
75
|
+
- { name: out_dir, from: "$.out_dir" }
|
|
76
|
+
|
|
77
|
+
- id: have_foundations
|
|
78
|
+
action: verify_context
|
|
79
|
+
require_non_empty: foundations
|
|
80
|
+
on_empty: stop
|
|
81
|
+
on_empty_message: >
|
|
82
|
+
No foundation bundle is available for this repository. Bundles present:
|
|
83
|
+
{{all_foundations}}; the ecosystem(s) this repository declares in
|
|
84
|
+
.appweaver/stacks.json: {{lane_ecosystems}}. A foundation is a complete project in
|
|
85
|
+
one ecosystem's languages and build system, so one from another ecosystem is not a
|
|
86
|
+
scaffold for this repo — it is a second, foreign project beside it. Either add a
|
|
87
|
+
bundle under foundations/<ecosystem>/<Name>/<Name>.pack.txt for your stack (see the
|
|
88
|
+
pack scripts in that directory), or scaffold with the stack's own tooling (Spring
|
|
89
|
+
Initializr, `npm create`, `cargo new`, …) and declare the result with
|
|
90
|
+
/appweaver select-stack — implement generates INTO a project tree and does not
|
|
91
|
+
require that the kit be the thing that created it.
|
|
92
|
+
|
|
93
|
+
# 1b. PICK the foundation. A matching fast-path arg auto-selects; a lone
|
|
94
|
+
# foundation auto-confirms; otherwise the user chooses from the list.
|
|
95
|
+
- id: pick_foundation
|
|
96
|
+
action: user_select
|
|
97
|
+
prompt: "Select a foundation to scaffold from:"
|
|
98
|
+
options_from_variable: foundations
|
|
99
|
+
preselect_from: preselect_name
|
|
100
|
+
single_option_confirm: true
|
|
101
|
+
outputs:
|
|
102
|
+
- { name: fname, from: selection }
|
|
103
|
+
|
|
104
|
+
# 1c. ASK for the app (project) name — deterministic free-text, no LLM. Skipped
|
|
105
|
+
# when the fast-path arg already supplied it (preselect_app non-empty).
|
|
106
|
+
- id: ask_app
|
|
107
|
+
action: ask
|
|
108
|
+
condition: "{{preselect_app}} == "
|
|
109
|
+
prompt: >
|
|
110
|
+
Enter the project (application) name — it replaces the foundation's sentinel
|
|
111
|
+
across the generated tree (dotted / underscored / hyphen / lower forms),
|
|
112
|
+
e.g. AppWeaver.Health:
|
|
113
|
+
answer_var: app_typed
|
|
114
|
+
|
|
115
|
+
# 1d. Coalesce the app name (engine has no compound conditions → two ordered
|
|
116
|
+
# sets): default to the typed answer, then override with the fast-path token.
|
|
117
|
+
- id: app_from_typed
|
|
118
|
+
action: set
|
|
119
|
+
vars: { app: "{{app_typed}}" }
|
|
120
|
+
- id: app_from_arg
|
|
121
|
+
action: set
|
|
122
|
+
condition: "{{preselect_app}} != "
|
|
123
|
+
vars: { app: "{{preselect_app}}" }
|
|
124
|
+
|
|
125
|
+
# 1e. Locate the bundle/unpacker for the CHOSEN foundation + read the (bounded)
|
|
126
|
+
# pack header (sentinel + file_count shown in the confirm below).
|
|
127
|
+
- id: locate
|
|
128
|
+
action: execute_script
|
|
129
|
+
script: { ref: actions }
|
|
130
|
+
subcommand: foundation-locate
|
|
131
|
+
args: ["--name", "{{fname}}", "--app", "{{app}}", "--out", "{{out_dir}}"]
|
|
132
|
+
outputs:
|
|
133
|
+
- { name: locate_ok, from: "$.ok" }
|
|
134
|
+
- { name: locate_msg, from: "$.reason" }
|
|
135
|
+
- { name: available, from: "$.available" }
|
|
136
|
+
- { name: fname, from: "$.name" }
|
|
137
|
+
- { name: app, from: "$.app" }
|
|
138
|
+
- { name: out_dir, from: "$.out_dir" }
|
|
139
|
+
- { name: sentinel, from: "$.sentinel" }
|
|
140
|
+
- { name: file_count, from: "$.file_count" }
|
|
141
|
+
|
|
142
|
+
- id: locate_gate
|
|
143
|
+
action: verify_context
|
|
144
|
+
require_true: locate_ok
|
|
145
|
+
on_false: stop
|
|
146
|
+
on_false_message: "{{locate_msg}} (available foundations: {{available}})"
|
|
147
|
+
|
|
148
|
+
# 2. Confirm the scaffold plan (checkpoint kind 'ask' under every strategy).
|
|
149
|
+
- id: confirm
|
|
150
|
+
action: ask
|
|
151
|
+
prompt: |
|
|
152
|
+
Foundation: {{fname}} (sentinel {{sentinel}}, {{file_count}} files)
|
|
153
|
+
App Name: {{app}}
|
|
154
|
+
Output: {{out_dir}}
|
|
155
|
+
Rename {{sentinel}} -> {{app}} (dotted/underscored/hyphen/lower forms).
|
|
156
|
+
Unchanged: 'Projects' sample domain + AppWeaver.* framework packages. Proceed?
|
|
157
|
+
options: ["yes", "no"]
|
|
158
|
+
answer_var: proceed
|
|
159
|
+
|
|
160
|
+
- id: confirm_gate
|
|
161
|
+
action: verify_context
|
|
162
|
+
require_value: proceed
|
|
163
|
+
equals: "yes"
|
|
164
|
+
on_mismatch: stop
|
|
165
|
+
on_mismatch_message: "Cancelled by user."
|
|
166
|
+
|
|
167
|
+
# 3. Dry-run to surface collisions, then confirm overwrite if needed.
|
|
168
|
+
- id: dry_run
|
|
169
|
+
action: execute_script
|
|
170
|
+
script: { ref: actions }
|
|
171
|
+
subcommand: foundation-unpack
|
|
172
|
+
args: ["--name", "{{fname}}", "--app", "{{app}}", "--out", "{{out_dir}}", "--dry-run"]
|
|
173
|
+
outputs:
|
|
174
|
+
- { name: has_collisions, from: "$.has_collisions" }
|
|
175
|
+
|
|
176
|
+
- id: ask_overwrite
|
|
177
|
+
action: ask
|
|
178
|
+
condition: "{{has_collisions}} == true"
|
|
179
|
+
prompt: "Output files already exist. Overwrite them?"
|
|
180
|
+
options: ["yes", "no"]
|
|
181
|
+
answer_var: overwrite
|
|
182
|
+
|
|
183
|
+
- id: overwrite_gate
|
|
184
|
+
action: verify_context
|
|
185
|
+
condition: "{{has_collisions}} == true"
|
|
186
|
+
require_value: overwrite
|
|
187
|
+
equals: "yes"
|
|
188
|
+
on_mismatch: stop
|
|
189
|
+
on_mismatch_message: "Aborted — output files exist and overwrite was declined."
|
|
190
|
+
|
|
191
|
+
# 4. Unpack for real.
|
|
192
|
+
- id: unpack
|
|
193
|
+
action: execute_script
|
|
194
|
+
script: { ref: actions }
|
|
195
|
+
subcommand: foundation-unpack
|
|
196
|
+
args: ["--name", "{{fname}}", "--app", "{{app}}", "--out", "{{out_dir}}", "--force", "{{overwrite}}"]
|
|
197
|
+
outputs:
|
|
198
|
+
- { name: written, from: "$.written" }
|
|
199
|
+
|
|
200
|
+
# 5. Optional reference sample.
|
|
201
|
+
- id: ask_reference
|
|
202
|
+
action: ask
|
|
203
|
+
prompt: "Include the reference sample project (Projects, Users, Reports slices)?"
|
|
204
|
+
options: ["yes", "no"]
|
|
205
|
+
answer_var: want_reference
|
|
206
|
+
|
|
207
|
+
- id: stash_dbcontext
|
|
208
|
+
action: execute_script
|
|
209
|
+
condition: "{{want_reference}} == yes"
|
|
210
|
+
script: { ref: actions }
|
|
211
|
+
subcommand: foundation-stash-dbcontext
|
|
212
|
+
args: ["--out", "{{out_dir}}"]
|
|
213
|
+
outputs:
|
|
214
|
+
- { name: stash_found, from: "$.found" }
|
|
215
|
+
- { name: db_context, from: "$.dbcontext" }
|
|
216
|
+
- { name: db_backup, from: "$.backup" }
|
|
217
|
+
|
|
218
|
+
- id: reference_unpack
|
|
219
|
+
action: execute_script
|
|
220
|
+
condition: "{{want_reference}} == yes"
|
|
221
|
+
script: { ref: actions }
|
|
222
|
+
subcommand: foundation-unpack
|
|
223
|
+
args: ["--name", "{{fname}}", "--app", "{{app}}", "--out", "{{out_dir}}", "--reference"]
|
|
224
|
+
outputs:
|
|
225
|
+
- { name: ref_written, from: "$.written" }
|
|
226
|
+
|
|
227
|
+
# 6. Merge the foundation DbContext (usings + DbSet<>) back over the reference
|
|
228
|
+
# one. agent_author: read-only generation, the ENGINE writes the target.
|
|
229
|
+
- id: merge_dbcontext
|
|
230
|
+
action: agent_author
|
|
231
|
+
condition: "{{stash_found}} == true"
|
|
232
|
+
context: ["{{db_backup}}", "{{db_context}}"]
|
|
233
|
+
include_standards: false
|
|
234
|
+
task: |
|
|
235
|
+
The target file ({{db_context}}) currently holds the REFERENCE DbContext
|
|
236
|
+
(sample DbSet<> properties, no OnModelCreating). The backup ({{db_backup}})
|
|
237
|
+
holds the FOUNDATION DbContext (full OnModelCreating, no DbSet<>). Produce a
|
|
238
|
+
single merged ApplicationDbContext:
|
|
239
|
+
- Base = the FOUNDATION file (backup).
|
|
240
|
+
- Add any `using` directives from the reference that are missing.
|
|
241
|
+
- Insert every reference `public DbSet<…>` line as a block right after the
|
|
242
|
+
class opening brace (before OnModelCreating), preserving any comment above them.
|
|
243
|
+
- Keep everything else in the foundation file unchanged.
|
|
244
|
+
output_target: { type: file, path: "{{db_context}}" }
|
|
245
|
+
|
|
246
|
+
# 7. Verify (sentinel residue must be zero in the generated tree).
|
|
247
|
+
- id: verify
|
|
248
|
+
action: execute_script
|
|
249
|
+
script: { ref: actions }
|
|
250
|
+
subcommand: foundation-verify
|
|
251
|
+
args: ["--out", "{{out_dir}}", "--sentinel", "{{sentinel}}"]
|
|
252
|
+
outputs:
|
|
253
|
+
- { name: clean, from: "$.clean" }
|
|
254
|
+
- { name: residue, from: "$.residue" }
|
|
255
|
+
|
|
256
|
+
outputs:
|
|
257
|
+
foundation: "{{fname}}"
|
|
258
|
+
app: "{{app}}"
|
|
259
|
+
output_dir: "{{out_dir}}"
|
|
260
|
+
files_written: "{{written}}"
|
|
261
|
+
reference_files: "{{ref_written}}"
|
|
262
|
+
sentinel_clean: "{{clean}}"
|
|
263
|
+
sentinel_residue: "{{residue}}"
|
|
264
|
+
note: "Foundation scaffolded into {{out_dir}} ({{written}} file(s), sentinel renamed to {{app}}). Configure your AppWeaver.* NuGet feed and run the AppHost to confirm the scaffold starts before building on it."
|
|
265
|
+
next: "/appweaver select-feature (pick the feature to build; every stage from specify onward reads that active feature and stops without it. If this workspace has governed projects under guardrails/projects/, run /appweaver select-domain first — it is one-time and optional.)"
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# aw-spec-implement-delta (orchestrator) — generate the DELTA's code from the design
|
|
3
|
+
#
|
|
4
|
+
# The CR analog of implement, SCOPED to the open change. GENERATE / edit exactly the
|
|
5
|
+
# source files + paired tests that delta-design.md marks ADDED or MODIFIED, into the
|
|
6
|
+
# existing project tree, using the master design.md as the base context. The delta
|
|
7
|
+
# design is the authoritative source for WHAT the change is — analyze-delta-design already
|
|
8
|
+
# conformed it to the delta spec. The target STACK is bound from the constitution.
|
|
9
|
+
# implement-delta does NOT touch spec.md / design.md and does NOT close the change —
|
|
10
|
+
# finalize-delta merges the delta into the master docs afterward, and close-delta bumps
|
|
11
|
+
# the version at the very end.
|
|
12
|
+
#
|
|
13
|
+
# specify → design → ⟨review⟩ → analyze-delta-design → implement-delta ← you are here
|
|
14
|
+
# → build → finalize-delta → analyze-slice → close-delta
|
|
15
|
+
#
|
|
16
|
+
# Prereqs: run /appweaver analyze-delta-design first (the delta design is conformed),
|
|
17
|
+
# and the project must already be scaffolded (/appweaver foundation) — implement-delta
|
|
18
|
+
# GENERATES into that tree.
|
|
19
|
+
#
|
|
20
|
+
# Launch: /appweaver implement-delta [strategy] [guidance]
|
|
21
|
+
# =============================================================================
|
|
22
|
+
|
|
23
|
+
name: aw-spec-implement-delta
|
|
24
|
+
description: Generate only the source files + paired tests the open change's delta-design.md marks ADDED/MODIFIED, into the existing project tree, bound to the project's stack. Model-driven, delta-design-scoped; does not touch the master docs or close the change.
|
|
25
|
+
version: 1.0.0
|
|
26
|
+
agent_agnostic: true
|
|
27
|
+
dialect: aw-spec.orchestrator/v1
|
|
28
|
+
|
|
29
|
+
inputs:
|
|
30
|
+
user_input:
|
|
31
|
+
description: Optional implementation guidance (stack hints, focus area).
|
|
32
|
+
required: false
|
|
33
|
+
bind: USER_INPUT
|
|
34
|
+
|
|
35
|
+
scripts:
|
|
36
|
+
actions:
|
|
37
|
+
sh: .appweaver/scripts/bash/aw-spec-actions.sh
|
|
38
|
+
ps1: .appweaver/scripts/powershell/aw-spec-actions.ps1
|
|
39
|
+
xref:
|
|
40
|
+
sh: .appweaver/scripts/bash/aw-xref.sh
|
|
41
|
+
ps1: .appweaver/scripts/powershell/aw-xref.ps1
|
|
42
|
+
|
|
43
|
+
# Sticky standards seed = the UNIVERSAL always-on rule only (ai-rules). Same FRAMEWORK /
|
|
44
|
+
# code-generation set as the forward implement — HOW to build — but no longer hardcoded:
|
|
45
|
+
# it is CONFIGURATION, loaded per-command from guardrails/projects/<project>/tech-rule-bindings.md
|
|
46
|
+
# by the tech-select module (see the tech_select step below). No domain rule files:
|
|
47
|
+
# everything domain reached the delta via delta-spec → delta-design; the tech map lists
|
|
48
|
+
# only technical files. The architecture principles come via constitution.technical.md
|
|
49
|
+
# (referred to directly, as-is — NOT mapped); the structure via design.md. (missing skipped)
|
|
50
|
+
standards:
|
|
51
|
+
- { path: .appweaver/ai-rules.md } # kit-resident: the universal operating rules, every flow
|
|
52
|
+
|
|
53
|
+
workflow:
|
|
54
|
+
|
|
55
|
+
# 0. TECHNICAL rule files → sticky standards (configuration, not hardcoded).
|
|
56
|
+
# tech-select reads guardrails/projects/<project>/tech-rule-bindings.md under
|
|
57
|
+
# "## /aw-spec-implement-delta" and loads that set into the sticky standards the
|
|
58
|
+
# agent_generate step ALWAYS prepends. No domain rule file is loaded here — the tech
|
|
59
|
+
# map lists only technical files (rule-partition intact). No blocking gate: an
|
|
60
|
+
# unconfigured project soft-continues (constitution.technical.md still carries the
|
|
61
|
+
# tech base, referred to directly below).
|
|
62
|
+
- id: tech_select
|
|
63
|
+
action: include
|
|
64
|
+
module: .appweaver/orchestrator/modules/tech-select.orch.yaml
|
|
65
|
+
with: { command: aw-spec-implement-delta }
|
|
66
|
+
|
|
67
|
+
# 1. Resolve the current feature + its master design (the base context).
|
|
68
|
+
- id: feature_paths
|
|
69
|
+
action: execute_script
|
|
70
|
+
on_error: continue # never crash raw on 'no feature set' — the gate below explains it
|
|
71
|
+
script: { ref: actions }
|
|
72
|
+
subcommand: feature-paths
|
|
73
|
+
outputs:
|
|
74
|
+
- { name: feature_dir, from: "$.feature_dir" }
|
|
75
|
+
- { name: design_doc, from: "$.design_file" }
|
|
76
|
+
- { name: design_exists, from: "$.design_exists" }
|
|
77
|
+
|
|
78
|
+
- id: require_feature
|
|
79
|
+
action: verify_context
|
|
80
|
+
require_non_empty: feature_dir
|
|
81
|
+
on_empty: stop
|
|
82
|
+
on_empty_message: "No active feature. Run /appweaver select-feature first (pick or create the aggregate, e.g. Order), then re-run implement-delta."
|
|
83
|
+
|
|
84
|
+
- id: verify_design
|
|
85
|
+
action: verify_context
|
|
86
|
+
require_true: design_exists
|
|
87
|
+
on_false: stop
|
|
88
|
+
on_false_message: "No design.md for the current feature. Run /appweaver design (and, for a change, /appweaver specify + design + analyze-delta-design) first."
|
|
89
|
+
|
|
90
|
+
# 1b. Read the OPEN change (opened by cr). implement-delta needs a change to implement.
|
|
91
|
+
# Require the SERVICE LANE and its source path — implement-delta writes into the
|
|
92
|
+
# subtree the lane owns, exactly as implement does.
|
|
93
|
+
- id: lane_gate
|
|
94
|
+
action: include
|
|
95
|
+
module: .appweaver/orchestrator/modules/lane-gate.orch.yaml
|
|
96
|
+
with: { require: backend, command: "/appweaver implement-delta" }
|
|
97
|
+
|
|
98
|
+
- id: read_change
|
|
99
|
+
action: execute_script
|
|
100
|
+
script: { ref: actions }
|
|
101
|
+
subcommand: version-read
|
|
102
|
+
args: ["--feature-dir", "{{feature_dir}}"]
|
|
103
|
+
outputs:
|
|
104
|
+
- { name: active_change, from: "$.active_change" }
|
|
105
|
+
- { name: has_change, from: "$.has_change" }
|
|
106
|
+
|
|
107
|
+
- id: require_change
|
|
108
|
+
action: verify_context
|
|
109
|
+
require_true: has_change
|
|
110
|
+
on_false: stop
|
|
111
|
+
on_false_message: "No open change on this feature. Run /appweaver specify <change> then /appweaver design, review the delta docs, and /appweaver analyze-delta-design before implement-delta."
|
|
112
|
+
|
|
113
|
+
# 1c. Require the PROJECT — a scaffolded, compiling tree — to be present. implement-delta
|
|
114
|
+
# GENERATES the delta's code INTO it; with no project there is nowhere to place the
|
|
115
|
+
# files. Searches the LANE'S OWN subtree for any ecosystem manifest before falling
|
|
116
|
+
# back to the whole repo, so a stack that ships no foundation bundle passes on the
|
|
117
|
+
# project its team scaffolded.
|
|
118
|
+
- id: detect_foundation
|
|
119
|
+
action: execute_script
|
|
120
|
+
script: { ref: actions }
|
|
121
|
+
subcommand: detect-project
|
|
122
|
+
args: ["--root", "{{lane_source_path}}"]
|
|
123
|
+
outputs:
|
|
124
|
+
- { name: foundation_present, from: "$.scaffolded" }
|
|
125
|
+
- { name: project_markers, from: "$.markers" }
|
|
126
|
+
- { name: project_scope, from: "$.scope" }
|
|
127
|
+
|
|
128
|
+
- id: foundation_gate
|
|
129
|
+
action: verify_context
|
|
130
|
+
require_true: foundation_present
|
|
131
|
+
on_false: stop
|
|
132
|
+
on_false_message: "No project found under the {{lane_id}} lane's source path `{{lane_source_path}}`, nor anywhere else in this repository. implement-delta GENERATES the delta's code into an existing project tree, so one has to be scaffolded first: run /appweaver foundation <FoundationName> <AppName> where a foundation bundle ships for this stack, or create the project with the stack's own tooling under that path. Any ecosystem manifest marks it — .sln/.csproj, pom.xml, build.gradle(.kts), package.json, go.mod, Cargo.toml or pyproject.toml."
|
|
133
|
+
|
|
134
|
+
# 2. Pre-execution hooks.
|
|
135
|
+
- id: resolve_pre_hooks
|
|
136
|
+
action: execute_script
|
|
137
|
+
script: { ref: actions }
|
|
138
|
+
subcommand: resolve-hooks
|
|
139
|
+
args: ["--phase", "before_implement_cr"]
|
|
140
|
+
outputs:
|
|
141
|
+
- { name: before_hooks, from: "$.hooks" }
|
|
142
|
+
- id: dispatch_pre_hooks
|
|
143
|
+
action: dispatch_hooks
|
|
144
|
+
hooks_from_variable: before_hooks
|
|
145
|
+
|
|
146
|
+
# 3. Model-driven generation SCOPED to the delta: delta-design.md → the ADDED/MODIFIED
|
|
147
|
+
# source files + paired tests. The master design.md is the base (unchanged elements
|
|
148
|
+
# the delta depends on); the constitution/stack profile fixes HOW. The delta spec is
|
|
149
|
+
# in context ONLY to cite traceability ids on the paired tests.
|
|
150
|
+
# Context is fed via build_context — agent_generate reads the ENVELOPE, not a
|
|
151
|
+
# step-level context: key (unlike agent_author/agent_query which read both).
|
|
152
|
+
- id: ctx_generate
|
|
153
|
+
action: build_context
|
|
154
|
+
context:
|
|
155
|
+
- { path: "{{feature_dir}}/changes/{{active_change}}/delta-design.md" }
|
|
156
|
+
- { path: "{{feature_dir}}/changes/{{active_change}}/delta-spec.md" }
|
|
157
|
+
- { path: "{{design_doc}}" }
|
|
158
|
+
- { path: .appweaver/memory/constitution.technical.md, optional: true } # technology base ONLY — no domain
|
|
159
|
+
- id: generate
|
|
160
|
+
action: agent_generate
|
|
161
|
+
tools: "Read,Write,Edit"
|
|
162
|
+
permission_mode: acceptEdits
|
|
163
|
+
task: |
|
|
164
|
+
Implement ONLY this change into the existing project tree, STRICTLY from its
|
|
165
|
+
delta-design.md (in context). The delta design is the authoritative source of
|
|
166
|
+
WHAT changed — analyze-delta-design already conformed it to the delta spec. The
|
|
167
|
+
master design.md (in context) is the BASE: the unchanged elements the delta
|
|
168
|
+
depends on; do NOT regenerate them. Guidance: {{USER_INPUT}}
|
|
169
|
+
Rules:
|
|
170
|
+
- SCOPE = THE DELTA ONLY. Realise exactly the elements delta-design.md marks
|
|
171
|
+
ADDED (create the new file) or MODIFIED (edit the existing file in place).
|
|
172
|
+
Touch NOTHING the delta does not list, except the regression re-tests below.
|
|
173
|
+
- THE DELTA DESIGN IS THE ONLY DOMAIN INPUT. You have the delta design + master
|
|
174
|
+
design.md + framework/code standards, and NO domain rule files. Introduce NO
|
|
175
|
+
domain rule, identifier, terminology, or behaviour the delta design does not
|
|
176
|
+
state. If something domain seems missing, STOP and surface it (fix it in cr /
|
|
177
|
+
analyze-delta-design); never invent it from memory.
|
|
178
|
+
- BIND THE STACK: this lane is `{{lane_id}}` — {{lane_title}}, language
|
|
179
|
+
{{lane_language}} ({{lane_ecosystem}}), declared in .appweaver/stacks.json and
|
|
180
|
+
compiled with `{{lane_build}}`, tested with `{{lane_test}}`. Generate in THAT
|
|
181
|
+
language and framework and no other, using its idioms, its project layout and
|
|
182
|
+
its test framework. Take persistence, messaging and the remaining technology
|
|
183
|
+
choices from the constitution's technology base + the loaded standards; the
|
|
184
|
+
design is technology-agnostic, so do not re-decide anything already fixed there.
|
|
185
|
+
If the loaded standards describe a DIFFERENT stack than the one above, the lane
|
|
186
|
+
wins on language and layout — the standards' stack-specific mechanics do not
|
|
187
|
+
apply, so follow their INTENT and STOP to surface the mismatch in your summary.
|
|
188
|
+
- WRITE ONLY UNDER `{{lane_source_path}}` — the source path the `{{lane_id}}`
|
|
189
|
+
lane declares in .appweaver/stacks.json. That subtree is this lane's, and a file
|
|
190
|
+
outside it belongs to another lane or to no lane at all.
|
|
191
|
+
- Follow the project's existing folder/layer convention + the loaded
|
|
192
|
+
coding-standards, dependency-policy and testing standards for HOW to structure,
|
|
193
|
+
name, and place files WITHIN that subtree. Match the surrounding code already
|
|
194
|
+
in the tree.
|
|
195
|
+
- Realise EVERY ADDED/MODIFIED delta element as code: one file per Domain type /
|
|
196
|
+
Application use-case / API endpoint / Infrastructure adapter, placed by layer.
|
|
197
|
+
Preserve the ubiquitous-language names verbatim. Enforce each new/changed
|
|
198
|
+
Domain invariant, handler orchestration, API error contract, the Cross-Cutting
|
|
199
|
+
Concerns realisations (audit / retention / data-exposure — CN-/DC-) and the
|
|
200
|
+
External Integrations table's contracts (IC-) exactly as the delta design states.
|
|
201
|
+
- COMPONENTS: if a delta element depends on a framework component, code against
|
|
202
|
+
its ABSTRACTION / port as the delta design declares — do NOT hand-roll it.
|
|
203
|
+
Installing the component (packages, wiring, config) is /appweaver
|
|
204
|
+
add-component <Component>; if the port isn't present, code to it and note that
|
|
205
|
+
as the prerequisite.
|
|
206
|
+
- Author a paired test for every ADDED/MODIFIED behaviour / use-case / endpoint;
|
|
207
|
+
derive the cases from the delta design's pre/post/invariant contracts and cite
|
|
208
|
+
the delta-spec id (FR / BR / CN / DC / IC / US).
|
|
209
|
+
- REGRESSION: for each element in the delta design's "Regression targets", verify
|
|
210
|
+
(add/adjust a test where needed) that the existing behaviour still holds after
|
|
211
|
+
a shared element changed — but do NOT rewrite that existing behaviour.
|
|
212
|
+
- Where generated code depends on a delta Assumption (DA-n) / Workaround (WA-n),
|
|
213
|
+
mark it with a comment citing that id.
|
|
214
|
+
outputs:
|
|
215
|
+
- { name: files, from: "$.files" }
|
|
216
|
+
|
|
217
|
+
- id: verify_generated
|
|
218
|
+
action: verify_context
|
|
219
|
+
require_non_empty: files
|
|
220
|
+
on_empty: stop
|
|
221
|
+
on_empty_message: "No files generated. Ensure /appweaver design produced a filled delta-design.md (not the empty template) and it passed /appweaver analyze-delta-design, then re-run."
|
|
222
|
+
|
|
223
|
+
# 3b. Refresh THIS slice's OKF concept source_files with the delta's changed files —
|
|
224
|
+
# UNION, never replace (the delta is scoped; {{files}} is only the ADDED/MODIFIED
|
|
225
|
+
# files). The cross-slice EDGES are refreshed later in finalize-delta, AFTER the delta
|
|
226
|
+
# merges into the master design.md (here the master still holds the pre-change deps,
|
|
227
|
+
# so recording edges now would read stale references). Best-effort enrichment.
|
|
228
|
+
- id: xref_concept_merge
|
|
229
|
+
action: execute_script
|
|
230
|
+
on_error: continue
|
|
231
|
+
script: { ref: xref }
|
|
232
|
+
subcommand: concept-upsert
|
|
233
|
+
args: ["--feature-dir", "{{feature_dir}}", "--source-files", "{{files}}", "--merge"]
|
|
234
|
+
outputs:
|
|
235
|
+
- { name: okf_concept, from: "$.concept" }
|
|
236
|
+
|
|
237
|
+
# 4. Post-execution hooks.
|
|
238
|
+
- id: resolve_post_hooks
|
|
239
|
+
action: execute_script
|
|
240
|
+
script: { ref: actions }
|
|
241
|
+
subcommand: resolve-hooks
|
|
242
|
+
args: ["--phase", "after_implement_cr"]
|
|
243
|
+
outputs:
|
|
244
|
+
- { name: after_hooks, from: "$.hooks" }
|
|
245
|
+
- id: dispatch_post_hooks
|
|
246
|
+
action: dispatch_hooks
|
|
247
|
+
hooks_from_variable: after_hooks
|
|
248
|
+
|
|
249
|
+
outputs:
|
|
250
|
+
feature_dir: "{{feature_dir}}"
|
|
251
|
+
cr_id: "{{active_change}}"
|
|
252
|
+
files: "{{files}}"
|
|
253
|
+
next: "/appweaver build → finalize-delta → analyze-slice → close-delta. COMPILE FIRST (build), then finalize-delta runs the downstream fence and merges the delta into spec.md + design.md — but leaves the change OPEN. analyze-slice then verifies the slice against that now-merged master (tests, domain conformance, referrer blast radius) while a red result is still recoverable. close-delta LAST archives the change and bumps the version."
|