its-magic 0.1.2-9 → 0.1.3-0

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 (237) hide show
  1. package/README.md +1602 -755
  2. package/bin/its-magic.js +121 -11
  3. package/bin/postinstall.js +93 -0
  4. package/installer.ps1 +759 -0
  5. package/installer.py +1036 -0
  6. package/installer.sh +649 -0
  7. package/package.json +18 -14
  8. package/scripts/check_intake_template_parity.py +312 -0
  9. package/scripts/doc_profile_lib.py +415 -0
  10. package/scripts/guard_installer_publish.py +88 -0
  11. package/scripts/intake_bug_routing_guard.py +67 -0
  12. package/scripts/intake_evidence_lib.py +802 -0
  13. package/scripts/intake_evidence_validate.py +73 -0
  14. package/scripts/materialize_codebase_map.py +184 -0
  15. package/scripts/remote_config_summary.py +243 -0
  16. package/template/.cursor/agents/curator.mdc +35 -0
  17. package/template/.cursor/agents/dev.mdc +29 -0
  18. package/template/.cursor/agents/po.mdc +141 -0
  19. package/template/.cursor/agents/qa.mdc +28 -0
  20. package/template/.cursor/agents/release.mdc +28 -0
  21. package/template/.cursor/agents/security.mdc +98 -0
  22. package/template/.cursor/agents/tech-lead.mdc +57 -0
  23. package/template/.cursor/commands/architecture.md +127 -0
  24. package/template/.cursor/commands/ask.md +55 -0
  25. package/template/.cursor/commands/auto.md +533 -0
  26. package/template/.cursor/commands/discovery.md +47 -0
  27. package/template/.cursor/commands/execute.md +343 -0
  28. package/template/.cursor/commands/intake.md +323 -0
  29. package/template/.cursor/commands/map-codebase.md +46 -0
  30. package/template/.cursor/commands/memory-audit.md +175 -0
  31. package/template/.cursor/commands/milestone-complete.md +51 -0
  32. package/template/.cursor/commands/milestone-start.md +59 -0
  33. package/template/.cursor/commands/pause.md +64 -0
  34. package/{.cursor/commands/gsd-phase-context.md → template/.cursor/commands/phase-context.md} +6 -2
  35. package/template/.cursor/commands/plan-verify.md +34 -0
  36. package/template/.cursor/commands/qa.md +226 -0
  37. package/template/.cursor/commands/quick.md +41 -0
  38. package/template/.cursor/commands/refresh-context.md +82 -0
  39. package/template/.cursor/commands/release.md +523 -0
  40. package/template/.cursor/commands/research.md +49 -0
  41. package/template/.cursor/commands/resume.md +67 -0
  42. package/template/.cursor/commands/security-review.md +81 -0
  43. package/template/.cursor/commands/sprint-plan.md +103 -0
  44. package/template/.cursor/commands/status-reconcile.md +95 -0
  45. package/template/.cursor/commands/verify-work.md +152 -0
  46. package/template/.cursor/dev-environment.json.example +22 -0
  47. package/{.cursor → template/.cursor}/hooks/README.md +3 -2
  48. package/{.cursor/hooks/gsd-hook.py → template/.cursor/hooks/hook.py} +15 -6
  49. package/template/.cursor/hooks.json +26 -0
  50. package/template/.cursor/remote.json +31 -0
  51. package/template/.cursor/rules/caveman.mdc +184 -0
  52. package/template/.cursor/rules/coding-standards.mdc +39 -0
  53. package/template/.cursor/rules/core.mdc +111 -0
  54. package/template/.cursor/rules/handoffs.mdc +27 -0
  55. package/template/.cursor/rules/quality.mdc +49 -0
  56. package/template/.cursor/scratchpad.local.example.md +323 -0
  57. package/template/.cursor/scratchpad.md +324 -0
  58. package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/SKILL.md +2 -2
  59. package/template/.cursorignore +6 -0
  60. package/template/.env.example +28 -0
  61. package/template/.github/workflows/ci.yml +194 -0
  62. package/{.github → template/.github}/workflows/deploy.yml +5 -2
  63. package/template/.its-magic-version +1 -0
  64. package/template/CHANGELOG.md +11 -0
  65. package/template/README.md +1602 -0
  66. package/template/decisions/DEC-0001.md +11 -0
  67. package/template/decisions/DEC-0002.md +11 -0
  68. package/template/docs/developer/README.md +44 -0
  69. package/template/docs/engineering/architecture.md +9 -0
  70. package/template/docs/engineering/artifact-ordering-policy.md +48 -0
  71. package/template/docs/engineering/artifact-ownership-policy.md +57 -0
  72. package/template/docs/engineering/auto-orchestration-reference.md +1211 -0
  73. package/{docs → template/docs}/engineering/codebase-map.md +0 -5
  74. package/template/docs/engineering/compatibility-report.md +20 -0
  75. package/template/docs/engineering/compatibility-signals.md +7 -0
  76. package/template/docs/engineering/component-scope-report.md +16 -0
  77. package/template/docs/engineering/component-scope.md +19 -0
  78. package/template/docs/engineering/context/installer-owned-paths.manifest +96 -0
  79. package/template/docs/engineering/context/readme-section-affinity.json +30 -0
  80. package/template/docs/engineering/decisions.md +16 -0
  81. package/template/docs/engineering/legacy-drift-audit.md +21 -0
  82. package/template/docs/engineering/manifests/components/api-gateway.manifest.yaml +12 -0
  83. package/template/docs/engineering/manifests/registry.manifest.yaml +20 -0
  84. package/template/docs/engineering/manifests/repo.manifest.yaml +11 -0
  85. package/template/docs/engineering/phase-context.md +16 -0
  86. package/template/docs/engineering/release-targets.json +123 -0
  87. package/template/docs/engineering/research.md +29 -0
  88. package/template/docs/engineering/runbook.md +2391 -0
  89. package/template/docs/engineering/runtime-connectivity.md +81 -0
  90. package/template/docs/engineering/security-review.md +33 -0
  91. package/template/docs/engineering/spec-pack/README.md +20 -0
  92. package/template/docs/engineering/state-archive/README.md +15 -0
  93. package/template/docs/engineering/state.md +20 -0
  94. package/template/docs/engineering/status-normalization-report.md +19 -0
  95. package/template/docs/engineering/token-cost-parity-manifest.md +16 -0
  96. package/template/docs/engineering/us-0084-remote-e2e.md +44 -0
  97. package/template/docs/product/acceptance.md +1 -0
  98. package/template/docs/product/backlog.md +5 -0
  99. package/template/docs/product/vision.md +11 -0
  100. package/template/docs/user-guides/README.md +40 -0
  101. package/{handoffs → template/handoffs}/dev_to_qa.md +0 -3
  102. package/{handoffs → template/handoffs}/po_to_tl.md +0 -3
  103. package/{handoffs → template/handoffs}/qa_to_dev.md +1 -2
  104. package/template/handoffs/release_notes.md +51 -0
  105. package/template/handoffs/release_queue.md +47 -0
  106. package/template/handoffs/release_to_dev.md +31 -0
  107. package/template/handoffs/releases/Sxxxx-release-notes.md +62 -0
  108. package/template/handoffs/releases/vX.Y.Z-release-notes.md.example +21 -0
  109. package/template/handoffs/resume_brief.md +14 -0
  110. package/{handoffs → template/handoffs}/tl_to_dev.md +0 -2
  111. package/template/handoffs/token_cost_runs/README.md +26 -0
  112. package/template/its_magic/.its-magic-version +1 -0
  113. package/template/its_magic/README.md +9 -0
  114. package/template/scripts/auto_outer_driver.py +521 -0
  115. package/template/scripts/caveman_compress_input.py +903 -0
  116. package/template/scripts/check_downstream_ci_guard.py +67 -0
  117. package/template/scripts/check_intake_template_parity.py +312 -0
  118. package/template/scripts/check_token_cost_parity.py +69 -0
  119. package/template/scripts/dev_environment_lib.py +601 -0
  120. package/template/scripts/doc_profile_lib.py +415 -0
  121. package/template/scripts/downstream_ci_guard_lib.py +222 -0
  122. package/template/scripts/enforce-triad-hot-surface.py +753 -0
  123. package/template/scripts/guard_installer_publish.py +88 -0
  124. package/template/scripts/intake_bug_resume_brief_refresh.py +303 -0
  125. package/template/scripts/intake_bug_routing_guard.py +67 -0
  126. package/template/scripts/intake_evidence_lib.py +802 -0
  127. package/template/scripts/intake_evidence_validate.py +73 -0
  128. package/template/scripts/materialize_codebase_map.py +184 -0
  129. package/template/scripts/pack_json_validate.py +130 -0
  130. package/template/scripts/project_readme_coverage_lib.py +417 -0
  131. package/template/scripts/readme_feature_coverage_lib.py +608 -0
  132. package/{scripts → template/scripts}/release-all.sh +27 -4
  133. package/template/scripts/release_changelog_backfill.py +153 -0
  134. package/template/scripts/release_changelog_lib.py +544 -0
  135. package/template/scripts/release_changelog_validate.py +134 -0
  136. package/template/scripts/remote_config_summary.py +243 -0
  137. package/template/scripts/sync_push_gates.py +198 -0
  138. package/template/scripts/token_cost_compare.py +40 -0
  139. package/template/scripts/token_cost_lib.py +108 -0
  140. package/template/scripts/uat_probe_lib.py +868 -0
  141. package/template/scripts/validate-and-push.ps1 +280 -0
  142. package/template/scripts/validate-and-push.sh +243 -0
  143. package/template/scripts/validate_doc_profile.py +103 -0
  144. package/template/scripts/validate_project_readme_coverage.py +151 -0
  145. package/template/scripts/validate_readme_feature_coverage.py +140 -0
  146. package/template/sprints/S0001/progress.md +1 -0
  147. package/template/sprints/S0001/qa-findings.md +9 -0
  148. package/template/sprints/S0001/release-findings.md +24 -0
  149. package/template/sprints/S0001/sprint.md +9 -0
  150. package/template/sprints/S0001/summary.md +7 -0
  151. package/template/sprints/S0001/tasks.md +1 -0
  152. package/template/sprints/S0001/uat.json +6 -0
  153. package/template/sprints/S0001/uat.md +5 -0
  154. package/template/sprints/quick/Q0001/summary.md +1 -0
  155. package/{sprints → template/sprints}/quick/Q0001/task.json +0 -1
  156. package/.cursor/agents/curator.mdc +0 -21
  157. package/.cursor/agents/dev.mdc +0 -20
  158. package/.cursor/agents/po.mdc +0 -19
  159. package/.cursor/agents/qa.mdc +0 -19
  160. package/.cursor/agents/release.mdc +0 -19
  161. package/.cursor/agents/tech-lead.mdc +0 -21
  162. package/.cursor/commands/gsd-architecture.md +0 -29
  163. package/.cursor/commands/gsd-auto.md +0 -27
  164. package/.cursor/commands/gsd-discovery.md +0 -27
  165. package/.cursor/commands/gsd-execute.md +0 -32
  166. package/.cursor/commands/gsd-intake.md +0 -28
  167. package/.cursor/commands/gsd-map-codebase.md +0 -25
  168. package/.cursor/commands/gsd-milestone-complete.md +0 -24
  169. package/.cursor/commands/gsd-milestone-start.md +0 -26
  170. package/.cursor/commands/gsd-pause.md +0 -25
  171. package/.cursor/commands/gsd-plan-verify.md +0 -26
  172. package/.cursor/commands/gsd-qa.md +0 -28
  173. package/.cursor/commands/gsd-quick.md +0 -24
  174. package/.cursor/commands/gsd-refresh-context.md +0 -26
  175. package/.cursor/commands/gsd-release.md +0 -29
  176. package/.cursor/commands/gsd-research.md +0 -28
  177. package/.cursor/commands/gsd-resume.md +0 -26
  178. package/.cursor/commands/gsd-sprint-plan.md +0 -30
  179. package/.cursor/commands/gsd-verify-work.md +0 -25
  180. package/.cursor/hooks.json +0 -26
  181. package/.cursor/plans/cursor-gsd-team-kit_8cfee9b8.plan.md +0 -57
  182. package/.cursor/remote.json +0 -18
  183. package/.cursor/rules/gsd-core.mdc +0 -18
  184. package/.cursor/rules/gsd-handoffs.mdc +0 -10
  185. package/.cursor/rules/gsd-quality.mdc +0 -15
  186. package/.cursor/scratchpad.md +0 -34
  187. package/.github/workflows/ci.yml +0 -47
  188. package/decisions/DEC-0001.md +0 -21
  189. package/decisions/DEC-0002.md +0 -21
  190. package/docs/engineering/architecture.md +0 -354
  191. package/docs/engineering/decisions.md +0 -6
  192. package/docs/engineering/research.md +0 -11
  193. package/docs/engineering/runbook.md +0 -32
  194. package/docs/engineering/state.md +0 -33
  195. package/docs/product/acceptance.md +0 -6
  196. package/docs/product/backlog.md +0 -7
  197. package/docs/product/vision.md +0 -46
  198. package/gsd-installer.ps1 +0 -189
  199. package/gsd-installer.py +0 -195
  200. package/gsd-installer.sh +0 -201
  201. package/handoffs/release_notes.md +0 -14
  202. package/handoffs/resume_brief.md +0 -8
  203. package/milestones/M0001/milestone.json +0 -7
  204. package/milestones/M0001/phases.json +0 -9
  205. package/milestones/M0001/progress.md +0 -3
  206. package/milestones/M0001/summary.md +0 -3
  207. package/scripts/generate-release-notes.ps1 +0 -74
  208. package/scripts/generate-release-notes.sh +0 -63
  209. package/scripts/release-all.ps1 +0 -423
  210. package/sprints/S0001/progress.md +0 -4
  211. package/sprints/S0001/qa-findings.md +0 -113
  212. package/sprints/S0001/sprint.md +0 -70
  213. package/sprints/S0001/summary.md +0 -46
  214. package/sprints/S0001/tasks.md +0 -35
  215. package/sprints/S0001/uat.json +0 -8
  216. package/sprints/S0001/uat.md +0 -8
  217. package/sprints/quick/Q0001/summary.md +0 -3
  218. /package/{.cursor/rules/gsd-escalation.mdc → template/.cursor/rules/escalation.mdc} +0 -0
  219. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/acceptance.json +0 -0
  220. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/acceptance.md +0 -0
  221. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/architecture.json +0 -0
  222. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/architecture.md +0 -0
  223. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/decision.json +0 -0
  224. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/decision.md +0 -0
  225. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/handoff.json +0 -0
  226. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/handoff.md +0 -0
  227. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/milestone.json +0 -0
  228. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/phase-context.json +0 -0
  229. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/plan-verify.json +0 -0
  230. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/sprint.json +0 -0
  231. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/sprint.md +0 -0
  232. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/story.json +0 -0
  233. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/story.md +0 -0
  234. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/uat.json +0 -0
  235. /package/{docs → template/docs}/engineering/context/phase-template.json +0 -0
  236. /package/{docs → template/docs}/engineering/dependencies.json +0 -0
  237. /package/{sprints → template/sprints}/S0001/plan-verify.json +0 -0
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Downstream CI drift guard CLI (BUG-0009 / DEC-0075).
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ import argparse
9
+ import json
10
+ import os
11
+ import sys
12
+
13
+ _SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
14
+ _REPO_ROOT = os.path.normpath(os.path.join(_SCRIPT_DIR, ".."))
15
+
16
+ if _SCRIPT_DIR not in sys.path:
17
+ sys.path.insert(0, _SCRIPT_DIR)
18
+
19
+ import downstream_ci_guard_lib as dci # noqa: E402
20
+
21
+
22
+ def main() -> int:
23
+ parser = argparse.ArgumentParser(
24
+ description="Downstream CI drift guard (template forbidden scan + active inventory)."
25
+ )
26
+ parser.add_argument(
27
+ "--repo",
28
+ default=_REPO_ROOT,
29
+ help="Target repository root (default: parent of scripts/).",
30
+ )
31
+ parser.add_argument(
32
+ "--self-test",
33
+ action="store_true",
34
+ help="Run stable marker subtests.",
35
+ )
36
+ parser.add_argument(
37
+ "--report",
38
+ action="store_true",
39
+ help="Emit JSON inventory to stdout.",
40
+ )
41
+ args = parser.parse_args()
42
+
43
+ if args.self_test:
44
+ try:
45
+ dci.self_test()
46
+ except AssertionError as exc:
47
+ print(f"self-test failed: {exc}", file=sys.stderr)
48
+ return 2
49
+ print("[DOWNSTREAM_CI_GUARD_SELF_TEST_OK]")
50
+ return 0
51
+
52
+ target = os.path.abspath(args.repo)
53
+ report, stderr_lines = dci.build_report(target)
54
+
55
+ if args.report:
56
+ print(json.dumps(dci.report_to_dict(report), sort_keys=True, separators=(",", ":")))
57
+
58
+ for line in stderr_lines:
59
+ print(line, file=sys.stderr)
60
+
61
+ if not report.ok:
62
+ return 1
63
+ return 0
64
+
65
+
66
+ if __name__ == "__main__":
67
+ sys.exit(main())
@@ -0,0 +1,312 @@
1
+ #!/usr/bin/env python3
2
+ """Verify active vs template/scripts/ bytes match for DEC-0063 intake gate modules (BUG-0001).
3
+
4
+ Scoped modes (DEC-0073 §10 / US-0090):
5
+ --scope=intake (default) DEC-0063 intake pair table.
6
+ --scope=caveman-compress DEC-0073 caveman input-compression pair table.
7
+ --scope=readme-feature-coverage DEC-0074 README feature-coverage pair table.
8
+ --scope=downstream-ci-guard DEC-0075 downstream CI guard script pair table.
9
+ --scope=us-0092 DEC-0078 full-autonomy outer driver + probe surfaces.
10
+ --scope=us-0093 DEC-0079 browser UAT probe surfaces.
11
+ --scope=us-0095 DEC-0080 native in-chat auto-chain surfaces.
12
+ --scope=bug-0012 DEC-0081 native-chain compliance surfaces (BUG-0012).
13
+ --scope=us-0096 DEC-0082 delivery modes surfaces (US-0096).
14
+ --scope=project-readme DEC-0083 project README bootstrap surfaces (US-0097).
15
+ --scope=dev-environment DEC-0084 dev auto-launch profile surfaces (US-0098).
16
+ --scope=all union of all tables.
17
+ """
18
+
19
+ from __future__ import annotations
20
+
21
+ import argparse
22
+ import sys
23
+ from pathlib import Path
24
+
25
+ INTAKE_TEMPLATE_PAIRS: tuple[tuple[str, str], ...] = (
26
+ ("scripts/intake_evidence_validate.py", "template/scripts/intake_evidence_validate.py"),
27
+ ("scripts/intake_evidence_lib.py", "template/scripts/intake_evidence_lib.py"),
28
+ ("scripts/intake_bug_routing_guard.py", "template/scripts/intake_bug_routing_guard.py"),
29
+ ("scripts/intake_bug_resume_brief_refresh.py", "template/scripts/intake_bug_resume_brief_refresh.py"),
30
+ ("scripts/check_intake_template_parity.py", "template/scripts/check_intake_template_parity.py"),
31
+ )
32
+
33
+ # DEC-0073 §10 / US-0090 — Caveman input-compression surface pairs. Contents
34
+ # must be byte-identical between active and template paths; installer delivers
35
+ # template copies (BUG-0003 / DEC-0066).
36
+ CAVEMAN_COMPRESS_PAIRS: tuple[tuple[str, str], ...] = (
37
+ ("scripts/caveman_compress_input.py", "template/scripts/caveman_compress_input.py"),
38
+ ("docs/engineering/context/installer-owned-paths.manifest",
39
+ "template/docs/engineering/context/installer-owned-paths.manifest"),
40
+ ("docs/engineering/runbook.md", "template/docs/engineering/runbook.md"),
41
+ ("docs/engineering/auto-orchestration-reference.md",
42
+ "template/docs/engineering/auto-orchestration-reference.md"),
43
+ )
44
+
45
+ README_FEATURE_COVERAGE_PAIRS: tuple[tuple[str, str], ...] = (
46
+ (
47
+ "scripts/validate_readme_feature_coverage.py",
48
+ "template/scripts/validate_readme_feature_coverage.py",
49
+ ),
50
+ (
51
+ "scripts/readme_feature_coverage_lib.py",
52
+ "template/scripts/readme_feature_coverage_lib.py",
53
+ ),
54
+ (
55
+ "docs/engineering/context/readme-section-affinity.json",
56
+ "template/docs/engineering/context/readme-section-affinity.json",
57
+ ),
58
+ (".cursor/commands/release.md", "template/.cursor/commands/release.md"),
59
+ ("docs/engineering/runbook.md", "template/docs/engineering/runbook.md"),
60
+ (
61
+ "docs/engineering/context/installer-owned-paths.manifest",
62
+ "template/docs/engineering/context/installer-owned-paths.manifest",
63
+ ),
64
+ (
65
+ "scripts/check_intake_template_parity.py",
66
+ "template/scripts/check_intake_template_parity.py",
67
+ ),
68
+ )
69
+
70
+ US0092_PAIRS: tuple[tuple[str, str], ...] = (
71
+ ("scripts/auto_outer_driver.py", "template/scripts/auto_outer_driver.py"),
72
+ ("scripts/uat_probe_lib.py", "template/scripts/uat_probe_lib.py"),
73
+ (
74
+ "docs/engineering/context/installer-owned-paths.manifest",
75
+ "template/docs/engineering/context/installer-owned-paths.manifest",
76
+ ),
77
+ (".cursor/commands/auto.md", "template/.cursor/commands/auto.md"),
78
+ (".cursor/commands/verify-work.md", "template/.cursor/commands/verify-work.md"),
79
+ (".cursor/commands/qa.md", "template/.cursor/commands/qa.md"),
80
+ (
81
+ "docs/engineering/auto-orchestration-reference.md",
82
+ "template/docs/engineering/auto-orchestration-reference.md",
83
+ ),
84
+ ("docs/engineering/runbook.md", "template/docs/engineering/runbook.md"),
85
+ )
86
+
87
+ US0093_PAIRS: tuple[tuple[str, str], ...] = (
88
+ ("scripts/uat_probe_lib.py", "template/scripts/uat_probe_lib.py"),
89
+ (".cursor/commands/verify-work.md", "template/.cursor/commands/verify-work.md"),
90
+ (".cursor/commands/qa.md", "template/.cursor/commands/qa.md"),
91
+ (".cursor/commands/execute.md", "template/.cursor/commands/execute.md"),
92
+ (
93
+ ".cursor/scratchpad.local.example.md",
94
+ "template/.cursor/scratchpad.local.example.md",
95
+ ),
96
+ ("docs/engineering/runbook.md", "template/docs/engineering/runbook.md"),
97
+ (
98
+ "docs/engineering/auto-orchestration-reference.md",
99
+ "template/docs/engineering/auto-orchestration-reference.md",
100
+ ),
101
+ (
102
+ "docs/engineering/context/installer-owned-paths.manifest",
103
+ "template/docs/engineering/context/installer-owned-paths.manifest",
104
+ ),
105
+ )
106
+
107
+ US0095_PAIRS: tuple[tuple[str, str], ...] = (
108
+ (".cursor/commands/auto.md", "template/.cursor/commands/auto.md"),
109
+ (
110
+ "docs/engineering/auto-orchestration-reference.md",
111
+ "template/docs/engineering/auto-orchestration-reference.md",
112
+ ),
113
+ ("docs/engineering/runbook.md", "template/docs/engineering/runbook.md"),
114
+ ("README.md", "template/README.md"),
115
+ (
116
+ "scripts/check_intake_template_parity.py",
117
+ "template/scripts/check_intake_template_parity.py",
118
+ ),
119
+ )
120
+
121
+ BUG0012_PAIRS: tuple[tuple[str, str], ...] = (
122
+ (".cursor/commands/auto.md", "template/.cursor/commands/auto.md"),
123
+ (
124
+ "docs/engineering/auto-orchestration-reference.md",
125
+ "template/docs/engineering/auto-orchestration-reference.md",
126
+ ),
127
+ ("docs/engineering/runbook.md", "template/docs/engineering/runbook.md"),
128
+ (
129
+ "scripts/check_intake_template_parity.py",
130
+ "template/scripts/check_intake_template_parity.py",
131
+ ),
132
+ )
133
+
134
+ US0096_PAIRS: tuple[tuple[str, str], ...] = (
135
+ (
136
+ ".cursor/scratchpad.local.example.md",
137
+ "template/.cursor/scratchpad.local.example.md",
138
+ ),
139
+ (".cursor/commands/auto.md", "template/.cursor/commands/auto.md"),
140
+ (
141
+ "docs/engineering/auto-orchestration-reference.md",
142
+ "template/docs/engineering/auto-orchestration-reference.md",
143
+ ),
144
+ ("docs/engineering/runbook.md", "template/docs/engineering/runbook.md"),
145
+ (".cursor/commands/quick.md", "template/.cursor/commands/quick.md"),
146
+ (
147
+ "scripts/check_intake_template_parity.py",
148
+ "template/scripts/check_intake_template_parity.py",
149
+ ),
150
+ ("scripts/pack_json_validate.py", "template/scripts/pack_json_validate.py"),
151
+ )
152
+
153
+ PROJECT_README_PAIRS: tuple[tuple[str, str], ...] = (
154
+ (
155
+ "scripts/validate_project_readme_coverage.py",
156
+ "template/scripts/validate_project_readme_coverage.py",
157
+ ),
158
+ (
159
+ "scripts/project_readme_coverage_lib.py",
160
+ "template/scripts/project_readme_coverage_lib.py",
161
+ ),
162
+ (".cursor/commands/execute.md", "template/.cursor/commands/execute.md"),
163
+ (".cursor/commands/release.md", "template/.cursor/commands/release.md"),
164
+ ("docs/engineering/runbook.md", "template/docs/engineering/runbook.md"),
165
+ (
166
+ "docs/engineering/context/installer-owned-paths.manifest",
167
+ "template/docs/engineering/context/installer-owned-paths.manifest",
168
+ ),
169
+ (
170
+ ".cursor/scratchpad.local.example.md",
171
+ "template/.cursor/scratchpad.local.example.md",
172
+ ),
173
+ (
174
+ "scripts/check_intake_template_parity.py",
175
+ "template/scripts/check_intake_template_parity.py",
176
+ ),
177
+ )
178
+
179
+ DEV_ENVIRONMENT_PAIRS: tuple[tuple[str, str], ...] = (
180
+ (".cursor/commands/execute.md", "template/.cursor/commands/execute.md"),
181
+ (".cursor/scratchpad.md", "template/.cursor/scratchpad.md"),
182
+ (
183
+ ".cursor/scratchpad.local.example.md",
184
+ "template/.cursor/scratchpad.local.example.md",
185
+ ),
186
+ (
187
+ "template/.cursor/dev-environment.json.example",
188
+ "template/.cursor/dev-environment.json.example",
189
+ ),
190
+ (
191
+ "scripts/dev_environment_lib.py",
192
+ "template/scripts/dev_environment_lib.py",
193
+ ),
194
+ ("docs/engineering/runbook.md", "template/docs/engineering/runbook.md"),
195
+ (
196
+ "docs/engineering/auto-orchestration-reference.md",
197
+ "template/docs/engineering/auto-orchestration-reference.md",
198
+ ),
199
+ (
200
+ "scripts/check_intake_template_parity.py",
201
+ "template/scripts/check_intake_template_parity.py",
202
+ ),
203
+ )
204
+
205
+ RELEASE_CHANGELOG_PAIRS: tuple[tuple[str, str], ...] = (
206
+ (
207
+ "scripts/release_changelog_lib.py",
208
+ "template/scripts/release_changelog_lib.py",
209
+ ),
210
+ (
211
+ "scripts/release_changelog_validate.py",
212
+ "template/scripts/release_changelog_validate.py",
213
+ ),
214
+ (
215
+ "scripts/release_changelog_backfill.py",
216
+ "template/scripts/release_changelog_backfill.py",
217
+ ),
218
+ ("CHANGELOG.md", "template/CHANGELOG.md"),
219
+ (".cursor/commands/release.md", "template/.cursor/commands/release.md"),
220
+ ("scripts/release-all.sh", "template/scripts/release-all.sh"),
221
+ (
222
+ "template/handoffs/releases/vX.Y.Z-release-notes.md.example",
223
+ "template/handoffs/releases/vX.Y.Z-release-notes.md.example",
224
+ ),
225
+ (
226
+ "scripts/check_intake_template_parity.py",
227
+ "template/scripts/check_intake_template_parity.py",
228
+ ),
229
+ )
230
+
231
+ DOWNSTREAM_CI_GUARD_PAIRS: tuple[tuple[str, str], ...] = (
232
+ (
233
+ "scripts/check_downstream_ci_guard.py",
234
+ "template/scripts/check_downstream_ci_guard.py",
235
+ ),
236
+ (
237
+ "scripts/downstream_ci_guard_lib.py",
238
+ "template/scripts/downstream_ci_guard_lib.py",
239
+ ),
240
+ )
241
+
242
+ SCOPES: dict[str, tuple[tuple[str, str], ...]] = {
243
+ "intake": INTAKE_TEMPLATE_PAIRS,
244
+ "caveman-compress": CAVEMAN_COMPRESS_PAIRS,
245
+ "readme-feature-coverage": README_FEATURE_COVERAGE_PAIRS,
246
+ "downstream-ci-guard": DOWNSTREAM_CI_GUARD_PAIRS,
247
+ "us-0092": US0092_PAIRS,
248
+ "us-0093": US0093_PAIRS,
249
+ "us-0095": US0095_PAIRS,
250
+ "bug-0012": BUG0012_PAIRS,
251
+ "us-0096": US0096_PAIRS,
252
+ "project-readme": PROJECT_README_PAIRS,
253
+ "dev-environment": DEV_ENVIRONMENT_PAIRS,
254
+ "release-changelog": RELEASE_CHANGELOG_PAIRS,
255
+ "all": (
256
+ INTAKE_TEMPLATE_PAIRS
257
+ + CAVEMAN_COMPRESS_PAIRS
258
+ + README_FEATURE_COVERAGE_PAIRS
259
+ + DOWNSTREAM_CI_GUARD_PAIRS
260
+ + US0092_PAIRS
261
+ + US0093_PAIRS
262
+ + US0095_PAIRS
263
+ + BUG0012_PAIRS
264
+ + US0096_PAIRS
265
+ + PROJECT_README_PAIRS
266
+ + DEV_ENVIRONMENT_PAIRS
267
+ + RELEASE_CHANGELOG_PAIRS
268
+ ),
269
+ }
270
+
271
+
272
+ def main() -> int:
273
+ p = argparse.ArgumentParser(description=__doc__)
274
+ p.add_argument(
275
+ "--repo",
276
+ type=Path,
277
+ default=Path(__file__).resolve().parent.parent,
278
+ help="Repository root",
279
+ )
280
+ p.add_argument(
281
+ "--scope",
282
+ choices=sorted(SCOPES.keys()),
283
+ default="intake",
284
+ help="Parity pair table to verify.",
285
+ )
286
+ args = p.parse_args()
287
+ root: Path = args.repo
288
+ pairs = SCOPES[args.scope]
289
+ failed = False
290
+ for rel_active, rel_tpl in pairs:
291
+ a = root / rel_active
292
+ t = root / rel_tpl
293
+ if not a.is_file() or not t.is_file():
294
+ print(f"[INTAKE_TEMPLATE_PARITY_ERROR] missing file: {rel_active} or {rel_tpl}")
295
+ failed = True
296
+ continue
297
+ ba = a.read_bytes()
298
+ bt = t.read_bytes()
299
+ if ba != bt:
300
+ print(
301
+ f"[INTAKE_TEMPLATE_PARITY_ERROR] mismatch: {rel_active} ({len(ba)}b) "
302
+ f"!= {rel_tpl} ({len(bt)}b)"
303
+ )
304
+ failed = True
305
+ if failed:
306
+ return 2
307
+ print(f"[INTAKE_TEMPLATE_PARITY_OK] scope={args.scope}")
308
+ return 0
309
+
310
+
311
+ if __name__ == "__main__":
312
+ sys.exit(main())
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env python3
2
+ """Verify active vs template/ bytes match for DEC-0062 token-cost parity manifest paths."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import re
8
+ import sys
9
+ from pathlib import Path
10
+
11
+ _PAIR_RE = re.compile(r"`([^`]+)`\s*→\s*`([^`]+)`")
12
+
13
+
14
+ def load_pairs(manifest_text: str) -> list[tuple[Path, Path]]:
15
+ pairs: list[tuple[Path, Path]] = []
16
+ for line in manifest_text.splitlines():
17
+ line = line.strip()
18
+ if not line.startswith("- "):
19
+ continue
20
+ m = _PAIR_RE.search(line)
21
+ if not m:
22
+ continue
23
+ pairs.append((Path(m.group(1)), Path(m.group(2))))
24
+ return pairs
25
+
26
+
27
+ def main() -> int:
28
+ p = argparse.ArgumentParser(description=__doc__)
29
+ p.add_argument(
30
+ "--repo",
31
+ type=Path,
32
+ default=Path(__file__).resolve().parent.parent,
33
+ help="Repository root",
34
+ )
35
+ args = p.parse_args()
36
+ root: Path = args.repo
37
+ manifest = root / "docs/engineering/token-cost-parity-manifest.md"
38
+ if not manifest.is_file():
39
+ print(f"[TOKEN_COST_PARITY_ERROR] missing manifest: {manifest}")
40
+ return 2
41
+ text = manifest.read_text(encoding="utf-8")
42
+ pairs = load_pairs(text)
43
+ if not pairs:
44
+ print("[TOKEN_COST_PARITY_ERROR] no path pairs parsed from manifest")
45
+ return 2
46
+ failed = False
47
+ for rel_active, rel_tpl in pairs:
48
+ a = root / rel_active
49
+ t = root / rel_tpl
50
+ if not a.is_file() or not t.is_file():
51
+ print(f"[TOKEN_COST_PARITY_ERROR] missing file: {rel_active} or {rel_tpl}")
52
+ failed = True
53
+ continue
54
+ ba = a.read_bytes()
55
+ bt = t.read_bytes()
56
+ if ba != bt:
57
+ print(
58
+ f"[TOKEN_COST_PARITY_ERROR] mismatch: {rel_active} ({len(ba)}b) "
59
+ f"!= {rel_tpl} ({len(bt)}b)"
60
+ )
61
+ failed = True
62
+ if failed:
63
+ return 2
64
+ print("[TOKEN_COST_PARITY_OK]")
65
+ return 0
66
+
67
+
68
+ if __name__ == "__main__":
69
+ sys.exit(main())