agentic-dev 0.2.11 → 0.2.12

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 (314) hide show
  1. package/README.md +53 -46
  2. package/package.json +8 -22
  3. package/.agent/prd.json +0 -29
  4. package/.agent/progress.txt +0 -1
  5. package/.agent/prompt.md +0 -21
  6. package/.agent/ralph-loop-state.json +0 -13
  7. package/.agent/ralph-supervisor-state.json +0 -12
  8. package/.agent/ralph-supervisor.sh +0 -238
  9. package/.agent/ralph.sh +0 -305
  10. package/.agent/runs/README.md +0 -7
  11. package/.agent/sdd-build-ast-audit.json +0 -13
  12. package/.claude/CLAUDE.md +0 -44
  13. package/.claude/agentic-dev.json +0 -3
  14. package/.claude/agents/ai-dev.md +0 -27
  15. package/.claude/agents/backend-dev.md +0 -26
  16. package/.claude/agents/db-dev.md +0 -26
  17. package/.claude/agents/devops.md +0 -27
  18. package/.claude/agents/frontend-dev.md +0 -25
  19. package/.claude/agents/github-ops.md +0 -25
  20. package/.claude/agents/test-dev.md +0 -26
  21. package/.claude/agents/uiux-designer.md +0 -25
  22. package/.claude/settings.json +0 -49
  23. package/.claude/settings.local.json +0 -8
  24. package/.claude/skills/sdd/SKILL.md +0 -189
  25. package/.claude/skills/sdd/agents/openai.yaml +0 -4
  26. package/.claude/skills/sdd/references/section-map.md +0 -67
  27. package/.claude/workspace-config.json +0 -3
  28. package/.codex/agentic-dev.json +0 -3
  29. package/.codex/agents/README.md +0 -22
  30. package/.codex/agents/api.toml +0 -11
  31. package/.codex/agents/architecture.toml +0 -11
  32. package/.codex/agents/ci.toml +0 -11
  33. package/.codex/agents/gitops.toml +0 -11
  34. package/.codex/agents/orchestrator.toml +0 -11
  35. package/.codex/agents/quality.toml +0 -11
  36. package/.codex/agents/runtime.toml +0 -11
  37. package/.codex/agents/security.toml +0 -11
  38. package/.codex/agents/specs.toml +0 -11
  39. package/.codex/agents/ui.toml +0 -11
  40. package/.codex/config.toml +0 -46
  41. package/.codex/skills/SKILL.md +0 -13
  42. package/.codex/skills/sdd/SKILL.md +0 -189
  43. package/.codex/skills/sdd/agents/openai.yaml +0 -4
  44. package/.codex/skills/sdd/references/section-map.md +0 -67
  45. package/.dockerignore +0 -8
  46. package/.env.example +0 -50
  47. package/.gitignore +0 -16
  48. package/AGENTS.md +0 -86
  49. package/SDD_SKILL.md +0 -589
  50. package/compose.yml +0 -206
  51. package/infra/compose/.env.dev.example +0 -28
  52. package/infra/compose/.env.prod.example +0 -29
  53. package/infra/compose/README.md +0 -35
  54. package/infra/compose/dev.yml +0 -125
  55. package/infra/compose/prod.yml +0 -126
  56. package/infra/terraform/README.md +0 -34
  57. package/infra/terraform/aws/data/.terraform.lock.hcl +0 -25
  58. package/infra/terraform/aws/data/README.md +0 -18
  59. package/infra/terraform/aws/data/main.tf +0 -147
  60. package/infra/terraform/aws/data/outputs.tf +0 -14
  61. package/infra/terraform/aws/data/variables.tf +0 -57
  62. package/infra/terraform/aws/data/versions.tf +0 -10
  63. package/infra/terraform/aws/domain/.terraform.lock.hcl +0 -25
  64. package/infra/terraform/aws/domain/README.md +0 -20
  65. package/infra/terraform/aws/domain/env/dev.tfvars.example +0 -6
  66. package/infra/terraform/aws/domain/env/prod.tfvars.example +0 -7
  67. package/infra/terraform/aws/domain/main.tf +0 -149
  68. package/infra/terraform/aws/domain/outputs.tf +0 -29
  69. package/infra/terraform/aws/domain/variables.tf +0 -58
  70. package/infra/terraform/aws/domain/versions.tf +0 -10
  71. package/infra/terraform/openstack/README.md +0 -38
  72. package/infra/terraform/openstack/dev/.terraform.lock.hcl +0 -24
  73. package/infra/terraform/openstack/dev/README.md +0 -18
  74. package/infra/terraform/openstack/dev/main.tf +0 -49
  75. package/infra/terraform/openstack/dev/providers.tf +0 -15
  76. package/infra/terraform/openstack/dev/terraform.tfvars.example +0 -54
  77. package/infra/terraform/openstack/dev/variables.tf +0 -210
  78. package/infra/terraform/openstack/dev/versions.tf +0 -10
  79. package/infra/terraform/openstack/modules/environment_host/main.tf +0 -143
  80. package/infra/terraform/openstack/modules/environment_host/outputs.tf +0 -25
  81. package/infra/terraform/openstack/modules/environment_host/templates/docker-host-user-data.sh.tftpl +0 -40
  82. package/infra/terraform/openstack/modules/environment_host/variables.tf +0 -145
  83. package/infra/terraform/openstack/modules/environment_host/versions.tf +0 -7
  84. package/infra/terraform/openstack/prod/.terraform.lock.hcl +0 -24
  85. package/infra/terraform/openstack/prod/README.md +0 -18
  86. package/infra/terraform/openstack/prod/main.tf +0 -49
  87. package/infra/terraform/openstack/prod/providers.tf +0 -15
  88. package/infra/terraform/openstack/prod/terraform.tfvars.example +0 -55
  89. package/infra/terraform/openstack/prod/variables.tf +0 -210
  90. package/infra/terraform/openstack/prod/versions.tf +0 -10
  91. package/infra/terraform/openstack/server/.terraform.lock.hcl +0 -45
  92. package/infra/terraform/openstack/server/README.md +0 -47
  93. package/infra/terraform/openstack/server/main.tf +0 -161
  94. package/infra/terraform/openstack/server/outputs.tf +0 -30
  95. package/infra/terraform/openstack/server/providers.tf +0 -30
  96. package/infra/terraform/openstack/server/templates/server-user-data.sh.tftpl +0 -50
  97. package/infra/terraform/openstack/server/variables.tf +0 -233
  98. package/infra/terraform/openstack/server/zz_aspace.auto.tfvars.example.json +0 -29
  99. package/pnpm-workspace.yaml +0 -2
  100. package/scripts/dev/audit_sdd_build_ast.py +0 -277
  101. package/sdd/01_planning/01_feature/INDEX.md +0 -16
  102. package/sdd/01_planning/01_feature/README.md +0 -76
  103. package/sdd/01_planning/01_feature/alerts_feature_spec.md +0 -55
  104. package/sdd/01_planning/01_feature/auth_feature_spec.md +0 -57
  105. package/sdd/01_planning/01_feature/catalog_feature_spec.md +0 -61
  106. package/sdd/01_planning/01_feature/fulfillment_feature_spec.md +0 -58
  107. package/sdd/01_planning/01_feature/health_feature_spec.md +0 -52
  108. package/sdd/01_planning/01_feature/inventory_feature_spec.md +0 -60
  109. package/sdd/01_planning/01_feature/order_feature_spec.md +0 -63
  110. package/sdd/01_planning/01_feature/shipping_feature_spec.md +0 -55
  111. package/sdd/01_planning/01_feature/support_feature_spec.md +0 -53
  112. package/sdd/01_planning/01_feature/user_feature_spec.md +0 -54
  113. package/sdd/01_planning/02_screen/INDEX.md +0 -13
  114. package/sdd/01_planning/02_screen/README.md +0 -41
  115. package/sdd/01_planning/02_screen/admin_screen_spec.pdf +0 -0
  116. package/sdd/01_planning/02_screen/assets/README.md +0 -16
  117. package/sdd/01_planning/02_screen/assets/example/README.md +0 -13
  118. package/sdd/01_planning/02_screen/landing_screen_spec.pdf +0 -0
  119. package/sdd/01_planning/02_screen/mobile_screen_spec.pdf +0 -0
  120. package/sdd/01_planning/02_screen/web_screen_spec.pdf +0 -0
  121. package/sdd/01_planning/03_architecture/INDEX.md +0 -9
  122. package/sdd/01_planning/03_architecture/README.md +0 -25
  123. package/sdd/01_planning/03_architecture/architecture_document_structure.md +0 -77
  124. package/sdd/01_planning/03_architecture/backend/README.md +0 -10
  125. package/sdd/01_planning/03_architecture/frontend/README.md +0 -12
  126. package/sdd/01_planning/03_architecture/infra/README.md +0 -10
  127. package/sdd/01_planning/03_architecture/tech-research/README.md +0 -4
  128. package/sdd/01_planning/03_architecture/templates_system_architecture.md +0 -84
  129. package/sdd/01_planning/04_data/INDEX.md +0 -4
  130. package/sdd/01_planning/04_data/README.md +0 -10
  131. package/sdd/01_planning/04_data/templates_data_modeling.md +0 -119
  132. package/sdd/01_planning/05_api/README.md +0 -12
  133. package/sdd/01_planning/05_api/templates_api_contract.md +0 -90
  134. package/sdd/01_planning/06_iac/README.md +0 -11
  135. package/sdd/01_planning/06_iac/templates_runtime_and_cicd_baseline.md +0 -46
  136. package/sdd/01_planning/07_integration/README.md +0 -11
  137. package/sdd/01_planning/07_integration/templates_frontend_api_integration.md +0 -46
  138. package/sdd/01_planning/08_nonfunctional/README.md +0 -7
  139. package/sdd/01_planning/09_security/README.md +0 -7
  140. package/sdd/01_planning/10_test/README.md +0 -12
  141. package/sdd/01_planning/10_test/templates_test_strategy.md +0 -60
  142. package/sdd/01_planning/INDEX.md +0 -19
  143. package/sdd/01_planning/README.md +0 -17
  144. package/sdd/02_plan/01_feature/README.md +0 -34
  145. package/sdd/02_plan/01_feature/_feature_todo_template.md +0 -29
  146. package/sdd/02_plan/02_screen/INDEX.md +0 -19
  147. package/sdd/02_plan/02_screen/README.md +0 -39
  148. package/sdd/02_plan/02_screen/_screen_todo_template.md +0 -60
  149. package/sdd/02_plan/03_architecture/README.md +0 -23
  150. package/sdd/02_plan/03_architecture/architecture_document_governance.md +0 -40
  151. package/sdd/02_plan/03_architecture/build_ast_runtime_tree_governance.md +0 -53
  152. package/sdd/02_plan/03_architecture/repository_governance.md +0 -39
  153. package/sdd/02_plan/03_architecture/runtime_and_structure_governance.md +0 -38
  154. package/sdd/02_plan/03_architecture/templates-hexagonal-template-architecture.md +0 -9
  155. package/sdd/02_plan/03_architecture/toolchain_governance.md +0 -98
  156. package/sdd/02_plan/04_data/README.md +0 -5
  157. package/sdd/02_plan/05_api/README.md +0 -5
  158. package/sdd/02_plan/06_iac/README.md +0 -11
  159. package/sdd/02_plan/06_iac/dev_runtime_delivery.md +0 -36
  160. package/sdd/02_plan/06_iac/template_runtime_delivery.md +0 -50
  161. package/sdd/02_plan/07_integration/README.md +0 -5
  162. package/sdd/02_plan/07_integration/frontend_live_integration.md +0 -31
  163. package/sdd/02_plan/08_nonfunctional/README.md +0 -5
  164. package/sdd/02_plan/08_nonfunctional/repository_hygiene.md +0 -26
  165. package/sdd/02_plan/09_security/README.md +0 -5
  166. package/sdd/02_plan/10_test/README.md +0 -11
  167. package/sdd/02_plan/10_test/regression_verification.md +0 -39
  168. package/sdd/02_plan/10_test/templates/README.md +0 -8
  169. package/sdd/02_plan/10_test/templates/ui_parity_web_contract.template.yaml +0 -23
  170. package/sdd/02_plan/10_test/verification_strategy.md +0 -43
  171. package/sdd/02_plan/99_generated/from_planning/ui_parity/.gitkeep +0 -1
  172. package/sdd/02_plan/README.md +0 -40
  173. package/sdd/03_build/01_feature/README.md +0 -20
  174. package/sdd/03_build/01_feature/domain/README.md +0 -3
  175. package/sdd/03_build/01_feature/domain/account_and_access.md +0 -20
  176. package/sdd/03_build/01_feature/domain/catalog_and_inventory.md +0 -20
  177. package/sdd/03_build/01_feature/domain/ordering_and_fulfillment.md +0 -21
  178. package/sdd/03_build/01_feature/domain/support_and_observability.md +0 -21
  179. package/sdd/03_build/01_feature/domain_surfaces.md +0 -28
  180. package/sdd/03_build/01_feature/service/README.md +0 -3
  181. package/sdd/03_build/01_feature/service/admin_surface.md +0 -15
  182. package/sdd/03_build/01_feature/service/landing_surface.md +0 -13
  183. package/sdd/03_build/01_feature/service/mobile_surface.md +0 -14
  184. package/sdd/03_build/01_feature/service/web_surface.md +0 -14
  185. package/sdd/03_build/02_screen/README.md +0 -25
  186. package/sdd/03_build/02_screen/_screen_build_template.md +0 -26
  187. package/sdd/03_build/02_screen/admin/README.md +0 -5
  188. package/sdd/03_build/02_screen/landing/README.md +0 -5
  189. package/sdd/03_build/02_screen/mobile/README.md +0 -5
  190. package/sdd/03_build/02_screen/web/README.md +0 -5
  191. package/sdd/03_build/03_architecture/README.md +0 -10
  192. package/sdd/03_build/03_architecture/architecture_document_governance.md +0 -30
  193. package/sdd/03_build/03_architecture/build_ast_runtime_tree_governance.md +0 -24
  194. package/sdd/03_build/03_architecture/repository_governance.md +0 -18
  195. package/sdd/03_build/03_architecture/toolchain_governance.md +0 -36
  196. package/sdd/03_build/06_iac/README.md +0 -3
  197. package/sdd/03_build/06_iac/dev_runtime_delivery.md +0 -10
  198. package/sdd/03_build/06_iac/template_runtime_delivery.md +0 -49
  199. package/sdd/03_build/07_integration/README.md +0 -3
  200. package/sdd/03_build/07_integration/frontend_live_integration.md +0 -11
  201. package/sdd/03_build/08_nonfunctional/README.md +0 -3
  202. package/sdd/03_build/08_nonfunctional/repository_hygiene.md +0 -10
  203. package/sdd/03_build/10_test/README.md +0 -9
  204. package/sdd/03_build/10_test/regression_verification.md +0 -16
  205. package/sdd/03_build/10_test/verification_harness.md +0 -11
  206. package/sdd/03_build/README.md +0 -35
  207. package/sdd/03_verify/01_feature/README.md +0 -5
  208. package/sdd/03_verify/01_feature/domain_verification.md +0 -14
  209. package/sdd/03_verify/01_feature/service_verification.md +0 -22
  210. package/sdd/03_verify/02_screen/README.md +0 -6
  211. package/sdd/03_verify/02_screen/_screen_verify_template.md +0 -20
  212. package/sdd/03_verify/02_screen/admin/README.md +0 -4
  213. package/sdd/03_verify/02_screen/landing/README.md +0 -4
  214. package/sdd/03_verify/02_screen/mobile/README.md +0 -4
  215. package/sdd/03_verify/02_screen/web/README.md +0 -4
  216. package/sdd/03_verify/03_architecture/README.md +0 -10
  217. package/sdd/03_verify/03_architecture/architecture_document_governance.md +0 -15
  218. package/sdd/03_verify/03_architecture/build_ast_runtime_tree_governance.md +0 -28
  219. package/sdd/03_verify/03_architecture/repository_governance.md +0 -16
  220. package/sdd/03_verify/03_architecture/toolchain_governance.md +0 -58
  221. package/sdd/03_verify/06_iac/README.md +0 -3
  222. package/sdd/03_verify/06_iac/dev_runtime_delivery.md +0 -10
  223. package/sdd/03_verify/06_iac/template_runtime_delivery.md +0 -42
  224. package/sdd/03_verify/07_integration/README.md +0 -3
  225. package/sdd/03_verify/07_integration/frontend_live_integration.md +0 -16
  226. package/sdd/03_verify/08_nonfunctional/README.md +0 -3
  227. package/sdd/03_verify/08_nonfunctional/repository_hygiene.md +0 -14
  228. package/sdd/03_verify/10_test/README.md +0 -9
  229. package/sdd/03_verify/10_test/regression_verification.md +0 -16
  230. package/sdd/03_verify/10_test/ui_parity/README.md +0 -4
  231. package/sdd/03_verify/10_test/ui_parity/loop_runs/.gitkeep +0 -0
  232. package/sdd/03_verify/10_test/ui_parity/reference/.gitkeep +0 -0
  233. package/sdd/03_verify/10_test/ui_parity/staged_runs/.gitkeep +0 -0
  234. package/sdd/03_verify/10_test/verification_harness.md +0 -17
  235. package/sdd/03_verify/README.md +0 -22
  236. package/sdd/05_operate/01_runbooks/.gitkeep +0 -1
  237. package/sdd/05_operate/01_runbooks/README.md +0 -4
  238. package/sdd/05_operate/02_delivery_status/README.md +0 -4
  239. package/sdd/05_operate/02_delivery_status/service_status.md +0 -16
  240. package/sdd/05_operate/README.md +0 -12
  241. package/sdd/99_toolchain/01_automation/.gitkeep +0 -1
  242. package/sdd/99_toolchain/01_automation/README.md +0 -76
  243. package/sdd/99_toolchain/01_automation/agentic-dev/analyze_proof_results.py +0 -132
  244. package/sdd/99_toolchain/01_automation/agentic-dev/analyze_route_gap.py +0 -85
  245. package/sdd/99_toolchain/01_automation/agentic-dev/assets/repo-contract.template.json +0 -75
  246. package/sdd/99_toolchain/01_automation/agentic-dev/bootstrap_frontend_parity.sh +0 -84
  247. package/sdd/99_toolchain/01_automation/agentic-dev/init_frontend_parity.sh +0 -33
  248. package/sdd/99_toolchain/01_automation/agentic-dev/init_repo_contract.sh +0 -51
  249. package/sdd/99_toolchain/01_automation/agentic-dev/repo-contract.json +0 -76
  250. package/sdd/99_toolchain/01_automation/agentic-dev/resolve_frontend_target.py +0 -52
  251. package/sdd/99_toolchain/01_automation/agentic-dev/resolve_repo_contract.py +0 -56
  252. package/sdd/99_toolchain/01_automation/agentic-dev/run_frontend_target.sh +0 -100
  253. package/sdd/99_toolchain/01_automation/agentic-dev/run_repo_phase.sh +0 -140
  254. package/sdd/99_toolchain/01_automation/agentic-dev/validate_json_schema.py +0 -39
  255. package/sdd/99_toolchain/01_automation/agentic-parity-harness-design.md +0 -291
  256. package/sdd/99_toolchain/01_automation/assets/admin_screen_capture/dashboard.png +0 -0
  257. package/sdd/99_toolchain/01_automation/assets/admin_screen_capture/login.png +0 -0
  258. package/sdd/99_toolchain/01_automation/assets/admin_screen_capture/queue.png +0 -0
  259. package/sdd/99_toolchain/01_automation/assets/admin_screen_capture/support.png +0 -0
  260. package/sdd/99_toolchain/01_automation/assets/landing_screen_capture/home.png +0 -0
  261. package/sdd/99_toolchain/01_automation/assets/landing_screen_capture/login.png +0 -0
  262. package/sdd/99_toolchain/01_automation/assets/landing_screen_capture/workspace.png +0 -0
  263. package/sdd/99_toolchain/01_automation/assets/mobile_screen_capture/dashboard.png +0 -0
  264. package/sdd/99_toolchain/01_automation/assets/mobile_screen_capture/fulfillment.png +0 -0
  265. package/sdd/99_toolchain/01_automation/assets/mobile_screen_capture/login.png +0 -0
  266. package/sdd/99_toolchain/01_automation/assets/web_screen_capture/dashboard.png +0 -0
  267. package/sdd/99_toolchain/01_automation/assets/web_screen_capture/login.png +0 -0
  268. package/sdd/99_toolchain/01_automation/assets/web_screen_capture/orders.png +0 -0
  269. package/sdd/99_toolchain/01_automation/build_asset_recipes.py +0 -10
  270. package/sdd/99_toolchain/01_automation/build_screen_spec_pdf.py +0 -427
  271. package/sdd/99_toolchain/01_automation/capture_screen_assets.mjs +0 -148
  272. package/sdd/99_toolchain/01_automation/harness-layout.md +0 -34
  273. package/sdd/99_toolchain/01_automation/parity-execution-tooling-design.md +0 -319
  274. package/sdd/99_toolchain/01_automation/playwright_exactness_manifest.py +0 -21
  275. package/sdd/99_toolchain/01_automation/run_playwright_exactness.py +0 -87
  276. package/sdd/99_toolchain/01_automation/screen_spec_manifest.py +0 -321
  277. package/sdd/99_toolchain/01_automation/spec_asset_builder.py +0 -274
  278. package/sdd/99_toolchain/01_automation/ui-contract-projection.md +0 -79
  279. package/sdd/99_toolchain/01_automation/ui-parity/README.md +0 -60
  280. package/sdd/99_toolchain/01_automation/ui-parity/cli/extract-reference-pages.mjs +0 -2
  281. package/sdd/99_toolchain/01_automation/ui-parity/cli/materialize-reference-assets.mjs +0 -58
  282. package/sdd/99_toolchain/01_automation/ui-parity/cli/normalize-reference-assets.mjs +0 -2
  283. package/sdd/99_toolchain/01_automation/ui-parity/cli/route-gap-report.mjs +0 -187
  284. package/sdd/99_toolchain/01_automation/ui-parity/cli/run-proof.mjs +0 -50
  285. package/sdd/99_toolchain/01_automation/ui-parity/cli/scaffold-contract.mjs +0 -62
  286. package/sdd/99_toolchain/01_automation/ui-parity/cli/upload-parity1.mjs +0 -2
  287. package/sdd/99_toolchain/01_automation/ui-parity/contracts/collector-metadata.schema.json +0 -33
  288. package/sdd/99_toolchain/01_automation/ui-parity/contracts/proof-result.schema.json +0 -76
  289. package/sdd/99_toolchain/01_automation/ui-parity/contracts/route-gap-report.schema.json +0 -95
  290. package/sdd/99_toolchain/01_automation/ui-parity/core/capture-runner.mjs +0 -55
  291. package/sdd/99_toolchain/01_automation/ui-parity/core/load-adapter.mjs +0 -25
  292. package/sdd/99_toolchain/01_automation/ui-parity/core/load-contract.mjs +0 -81
  293. package/sdd/99_toolchain/01_automation/ui-parity/core/paths.mjs +0 -23
  294. package/sdd/99_toolchain/01_automation/ui-parity/core/proof-runner.mjs +0 -255
  295. package/sdd/99_toolchain/01_automation/ui-parity/interfaces/ui-parity-artifact-layout.md +0 -23
  296. package/sdd/99_toolchain/01_automation/ui-parity/interfaces/ui-parity-proof-interface.md +0 -60
  297. package/sdd/99_toolchain/01_automation/ui-parity/interfaces/ui-parity-route-gap-interface.md +0 -82
  298. package/sdd/99_toolchain/01_automation/ui-parity/runtime/playwright-runtime.mjs +0 -16
  299. package/sdd/99_toolchain/01_automation/ui-parity/runtime/static-runtime.mjs +0 -6
  300. package/sdd/99_toolchain/02_policies/.gitkeep +0 -1
  301. package/sdd/99_toolchain/02_policies/build-ast-governance-policy.md +0 -22
  302. package/sdd/99_toolchain/02_policies/compose-runtime-baseline-policy.md +0 -24
  303. package/sdd/99_toolchain/02_policies/convention-storage-policy.md +0 -26
  304. package/sdd/99_toolchain/02_policies/main-push-before-dev-deploy-policy.md +0 -27
  305. package/sdd/99_toolchain/02_policies/regression-verification-policy.md +0 -22
  306. package/sdd/99_toolchain/03_templates/.gitkeep +0 -1
  307. package/sdd/99_toolchain/03_templates/asset_recipe_manifest.example.py +0 -38
  308. package/sdd/99_toolchain/03_templates/generated_assets/README.md +0 -11
  309. package/sdd/99_toolchain/03_templates/generated_assets/example-brand-lockup.svg +0 -3
  310. package/sdd/99_toolchain/03_templates/generated_assets/example-brand-mark.svg +0 -3
  311. package/sdd/99_toolchain/03_templates/generated_assets/example-brand-wordmark.svg +0 -3
  312. package/sdd/99_toolchain/03_templates/playwright_exactness_manifest.example.py +0 -21
  313. package/sdd/99_toolchain/README.md +0 -23
  314. package/sdd/README.md +0 -21
