aw-spec-cli 0.1.4 → 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/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 +27 -0
- 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/init.d.ts.map +1 -1
- package/dist/commands/init.js +7 -54
- package/dist/commands/init.js.map +1 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +1 -1
- package/dist/utils/paths.js +2 -2
- package/dist/utils/paths.js.map +1 -1
- 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/UI.Visualization/PACKAGING.md +0 -191
- package/assets/docs/UI.Visualization/UI.Visualization.Reference.pack.txt +0 -11768
- package/assets/docs/UI.Visualization/UI.Visualization.pack.txt +0 -11214
- package/assets/docs/UI.Visualization/pack-foundation.ps1 +0 -165
- package/assets/docs/UI.Visualization/pack-foundation.sh +0 -206
- package/assets/docs/UI.Visualization/pack-reference-foundation.ps1 +0 -159
- package/assets/docs/UI.Visualization/pack-reference-foundation.sh +0 -205
- package/assets/docs/UI.Visualization/unpack-foundation.ps1 +0 -126
- package/assets/docs/UI.Visualization/unpack-foundation.sh +0 -217
- package/assets/docs/UI.Visualization/unpack-reference-foundation.ps1 +0 -129
- package/assets/docs/UI.Visualization/unpack-reference-foundation.sh +0 -218
- package/assets/docs/command.txt +0 -295
- package/assets/docs/domainspecs/UIVisualization/chart-bubble.md +0 -70
- package/assets/docs/domainspecs/UIVisualization/chart-dimred.md +0 -58
- package/assets/docs/domainspecs/UIVisualization/chart-heatmap.md +0 -62
- package/assets/docs/domainspecs/UIVisualization/chart-network.md +0 -69
- package/assets/docs/domainspecs/UIVisualization/chart-parallel.md +0 -75
- package/assets/docs/domainspecs/UIVisualization/chart-scurve.md +0 -66
- package/assets/docs/domainspecs/UIVisualization/chart-survival.md +0 -69
- package/assets/docs/domainspecs/UIVisualization/chart-trellis.md +0 -68
- package/assets/docs/domainspecs/UIVisualization/chart-violin.md +0 -61
- package/assets/docs/domainspecs/UIVisualization/chart-volcano.md +0 -63
- package/assets/docs/domainspecs/UIVisualization/charting-standards.domain.md +0 -80
- package/assets/docs/domainspecs/UIVisualization/clean-architecture.domain.md +0 -87
- package/assets/docs/domainspecs/UIVisualization/coding-standards.domain.md +0 -47
- package/assets/docs/domainspecs/UIVisualization/comandrulemap.md +0 -130
- package/assets/docs/domainspecs/UIVisualization/component-contracts.domain.md +0 -67
- package/assets/docs/domainspecs/UIVisualization/data-source.domain.md +0 -68
- package/assets/docs/domainspecs/UIVisualization/domain-requirements.md +0 -110
- package/assets/docs/domainspecs/UIVisualization/folder-structure.domain.md +0 -55
- package/assets/docs/domainspecs/UIVisualization/state-management.domain.md +0 -67
- package/assets/docs/domainspecs/UIVisualization/testing.domain.md +0 -52
- package/assets/docs/domainspecs/UIVisualization/ui-viz-terms.md +0 -39
- package/assets/docs/pharma-constitution.my-ref.md +0 -86
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""aw-rev-constitution.py — deterministic substrate for the Brownfield GOVERN-BACKWARD
|
|
3
|
+
phase.
|
|
4
|
+
|
|
5
|
+
A legacy codebase has no GOVERNANCE tier — no split constitution, no rule packs —
|
|
6
|
+
yet specify/design/implement/gates are all driven by one. Govern-backward
|
|
7
|
+
reverse-engineers that tier from what the code itself evidences, so forward
|
|
8
|
+
development of the SAME codebase runs governed exactly like greenfield (Change
|
|
9
|
+
Requests through the CR delta loop).
|
|
10
|
+
|
|
11
|
+
CALLER (2026-07-29 onward): the standalone `/aw-spec-orch rev-constitution` workflow
|
|
12
|
+
is RETIRED — do not expect that command to exist. The phase now lives in:
|
|
13
|
+
* `/aw-spec-orch onboard` — up front, over the WHOLE repo, before any slice is
|
|
14
|
+
adopted. It is the ONLY caller of this core (workflow `scripts:` ref, both
|
|
15
|
+
shells). At onboard time nothing is adopted yet, so `list-adopted` legitimately
|
|
16
|
+
returns slice_count 0 and draws its context from the OKF bundle instead.
|
|
17
|
+
* `/aw-spec-orch adopt` — per slice, reconciling each provisional principle
|
|
18
|
+
against that slice's real spec.md/design.md evidence. Adopt does NOT call this
|
|
19
|
+
core; it reconciles in its own steps.
|
|
20
|
+
|
|
21
|
+
This core survived the retirement unchanged because it is the MODEL-FREE half: it
|
|
22
|
+
enumerates whatever slices ARE adopted and scaffolds the
|
|
23
|
+
`docs/domainspecs/brf-<domain>/` pack directory; the calling workflow's authoring
|
|
24
|
+
agents fill the rule files + the split constitution. Governance stance is AS-BUILT
|
|
25
|
+
(the constitution reflects what the code does, not an aspiration — a separate
|
|
26
|
+
modernization/migration workflow drains the debt later).
|
|
27
|
+
|
|
28
|
+
Two subcommands, each printing a single JSON object as the LAST stdout line (so
|
|
29
|
+
the orchestrator's execute_script can bind it); human-readable summaries go to
|
|
30
|
+
STDERR so they never corrupt the JSON contract:
|
|
31
|
+
|
|
32
|
+
list-adopted [--root <dir>] [--specs <dir>] [--bundle <dir>]
|
|
33
|
+
-> the union of adopted artifacts to reverse-engineer FROM. Returns
|
|
34
|
+
{slices[], slice_count, reverse_count, spec_context[], design_context[],
|
|
35
|
+
all_context[], project_context[], project_name, overview, platform,
|
|
36
|
+
backlog, root}. *_context arrays are workspace-relative paths ready for a
|
|
37
|
+
build_context `context_from:`. The technology (design) side carries the
|
|
38
|
+
designs + OKF overview + platform note + migration backlog + the per-slice
|
|
39
|
+
source-maps (the code-coordinate bridge) so the TECHNICAL half is derived from
|
|
40
|
+
what the code evidences AND cites real code files/types, not the template —
|
|
41
|
+
including the shared-infra gaps (platform Open Questions) and the as-built debt
|
|
42
|
+
sink to route unmet template ideals to. Stays domain-agnostic by the author's
|
|
43
|
+
prompt (cite code paths, ignore the source-map's domain spec-ids / entity names).
|
|
44
|
+
|
|
45
|
+
pack-setup --name <domain> [--fallback <name>] [--root <dir>]
|
|
46
|
+
-> slugify + `brf-` prefix the domain, create docs/domainspecs/<slug>/ (guard:
|
|
47
|
+
refuses to clobber a pack that already holds .md files). Returns
|
|
48
|
+
{domain_slug, pack_dir, comandrulemap, domain_constitution_source,
|
|
49
|
+
pack_present}. pack_present is the STRING "true"/"false" (so verify_context
|
|
50
|
+
require_value/condition can gate the anti-clobber guard).
|
|
51
|
+
|
|
52
|
+
Usage: aw-rev-constitution.py <list-adopted|pack-setup> [options]
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
import argparse
|
|
56
|
+
import json
|
|
57
|
+
import os
|
|
58
|
+
import re
|
|
59
|
+
import sys
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _root(arg_root):
|
|
63
|
+
"""Repo/component root: explicit --root, else CWD (the orchestrator runs each
|
|
64
|
+
execute_script with CWD = the component root, where .aw-spec / specs / docs live)."""
|
|
65
|
+
return os.path.abspath(arg_root) if arg_root else os.getcwd()
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _rel(path, root):
|
|
69
|
+
"""Workspace-relative POSIX path (build_context resolves against CWD = root)."""
|
|
70
|
+
return os.path.relpath(path, root).replace(os.sep, "/")
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _emit(obj):
|
|
74
|
+
"""JSON contract: the object as the LAST stdout line."""
|
|
75
|
+
print(json.dumps(obj))
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _uniq(seq):
|
|
79
|
+
"""Order-preserving de-dup (context arrays are concatenated from overlapping
|
|
80
|
+
sources — the OKF overview belongs to several of them)."""
|
|
81
|
+
seen, out = set(), []
|
|
82
|
+
for x in seq:
|
|
83
|
+
if x and x not in seen:
|
|
84
|
+
seen.add(x)
|
|
85
|
+
out.append(x)
|
|
86
|
+
return out
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _project_name(overview_abs):
|
|
90
|
+
"""The project's display name — the WHOLE project the governance tier governs,
|
|
91
|
+
NOT the outer tooling folder. Inventory writes the OKF overview's Purpose as
|
|
92
|
+
'## Purpose ... **<ProjectName>** is a ...', so the first bold token in that
|
|
93
|
+
section is the solution/product name (e.g. 'Medicinal.Healthcare'). Empty when no
|
|
94
|
+
overview exists — pack-setup then falls back to the repo basename as before."""
|
|
95
|
+
if not overview_abs or not os.path.isfile(overview_abs):
|
|
96
|
+
return ""
|
|
97
|
+
try:
|
|
98
|
+
with open(overview_abs, "r", encoding="utf-8", errors="replace") as fh:
|
|
99
|
+
text = fh.read(8192)
|
|
100
|
+
except OSError:
|
|
101
|
+
return ""
|
|
102
|
+
m = re.search(r"##\s*Purpose\s*(.+?)(?:\n##\s|\Z)", text, re.IGNORECASE | re.DOTALL)
|
|
103
|
+
scope = m.group(1) if m else text
|
|
104
|
+
b = re.search(r"\*\*([^*\n]+?)\*\*", scope)
|
|
105
|
+
return b.group(1).strip() if b else ""
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
# ─────────────────────────────── list-adopted ──────────────────────────────
|
|
109
|
+
def cmd_list_adopted(args):
|
|
110
|
+
root = _root(args.root)
|
|
111
|
+
specs_dir = os.path.join(root, args.specs)
|
|
112
|
+
bundle_dir = os.path.join(root, args.bundle)
|
|
113
|
+
|
|
114
|
+
slices = []
|
|
115
|
+
spec_context = []
|
|
116
|
+
design_context = []
|
|
117
|
+
source_maps = []
|
|
118
|
+
reverse_count = 0
|
|
119
|
+
|
|
120
|
+
if os.path.isdir(specs_dir):
|
|
121
|
+
for name in sorted(os.listdir(specs_dir)):
|
|
122
|
+
sdir = os.path.join(specs_dir, name)
|
|
123
|
+
if not os.path.isdir(sdir):
|
|
124
|
+
continue
|
|
125
|
+
spec = os.path.join(sdir, "spec.md")
|
|
126
|
+
design = os.path.join(sdir, "design.md")
|
|
127
|
+
# A slice is adoptable-governance input only when BOTH docs exist.
|
|
128
|
+
if not (os.path.isfile(spec) and os.path.isfile(design)):
|
|
129
|
+
continue
|
|
130
|
+
smap = os.path.join(sdir, "source-map.md")
|
|
131
|
+
is_reverse = False
|
|
132
|
+
try:
|
|
133
|
+
with open(spec, "r", encoding="utf-8", errors="replace") as fh:
|
|
134
|
+
head = fh.read(4096)
|
|
135
|
+
if re.search(r"reverse-engineered", head, re.IGNORECASE):
|
|
136
|
+
is_reverse = True
|
|
137
|
+
except OSError:
|
|
138
|
+
pass
|
|
139
|
+
if is_reverse:
|
|
140
|
+
reverse_count += 1
|
|
141
|
+
slices.append({
|
|
142
|
+
"name": name,
|
|
143
|
+
"spec": _rel(spec, root),
|
|
144
|
+
"design": _rel(design, root),
|
|
145
|
+
"source_map": _rel(smap, root) if os.path.isfile(smap) else "",
|
|
146
|
+
"origin": "reverse-engineered" if is_reverse else "unknown",
|
|
147
|
+
})
|
|
148
|
+
spec_context.append(_rel(spec, root))
|
|
149
|
+
design_context.append(_rel(design, root))
|
|
150
|
+
if os.path.isfile(smap):
|
|
151
|
+
source_maps.append(_rel(smap, root))
|
|
152
|
+
|
|
153
|
+
# The OKF architecture overview names the actual tech stack (technology half input).
|
|
154
|
+
overview = ""
|
|
155
|
+
overview_abs = ""
|
|
156
|
+
for cand in ("architecture/overview.md", "architecture/architecture.md"):
|
|
157
|
+
p = os.path.join(bundle_dir, cand)
|
|
158
|
+
if os.path.isfile(p):
|
|
159
|
+
overview = _rel(p, root)
|
|
160
|
+
overview_abs = p
|
|
161
|
+
break
|
|
162
|
+
|
|
163
|
+
# TECHNICAL evidence beyond the overview, both domain-free: the shared-platform note
|
|
164
|
+
# (cross-cutting persistence / tenancy / concurrency reality — incl. its Open Questions,
|
|
165
|
+
# e.g. tenancy may be inactive) and the migration backlog (the as-built DEBT SINK the
|
|
166
|
+
# technical author routes any unmet template ideal / stub to, instead of asserting it).
|
|
167
|
+
# These feed the DESIGN side so the technical half is EVIDENCE-FIRST, not template-first.
|
|
168
|
+
platform_ref = ""
|
|
169
|
+
p = os.path.join(bundle_dir, "architecture/platform.md")
|
|
170
|
+
if os.path.isfile(p):
|
|
171
|
+
platform_ref = _rel(p, root)
|
|
172
|
+
backlog_ref = ""
|
|
173
|
+
p = os.path.join(bundle_dir, "migration-backlog.md")
|
|
174
|
+
if os.path.isfile(p):
|
|
175
|
+
backlog_ref = _rel(p, root)
|
|
176
|
+
|
|
177
|
+
# Project-level OKF framing — the PROJECT AS A WHOLE, not just one adopted slice:
|
|
178
|
+
# the overview (mission + aggregate map + external refs + stack), the aggregate
|
|
179
|
+
# index (bounded-context map), and the shared-platform note. These are what let the
|
|
180
|
+
# DOMAIN author write a project charter instead of a single-aggregate spec. The
|
|
181
|
+
# technical half deliberately does NOT get the aggregate index or specs (stays
|
|
182
|
+
# domain-free); it DOES get platform.md + the backlog as technical evidence (below).
|
|
183
|
+
project_context = [overview] if overview else []
|
|
184
|
+
for cand in ("aggregates/index.md", "architecture/platform.md", "index.md"):
|
|
185
|
+
p = os.path.join(bundle_dir, cand)
|
|
186
|
+
if os.path.isfile(p):
|
|
187
|
+
project_context.append(_rel(p, root))
|
|
188
|
+
project_context = _uniq(project_context)
|
|
189
|
+
|
|
190
|
+
# The display name of the whole project the governance tier governs (from the OKF
|
|
191
|
+
# overview), so the pack/constitution are named + titled after the PROJECT — not the
|
|
192
|
+
# outer tooling folder the CWD-basename fallback would pick.
|
|
193
|
+
project_name = _project_name(overview_abs)
|
|
194
|
+
|
|
195
|
+
# spec side = domain input (specs + source-maps + PROJECT framing); design side =
|
|
196
|
+
# technology input (designs + OKF stack overview + shared-platform note + as-built
|
|
197
|
+
# backlog + the per-slice source-maps — the code-coordinate bridge, so the TECHNICAL
|
|
198
|
+
# half anchors each principle to a real code file/type, not just a design section;
|
|
199
|
+
# kept domain-agnostic by the author's prompt discipline, not by starving it of the
|
|
200
|
+
# code map — rich enough to DERIVE the principle set from evidence and route unmet
|
|
201
|
+
# ideals to debt); all = the pack author's full picture.
|
|
202
|
+
spec_side = _uniq(spec_context + source_maps + project_context)
|
|
203
|
+
design_side = _uniq(
|
|
204
|
+
design_context
|
|
205
|
+
+ source_maps
|
|
206
|
+
+ ([overview] if overview else [])
|
|
207
|
+
+ ([platform_ref] if platform_ref else [])
|
|
208
|
+
+ ([backlog_ref] if backlog_ref else [])
|
|
209
|
+
)
|
|
210
|
+
all_context = _uniq(spec_context + design_context + source_maps + project_context)
|
|
211
|
+
|
|
212
|
+
result = {
|
|
213
|
+
"slices": slices,
|
|
214
|
+
"slice_count": len(slices),
|
|
215
|
+
"reverse_count": reverse_count,
|
|
216
|
+
"spec_context": spec_side,
|
|
217
|
+
"design_context": design_side,
|
|
218
|
+
"all_context": all_context,
|
|
219
|
+
"project_context": project_context,
|
|
220
|
+
"project_name": project_name,
|
|
221
|
+
"overview": overview,
|
|
222
|
+
"platform": platform_ref,
|
|
223
|
+
"backlog": backlog_ref,
|
|
224
|
+
"root": root,
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
names = ", ".join(s["name"] for s in slices) or "(none)"
|
|
228
|
+
print(
|
|
229
|
+
f"[govern-backward] adopted slices: {len(slices)} "
|
|
230
|
+
f"({reverse_count} reverse-engineered) — {names}\n"
|
|
231
|
+
f" project: {project_name or '(unknown — no OKF overview)'} "
|
|
232
|
+
f"overview: {overview or '(none — no OKF bundle)'}\n"
|
|
233
|
+
f" technical evidence: platform={platform_ref or '(none)'} "
|
|
234
|
+
f"backlog={backlog_ref or '(none)'}",
|
|
235
|
+
file=sys.stderr,
|
|
236
|
+
)
|
|
237
|
+
_emit(result)
|
|
238
|
+
return 0
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
# ─────────────────────────────── pack-setup ────────────────────────────────
|
|
242
|
+
def _slugify(name):
|
|
243
|
+
s = (name or "").strip().lower()
|
|
244
|
+
s = re.sub(r"[^a-z0-9]+", "-", s)
|
|
245
|
+
s = re.sub(r"-{2,}", "-", s).strip("-")
|
|
246
|
+
return s
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def cmd_pack_setup(args):
|
|
250
|
+
root = _root(args.root)
|
|
251
|
+
raw = args.name if (args.name and args.name.strip()) else args.fallback
|
|
252
|
+
if not raw or not raw.strip():
|
|
253
|
+
# Last-resort fallback: the component/repo directory name.
|
|
254
|
+
raw = os.path.basename(root.rstrip(os.sep)) or "domain"
|
|
255
|
+
slug = _slugify(raw)
|
|
256
|
+
if not slug:
|
|
257
|
+
slug = "domain"
|
|
258
|
+
# Strip any leading brf- the operator already typed, then re-apply once.
|
|
259
|
+
slug = re.sub(r"^brf-+", "", slug)
|
|
260
|
+
domain_slug = "brf-" + slug
|
|
261
|
+
|
|
262
|
+
pack_dir = os.path.join(root, "docs", "domainspecs", domain_slug)
|
|
263
|
+
# Anti-clobber guard: a pack that already holds curated .md files is not ours
|
|
264
|
+
# to overwrite (mirrors inventory's bundle_guard). pack_present drives the gate.
|
|
265
|
+
present = False
|
|
266
|
+
if os.path.isdir(pack_dir):
|
|
267
|
+
present = any(f.endswith(".md") for f in os.listdir(pack_dir))
|
|
268
|
+
if not present:
|
|
269
|
+
os.makedirs(pack_dir, exist_ok=True)
|
|
270
|
+
|
|
271
|
+
result = {
|
|
272
|
+
"domain_slug": domain_slug,
|
|
273
|
+
"pack_dir": _rel(pack_dir, root),
|
|
274
|
+
"comandrulemap": _rel(os.path.join(pack_dir, "comandrulemap.md"), root),
|
|
275
|
+
"domain_constitution_source": f"docs/{domain_slug}-constitution.md",
|
|
276
|
+
"pack_present": "true" if present else "false",
|
|
277
|
+
"root": root,
|
|
278
|
+
}
|
|
279
|
+
print(
|
|
280
|
+
f"[govern-backward] domain pack: docs/domainspecs/{domain_slug}/ "
|
|
281
|
+
f"({'EXISTS — guarded' if present else 'created'})",
|
|
282
|
+
file=sys.stderr,
|
|
283
|
+
)
|
|
284
|
+
_emit(result)
|
|
285
|
+
return 0
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def main(argv):
|
|
289
|
+
ap = argparse.ArgumentParser(prog="aw-rev-constitution.py", add_help=True)
|
|
290
|
+
sub = ap.add_subparsers(dest="cmd")
|
|
291
|
+
|
|
292
|
+
la = sub.add_parser("list-adopted", help="enumerate adopted slices to reverse-engineer from")
|
|
293
|
+
la.add_argument("--root", default="")
|
|
294
|
+
la.add_argument("--specs", default="specs")
|
|
295
|
+
la.add_argument("--bundle", default="knowledge")
|
|
296
|
+
la.set_defaults(func=cmd_list_adopted)
|
|
297
|
+
|
|
298
|
+
ps = sub.add_parser("pack-setup", help="create the docs/domainspecs/brf-<domain>/ pack dir")
|
|
299
|
+
ps.add_argument("--name", default="")
|
|
300
|
+
ps.add_argument("--fallback", default="")
|
|
301
|
+
ps.add_argument("--root", default="")
|
|
302
|
+
ps.set_defaults(func=cmd_pack_setup)
|
|
303
|
+
|
|
304
|
+
args = ap.parse_args(argv)
|
|
305
|
+
if not getattr(args, "func", None):
|
|
306
|
+
ap.print_help(sys.stderr)
|
|
307
|
+
return 2
|
|
308
|
+
return args.func(args)
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
if __name__ == "__main__":
|
|
312
|
+
sys.exit(main(sys.argv[1:]))
|