aw-spec-cli 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/assets/.agents/agent.json +1 -1
  2. package/assets/.agents/skills/{aw-spec-orch → appweaver}/SKILL.md +10 -10
  3. package/assets/.agents/skills/{aw-spec-orch-demo → appweaver-demo}/SKILL.md +9 -9
  4. package/assets/.claude/agent.json +1 -1
  5. package/assets/.claude/skills/{aw-spec-orch → appweaver}/SKILL.md +10 -10
  6. package/assets/.claude/skills/{aw-spec-orch-demo → appweaver-demo}/SKILL.md +9 -9
  7. package/assets/.kilocode/agent.json +1 -1
  8. package/assets/.kilocode/workflows/{aw-spec-orch-demo.md → appweaver-demo.md} +9 -9
  9. package/assets/.kilocode/workflows/{aw-spec-orch.md → appweaver.md} +10 -10
  10. package/assets/docs/pharma-constitution.my-ref.md +86 -0
  11. package/dist/utils/paths.js +2 -2
  12. package/dist/utils/paths.js.map +1 -1
  13. package/package.json +1 -1
  14. package/assets/.aw-spec/DESIGN-FORMAT.md +0 -151
  15. package/assets/.aw-spec/ORCH-DIALECT.md +0 -156
  16. package/assets/.aw-spec/RULE-PARTITION.md +0 -126
  17. package/assets/.aw-spec/domain.json +0 -3
  18. package/assets/.aw-spec/extensions/.registry +0 -19
  19. package/assets/.aw-spec/extensions/agent-context/README.md +0 -57
  20. package/assets/.aw-spec/extensions/agent-context/agent-context-config.yml +0 -4
  21. package/assets/.aw-spec/extensions/agent-context/commands/aw-spec.agent-context.update.md +0 -26
  22. package/assets/.aw-spec/extensions/agent-context/extension.yml +0 -37
  23. package/assets/.aw-spec/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -201
  24. package/assets/.aw-spec/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -237
  25. package/assets/.aw-spec/extensions.yml +0 -16
  26. package/assets/.aw-spec/feature.json +0 -3
  27. package/assets/.aw-spec/init-options.json +0 -9
  28. package/assets/.aw-spec/integration.json +0 -15
  29. package/assets/.aw-spec/integrations/aw-spec.manifest.json +0 -9
  30. package/assets/.aw-spec/interpreter/run-skill.py +0 -1158
  31. package/assets/.aw-spec/memory/constitution.md +0 -50
  32. package/assets/.aw-spec/orchestrator/AGENT-PROFILE.md +0 -94
  33. package/assets/.aw-spec/orchestrator/README.md +0 -300
  34. package/assets/.aw-spec/orchestrator/adapters/claude_agent_sdk.py +0 -74
  35. package/assets/.aw-spec/orchestrator/adapters/google_antigravity.py +0 -74
  36. package/assets/.aw-spec/orchestrator/modules/delta-design.orch.yaml +0 -105
  37. package/assets/.aw-spec/orchestrator/modules/delta-spec.orch.yaml +0 -79
  38. package/assets/.aw-spec/orchestrator/modules/domain-select.orch.yaml +0 -81
  39. package/assets/.aw-spec/orchestrator/modules/tech-select.orch.yaml +0 -75
  40. package/assets/.aw-spec/orchestrator/orchestrator.py +0 -1721
  41. package/assets/.aw-spec/orchestrator/rev-templates/ai-rules.reference.md +0 -40
  42. package/assets/.aw-spec/orchestrator/rev-templates/comandrulemap.skeleton.md +0 -59
  43. package/assets/.aw-spec/orchestrator/rev-templates/commandtechrulemap.skeleton.md +0 -97
  44. package/assets/.aw-spec/orchestrator/rev-templates/domain-constitution.skeleton.md +0 -61
  45. package/assets/.aw-spec/orchestrator/rev-templates/domain-requirements.skeleton.md +0 -48
  46. package/assets/.aw-spec/orchestrator/rev-templates/domain-rule-file.skeleton.md +0 -39
  47. package/assets/.aw-spec/orchestrator/rev-templates/technical-constitution.skeleton.md +0 -106
  48. package/assets/.aw-spec/orchestrator/rev-templates/technical-rule-file.skeleton.md +0 -54
  49. package/assets/.aw-spec/orchestrator/workflows/_smoke.orch.yaml +0 -160
  50. package/assets/.aw-spec/orchestrator/workflows/aw-spec-add-component.orch.yaml +0 -244
  51. package/assets/.aw-spec/orchestrator/workflows/aw-spec-adopt.orch.yaml +0 -775
  52. package/assets/.aw-spec/orchestrator/workflows/aw-spec-analyze-delta-design.orch.yaml +0 -248
  53. package/assets/.aw-spec/orchestrator/workflows/aw-spec-analyze-design.orch.yaml +0 -261
  54. package/assets/.aw-spec/orchestrator/workflows/aw-spec-analyze-slice.orch.yaml +0 -425
  55. package/assets/.aw-spec/orchestrator/workflows/aw-spec-build.orch.yaml +0 -188
  56. package/assets/.aw-spec/orchestrator/workflows/aw-spec-characterize.orch.yaml +0 -474
  57. package/assets/.aw-spec/orchestrator/workflows/aw-spec-close-delta.orch.yaml +0 -181
  58. package/assets/.aw-spec/orchestrator/workflows/aw-spec-constitution.orch.yaml +0 -284
  59. package/assets/.aw-spec/orchestrator/workflows/aw-spec-demo.orch.yaml +0 -103
  60. package/assets/.aw-spec/orchestrator/workflows/aw-spec-dependency-tree.orch.yaml +0 -69
  61. package/assets/.aw-spec/orchestrator/workflows/aw-spec-deploy.orch.yaml +0 -85
  62. package/assets/.aw-spec/orchestrator/workflows/aw-spec-design.orch.yaml +0 -382
  63. package/assets/.aw-spec/orchestrator/workflows/aw-spec-finalize-delta.orch.yaml +0 -382
  64. package/assets/.aw-spec/orchestrator/workflows/aw-spec-foundation.orch.yaml +0 -246
  65. package/assets/.aw-spec/orchestrator/workflows/aw-spec-implement-delta.orch.yaml +0 -231
  66. package/assets/.aw-spec/orchestrator/workflows/aw-spec-implement.orch.yaml +0 -258
  67. package/assets/.aw-spec/orchestrator/workflows/aw-spec-inventory.orch.yaml +0 -236
  68. package/assets/.aw-spec/orchestrator/workflows/aw-spec-onboard.orch.yaml +0 -949
  69. package/assets/.aw-spec/orchestrator/workflows/aw-spec-parity.orch.yaml +0 -293
  70. package/assets/.aw-spec/orchestrator/workflows/aw-spec-run.orch.yaml +0 -177
  71. package/assets/.aw-spec/orchestrator/workflows/aw-spec-select-domain.orch.yaml +0 -79
  72. package/assets/.aw-spec/orchestrator/workflows/aw-spec-select-feature.orch.yaml +0 -128
  73. package/assets/.aw-spec/orchestrator/workflows/aw-spec-specify.orch.yaml +0 -412
  74. package/assets/.aw-spec/scripts/bash/aw-inventory.sh +0 -14
  75. package/assets/.aw-spec/scripts/bash/aw-parity.sh +0 -13
  76. package/assets/.aw-spec/scripts/bash/aw-rev-constitution.sh +0 -13
  77. package/assets/.aw-spec/scripts/bash/aw-spec-actions.sh +0 -1899
  78. package/assets/.aw-spec/scripts/bash/aw-xref.sh +0 -15
  79. package/assets/.aw-spec/scripts/bash/common.sh +0 -533
  80. package/assets/.aw-spec/scripts/powershell/aw-inventory.ps1 +0 -14
  81. package/assets/.aw-spec/scripts/powershell/aw-parity.ps1 +0 -13
  82. package/assets/.aw-spec/scripts/powershell/aw-rev-constitution.ps1 +0 -13
  83. package/assets/.aw-spec/scripts/powershell/aw-spec-actions.ps1 +0 -1563
  84. package/assets/.aw-spec/scripts/powershell/aw-xref.ps1 +0 -15
  85. package/assets/.aw-spec/scripts/python/aw-inventory.py +0 -683
  86. package/assets/.aw-spec/scripts/python/aw-parity.py +0 -380
  87. package/assets/.aw-spec/scripts/python/aw-rev-constitution.py +0 -312
  88. package/assets/.aw-spec/scripts/python/aw-xref.py +0 -1330
  89. package/assets/.aw-spec/scripts/python/validate_okf.py +0 -349
  90. package/assets/.aw-spec/templates/constitution-domain-template.md +0 -75
  91. package/assets/.aw-spec/templates/constitution-technical-template.md +0 -70
  92. package/assets/.aw-spec/templates/delta-design-template.md +0 -69
  93. package/assets/.aw-spec/templates/delta-spec-template.md +0 -60
  94. package/assets/.aw-spec/templates/design-template.md +0 -383
  95. package/assets/.aw-spec/templates/okf-concept-template.md +0 -103
  96. package/assets/.aw-spec/templates/parity-manifest-template.json +0 -49
  97. package/assets/.aw-spec/templates/source-map-template.md +0 -85
  98. package/assets/.aw-spec/templates/spec-template.md +0 -252
  99. package/assets/docs/ModularMonolith/ModularMonolith.Reference.pack.txt +0 -25248
  100. package/assets/docs/ModularMonolith/ModularMonolith.pack.txt +0 -5726
  101. package/assets/docs/ModularMonolith/pack-foundation.ps1 +0 -145
  102. package/assets/docs/ModularMonolith/pack-foundation.sh +0 -196
  103. package/assets/docs/ModularMonolith/pack-reference-foundation.ps1 +0 -157
  104. package/assets/docs/ModularMonolith/pack-reference-foundation.sh +0 -209
  105. package/assets/docs/ModularMonolith/unpack-foundation.ps1 +0 -126
  106. package/assets/docs/ModularMonolith/unpack-foundation.sh +0 -217
  107. package/assets/docs/ModularMonolith/unpack-reference-foundation.ps1 +0 -129
  108. package/assets/docs/ModularMonolith/unpack-reference-foundation.sh +0 -218
  109. package/assets/docs/README.md +0 -106
  110. package/assets/docs/VerticalSlice/PACKAGING.md +0 -185
  111. package/assets/docs/VerticalSlice/VerticalSlice.Reference.pack.txt +0 -19318
  112. package/assets/docs/VerticalSlice/VerticalSlice.pack.txt +0 -2833
  113. package/assets/docs/VerticalSlice/pack-foundation.ps1 +0 -145
  114. package/assets/docs/VerticalSlice/pack-foundation.sh +0 -196
  115. package/assets/docs/VerticalSlice/pack-reference-foundation.ps1 +0 -157
  116. package/assets/docs/VerticalSlice/pack-reference-foundation.sh +0 -209
  117. package/assets/docs/VerticalSlice/unpack-foundation.ps1 +0 -126
  118. package/assets/docs/VerticalSlice/unpack-foundation.sh +0 -217
  119. package/assets/docs/VerticalSlice/unpack-reference-foundation.ps1 +0 -129
  120. package/assets/docs/VerticalSlice/unpack-reference-foundation.sh +0 -218
  121. package/assets/docs/architecture/clean-architecture.md +0 -71
  122. package/assets/docs/architecture/cqrs.md +0 -141
  123. package/assets/docs/architecture/eventing.md +0 -83
  124. package/assets/docs/architecture/folder-structure.md +0 -61
  125. package/assets/docs/architecture/modular-monolith.md +0 -47
  126. package/assets/docs/architecture/persistence.md +0 -269
  127. package/assets/docs/architecture/testing.md +0 -55
  128. package/assets/docs/architecture/vertical-slices.md +0 -201
  129. package/assets/docs/components/Email/README.md +0 -119
  130. package/assets/docs/components/Email/ReferenceEndpoints/SendEmailEndpoint.cs +0 -84
  131. package/assets/docs/components/Email/integration.md +0 -300
  132. package/assets/docs/components/Jobs/README.md +0 -113
  133. package/assets/docs/components/Jobs/integration.md +0 -259
  134. package/assets/docs/components/QrGenerator/README.md +0 -85
  135. package/assets/docs/components/QrGenerator/ReferenceEndpoints/GenerateQrEndpoint.cs +0 -57
  136. package/assets/docs/components/QrGenerator/integration.md +0 -230
  137. package/assets/docs/components/README.md +0 -74
  138. package/assets/docs/domain/domain-driven-design.md +0 -212
  139. package/assets/docs/domainspecs/healthcare/ai-rules.domain.md +0 -34
  140. package/assets/docs/domainspecs/healthcare/api-versioning.domain.md +0 -17
  141. package/assets/docs/domainspecs/healthcare/auditing.domain.md +0 -97
  142. package/assets/docs/domainspecs/healthcare/authorization.domain.md +0 -26
  143. package/assets/docs/domainspecs/healthcare/clinical-terms.md +0 -20
  144. package/assets/docs/domainspecs/healthcare/coding-standards.domain.md +0 -26
  145. package/assets/docs/domainspecs/healthcare/comandrulemap.md +0 -100
  146. package/assets/docs/domainspecs/healthcare/commandtechrulemap.md +0 -119
  147. package/assets/docs/domainspecs/healthcare/consent.md +0 -19
  148. package/assets/docs/domainspecs/healthcare/cqrs.domain.md +0 -12
  149. package/assets/docs/domainspecs/healthcare/data-classification.domain.md +0 -28
  150. package/assets/docs/domainspecs/healthcare/dependency-policy.domain.md +0 -11
  151. package/assets/docs/domainspecs/healthcare/dicom.md +0 -15
  152. package/assets/docs/domainspecs/healthcare/domain-driven-design.domain.md +0 -28
  153. package/assets/docs/domainspecs/healthcare/domain-requirements.md +0 -55
  154. package/assets/docs/domainspecs/healthcare/eventing.domain.md +0 -18
  155. package/assets/docs/domainspecs/healthcare/fhir.md +0 -36
  156. package/assets/docs/domainspecs/healthcare/folder-structure.domain.md +0 -23
  157. package/assets/docs/domainspecs/healthcare/hipaa.md +0 -34
  158. package/assets/docs/domainspecs/healthcare/hl7.md +0 -15
  159. package/assets/docs/domainspecs/healthcare/integration-terms.md +0 -21
  160. package/assets/docs/domainspecs/healthcare/persistence.domain.md +0 -20
  161. package/assets/docs/domainspecs/healthcare/terminology.md +0 -30
  162. package/assets/docs/domainspecs/healthcare/testing.domain.md +0 -15
  163. package/assets/docs/domainspecs/healthcare/vertical-slices.domain.md +0 -18
  164. package/assets/docs/domainspecs/healthcare/zero-trust.domain.md +0 -12
  165. package/assets/docs/domainspecs/pharma/ai-rules.domain.md +0 -32
  166. package/assets/docs/domainspecs/pharma/api-versioning.domain.md +0 -20
  167. package/assets/docs/domainspecs/pharma/atc.md +0 -22
  168. package/assets/docs/domainspecs/pharma/auditing.domain.md +0 -90
  169. package/assets/docs/domainspecs/pharma/authorization.domain.md +0 -25
  170. package/assets/docs/domainspecs/pharma/coding-standards.domain.md +0 -28
  171. package/assets/docs/domainspecs/pharma/comandrulemap.md +0 -108
  172. package/assets/docs/domainspecs/pharma/commandtechrulemap.md +0 -119
  173. package/assets/docs/domainspecs/pharma/cqrs.domain.md +0 -16
  174. package/assets/docs/domainspecs/pharma/data-classification.domain.md +0 -24
  175. package/assets/docs/domainspecs/pharma/data-provenance.md +0 -21
  176. package/assets/docs/domainspecs/pharma/dependency-policy.domain.md +0 -11
  177. package/assets/docs/domainspecs/pharma/domain-driven-design.domain.md +0 -36
  178. package/assets/docs/domainspecs/pharma/domain-requirements.md +0 -99
  179. package/assets/docs/domainspecs/pharma/eventing.domain.md +0 -18
  180. package/assets/docs/domainspecs/pharma/fhir.md +0 -31
  181. package/assets/docs/domainspecs/pharma/folder-structure.domain.md +0 -24
  182. package/assets/docs/domainspecs/pharma/hl7.md +0 -17
  183. package/assets/docs/domainspecs/pharma/idmp.md +0 -26
  184. package/assets/docs/domainspecs/pharma/integration-terms.md +0 -21
  185. package/assets/docs/domainspecs/pharma/ndc.md +0 -28
  186. package/assets/docs/domainspecs/pharma/persistence.domain.md +0 -23
  187. package/assets/docs/domainspecs/pharma/pharma-terms.md +0 -27
  188. package/assets/docs/domainspecs/pharma/product-lifecycle.domain.md +0 -30
  189. package/assets/docs/domainspecs/pharma/regulatory-compliance.md +0 -19
  190. package/assets/docs/domainspecs/pharma/terminology.md +0 -32
  191. package/assets/docs/domainspecs/pharma/testing.domain.md +0 -19
  192. package/assets/docs/domainspecs/pharma/vertical-slices.domain.md +0 -17
  193. package/assets/docs/domainspecs/pharma/zero-trust.domain.md +0 -12
  194. package/assets/docs/glossary/ai-rules.md +0 -59
  195. package/assets/docs/governance/api-versioning.md +0 -99
  196. package/assets/docs/governance/coding-standards.md +0 -87
  197. package/assets/docs/governance/dependency-policy.md +0 -40
  198. package/assets/docs/interop/ihe-conformance.md +0 -31
  199. package/assets/docs/requirement-spec.txt +0 -27
  200. package/assets/docs/security/auditing.md +0 -160
  201. package/assets/docs/security/authorization-matrix.md +0 -14
  202. package/assets/docs/security/authorization.md +0 -87
  203. package/assets/docs/security/data-classification.md +0 -38
  204. package/assets/docs/security/zero-trust.md +0 -76
  205. package/assets/docs/technology-constitution.md +0 -172
@@ -1,312 +0,0 @@
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:]))