@@ -1,9 +0,0 @@
1
- # Test Verification
2
-
3
- - 반복 사용하는 검증 harness summary를 유지한다.
4
- - regression verification summary도 같은 section에서 유지한다.
5
-
6
- ## Current Documents
7
-
8
- - [verification_harness.md](verification_harness.md)
9
- - [regression_verification.md](regression_verification.md)
@@ -1,16 +0,0 @@
1
- # regression verification
2
-
3
- ## Status
4
-
5
- - pass
6
-
7
- ## Retained Checks
8
-
9
- - `sdd/02_plan/10_test/regression_verification.md`가 current regression scope baseline으로 추가됐다.
10
- - `AGENTS.md`, `.codex/skills/sdd/SKILL.md`, `sdd/99_toolchain/01_automation/README.md`가 direct-only verification 금지와 selected regression surface 기록 규칙을 함께 유지한다.
11
- - `sdd/03_build/10_test/regression_verification.md`가 template workflow 반영 상태를 current-state로 설명한다.
12
- - screen exact automation gate가 Playwright인 경우 suite id, toolchain runner command, artifact path를 retained check에 함께 남긴다.
13
-
14
- ## Residual Risk
15
-
16
- - regression scope selection은 아직 자동 selector가 없어서 문서 규칙과 reviewer 판단에 의존한다.
@@ -1,4 +0,0 @@
1
- # UI Parity Artifacts
2
-
3
- - UI parity reference asset과 proof output의 current durable 위치다.
4
- - latest-named artifact를 같은 경로에서 덮어써 유지한다.
@@ -1,17 +0,0 @@
1
- # verification harness
2
-
3
- ## Status
4
-
5
- - pass
6
-
7
- ## Retained Checks
8
-
9
- - verify harness는 stable current artifact path를 사용한다.
10
- - UI parity reference asset과 proof output은 current durable location을 사용한다.
11
- - screen local exactness는 `python3 sdd/99_toolchain/01_automation/run_playwright_exactness.py --suite <suite-id> --base-url <url>`를 canonical harness entrypoint로 사용한다.
12
- - regression verification scope는 별도 durable baseline에서 선택하고, harness는 selected surface 중 automation 가능한 slice를 담당한다.
13
-
14
- ## Residual Risk
15
-
16
- - harness CLI default path가 legacy verify folder를 다시 가리키면 drift가 생긴다.
17
- - regression surface selector 자동화가 없어 shared-impact 판정은 문서와 reviewer 판단에 의존한다.
@@ -1,22 +0,0 @@
1
- # Verify Governance
2
-
3
- ## Purpose
4
-
5
- - `sdd/03_verify/`는 현재 구현 상태에 대한 retained verification을 durable 문서로 유지하는 루트다.
6
- - 날짜별 gate/test log를 쌓지 않고, 현재 기준의 pass/fail 상태와 residual risk만 남긴다.
7
-
8
- ## Canonical Rule
9
-
10
- - `03_verify`는 `02_plan`, `03_build`와 같은 section 축을 따른다.
11
- - feature, screen, architecture, IAC, test surface별 verification summary를 같은 파일에서 갱신한다.
12
- - history성 gate/test 로그는 `03_verify`에 두지 않는다.
13
-
14
- ## Sections
15
-
16
- - `01_feature/`: feature 범주별 retained verification summary
17
- - `02_screen/`: screen별 retained verification summary
18
- - `03_architecture/`: 거버넌스/구조 관련 verification summary
19
- - `06_iac/`: delivery/runtime verification summary
20
- - `07_integration/`: integration verification summary
21
- - `08_nonfunctional/`: nonfunctional verification summary
22
- - `10_test/`: 반복 사용하는 검증 harness summary
@@ -1 +0,0 @@
1
-
@@ -1,4 +0,0 @@
1
- # Runbooks
2
-
3
- - 이 폴더는 현재 유효한 운영 절차를 durable runbook으로 유지한다.
4
- - 날짜별 운영 이력은 두지 않고, 지금 따라야 하는 절차만 갱신한다.
@@ -1,4 +0,0 @@
1
- # Delivery Status
2
-
3
- - 이 폴더는 현재 live deployment와 monitoring baseline을 durable 문서로 유지한다.
4
- - service surface별 current status만 남기고, 과거 release log는 보관하지 않는다.
@@ -1,16 +0,0 @@
1
- # service status
2
-
3
- ## Current Live State
4
-
5
- - template repo는 root compose/developer baseline 기준의 current buildable state를 유지한다.
6
- - production release timeline은 SDD에 누적하지 않는다.
7
-
8
- ## Monitoring Baseline
9
-
10
- - backend `pytest`
11
- - frontend app build
12
- - parity harness current output path 확인
13
-
14
- ## Residual Risk
15
-
16
- - 실제 서비스 레포에 이식할 때는 각 서비스의 runtime/edge 기준으로 다시 구체화해야 한다.
@@ -1,12 +0,0 @@
1
- # Operate Governance
2
-
3
- ## Purpose
4
-
5
- - `sdd/05_operate/`는 현재 배포 상태, 모니터링 기준, 운영 절차를 durable 문서로 유지하는 루트다.
6
- - raw 운영 로그나 히스토리성 release note는 남기지 않는다.
7
-
8
- ## Canonical Rule
9
-
10
- - runbook은 절차를 설명하는 durable 문서로 유지한다.
11
- - delivery status는 현재 live state와 확인 기준만 남기고 덮어쓴다.
12
- - raw runtime log와 상세 incident timeline은 backend/application logging system의 역할이다.
@@ -1,76 +0,0 @@
1
- # Automation Toolchain
2
-
3
- `01_automation`은 screen spec 생성, capture asset 수집, parity harness 실행, Playwright exactness orchestration, recipe 기반 정적 자산 생성을 위한 자동화 자산을 둔다.
4
-
5
- ## Scope
6
-
7
- - screen spec capture script
8
- - screen spec PDF generator
9
- - parity harness
10
- - Playwright exactness runner / suite registry
11
- - generator manifest
12
- - asset recipe builder
13
- - regression verification scope selection rule
14
-
15
- ## Screen Spec Rule
16
-
17
- - feature code: `DOMAIN-FNNN`
18
- - screen code: `SERVICE-SNNN`
19
- - desktop capture 기준 visible area: `1710x951`
20
- - 기본 capture viewport: `1690x940`
21
- - capture mode: `viewport-first`
22
-
23
- ## Canonical Tools
24
-
25
- - [screen_spec_manifest.py](./screen_spec_manifest.py)
26
- - [capture_screen_assets.mjs](./capture_screen_assets.mjs)
27
- - [build_screen_spec_pdf.py](./build_screen_spec_pdf.py)
28
- - [spec_asset_builder.py](./spec_asset_builder.py)
29
- - [build_asset_recipes.py](./build_asset_recipes.py)
30
- - [playwright_exactness_manifest.py](./playwright_exactness_manifest.py)
31
- - [run_playwright_exactness.py](./run_playwright_exactness.py)
32
-
33
- ## Storage Rule
34
-
35
- - generated runtime asset은 각 구현 repo 경로에 둔다.
36
- - planning 산출물은 `sdd/01_planning/02_screen/assets/` 아래에 둔다.
37
- - generator와 manifest는 `sdd/99_toolchain/01_automation/`에 둔다.
38
- - Playwright harness source는 repo 상황에 따라 `research/agent-browser/pocs/playwright-dev-e2e/` 같은 runtime location에 둘 수 있지만, canonical invocation과 suite registry는 `sdd/99_toolchain/01_automation/`이 소유한다.
39
-
40
- ## Regression Verification Rule
41
-
42
- - toolchain은 builder/harness를 제공하더라도 direct target만 확인하고 종료하는 흐름을 허용하지 않는다.
43
- - `sdd` 작업은 `sdd/02_plan/10_test/regression_verification.md`를 기준으로 direct, upstream, downstream, shared surface를 선택한다.
44
- - parity harness나 build check는 회귀 검수의 일부일 뿐이고, 실제 완료 기준은 선택한 regression surface 전체에 대한 retained evidence다.
45
- - Playwright exactness suite가 있는 surface는 `run_playwright_exactness.py`를 canonical local gate로 사용한다.
46
- - shared route, shell, auth/session, shared component, API/data contract, generated asset, builder output 변경은 adjacent consumer까지 검수 범위를 넓힌다.
47
- - 아직 자동화가 없는 회귀 surface는 command/manual verification으로 메우고, automation gap은 `sdd/03_build`, `sdd/03_verify`에 residual risk로 남긴다.
48
- - Browser Use나 수동 시각 점검은 Playwright exactness gate를 대체하지 않고 보강/진단 용도로만 사용한다.
49
-
50
- ## Asset Recipe Rule
51
-
52
- - 정적 디자인 자산 추출의 canonical tool name은 `스펙에셋빌더`다.
53
- - generic 실행 파일은 `[spec_asset_builder.py](./spec_asset_builder.py)`다.
54
- - `[build_asset_recipes.py](./build_asset_recipes.py)`는 기존 호출 호환용 wrapper다.
55
- - 화면명세서에 있는 icon, logo, illustration, 기타 재사용 가능한 static asset은 먼저 `스펙에셋빌더`로 추출한 뒤 구현 코드에서 사용한다.
56
- - reusable asset planning 문서는 `sdd/01_planning/02_screen/assets/` 아래에 둔다.
57
- - 프로젝트별 규칙은 Python manifest에서 `ASSET_RECIPES` 리스트로 선언한다.
58
- - 각 recipe는 `source`, `crop_box`, `transparent_white_threshold`, `trim`, `output`, `children`을 조합해 재사용 가능한 SVG/PNG 자산을 생성한다.
59
- - `--verify-exact`를 사용하면 generated output이 source crop과 픽셀 단위로 동일한지 검증한다.
60
- - builder로 표현 가능한 자산을 수동 redraw나 screenshot crop으로 대체하지 않는다.
61
- - 수동 예외가 필요하면 plan/build/verify 문서에 source, 예외 사유, 최종 자산 경로를 함께 남긴다.
62
- - 예시 manifest는 [`../03_templates/asset_recipe_manifest.example.py`](../03_templates/asset_recipe_manifest.example.py)에 둔다.
63
- - 예시 generated output은 [`../03_templates/generated_assets/README.md`](../03_templates/generated_assets/README.md) 경로를 사용한다.
64
-
65
- ## Playwright Exactness Rule
66
-
67
- - Playwright exactness의 canonical registry는 [playwright_exactness_manifest.py](./playwright_exactness_manifest.py)다.
68
- - canonical runner는 [run_playwright_exactness.py](./run_playwright_exactness.py)다.
69
- - downstream repo는 suite source를 runtime location에 둘 수 있지만, retained command는 wrapper 기준으로 남긴다.
70
- - suite id, spec file, target screen batch, artifact path는 durable current-state로 관리한다.
71
- - screen 작업의 기본 local exactness gate는 다음 순서를 따른다.
72
- - design guide / asset / screen spec baseline 확인
73
- - `python3 sdd/99_toolchain/01_automation/run_playwright_exactness.py --suite <suite-id> --base-url <url>`
74
- - 필요하면 `--api-base-url`, `--browser`, `--grep`를 추가한다.
75
- - 실행 결과와 artifact path를 `sdd/03_verify` current summary에 기록한다.
76
- - 시작점 예시는 [`../03_templates/playwright_exactness_manifest.example.py`](../03_templates/playwright_exactness_manifest.example.py)를 따른다.
@@ -1,132 +0,0 @@
1
- #!/usr/bin/env python3
2
- import json
3
- import sys
4
- from pathlib import Path
5
-
6
-
7
- VALID_OK_STATUSES = {"passed"}
8
- VALID_FAIL_STATUSES = {"failed", "size_mismatch", "missing_reference", "capture_error"}
9
-
10
-
11
- def collect_cases(node, bucket):
12
- if isinstance(node, dict):
13
- score = None
14
- identifier = None
15
- for key in ("diff_ratio", "score", "difference_ratio"):
16
- value = node.get(key)
17
- if isinstance(value, (int, float)):
18
- score = float(value)
19
- break
20
- for key in ("screen_code", "id", "name", "case", "route"):
21
- value = node.get(key)
22
- if isinstance(value, str) and value.strip():
23
- identifier = value.strip()
24
- break
25
- if score is not None:
26
- bucket.append((identifier or f"case_{len(bucket)+1}", score))
27
- for value in node.values():
28
- collect_cases(value, bucket)
29
- elif isinstance(node, list):
30
- for item in node:
31
- collect_cases(item, bucket)
32
-
33
-
34
- def summarize(path: Path) -> int:
35
- data = json.loads(path.read_text(encoding="utf-8"))
36
- cases = []
37
- collect_cases(data, cases)
38
- unique = []
39
- seen = set()
40
- for identifier, score in sorted(cases, key=lambda item: item[1], reverse=True):
41
- key = (identifier, score)
42
- if key in seen:
43
- continue
44
- seen.add(key)
45
- unique.append((identifier, score))
46
-
47
- print(f"proof_file={path}")
48
- print(f"cases_found={len(unique)}")
49
- if not unique:
50
- print("No comparable cases with numeric diff_ratio/score found.")
51
- return 0
52
- failing = [item for item in unique if item[1] > 0]
53
- best = min(unique, key=lambda item: item[1])
54
- worst = max(unique, key=lambda item: item[1])
55
- print(f"failing_cases={len(failing)}")
56
- print(f"best_case={best[0]} score={best[1]:.8f}")
57
- print(f"worst_case={worst[0]} score={worst[1]:.8f}")
58
- for identifier, score in failing[:10]:
59
- print(f"- {identifier}: {score:.8f}")
60
- return 0
61
-
62
-
63
- def check_gate(path: Path) -> int:
64
- data = json.loads(path.read_text(encoding="utf-8"))
65
- summary = data.get("summary")
66
- screens = data.get("screens")
67
- if not isinstance(summary, dict):
68
- print("proof_gate=fail reason=missing_summary")
69
- return 2
70
- if not isinstance(screens, list):
71
- print("proof_gate=fail reason=missing_screens")
72
- return 2
73
-
74
- failing_statuses = []
75
- for screen in screens:
76
- if not isinstance(screen, dict):
77
- failing_statuses.append(("unknown", "invalid_row"))
78
- continue
79
- status = screen.get("status")
80
- identifier = screen.get("id") or screen.get("route") or "unknown"
81
- if status in VALID_OK_STATUSES:
82
- continue
83
- if status in VALID_FAIL_STATUSES:
84
- failing_statuses.append((identifier, status))
85
- else:
86
- failing_statuses.append((identifier, f"unknown_status:{status}"))
87
-
88
- capture_error = int(summary.get("capture_error", 0) or 0)
89
- failed = int(summary.get("failed", 0) or 0)
90
- missing_reference = int(summary.get("missing_reference", 0) or 0)
91
- matched = bool(summary.get("matched", False))
92
-
93
- if failing_statuses or capture_error > 0 or failed > 0 or missing_reference > 0 or not matched:
94
- print("proof_gate=fail")
95
- print(f"summary_failed={failed}")
96
- print(f"summary_missing_reference={missing_reference}")
97
- print(f"summary_capture_error={capture_error}")
98
- print(f"summary_matched={matched}")
99
- for identifier, status in failing_statuses[:20]:
100
- print(f"- {identifier}: {status}")
101
- return 2
102
-
103
- print("proof_gate=pass")
104
- return 0
105
-
106
-
107
- def main() -> int:
108
- if len(sys.argv) < 2:
109
- print("Usage: analyze_proof_results.py [--gate] <proof-json>", file=sys.stderr)
110
- return 1
111
-
112
- gate_mode = False
113
- args = sys.argv[1:]
114
- if args and args[0] == "--gate":
115
- gate_mode = True
116
- args = args[1:]
117
- if not args:
118
- print("Usage: analyze_proof_results.py [--gate] <proof-json>", file=sys.stderr)
119
- return 1
120
-
121
- path = Path(args[0])
122
- if not path.is_file():
123
- print(f"File not found: {path}", file=sys.stderr)
124
- return 1
125
-
126
- if gate_mode:
127
- return check_gate(path)
128
- return summarize(path)
129
-
130
-
131
- if __name__ == "__main__":
132
- raise SystemExit(main())
@@ -1,85 +0,0 @@
1
- #!/usr/bin/env python3
2
- import json
3
- import sys
4
- from pathlib import Path
5
-
6
-
7
- FAIL_STATUSES = {"missing", "stateful"}
8
-
9
-
10
- def summarize(path: Path) -> int:
11
- data = json.loads(path.read_text(encoding="utf-8"))
12
- summary = data.get("summary", {})
13
- screens = data.get("screens", [])
14
- print(f"route_gap_file={path}")
15
- print(f"service={data.get('service', 'unknown')}")
16
- print(f"total={summary.get('total', 0)}")
17
- print(f"direct={summary.get('direct', 0)}")
18
- print(f"shared={summary.get('shared', 0)}")
19
- print(f"stateful={summary.get('stateful', 0)}")
20
- print(f"missing={summary.get('missing', 0)}")
21
- for row in screens:
22
- if isinstance(row, dict) and row.get("status") in FAIL_STATUSES:
23
- print(f"- {row.get('id', 'unknown')}: {row.get('status')}")
24
- return 0
25
-
26
-
27
- def check_gate(path: Path) -> int:
28
- data = json.loads(path.read_text(encoding="utf-8"))
29
- summary = data.get("summary")
30
- screens = data.get("screens")
31
- if not isinstance(summary, dict):
32
- print("route_gap_gate=fail reason=missing_summary")
33
- return 2
34
- if not isinstance(screens, list):
35
- print("route_gap_gate=fail reason=missing_screens")
36
- return 2
37
-
38
- failing_rows = []
39
- for row in screens:
40
- if not isinstance(row, dict):
41
- failing_rows.append(("unknown", "invalid_row"))
42
- continue
43
- status = str(row.get("status", "")).strip().lower()
44
- identifier = row.get("id") or row.get("title") or "unknown"
45
- if status in FAIL_STATUSES:
46
- failing_rows.append((identifier, status))
47
-
48
- if failing_rows or int(summary.get("missing", 0) or 0) > 0 or int(summary.get("stateful", 0) or 0) > 0:
49
- print("route_gap_gate=fail")
50
- print(f"summary_missing={summary.get('missing', 0)}")
51
- print(f"summary_stateful={summary.get('stateful', 0)}")
52
- for identifier, status in failing_rows[:20]:
53
- print(f"- {identifier}: {status}")
54
- return 2
55
-
56
- print("route_gap_gate=pass")
57
- return 0
58
-
59
-
60
- def main() -> int:
61
- if len(sys.argv) < 2:
62
- print("Usage: analyze_route_gap.py [--gate] <route-gap-json>", file=sys.stderr)
63
- return 1
64
-
65
- gate_mode = False
66
- args = sys.argv[1:]
67
- if args and args[0] == "--gate":
68
- gate_mode = True
69
- args = args[1:]
70
- if not args:
71
- print("Usage: analyze_route_gap.py [--gate] <route-gap-json>", file=sys.stderr)
72
- return 1
73
-
74
- path = Path(args[0])
75
- if not path.is_file():
76
- print(f"File not found: {path}", file=sys.stderr)
77
- return 1
78
-
79
- if gate_mode:
80
- return check_gate(path)
81
- return summarize(path)
82
-
83
-
84
- if __name__ == "__main__":
85
- raise SystemExit(main())
@@ -1,75 +0,0 @@
1
- {
2
- "schema_version": 1,
3
- "name": "replace-service-name",
4
- "spec": {
5
- "planning_paths": [
6
- "sdd/01_planning",
7
- "sdd/02_plan"
8
- ],
9
- "canonical_targets_dir": "sdd/02_plan"
10
- },
11
- "frontend": {
12
- "default_target": "web",
13
- "targets": {
14
- "web": {
15
- "dir": "client/web",
16
- "adapter_path": "client/web/scripts/ui-parity-web-adapter.mjs",
17
- "screens_path": "client/web/src/lib/specScreens.json",
18
- "routes_path": "client/web/src/lib/specRouteCatalog.json",
19
- "preview_url": "http://127.0.0.1:4301",
20
- "parity_contract_path": "sdd/02_plan/10_test/templates/ui_parity_web_contract.yaml",
21
- "route_gap_output": "sdd/02_plan/99_generated/from_planning/ui_parity/ui_parity_web_route_gap_report.json",
22
- "route_gap_markdown_output": "sdd/02_plan/99_generated/from_planning/ui_parity/ui_parity_web_route_gap_report.md",
23
- "proof_output": "sdd/03_verify/10_test/ui_parity/templates_web_agentic_dev_latest.json"
24
- },
25
- "mobile": {
26
- "dir": "client/mobile",
27
- "adapter_path": "client/mobile/scripts/ui-parity-mobile-adapter.mjs",
28
- "screens_path": "client/mobile/src/lib/specScreens.json",
29
- "routes_path": "client/mobile/src/lib/specRouteCatalog.json",
30
- "preview_url": "http://127.0.0.1:4302",
31
- "parity_contract_path": "sdd/02_plan/10_test/templates/ui_parity_mobile_contract.yaml",
32
- "route_gap_output": "sdd/02_plan/99_generated/from_planning/ui_parity/ui_parity_mobile_route_gap_report.json",
33
- "route_gap_markdown_output": "sdd/02_plan/99_generated/from_planning/ui_parity/ui_parity_mobile_route_gap_report.md",
34
- "proof_output": "sdd/03_verify/10_test/ui_parity/templates_mobile_agentic_dev_latest.json"
35
- },
36
- "admin": {
37
- "dir": "client/admin",
38
- "adapter_path": "client/admin/scripts/ui-parity-admin-adapter.mjs",
39
- "screens_path": "client/admin/src/lib/specScreens.json",
40
- "routes_path": "client/admin/src/lib/specRouteCatalog.json",
41
- "preview_url": "http://127.0.0.1:4400",
42
- "parity_contract_path": "sdd/02_plan/10_test/templates/ui_parity_admin_contract.yaml",
43
- "route_gap_output": "sdd/02_plan/99_generated/from_planning/ui_parity/ui_parity_admin_route_gap_report.json",
44
- "route_gap_markdown_output": "sdd/02_plan/99_generated/from_planning/ui_parity/ui_parity_admin_route_gap_report.md",
45
- "proof_output": "sdd/03_verify/10_test/ui_parity/templates_admin_agentic_dev_latest.json"
46
- },
47
- "landing": {
48
- "dir": "client/landing",
49
- "adapter_path": "client/landing/scripts/ui-parity-landing-adapter.mjs",
50
- "screens_path": "client/landing/src/lib/specScreens.json",
51
- "routes_path": "client/landing/src/lib/specRouteCatalog.json",
52
- "preview_url": "http://127.0.0.1:4300",
53
- "parity_contract_path": "sdd/02_plan/10_test/templates/ui_parity_landing_contract.yaml",
54
- "route_gap_output": "sdd/02_plan/99_generated/from_planning/ui_parity/ui_parity_landing_route_gap_report.json",
55
- "route_gap_markdown_output": "sdd/02_plan/99_generated/from_planning/ui_parity/ui_parity_landing_route_gap_report.md",
56
- "proof_output": "sdd/03_verify/10_test/ui_parity/templates_landing_agentic_dev_latest.json"
57
- }
58
- }
59
- },
60
- "commands": {
61
- "plan_audit": "bash sdd/99_toolchain/01_automation/agentic-dev/run_frontend_target.sh route_gap .",
62
- "build": "bash sdd/99_toolchain/01_automation/agentic-dev/run_frontend_target.sh build .",
63
- "proof": "bash sdd/99_toolchain/01_automation/agentic-dev/run_frontend_target.sh proof .",
64
- "deploy_dev": "echo 'replace deploy_dev command' >&2",
65
- "verify_dev": "echo 'replace verify_dev command' >&2"
66
- },
67
- "artifacts": {
68
- "route_gap_output": "sdd/02_plan/99_generated/from_planning/ui_parity/ui_parity_web_route_gap_report.json",
69
- "proof_output": "sdd/03_verify/10_test/ui_parity/replace_agentic_dev_latest.json"
70
- },
71
- "notes": [
72
- "Replace the commands and proof output path after cloning the template.",
73
- "plan_audit is expected to generate and gate a route-gap report before proof."
74
- ]
75
- }
@@ -1,84 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- usage() {
5
- cat <<'EOF'
6
- Usage: bootstrap_frontend_parity.sh [repo_root] [target]
7
-
8
- Run first-time frontend parity bootstrap for a cloned template.
9
-
10
- Steps:
11
- 1. init repo contract and route-gap assets
12
- 2. build frontend
13
- 3. start preview server
14
- 4. materialize reference assets
15
- 5. run plan_audit gate
16
- 6. run proof gate
17
- EOF
18
- }
19
-
20
- if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then
21
- usage
22
- exit 0
23
- fi
24
-
25
- repo_root="$(cd "${1:-$(pwd)}" && pwd)"
26
- frontend_target="${2:-}"
27
- script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
28
- target_payload="$(python3 "${script_dir}/resolve_frontend_target.py" "${repo_root}" "${frontend_target}")"
29
- read_target_value() {
30
- local key="$1"
31
- python3 - "${target_payload}" "${key}" <<'PY'
32
- import json
33
- import sys
34
-
35
- payload = json.loads(sys.argv[1])
36
- key = sys.argv[2]
37
- value = payload
38
- for part in key.split("."):
39
- if not isinstance(value, dict):
40
- raise SystemExit(1)
41
- value = value.get(part)
42
- if value is None:
43
- raise SystemExit(1)
44
- print(value if isinstance(value, str) else json.dumps(value, ensure_ascii=False))
45
- PY
46
- }
47
- target_name="$(read_target_value "name")"
48
- target_dir="$(read_target_value "target.dir")"
49
- preview_url="$(read_target_value "target.preview_url")"
50
- preview_log="${repo_root}/sdd/03_verify/10_test/ui_parity/${target_name}-preview.log"
51
- preview_pid=""
52
-
53
- cleanup() {
54
- if [[ -n "${preview_pid}" ]] && kill -0 "${preview_pid}" >/dev/null 2>&1; then
55
- kill "${preview_pid}" >/dev/null 2>&1 || true
56
- wait "${preview_pid}" >/dev/null 2>&1 || true
57
- fi
58
- }
59
- trap cleanup EXIT
60
-
61
- bash "${script_dir}/init_frontend_parity.sh" "${repo_root}" "${frontend_target}"
62
-
63
- cd "${repo_root}"
64
- mkdir -p "$(dirname "${preview_log}")"
65
- bash "${script_dir}/run_frontend_target.sh" build "${repo_root}" "${frontend_target}"
66
- npm --prefix "${target_dir}" run preview >"${preview_log}" 2>&1 &
67
- preview_pid="$!"
68
- for _ in $(seq 1 30); do
69
- if curl -fsS "${preview_url}" >/dev/null 2>&1; then
70
- break
71
- fi
72
- sleep 1
73
- done
74
- if ! curl -fsS "${preview_url}" >/dev/null 2>&1; then
75
- echo "Preview server did not become ready: ${preview_url}" >&2
76
- echo "Preview log: ${preview_log}" >&2
77
- exit 1
78
- fi
79
- bash "${script_dir}/run_frontend_target.sh" materialize_references "${repo_root}" "${frontend_target}"
80
-
81
- bash "${script_dir}/run_repo_phase.sh" plan_audit "${repo_root}" "${frontend_target}"
82
- bash "${script_dir}/run_repo_phase.sh" proof "${repo_root}" "${frontend_target}"
83
-
84
- echo "frontend_parity_bootstrap=ok"
@@ -1,33 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- usage() {
5
- cat <<'EOF'
6
- Usage: init_frontend_parity.sh [repo_root] [target]
7
-
8
- Bootstrap repo-local frontend parity assets for a cloned template.
9
-
10
- Steps:
11
- 1. Ensure repo contract aliases exist
12
- 2. Scaffold ui parity contract
13
- 3. Generate route-gap json/markdown manifests
14
-
15
- Optional runtime steps such as reference materialization and proof are intentionally excluded.
16
- EOF
17
- }
18
-
19
- if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then
20
- usage
21
- exit 0
22
- fi
23
-
24
- repo_root="$(cd "${1:-$(pwd)}" && pwd)"
25
- frontend_target="${2:-}"
26
- script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
27
-
28
- bash "${script_dir}/init_repo_contract.sh" "${repo_root}" >/dev/null
29
-
30
- bash "${script_dir}/run_frontend_target.sh" scaffold "${repo_root}" "${frontend_target}"
31
- bash "${script_dir}/run_frontend_target.sh" route_gap "${repo_root}" "${frontend_target}"
32
-
33
- echo "frontend_parity_init=ok"