aw-spec-cli 0.1.3 ā 0.1.5
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/README.md +291 -0
- package/assets/.agents/agent.json +28 -0
- package/assets/.agents/skills/aw-spec-orch/SKILL.md +56 -0
- package/assets/.agents/skills/aw-spec-orch-demo/SKILL.md +59 -0
- package/assets/.aw-spec/DESIGN-FORMAT.md +151 -0
- package/assets/.aw-spec/ORCH-DIALECT.md +156 -0
- package/assets/.aw-spec/RULE-PARTITION.md +126 -0
- package/assets/.aw-spec/extensions/agent-context/extension.yml +12 -9
- package/assets/.aw-spec/extensions.yml +12 -19
- package/assets/.aw-spec/integrations/aw-spec.manifest.json +1 -9
- package/assets/.aw-spec/interpreter/run-skill.py +1158 -0
- package/assets/.aw-spec/orchestrator/AGENT-PROFILE.md +94 -0
- package/assets/.aw-spec/orchestrator/README.md +300 -0
- package/assets/.aw-spec/orchestrator/adapters/claude_agent_sdk.py +74 -0
- package/assets/.aw-spec/orchestrator/adapters/google_antigravity.py +74 -0
- package/assets/.aw-spec/orchestrator/modules/delta-design.orch.yaml +105 -0
- package/assets/.aw-spec/orchestrator/modules/delta-spec.orch.yaml +79 -0
- package/assets/.aw-spec/orchestrator/modules/domain-select.orch.yaml +81 -0
- package/assets/.aw-spec/orchestrator/modules/tech-select.orch.yaml +75 -0
- package/assets/.aw-spec/orchestrator/orchestrator.py +1721 -0
- package/assets/.aw-spec/orchestrator/rev-templates/ai-rules.reference.md +40 -0
- package/assets/.aw-spec/orchestrator/rev-templates/comandrulemap.skeleton.md +59 -0
- package/assets/.aw-spec/orchestrator/rev-templates/commandtechrulemap.skeleton.md +97 -0
- package/assets/.aw-spec/orchestrator/rev-templates/domain-constitution.skeleton.md +61 -0
- package/assets/.aw-spec/orchestrator/rev-templates/domain-requirements.skeleton.md +48 -0
- package/assets/.aw-spec/orchestrator/rev-templates/domain-rule-file.skeleton.md +39 -0
- package/assets/.aw-spec/orchestrator/rev-templates/technical-constitution.skeleton.md +106 -0
- package/assets/.aw-spec/orchestrator/rev-templates/technical-rule-file.skeleton.md +54 -0
- package/assets/.aw-spec/orchestrator/workflows/_smoke.orch.yaml +160 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-add-component.orch.yaml +244 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-adopt.orch.yaml +775 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-analyze-delta-design.orch.yaml +248 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-analyze-design.orch.yaml +261 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-analyze-slice.orch.yaml +425 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-build.orch.yaml +188 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-characterize.orch.yaml +474 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-close-delta.orch.yaml +181 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-constitution.orch.yaml +284 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-demo.orch.yaml +103 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-dependency-tree.orch.yaml +69 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-deploy.orch.yaml +85 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-design.orch.yaml +382 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-finalize-delta.orch.yaml +382 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-foundation.orch.yaml +246 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-implement-delta.orch.yaml +231 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-implement.orch.yaml +258 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-inventory.orch.yaml +236 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-onboard.orch.yaml +949 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-parity.orch.yaml +293 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-run.orch.yaml +177 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-select-domain.orch.yaml +79 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-select-feature.orch.yaml +128 -0
- package/assets/.aw-spec/orchestrator/workflows/aw-spec-specify.orch.yaml +412 -0
- package/assets/.aw-spec/scripts/bash/aw-inventory.sh +14 -0
- package/assets/.aw-spec/scripts/bash/aw-parity.sh +13 -0
- package/assets/.aw-spec/scripts/bash/aw-rev-constitution.sh +13 -0
- package/assets/.aw-spec/scripts/bash/aw-spec-actions.sh +1899 -0
- package/assets/.aw-spec/scripts/bash/aw-xref.sh +15 -0
- package/assets/.aw-spec/scripts/bash/common.sh +11 -60
- package/assets/.aw-spec/scripts/powershell/aw-inventory.ps1 +14 -0
- package/assets/.aw-spec/scripts/powershell/aw-parity.ps1 +13 -0
- package/assets/.aw-spec/scripts/powershell/aw-rev-constitution.ps1 +13 -0
- package/assets/.aw-spec/scripts/powershell/aw-spec-actions.ps1 +1563 -0
- package/assets/.aw-spec/scripts/powershell/aw-xref.ps1 +15 -0
- package/assets/.aw-spec/scripts/python/aw-inventory.py +683 -0
- package/assets/.aw-spec/scripts/python/aw-parity.py +380 -0
- package/assets/.aw-spec/scripts/python/aw-rev-constitution.py +312 -0
- package/assets/.aw-spec/scripts/python/aw-xref.py +1330 -0
- package/assets/.aw-spec/scripts/python/validate_okf.py +349 -0
- package/assets/.aw-spec/templates/constitution-domain-template.md +75 -0
- package/assets/.aw-spec/templates/constitution-technical-template.md +70 -0
- package/assets/.aw-spec/templates/delta-design-template.md +69 -0
- package/assets/.aw-spec/templates/delta-spec-template.md +60 -0
- package/assets/.aw-spec/templates/design-template.md +383 -0
- package/assets/.aw-spec/templates/okf-concept-template.md +103 -0
- package/assets/.aw-spec/templates/parity-manifest-template.json +49 -0
- package/assets/.aw-spec/templates/source-map-template.md +85 -0
- package/assets/.aw-spec/templates/spec-template.md +192 -71
- package/assets/.claude/agent.json +27 -0
- package/assets/.claude/skills/aw-spec-orch/SKILL.md +55 -0
- package/assets/.claude/skills/aw-spec-orch-demo/SKILL.md +59 -0
- package/assets/.kilocode/agent.json +28 -0
- package/assets/.kilocode/workflows/aw-spec-orch-demo.md +59 -0
- package/assets/.kilocode/workflows/aw-spec-orch.md +55 -0
- package/assets/docs/architecture/clean-architecture.md +1 -1
- package/assets/docs/architecture/cqrs.md +1 -1
- package/assets/docs/architecture/eventing.md +1 -1
- package/assets/docs/architecture/folder-structure.md +1 -1
- package/assets/docs/architecture/modular-monolith.md +1 -1
- package/assets/docs/architecture/persistence.md +1 -1
- package/assets/docs/architecture/testing.md +1 -1
- package/assets/docs/architecture/vertical-slices.md +1 -1
- package/assets/docs/components/Email/README.md +1 -1
- package/assets/docs/components/Jobs/README.md +1 -1
- package/assets/docs/components/QrGenerator/README.md +1 -1
- package/assets/docs/components/README.md +1 -1
- package/assets/docs/domain/domain-driven-design.md +1 -1
- package/assets/docs/domainspecs/healthcare/api-versioning.domain.md +1 -1
- package/assets/docs/domainspecs/healthcare/auditing.domain.md +86 -18
- package/assets/docs/domainspecs/healthcare/authorization.domain.md +1 -1
- package/assets/docs/domainspecs/healthcare/clinical-terms.md +1 -1
- package/assets/docs/domainspecs/healthcare/coding-standards.domain.md +1 -1
- package/assets/docs/domainspecs/healthcare/comandrulemap.md +58 -124
- package/assets/docs/domainspecs/healthcare/commandtechrulemap.md +119 -0
- package/assets/docs/domainspecs/healthcare/consent.md +1 -1
- package/assets/docs/domainspecs/healthcare/cqrs.domain.md +1 -1
- package/assets/docs/domainspecs/healthcare/data-classification.domain.md +1 -1
- package/assets/docs/domainspecs/healthcare/dependency-policy.domain.md +1 -1
- package/assets/docs/domainspecs/healthcare/dicom.md +1 -1
- package/assets/docs/domainspecs/healthcare/domain-driven-design.domain.md +1 -1
- package/assets/docs/domainspecs/healthcare/eventing.domain.md +1 -1
- package/assets/docs/domainspecs/healthcare/fhir.md +1 -1
- package/assets/docs/domainspecs/healthcare/folder-structure.domain.md +1 -1
- package/assets/docs/domainspecs/healthcare/hipaa.md +1 -1
- package/assets/docs/domainspecs/healthcare/hl7.md +1 -1
- package/assets/docs/domainspecs/healthcare/integration-terms.md +1 -1
- package/assets/docs/domainspecs/healthcare/persistence.domain.md +1 -1
- package/assets/docs/domainspecs/healthcare/terminology.md +1 -1
- package/assets/docs/domainspecs/healthcare/testing.domain.md +1 -1
- package/assets/docs/domainspecs/healthcare/vertical-slices.domain.md +1 -1
- package/assets/docs/domainspecs/healthcare/zero-trust.domain.md +1 -1
- package/assets/docs/domainspecs/pharma/api-versioning.domain.md +1 -1
- package/assets/docs/domainspecs/pharma/atc.md +1 -1
- package/assets/docs/domainspecs/pharma/auditing.domain.md +80 -16
- package/assets/docs/domainspecs/pharma/authorization.domain.md +1 -1
- package/assets/docs/domainspecs/pharma/coding-standards.domain.md +1 -1
- package/assets/docs/domainspecs/pharma/comandrulemap.md +64 -142
- package/assets/docs/domainspecs/pharma/commandtechrulemap.md +119 -0
- package/assets/docs/domainspecs/pharma/cqrs.domain.md +1 -1
- package/assets/docs/domainspecs/pharma/data-classification.domain.md +1 -1
- package/assets/docs/domainspecs/pharma/data-provenance.md +1 -1
- package/assets/docs/domainspecs/pharma/dependency-policy.domain.md +1 -1
- package/assets/docs/domainspecs/pharma/domain-driven-design.domain.md +1 -1
- package/assets/docs/domainspecs/pharma/eventing.domain.md +1 -1
- package/assets/docs/domainspecs/pharma/fhir.md +1 -1
- package/assets/docs/domainspecs/pharma/folder-structure.domain.md +1 -1
- package/assets/docs/domainspecs/pharma/hl7.md +1 -1
- package/assets/docs/domainspecs/pharma/idmp.md +1 -1
- package/assets/docs/domainspecs/pharma/integration-terms.md +1 -1
- package/assets/docs/domainspecs/pharma/ndc.md +1 -1
- package/assets/docs/domainspecs/pharma/persistence.domain.md +1 -1
- package/assets/docs/domainspecs/pharma/pharma-terms.md +1 -1
- package/assets/docs/domainspecs/pharma/product-lifecycle.domain.md +1 -1
- package/assets/docs/domainspecs/pharma/regulatory-compliance.md +1 -1
- package/assets/docs/domainspecs/pharma/terminology.md +1 -1
- package/assets/docs/domainspecs/pharma/testing.domain.md +1 -1
- package/assets/docs/domainspecs/pharma/vertical-slices.domain.md +1 -1
- package/assets/docs/domainspecs/pharma/zero-trust.domain.md +1 -1
- package/assets/docs/governance/api-versioning.md +1 -1
- package/assets/docs/governance/coding-standards.md +1 -1
- package/assets/docs/governance/dependency-policy.md +1 -1
- package/assets/docs/requirement-spec.txt +13 -1
- package/assets/docs/security/auditing.md +54 -11
- package/assets/docs/security/authorization.md +1 -1
- package/assets/docs/security/data-classification.md +1 -1
- package/assets/docs/security/zero-trust.md +1 -1
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +142 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/utils/manifest.d.ts +31 -0
- package/dist/utils/manifest.d.ts.map +1 -0
- package/dist/utils/manifest.js +91 -0
- package/dist/utils/manifest.js.map +1 -0
- package/dist/utils/paths.js +2 -2
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/update-engine.d.ts +52 -0
- package/dist/utils/update-engine.d.ts.map +1 -0
- package/dist/utils/update-engine.js +203 -0
- package/dist/utils/update-engine.js.map +1 -0
- package/package.json +1 -1
- package/assets/.agents/skills/aw-spec-addcomponent/SKILL.md +0 -129
- package/assets/.agents/skills/aw-spec-agent-context-update/SKILL.md +0 -31
- package/assets/.agents/skills/aw-spec-analyze/SKILL.md +0 -296
- package/assets/.agents/skills/aw-spec-checklist/SKILL.md +0 -374
- package/assets/.agents/skills/aw-spec-clarify/SKILL.md +0 -320
- package/assets/.agents/skills/aw-spec-constitution/SKILL.md +0 -194
- package/assets/.agents/skills/aw-spec-fast-implement/SKILL.md +0 -268
- package/assets/.agents/skills/aw-spec-foundation/SKILL.md +0 -358
- package/assets/.agents/skills/aw-spec-implement/SKILL.md +0 -279
- package/assets/.agents/skills/aw-spec-minimal-implementation/SKILL.md +0 -209
- package/assets/.agents/skills/aw-spec-plan/SKILL.md +0 -221
- package/assets/.agents/skills/aw-spec-select-domain/SKILL.md +0 -73
- package/assets/.agents/skills/aw-spec-specify/SKILL.md +0 -382
- package/assets/.agents/skills/aw-spec-tasks/SKILL.md +0 -259
- package/assets/.agents/skills/aw-spec-taskstoissues/SKILL.md +0 -107
- package/assets/.aw-spec/integrations/claude.manifest.json +0 -17
- package/assets/.aw-spec/scripts/bash/check-prerequisites.sh +0 -189
- package/assets/.aw-spec/scripts/bash/create-new-feature.sh +0 -299
- package/assets/.aw-spec/scripts/bash/setup-plan.sh +0 -84
- package/assets/.aw-spec/scripts/bash/setup-tasks.sh +0 -91
- package/assets/.aw-spec/templates/checklist-template.md +0 -40
- package/assets/.aw-spec/templates/constitution-template.md +0 -57
- package/assets/.aw-spec/templates/plan-template.md +0 -113
- package/assets/.aw-spec/templates/tasks-template.md +0 -252
- package/assets/.aw-spec/workflows/aw-spec/workflow.yml +0 -77
- package/assets/.aw-spec/workflows/workflow-registry.json +0 -13
- package/assets/.claude/skills/aw-spec-addcomponent/SKILL.md +0 -129
- package/assets/.claude/skills/aw-spec-agent-context-update/SKILL.md +0 -31
- package/assets/.claude/skills/aw-spec-analyze/SKILL.md +0 -296
- package/assets/.claude/skills/aw-spec-checklist/SKILL.md +0 -374
- package/assets/.claude/skills/aw-spec-clarify/SKILL.md +0 -320
- package/assets/.claude/skills/aw-spec-constitution/SKILL.md +0 -194
- package/assets/.claude/skills/aw-spec-fast-implement/SKILL.md +0 -268
- package/assets/.claude/skills/aw-spec-foundation/SKILL.md +0 -358
- package/assets/.claude/skills/aw-spec-implement/SKILL.md +0 -279
- package/assets/.claude/skills/aw-spec-minimal-implementation/SKILL.md +0 -209
- package/assets/.claude/skills/aw-spec-plan/SKILL.md +0 -221
- package/assets/.claude/skills/aw-spec-select-domain/SKILL.md +0 -73
- package/assets/.claude/skills/aw-spec-specify/SKILL.md +0 -382
- package/assets/.claude/skills/aw-spec-tasks/SKILL.md +0 -259
- package/assets/.claude/skills/aw-spec-taskstoissues/SKILL.md +0 -107
- package/assets/.kilocode/rules/specify-rules.md +0 -4
- package/assets/.kilocode/workflows/aw-spec-addcomponent.md +0 -129
- package/assets/.kilocode/workflows/aw-spec-agent-context.update.md +0 -31
- package/assets/.kilocode/workflows/aw-spec-analyze.md +0 -296
- package/assets/.kilocode/workflows/aw-spec-checklist.md +0 -374
- package/assets/.kilocode/workflows/aw-spec-clarify.md +0 -320
- package/assets/.kilocode/workflows/aw-spec-constitution.md +0 -194
- package/assets/.kilocode/workflows/aw-spec-fast-implement.md +0 -263
- package/assets/.kilocode/workflows/aw-spec-foundation.md +0 -358
- package/assets/.kilocode/workflows/aw-spec-implement.md +0 -279
- package/assets/.kilocode/workflows/aw-spec-minimal-implementation.md +0 -204
- package/assets/.kilocode/workflows/aw-spec-plan.md +0 -221
- package/assets/.kilocode/workflows/aw-spec-select-domain.md +0 -73
- package/assets/.kilocode/workflows/aw-spec-specify.md +0 -382
- package/assets/.kilocode/workflows/aw-spec-tasks.md +0 -259
- package/assets/.kilocode/workflows/aw-spec-taskstoissues.md +0 -107
- package/assets/docs/command.txt +0 -295
- package/assets/docs/pharma-constitution.my-ref.md +0 -86
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Pharma Domain ā Command ā Technical-Rule-File Map
|
|
2
|
+
|
|
3
|
+
Per-command list of the **technical** rule files loaded (via `resolve-tech` + the
|
|
4
|
+
`tech-select` module, into the sticky standards set) for the spec-anchored
|
|
5
|
+
orchestrator pipeline. This is the technical counterpart of `comandrulemap.md`
|
|
6
|
+
(which maps the DOMAIN rule files).
|
|
7
|
+
|
|
8
|
+
**The model:** the technical rule files (the `docs/architecture` Ā· `docs/security` Ā·
|
|
9
|
+
`docs/interop` Ā· `docs/governance` set that used to be HARDCODED in each workflow's
|
|
10
|
+
`standards:` block) are now CONFIGURATION ā tune this map, not the workflows. The
|
|
11
|
+
technology base itself (`constitution.technical.md`) is NOT listed here ā every
|
|
12
|
+
consumer still refers to it directly, as-is.
|
|
13
|
+
|
|
14
|
+
- All paths are workspace-relative technical rule files (domain-agnostic docs/ā¦).
|
|
15
|
+
- `resolve-tech --command <name>` collects the `- ` bullets under `## /<name>`.
|
|
16
|
+
- This file is the **canonical technical mapping** for the pharma domain; it is
|
|
17
|
+
selected whenever pharma is the active domain (`.aw-spec/domain.json`).
|
|
18
|
+
- A command with no heading here loads no mapped technical file (only the workflow's
|
|
19
|
+
universal `ai-rules.md` seed + `constitution.technical.md`, referred to directly).
|
|
20
|
+
- `## /aw-spec-specify` is the one **modelling-methodology** slot (see the rule partition):
|
|
21
|
+
a domain-agnostic way of *modelling*, never a technology choice. Everything below it is a
|
|
22
|
+
HOW-phase technical set.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## /aw-spec-specify
|
|
27
|
+
<!-- MODELLING METHODOLOGY ONLY. Specify is the domain phase: the single technical input it
|
|
28
|
+
may take is a domain-agnostic way of MODELLING (DDD tactical patterns), never a
|
|
29
|
+
technology choice. Do NOT add an architecture / persistence / codegen file here ā that
|
|
30
|
+
would break specify's domain purity (design/implement own those). The domain's own DDD
|
|
31
|
+
overlay (domain-driven-design.domain.md) arrives separately via comandrulemap. -->
|
|
32
|
+
- docs/domain/domain-driven-design.md
|
|
33
|
+
|
|
34
|
+
## /aw-spec-design
|
|
35
|
+
<!-- The technical/architecture rule files the design author works from (alongside the
|
|
36
|
+
spec and constitution.technical.md). NO domain file here ā domain reaches design
|
|
37
|
+
only as spec ids (BR-/CN-/DC-/IC-). -->
|
|
38
|
+
- docs/architecture/clean-architecture.md
|
|
39
|
+
- docs/architecture/cqrs.md
|
|
40
|
+
- docs/architecture/eventing.md
|
|
41
|
+
- docs/architecture/modular-monolith.md
|
|
42
|
+
- docs/architecture/vertical-slices.md
|
|
43
|
+
- docs/architecture/persistence.md
|
|
44
|
+
- docs/architecture/folder-structure.md
|
|
45
|
+
- docs/architecture/testing.md
|
|
46
|
+
- docs/governance/api-versioning.md
|
|
47
|
+
- docs/security/zero-trust.md
|
|
48
|
+
- docs/security/authorization.md
|
|
49
|
+
- docs/security/authorization-matrix.md
|
|
50
|
+
- docs/security/auditing.md
|
|
51
|
+
- docs/security/data-classification.md
|
|
52
|
+
- docs/interop/ihe-conformance.md
|
|
53
|
+
|
|
54
|
+
## /aw-spec-implement
|
|
55
|
+
<!-- The FRAMEWORK / code-generation rule files the code generator builds against
|
|
56
|
+
(alongside design.md and constitution.technical.md). NO domain file ā domain
|
|
57
|
+
reaches implement only through design.md. clean-architecture/cqrs are design
|
|
58
|
+
concerns; component wiring is a separate /aw-spec-orch add-component step. -->
|
|
59
|
+
- docs/governance/coding-standards.md
|
|
60
|
+
- docs/governance/dependency-policy.md
|
|
61
|
+
- docs/architecture/folder-structure.md
|
|
62
|
+
- docs/architecture/testing.md
|
|
63
|
+
- docs/VerticalSlice/PACKAGING.md
|
|
64
|
+
|
|
65
|
+
## /aw-spec-implement-delta
|
|
66
|
+
<!-- The CR analog of implement ā same FRAMEWORK / code-generation set (HOW to build).
|
|
67
|
+
The delta's code is generated against the master design.md + delta-design.md; no
|
|
68
|
+
domain file (domain reached the delta via delta-spec ā delta-design). -->
|
|
69
|
+
- docs/governance/coding-standards.md
|
|
70
|
+
- docs/governance/dependency-policy.md
|
|
71
|
+
- docs/architecture/folder-structure.md
|
|
72
|
+
- docs/architecture/testing.md
|
|
73
|
+
- docs/VerticalSlice/PACKAGING.md
|
|
74
|
+
|
|
75
|
+
## /aw-spec-build
|
|
76
|
+
<!-- The compile/fix reference set: the layering + coding rules the fixer respects when
|
|
77
|
+
repairing compile errors against the design intent. NO domain file (build loads
|
|
78
|
+
domain rules separately via domain-select) and no constitution.technical here. -->
|
|
79
|
+
- docs/architecture/clean-architecture.md
|
|
80
|
+
- docs/governance/coding-standards.md
|
|
81
|
+
|
|
82
|
+
## /aw-spec-analyze-slice
|
|
83
|
+
<!-- The designācode conformance gate's TECHNICAL checklist: the code + tests are
|
|
84
|
+
validated against these (alongside the DOMAIN gate overlays, loaded separately via
|
|
85
|
+
resolve-domain `## /aw-spec-gate`). Validation input only ā never authoring. -->
|
|
86
|
+
- docs/architecture/testing.md
|
|
87
|
+
- docs/governance/coding-standards.md
|
|
88
|
+
|
|
89
|
+
## /aw-spec-constitution
|
|
90
|
+
<!-- The technology-constitution base the TECHNICAL half of the split constitution
|
|
91
|
+
ratifies into constitution.technical.md. Loaded BEFORE the technical half and before
|
|
92
|
+
domain-select, so the technical author stays domain-free (the seam). NO domain file
|
|
93
|
+
here ā the domain half's sources are the domain map's ## /aw-spec-constitution. -->
|
|
94
|
+
- docs/technology-constitution.md
|
|
95
|
+
|
|
96
|
+
## /aw-spec-run
|
|
97
|
+
<!-- Execution / data migration: the persistence rules the migration step generates against.
|
|
98
|
+
NO domain file; run does not reference constitution.technical.md. -->
|
|
99
|
+
- docs/architecture/persistence.md
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Quick reference (command ā technical file count)
|
|
104
|
+
|
|
105
|
+
| Command | Technical rule files | Role |
|
|
106
|
+
|---|---|---|
|
|
107
|
+
| /aw-spec-specify | 1 | the modelling methodology (DDD) the domain model is expressed in ā no technology |
|
|
108
|
+
| /aw-spec-design | 15 | architecture/security/interop the design author mediates the spec against |
|
|
109
|
+
| /aw-spec-implement | 5 | governance/architecture the code generator builds against (from design.md) |
|
|
110
|
+
| /aw-spec-implement-delta | 5 | same code-generation set, scoped to the open change's delta-design |
|
|
111
|
+
| /aw-spec-build | 2 | layering + coding rules the compile-fixer respects |
|
|
112
|
+
| /aw-spec-analyze-slice | 2 | testing + coding rules the designācode gate validates against |
|
|
113
|
+
| /aw-spec-constitution | 1 | the technology-constitution base the technical half ratifies |
|
|
114
|
+
| /aw-spec-run | 1 | persistence rules the execution / data-migration step generates against |
|
|
115
|
+
|
|
116
|
+
> All migrated workflows are on this map. The conformance-gate workflows **analyze-design**
|
|
117
|
+
> and **analyze-delta-design** are intentionally NOT here ā they validate design/delta
|
|
118
|
+
> against the spec + DOMAIN gate overlays only (comandrulemap `## /aw-spec-gate`), with no
|
|
119
|
+
> technical gate checklist.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# CQRS ā Pharma Domain Addenda
|
|
2
2
|
|
|
3
|
-
> Technology base: [[cqrs]]. Commands: `/aw-spec-
|
|
3
|
+
> Technology base: [[cqrs]]. Commands: `/aw-spec-specify`, `/aw-spec-gate`.
|
|
4
4
|
|
|
5
5
|
## Pipeline
|
|
6
6
|
- Append a **product-audit behavior** to the mediator pipeline: every create/modify/retire/re-identify/reclassify command on `MedicinalProduct` MUST emit an immutable audit record (User, Timestamp, Action, Previous Value, New Value). See [[auditing.domain]], [[regulatory-compliance]].
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Data Classification ā Pharma Domain Addenda
|
|
2
2
|
|
|
3
|
-
> Technology base: [[data-classification]]. Commands: `/aw-spec-
|
|
3
|
+
> Technology base: [[data-classification]]. Commands: `/aw-spec-constitution`, `/aw-spec-specify`, `/aw-spec-gate`.
|
|
4
4
|
|
|
5
5
|
> No PHI ā the model is commercial confidentiality, regulatory integrity, and source trust.
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Data Provenance Standards ā Pharma
|
|
2
2
|
|
|
3
|
-
> NON-NEGOTIABLE. Commands: `/aw-spec-
|
|
3
|
+
> NON-NEGOTIABLE. Commands: `/aw-spec-constitution`, `/aw-spec-specify`.
|
|
4
4
|
|
|
5
5
|
## First-class concern
|
|
6
6
|
- Any product attribute imported from an external source (FDA NDC directory, RxNorm, WHO ATC, an MAH submission, a partner feed) SHALL carry a **`ProvenanceRecord`** (Provenance module).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Dependency Policy ā Pharma Domain Addenda
|
|
2
2
|
|
|
3
|
-
> Technology base: [[dependency-policy]]. Commands: `/aw-spec-
|
|
3
|
+
> Technology base: [[dependency-policy]]. Commands: `/aw-spec-gate`.
|
|
4
4
|
|
|
5
5
|
## Reviews & libraries
|
|
6
6
|
- Every new dependency gets a **regulatory-suitability** review beyond the generic license/supply-chain check ā reject packages that phone home or ship analytics by default (leak risk for commercially-sensitive pre-market data) (see [[data-classification.domain]]).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Domain-Driven Design ā Medicinal Product Domain Model
|
|
2
2
|
|
|
3
|
-
> Technology base: [[domain-driven-design]]. NON-NEGOTIABLE. Commands: `/aw-spec-specify
|
|
3
|
+
> Technology base: [[domain-driven-design]]. NON-NEGOTIABLE. Commands: `/aw-spec-specify`.
|
|
4
4
|
|
|
5
5
|
## Modeling
|
|
6
6
|
- Use the pharma/regulatory ubiquitous language (see [[pharma-terms]]), aligned to ISO IDMP concepts (see [[idmp]]).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Eventing ā Pharma Domain Addenda
|
|
2
2
|
|
|
3
|
-
> Technology base: [[eventing]]. Commands: `/aw-spec-
|
|
3
|
+
> Technology base: [[eventing]]. Commands: `/aw-spec-specify`, `/aw-spec-gate`.
|
|
4
4
|
|
|
5
5
|
## Domain events
|
|
6
6
|
- `MedicinalProduct` raises domain events on every significant state change ā the integration seam to downstream consumers (prescribing, dispensing, manufacturing, pharmacovigilance, clinical).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# FHIR Standards ā Pharma
|
|
2
2
|
|
|
3
|
-
> NON-NEGOTIABLE. Commands: `/aw-spec-
|
|
3
|
+
> NON-NEGOTIABLE. Commands: `/aw-spec-constitution`, `/aw-spec-specify`.
|
|
4
4
|
|
|
5
5
|
## Architecture & projectors
|
|
6
6
|
- **R4 default**; R5 **additive** under `/fhir/R5/...`. FHIR is the canonical interop contract; it + any internal REST serve from the **same authoritative aggregates** ā no duplicate write paths.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Folder Structure ā Pharma Domain Addenda
|
|
2
2
|
|
|
3
|
-
> Technology base: [[folder-structure]]. Commands: `/aw-spec-
|
|
3
|
+
> Technology base: [[folder-structure]]. Commands: `/aw-spec-gate`. Replace `<SampleProjectName>`.
|
|
4
4
|
|
|
5
5
|
## Additions to the base layout
|
|
6
6
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# HL7 Integration Readiness ā Pharma
|
|
2
2
|
|
|
3
|
-
> Commands: `/aw-spec-
|
|
3
|
+
> Commands: `/aw-spec-constitution`, `/aw-spec-specify`.
|
|
4
4
|
|
|
5
5
|
## Principle
|
|
6
6
|
- The solution SHALL support **future integration with HL7-based systems**. The registry is the authoritative product source; HL7 surfaces are **adapters, not a parallel model**. FHIR is the primary contract (see [[fhir]]); HL7 v2 adapters are added where a downstream system (prescribing/dispensing/manufacturing/pharmacovigilance) needs them.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ISO IDMP ā Identification of Medicinal Products
|
|
2
2
|
|
|
3
|
-
> NON-NEGOTIABLE. Commands: `/aw-spec-
|
|
3
|
+
> NON-NEGOTIABLE. Commands: `/aw-spec-constitution`, `/aw-spec-specify`.
|
|
4
4
|
|
|
5
5
|
## Alignment principle
|
|
6
6
|
- The model SHALL align with the ISO IDMP suite (**ISO 11615/11616/11238/11239/11240**) **where applicable** ā IDMP shapes the ubiquitous language + aggregate boundaries; it is **not** a wire format and does not replace the internal model (see [[domain-driven-design.domain]]).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Glossary ā Integration Terms (Pharma)
|
|
2
2
|
|
|
3
|
-
> Ubiquitous language for pharma interoperability standards + identifiers. Commands: `/aw-spec-specify
|
|
3
|
+
> Ubiquitous language for pharma interoperability standards + identifiers. Commands: `/aw-spec-specify`. See [[pharma-terms]] (aggregates) + [[terminology]] (coding).
|
|
4
4
|
|
|
5
5
|
| Term | Definition |
|
|
6
6
|
|---|---|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# NDC ā National Drug Code Standards
|
|
2
2
|
|
|
3
|
-
> NON-NEGOTIABLE. Commands: `/aw-spec-
|
|
3
|
+
> NON-NEGOTIABLE. Commands: `/aw-spec-constitution`, `/aw-spec-specify`.
|
|
4
4
|
|
|
5
5
|
## Value Object
|
|
6
6
|
- **NDC SHALL be a Value Object** (`NdcCode`) ā immutable, equality by value (see [[domain-driven-design.domain]]).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Persistence ā Pharma Domain Addenda
|
|
2
2
|
|
|
3
|
-
> Technology base: [[persistence]]. NON-NEGOTIABLE. Commands: `/aw-spec-
|
|
3
|
+
> Technology base: [[persistence]]. NON-NEGOTIABLE. Commands: `/aw-spec-specify`, `/aw-spec-gate`.
|
|
4
4
|
|
|
5
5
|
## Version history
|
|
6
6
|
- Maintain a **version history** of product information: each approved change produces a new, immutable **`ProductVersion`** snapshot.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Glossary ā Pharmaceutical Terms
|
|
2
2
|
|
|
3
|
-
> Ubiquitous language for the medicinal product registry. Commands: `/aw-spec-
|
|
3
|
+
> Ubiquitous language for the medicinal product registry. Commands: `/aw-spec-constitution`, `/aw-spec-specify`. See [[domain-driven-design.domain]] (modeling), [[terminology]] (coding), [[integration-terms]] (interop).
|
|
4
4
|
|
|
5
5
|
| Term | Definition |
|
|
6
6
|
|---|---|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Product Lifecycle ā Medicinal Product State Machine
|
|
2
2
|
|
|
3
|
-
> Technology base: [[domain-driven-design]]. NON-NEGOTIABLE. Commands: `/aw-spec-
|
|
3
|
+
> Technology base: [[domain-driven-design]]. NON-NEGOTIABLE. Commands: `/aw-spec-constitution`, `/aw-spec-specify`.
|
|
4
4
|
|
|
5
5
|
## States
|
|
6
6
|
`Draft` ā `Under Review` ā `Approved` ā `Active` ā `Discontinued` / `Withdrawn`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Regulatory & Compliance Standards ā Pharma
|
|
2
2
|
|
|
3
|
-
> NON-NEGOTIABLE. Commands: `/aw-spec-
|
|
3
|
+
> NON-NEGOTIABLE. Commands: `/aw-spec-constitution`, `/aw-spec-specify`.
|
|
4
4
|
|
|
5
5
|
> Umbrella for the compliance requirements ā mechanisms live in the linked files.
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Terminology Standards ā Pharma
|
|
2
2
|
|
|
3
|
-
> NON-NEGOTIABLE. Commands: `/aw-spec-
|
|
3
|
+
> NON-NEGOTIABLE. Commands: `/aw-spec-constitution`, `/aw-spec-specify`.
|
|
4
4
|
|
|
5
5
|
## Coded value objects
|
|
6
6
|
- **Coded data MUST use industry terminologies ā free-text strings for coded concepts are FORBIDDEN.**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Testing ā Pharma Domain Addenda
|
|
2
2
|
|
|
3
|
-
> Technology base: [[testing]]. Commands: `/aw-spec-
|
|
3
|
+
> Technology base: [[testing]]. Commands: `/aw-spec-gate`.
|
|
4
4
|
|
|
5
5
|
## What MUST be tested
|
|
6
6
|
- **Aggregate invariants** ā required attributes; >= 1 ActiveIngredient; >= 1 PackagingConfiguration; NDC uniqueness + format; invalid dosage forms/routes rejected (see [[domain-driven-design.domain]], [[ndc]], [[terminology]]).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Vertical Slices ā Pharma Domain Addenda
|
|
2
2
|
|
|
3
|
-
> Technology base: [[vertical-slices]]. Commands: `/aw-spec-
|
|
3
|
+
> Technology base: [[vertical-slices]]. Commands: `/aw-spec-specify`, `/aw-spec-gate`.
|
|
4
4
|
|
|
5
5
|
## Interop adapters in the slice
|
|
6
6
|
`{Module}/Interop/` carries the pharma external-protocol adapters:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Zero-Trust ā Pharma Domain Addenda
|
|
2
2
|
|
|
3
|
-
> Technology base: [[zero-trust]]. Commands: `/aw-spec-
|
|
3
|
+
> Technology base: [[zero-trust]]. Commands: `/aw-spec-constitution`, `/aw-spec-specify`, `/aw-spec-gate`.
|
|
4
4
|
|
|
5
5
|
## Rules
|
|
6
6
|
- All registry traffic MUST be TLS-encrypted; commercially-sensitive pre-market data in transit MUST be TLS-protected; at-rest: see [[data-classification.domain]], [[persistence.domain]].
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# API Versioning Policy
|
|
2
2
|
|
|
3
|
-
> Pure technology (domain-agnostic) ā domain (e.g. FHIR) versioning in [[api-versioning.domain]]. Commands: `/aw-spec-
|
|
3
|
+
> Pure technology (domain-agnostic) ā domain (e.g. FHIR) versioning in [[api-versioning.domain]]. Commands: `/aw-spec-design`.
|
|
4
4
|
|
|
5
5
|
## REST versioning
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Coding Standards
|
|
2
2
|
|
|
3
|
-
> Pure technology (domain-agnostic) ā domain forbidden patterns & CI gates in [[coding-standards.domain]]. Commands: `/aw-spec-
|
|
3
|
+
> Pure technology (domain-agnostic) ā domain forbidden patterns & CI gates in [[coding-standards.domain]]. Commands: `/aw-spec-implement`, `/aw-spec-implement-delta`, `/aw-spec-build`, `/aw-spec-analyze-slice`.
|
|
4
4
|
|
|
5
5
|
## Naming conventions
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Dependency Policy
|
|
2
2
|
|
|
3
|
-
> Pure technology (domain-agnostic) ā domain package rules in [[dependency-policy.domain]]. Commands: `/aw-spec-
|
|
3
|
+
> Pure technology (domain-agnostic) ā domain package rules in [[dependency-policy.domain]]. Commands: `/aw-spec-implement`, `/aw-spec-implement-delta`.
|
|
4
4
|
|
|
5
5
|
## Package governance
|
|
6
6
|
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
MedicinalProduct/
|
|
2
|
+
|
|
3
|
+
/aw-spec-orch constitution @docs/pharma-constitution.md
|
|
4
|
+
|
|
5
|
+
/aw-spec-orch specify RegisterMedicinalProduct
|
|
2
6
|
|
|
3
7
|
Allow an authorized user to register a new medicinal product in the registry.
|
|
4
8
|
|
|
@@ -12,4 +16,12 @@ Acceptance:
|
|
|
12
16
|
- A product missing a required attribute, an active ingredient, or a packaging configuration is rejected.
|
|
13
17
|
- The creation is recorded in the audit trail.
|
|
14
18
|
|
|
19
|
+
/aw-spec-orch design
|
|
20
|
+
|
|
21
|
+
/aw-spec-orch analyze-design
|
|
22
|
+
|
|
23
|
+
/aw-spec-orch implement
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
15
27
|
==============================================================================================
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Auditing & Observability Standards
|
|
2
2
|
|
|
3
|
-
> Pure technology (domain-agnostic) ā domain audit additions in [[auditing.domain]]. NON-NEGOTIABLE. Commands: `/aw-spec-
|
|
3
|
+
> Pure technology (domain-agnostic) ā domain audit additions in [[auditing.domain]]. NON-NEGOTIABLE. Commands: `/aw-spec-design`.
|
|
4
4
|
|
|
5
5
|
## Observability baseline
|
|
6
6
|
|
|
@@ -39,14 +39,37 @@
|
|
|
39
39
|
- Audit records are retained per the applicable retention policy (see [[persistence]];
|
|
40
40
|
regulatory retention in [[auditing.domain]]).
|
|
41
41
|
|
|
42
|
-
##
|
|
42
|
+
## Two auditing levels
|
|
43
|
+
|
|
44
|
+
Auditing has exactly **two levels**, chosen **per aggregate** by the marker interfaces the root
|
|
45
|
+
implements. The interceptor populates every audit field automatically (no manual
|
|
46
|
+
`CreatedOn`/`ModifiedBy` assignment in handlers):
|
|
47
|
+
|
|
48
|
+
| Level | Aggregate root implements | Captured | Depth |
|
|
49
|
+
|-------|---------------------------|----------|-------|
|
|
50
|
+
| **Basic** | `IAuditedObject` (creation+modification) or `IFullAuditedObject` (+soft-delete) | `CreatedBy/On`, `ModifiedBy/On`, `DeletedBy/On`; one `AuditLog` per root per SaveChanges | entity-level (Created/Updated/Deleted) ā no before/after |
|
|
51
|
+
| **Advanced** | Basic markers **+ `IFieldAudited`** | Basic + field-level before/after (`PropertyChange`: original ā new) | entity + property-level previous/new |
|
|
43
52
|
|
|
44
|
-
|
|
45
|
-
|
|
53
|
+
Field-level before/after values exist **only** at the Advanced tier. Children marked
|
|
54
|
+
`IAggregateChild` fold into the root's `AuditLog`.
|
|
55
|
+
|
|
56
|
+
## Canonical example (agent reference ā `<SampleProjectName>` sample)
|
|
46
57
|
|
|
47
58
|
```csharp
|
|
48
|
-
|
|
49
|
-
|
|
59
|
+
// Basic ā lifecycle stamps only
|
|
60
|
+
public sealed class Category :
|
|
61
|
+
AggregateRootBase<CategoryId>, IAggregateRoot,
|
|
62
|
+
IAuditedObject // creation + modification
|
|
63
|
+
{
|
|
64
|
+
public DateTimeOffset CreatedOn { get; set; }
|
|
65
|
+
public string CreatedBy { get; set; } = default!;
|
|
66
|
+
public DateTimeOffset? ModifiedOn { get; set; }
|
|
67
|
+
public string? ModifiedBy { get; set; }
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Advanced ā full lifecycle + field-level (before/after) tracking
|
|
71
|
+
public sealed class Project :
|
|
72
|
+
AggregateRootBase<ProjectId>, IAggregateRoot,
|
|
50
73
|
IFullAuditedObject, // ICreationAudited + IModificationAudited + IDeletionAudited
|
|
51
74
|
IFieldAudited, // opt-in to field-level (before/after) auditing
|
|
52
75
|
ISoftDeletable, IConcurrencyTracked, IHasDomainEvents
|
|
@@ -69,15 +92,17 @@ The DbContext applies audit (plus soft-delete/tenant) behaviors centrally:
|
|
|
69
92
|
modelBuilder.ApplyCrossCuttingBehaviors(this); // wires audit interceptors + filters
|
|
70
93
|
```
|
|
71
94
|
|
|
72
|
-
Composition ā enable auditing on the repository stack
|
|
73
|
-
|
|
95
|
+
Composition ā enable auditing on the repository stack (one `EnableAdvancedAuditing()` registers
|
|
96
|
+
the interceptor that serves **both** levels; per-aggregate level is decided by the interfaces
|
|
97
|
+
above) and route audit records to a separate, append-only store (schema `Auditing`, prefix
|
|
98
|
+
`Audit_`):
|
|
74
99
|
|
|
75
100
|
```csharp
|
|
76
101
|
// <SampleProjectName>.Service/Extensions/InfrastructureServiceRegistration.cs
|
|
77
102
|
services.AddRepositories(builder => builder
|
|
78
103
|
.UseSingleDbContextEFRepositories<ApplicationDbContext>(/* ... */)
|
|
79
|
-
.
|
|
80
|
-
.EnableAdvancedAuditing()
|
|
104
|
+
.EnableSoftDelete()
|
|
105
|
+
.EnableAdvancedAuditing() // AdvancedAuditingSaveChangesInterceptor
|
|
81
106
|
.Done(), o => o.Provider = "EfCore");
|
|
82
107
|
|
|
83
108
|
services.AddDataStore(b => b.UseEfCoreDataStore(/* ... */), o =>
|
|
@@ -95,9 +120,27 @@ services.AddAuditing(b => b
|
|
|
95
120
|
o.ExcludeShadowProperties = true;
|
|
96
121
|
})
|
|
97
122
|
.UseAppWeaverDataStore(),
|
|
98
|
-
o => { o.IsEnabled = true; o.EnableFieldLevelAuditing = true; });
|
|
123
|
+
o => { o.IsEnabled = true; o.EnableFieldLevelAuditing = true; }); // field-level = Advanced
|
|
99
124
|
```
|
|
100
125
|
|
|
126
|
+
## Querying the audit trail (framework-provided)
|
|
127
|
+
|
|
128
|
+
The audit store is queryable out of the box via `IAuditEntity` ā no bespoke read model required:
|
|
129
|
+
|
|
130
|
+
```csharp
|
|
131
|
+
// by resource identity
|
|
132
|
+
var logs = await auditEntity.GetAuditLogsAsync(typeof(Project).FullName!, projectId.ToString());
|
|
133
|
+
// by user / action / time, with paging
|
|
134
|
+
var page = await auditEntity.GetAuditLogsAsync(new AuditLogFilter { UserId = "u1", Action = AuditAction.Updated, Take = 10 });
|
|
135
|
+
// by user / tenant
|
|
136
|
+
await auditEntity.GetAuditLogsByUserAsync("u1");
|
|
137
|
+
await auditEntity.GetAuditLogsByTenantAsync("tenant-alpha");
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Each `AuditLog` carries `{ UserId, UserName, Timestamp, Action, EntityType, EntityId, Metadata
|
|
141
|
+
(correlationId, ā¦) }`; its `EntityChanges` hold entity-level `ChangeType`, and ā for `IFieldAudited`
|
|
142
|
+
roots ā nested `PropertyChanges` with `OriginalValue ā NewValue`.
|
|
143
|
+
|
|
101
144
|
Observability baseline ā `ServiceDefaults` (OTel + Serilog + health) wired once in `Program.cs`:
|
|
102
145
|
|
|
103
146
|
```csharp
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Authorization Standards
|
|
2
2
|
|
|
3
|
-
> Pure technology (domain-agnostic) ā domain roles & matrix in [[authorization.domain]]. NON-NEGOTIABLE. Commands: `/aw-spec-
|
|
3
|
+
> Pure technology (domain-agnostic) ā domain roles & matrix in [[authorization.domain]]. NON-NEGOTIABLE. Commands: `/aw-spec-design`.
|
|
4
4
|
|
|
5
5
|
## Authorization model
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Data Classification Standards
|
|
2
2
|
|
|
3
|
-
> Pure technology (domain-agnostic) ā domain data categories in [[data-classification.domain]]. NON-NEGOTIABLE. Commands: `/aw-spec-
|
|
3
|
+
> Pure technology (domain-agnostic) ā domain data categories in [[data-classification.domain]]. NON-NEGOTIABLE. Commands: `/aw-spec-design`.
|
|
4
4
|
|
|
5
5
|
## Classification framework
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Zero-Trust Standards
|
|
2
2
|
|
|
3
|
-
> Pure technology (domain-agnostic) ā domain additions in [[zero-trust.domain]]. NON-NEGOTIABLE where marked. Commands: `/aw-spec-
|
|
3
|
+
> Pure technology (domain-agnostic) ā domain additions in [[zero-trust.domain]]. NON-NEGOTIABLE where marked. Commands: `/aw-spec-design`.
|
|
4
4
|
|
|
5
5
|
## Transport security (mTLS / TLS)
|
|
6
6
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,eAAO,MAAM,aAAa,SA6ItB,CAAC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import fs from 'fs-extra';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { fileURLToPath } from 'url';
|
|
7
|
+
import { resolveAssetsPath } from '../utils/paths.js';
|
|
8
|
+
import { readManifest, updateManifest } from '../utils/manifest.js';
|
|
9
|
+
import { buildUpdatePlan, applyUpdatePlan } from '../utils/update-engine.js';
|
|
10
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
const AGENT_FOLDER_MAP = {
|
|
12
|
+
claude: '.claude',
|
|
13
|
+
antigravity: '.agents',
|
|
14
|
+
kilocode: '.kilocode',
|
|
15
|
+
};
|
|
16
|
+
const ALWAYS_COPY = ['.aw-spec', 'docs'];
|
|
17
|
+
export const updateCommand = new Command('update')
|
|
18
|
+
.description('Update an existing AppWeaver Spec project with latest assets from registry')
|
|
19
|
+
.argument('[directory]', 'Target directory (default: current directory)', '.')
|
|
20
|
+
.option('-a, --agent <agent>', 'Agent to use: claude, antigravity, kilocode (detected from manifest if not specified)')
|
|
21
|
+
.option('-y, --yes', 'Skip prompts and apply non-conflicting updates automatically')
|
|
22
|
+
.option('--dry-run', 'Show what would be updated without making changes')
|
|
23
|
+
.action(async (directory, options) => {
|
|
24
|
+
const targetDir = directory === '.' ? process.cwd() : directory;
|
|
25
|
+
const manifestPath = path.join(targetDir, '.aw-spec', 'manifest.json');
|
|
26
|
+
console.log(`\nš Checking for updates in: ${targetDir}\n`);
|
|
27
|
+
// Load existing manifest
|
|
28
|
+
const manifest = await readManifest(manifestPath);
|
|
29
|
+
if (!manifest) {
|
|
30
|
+
console.log(chalk.red('ā No manifest found. This project was not initialized with aw-spec or is from an older version.'));
|
|
31
|
+
console.log(chalk.yellow(' Run `aw-spec init` to initialize a new project.'));
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
console.log(chalk.gray(` Current version: ${manifest.version}`));
|
|
35
|
+
console.log(chalk.gray(` Last updated: ${manifest.updatedAt}`));
|
|
36
|
+
console.log(chalk.gray(` Tracked files: ${Object.keys(manifest.files).length}`));
|
|
37
|
+
// Determine agent from manifest or options
|
|
38
|
+
let agent = options.agent;
|
|
39
|
+
if (agent === 'prompt') {
|
|
40
|
+
// Try to detect from init-options.json
|
|
41
|
+
const initOptionsPath = path.join(targetDir, '.aw-spec', 'init-options.json');
|
|
42
|
+
if (await fs.pathExists(initOptionsPath)) {
|
|
43
|
+
try {
|
|
44
|
+
const initOptions = await fs.readJSON(initOptionsPath);
|
|
45
|
+
if (initOptions.ai && ['claude', 'antigravity', 'kilocode'].includes(initOptions.ai)) {
|
|
46
|
+
agent = initOptions.ai;
|
|
47
|
+
console.log(chalk.gray(` Detected agent from init-options: ${agent}`));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Ignore parse errors
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// If still not determined, prompt
|
|
56
|
+
if (agent === 'prompt') {
|
|
57
|
+
if (options.yes) {
|
|
58
|
+
agent = 'claude';
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
const { selectedAgent } = await inquirer.prompt([
|
|
62
|
+
{
|
|
63
|
+
type: 'list',
|
|
64
|
+
name: 'selectedAgent',
|
|
65
|
+
message: 'Which agent skills should be updated?',
|
|
66
|
+
choices: [
|
|
67
|
+
{ name: 'Claude Code (.claude/skills)', value: 'claude' },
|
|
68
|
+
{ name: 'Antigravity (.agents/skills)', value: 'antigravity' },
|
|
69
|
+
{ name: 'KiloCode (.kilocode/skills)', value: 'kilocode' },
|
|
70
|
+
],
|
|
71
|
+
default: 'claude',
|
|
72
|
+
},
|
|
73
|
+
]);
|
|
74
|
+
agent = selectedAgent;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const agentFolder = AGENT_FOLDER_MAP[agent];
|
|
78
|
+
// Resolve new assets from registry
|
|
79
|
+
const assetsPath = await resolveAssetsPath();
|
|
80
|
+
console.log(chalk.gray(` Source assets: ${assetsPath}`));
|
|
81
|
+
if (options.dryRun) {
|
|
82
|
+
console.log('\nš Dry run - checking for updates...\n');
|
|
83
|
+
}
|
|
84
|
+
// Build update plan
|
|
85
|
+
console.log(chalk.bold('\nš Analyzing changes...\n'));
|
|
86
|
+
const plan = await buildUpdatePlan(manifest.files, targetDir, assetsPath);
|
|
87
|
+
// Print summary
|
|
88
|
+
console.log(chalk.bold('\nš Update Plan:'));
|
|
89
|
+
console.log(chalk.green(` Update: ${plan.summary.update}`));
|
|
90
|
+
console.log(chalk.blue(` Add: ${plan.summary.add}`));
|
|
91
|
+
console.log(chalk.yellow(` Preserve: ${plan.summary.preserve}`));
|
|
92
|
+
console.log(chalk.red(` Skip (conflicts): ${plan.summary.skip}`));
|
|
93
|
+
console.log(chalk.gray(` Remove: ${plan.summary.remove}`));
|
|
94
|
+
if (plan.summary.skip > 0) {
|
|
95
|
+
console.log(chalk.yellow('\nā ļø Conflicts detected - these files have both user and upstream changes:'));
|
|
96
|
+
for (const file of plan.files.filter(f => f.disposition === 'skip')) {
|
|
97
|
+
console.log(chalk.yellow(` ā ${file.relPath} - ${file.reason}`));
|
|
98
|
+
}
|
|
99
|
+
console.log(chalk.yellow('\n These files will be skipped. Resolve manually after update.'));
|
|
100
|
+
}
|
|
101
|
+
if (plan.summary.preserve > 0) {
|
|
102
|
+
console.log(chalk.blue('\nā¹ļø User-modified files preserved:'));
|
|
103
|
+
for (const file of plan.files.filter(f => f.disposition === 'preserve')) {
|
|
104
|
+
console.log(chalk.blue(` ā ${file.relPath} - ${file.reason}`));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (options.dryRun) {
|
|
108
|
+
console.log(chalk.bold('\nš Dry run complete - no changes made.'));
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
// Confirm before applying if not --yes
|
|
112
|
+
if (!options.yes && (plan.summary.update > 0 || plan.summary.add > 0 || plan.summary.remove > 0)) {
|
|
113
|
+
const { confirm } = await inquirer.prompt([
|
|
114
|
+
{
|
|
115
|
+
type: 'confirm',
|
|
116
|
+
name: 'confirm',
|
|
117
|
+
message: 'Apply these updates?',
|
|
118
|
+
default: true,
|
|
119
|
+
},
|
|
120
|
+
]);
|
|
121
|
+
if (!confirm) {
|
|
122
|
+
console.log(chalk.gray('\nUpdate cancelled.'));
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Apply update plan
|
|
127
|
+
console.log(chalk.bold('\nš¦ Applying updates...\n'));
|
|
128
|
+
await applyUpdatePlan(plan, targetDir, assetsPath, {
|
|
129
|
+
onProgress: (msg) => console.log(msg),
|
|
130
|
+
});
|
|
131
|
+
// Update manifest with new state
|
|
132
|
+
console.log(chalk.bold('\nš Updating manifest...'));
|
|
133
|
+
const newManifest = await updateManifest(manifestPath, targetDir, manifest.version);
|
|
134
|
+
console.log(chalk.green(` ā Manifest updated (${Object.keys(newManifest.files).length} files tracked)`));
|
|
135
|
+
console.log(chalk.bold('\nā
Update complete!'));
|
|
136
|
+
console.log('\nNext steps:');
|
|
137
|
+
console.log(' aw-spec doctor # Verify the installation');
|
|
138
|
+
if (plan.summary.skip > 0) {
|
|
139
|
+
console.log(chalk.yellow(' Review skipped files and resolve conflicts manually'));
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
//# sourceMappingURL=update.js.map
|