agentic-dev 0.2.11 → 0.2.13

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 (276) hide show
  1. package/README.md +72 -54
  2. package/bin/agentic-dev.mjs +162 -11
  3. package/lib/github.mjs +246 -0
  4. package/lib/orchestration-assets.mjs +249 -0
  5. package/lib/scaffold.mjs +89 -0
  6. package/package.json +8 -19
  7. package/.dockerignore +0 -8
  8. package/.env.example +0 -50
  9. package/.gitignore +0 -16
  10. package/AGENTS.md +0 -86
  11. package/SDD_SKILL.md +0 -589
  12. package/compose.yml +0 -206
  13. package/infra/compose/.env.dev.example +0 -28
  14. package/infra/compose/.env.prod.example +0 -29
  15. package/infra/compose/README.md +0 -35
  16. package/infra/compose/dev.yml +0 -125
  17. package/infra/compose/prod.yml +0 -126
  18. package/infra/terraform/README.md +0 -34
  19. package/infra/terraform/aws/data/.terraform.lock.hcl +0 -25
  20. package/infra/terraform/aws/data/README.md +0 -18
  21. package/infra/terraform/aws/data/main.tf +0 -147
  22. package/infra/terraform/aws/data/outputs.tf +0 -14
  23. package/infra/terraform/aws/data/variables.tf +0 -57
  24. package/infra/terraform/aws/data/versions.tf +0 -10
  25. package/infra/terraform/aws/domain/.terraform.lock.hcl +0 -25
  26. package/infra/terraform/aws/domain/README.md +0 -20
  27. package/infra/terraform/aws/domain/env/dev.tfvars.example +0 -6
  28. package/infra/terraform/aws/domain/env/prod.tfvars.example +0 -7
  29. package/infra/terraform/aws/domain/main.tf +0 -149
  30. package/infra/terraform/aws/domain/outputs.tf +0 -29
  31. package/infra/terraform/aws/domain/variables.tf +0 -58
  32. package/infra/terraform/aws/domain/versions.tf +0 -10
  33. package/infra/terraform/openstack/README.md +0 -38
  34. package/infra/terraform/openstack/dev/.terraform.lock.hcl +0 -24
  35. package/infra/terraform/openstack/dev/README.md +0 -18
  36. package/infra/terraform/openstack/dev/main.tf +0 -49
  37. package/infra/terraform/openstack/dev/providers.tf +0 -15
  38. package/infra/terraform/openstack/dev/terraform.tfvars.example +0 -54
  39. package/infra/terraform/openstack/dev/variables.tf +0 -210
  40. package/infra/terraform/openstack/dev/versions.tf +0 -10
  41. package/infra/terraform/openstack/modules/environment_host/main.tf +0 -143
  42. package/infra/terraform/openstack/modules/environment_host/outputs.tf +0 -25
  43. package/infra/terraform/openstack/modules/environment_host/templates/docker-host-user-data.sh.tftpl +0 -40
  44. package/infra/terraform/openstack/modules/environment_host/variables.tf +0 -145
  45. package/infra/terraform/openstack/modules/environment_host/versions.tf +0 -7
  46. package/infra/terraform/openstack/prod/.terraform.lock.hcl +0 -24
  47. package/infra/terraform/openstack/prod/README.md +0 -18
  48. package/infra/terraform/openstack/prod/main.tf +0 -49
  49. package/infra/terraform/openstack/prod/providers.tf +0 -15
  50. package/infra/terraform/openstack/prod/terraform.tfvars.example +0 -55
  51. package/infra/terraform/openstack/prod/variables.tf +0 -210
  52. package/infra/terraform/openstack/prod/versions.tf +0 -10
  53. package/infra/terraform/openstack/server/.terraform.lock.hcl +0 -45
  54. package/infra/terraform/openstack/server/README.md +0 -47
  55. package/infra/terraform/openstack/server/main.tf +0 -161
  56. package/infra/terraform/openstack/server/outputs.tf +0 -30
  57. package/infra/terraform/openstack/server/providers.tf +0 -30
  58. package/infra/terraform/openstack/server/templates/server-user-data.sh.tftpl +0 -50
  59. package/infra/terraform/openstack/server/variables.tf +0 -233
  60. package/infra/terraform/openstack/server/zz_aspace.auto.tfvars.example.json +0 -29
  61. package/pnpm-workspace.yaml +0 -2
  62. package/scripts/dev/audit_sdd_build_ast.py +0 -277
  63. package/sdd/01_planning/01_feature/INDEX.md +0 -16
  64. package/sdd/01_planning/01_feature/README.md +0 -76
  65. package/sdd/01_planning/01_feature/alerts_feature_spec.md +0 -55
  66. package/sdd/01_planning/01_feature/auth_feature_spec.md +0 -57
  67. package/sdd/01_planning/01_feature/catalog_feature_spec.md +0 -61
  68. package/sdd/01_planning/01_feature/fulfillment_feature_spec.md +0 -58
  69. package/sdd/01_planning/01_feature/health_feature_spec.md +0 -52
  70. package/sdd/01_planning/01_feature/inventory_feature_spec.md +0 -60
  71. package/sdd/01_planning/01_feature/order_feature_spec.md +0 -63
  72. package/sdd/01_planning/01_feature/shipping_feature_spec.md +0 -55
  73. package/sdd/01_planning/01_feature/support_feature_spec.md +0 -53
  74. package/sdd/01_planning/01_feature/user_feature_spec.md +0 -54
  75. package/sdd/01_planning/02_screen/INDEX.md +0 -13
  76. package/sdd/01_planning/02_screen/README.md +0 -41
  77. package/sdd/01_planning/02_screen/admin_screen_spec.pdf +0 -0
  78. package/sdd/01_planning/02_screen/assets/README.md +0 -16
  79. package/sdd/01_planning/02_screen/assets/example/README.md +0 -13
  80. package/sdd/01_planning/02_screen/landing_screen_spec.pdf +0 -0
  81. package/sdd/01_planning/02_screen/mobile_screen_spec.pdf +0 -0
  82. package/sdd/01_planning/02_screen/web_screen_spec.pdf +0 -0
  83. package/sdd/01_planning/03_architecture/INDEX.md +0 -9
  84. package/sdd/01_planning/03_architecture/README.md +0 -25
  85. package/sdd/01_planning/03_architecture/architecture_document_structure.md +0 -77
  86. package/sdd/01_planning/03_architecture/backend/README.md +0 -10
  87. package/sdd/01_planning/03_architecture/frontend/README.md +0 -12
  88. package/sdd/01_planning/03_architecture/infra/README.md +0 -10
  89. package/sdd/01_planning/03_architecture/tech-research/README.md +0 -4
  90. package/sdd/01_planning/03_architecture/templates_system_architecture.md +0 -84
  91. package/sdd/01_planning/04_data/INDEX.md +0 -4
  92. package/sdd/01_planning/04_data/README.md +0 -10
  93. package/sdd/01_planning/04_data/templates_data_modeling.md +0 -119
  94. package/sdd/01_planning/05_api/README.md +0 -12
  95. package/sdd/01_planning/05_api/templates_api_contract.md +0 -90
  96. package/sdd/01_planning/06_iac/README.md +0 -11
  97. package/sdd/01_planning/06_iac/templates_runtime_and_cicd_baseline.md +0 -46
  98. package/sdd/01_planning/07_integration/README.md +0 -11
  99. package/sdd/01_planning/07_integration/templates_frontend_api_integration.md +0 -46
  100. package/sdd/01_planning/08_nonfunctional/README.md +0 -7
  101. package/sdd/01_planning/09_security/README.md +0 -7
  102. package/sdd/01_planning/10_test/README.md +0 -12
  103. package/sdd/01_planning/10_test/templates_test_strategy.md +0 -60
  104. package/sdd/01_planning/INDEX.md +0 -19
  105. package/sdd/01_planning/README.md +0 -17
  106. package/sdd/02_plan/01_feature/README.md +0 -34
  107. package/sdd/02_plan/01_feature/_feature_todo_template.md +0 -29
  108. package/sdd/02_plan/02_screen/INDEX.md +0 -19
  109. package/sdd/02_plan/02_screen/README.md +0 -39
  110. package/sdd/02_plan/02_screen/_screen_todo_template.md +0 -60
  111. package/sdd/02_plan/03_architecture/README.md +0 -23
  112. package/sdd/02_plan/03_architecture/architecture_document_governance.md +0 -40
  113. package/sdd/02_plan/03_architecture/build_ast_runtime_tree_governance.md +0 -53
  114. package/sdd/02_plan/03_architecture/repository_governance.md +0 -39
  115. package/sdd/02_plan/03_architecture/runtime_and_structure_governance.md +0 -38
  116. package/sdd/02_plan/03_architecture/templates-hexagonal-template-architecture.md +0 -9
  117. package/sdd/02_plan/03_architecture/toolchain_governance.md +0 -98
  118. package/sdd/02_plan/04_data/README.md +0 -5
  119. package/sdd/02_plan/05_api/README.md +0 -5
  120. package/sdd/02_plan/06_iac/README.md +0 -11
  121. package/sdd/02_plan/06_iac/dev_runtime_delivery.md +0 -36
  122. package/sdd/02_plan/06_iac/template_runtime_delivery.md +0 -50
  123. package/sdd/02_plan/07_integration/README.md +0 -5
  124. package/sdd/02_plan/07_integration/frontend_live_integration.md +0 -31
  125. package/sdd/02_plan/08_nonfunctional/README.md +0 -5
  126. package/sdd/02_plan/08_nonfunctional/repository_hygiene.md +0 -26
  127. package/sdd/02_plan/09_security/README.md +0 -5
  128. package/sdd/02_plan/10_test/README.md +0 -11
  129. package/sdd/02_plan/10_test/regression_verification.md +0 -39
  130. package/sdd/02_plan/10_test/templates/README.md +0 -8
  131. package/sdd/02_plan/10_test/templates/ui_parity_web_contract.template.yaml +0 -23
  132. package/sdd/02_plan/10_test/verification_strategy.md +0 -43
  133. package/sdd/02_plan/99_generated/from_planning/ui_parity/.gitkeep +0 -1
  134. package/sdd/02_plan/README.md +0 -40
  135. package/sdd/03_build/01_feature/README.md +0 -20
  136. package/sdd/03_build/01_feature/domain/README.md +0 -3
  137. package/sdd/03_build/01_feature/domain/account_and_access.md +0 -20
  138. package/sdd/03_build/01_feature/domain/catalog_and_inventory.md +0 -20
  139. package/sdd/03_build/01_feature/domain/ordering_and_fulfillment.md +0 -21
  140. package/sdd/03_build/01_feature/domain/support_and_observability.md +0 -21
  141. package/sdd/03_build/01_feature/domain_surfaces.md +0 -28
  142. package/sdd/03_build/01_feature/service/README.md +0 -3
  143. package/sdd/03_build/01_feature/service/admin_surface.md +0 -15
  144. package/sdd/03_build/01_feature/service/landing_surface.md +0 -13
  145. package/sdd/03_build/01_feature/service/mobile_surface.md +0 -14
  146. package/sdd/03_build/01_feature/service/web_surface.md +0 -14
  147. package/sdd/03_build/02_screen/README.md +0 -25
  148. package/sdd/03_build/02_screen/_screen_build_template.md +0 -26
  149. package/sdd/03_build/02_screen/admin/README.md +0 -5
  150. package/sdd/03_build/02_screen/landing/README.md +0 -5
  151. package/sdd/03_build/02_screen/mobile/README.md +0 -5
  152. package/sdd/03_build/02_screen/web/README.md +0 -5
  153. package/sdd/03_build/03_architecture/README.md +0 -10
  154. package/sdd/03_build/03_architecture/architecture_document_governance.md +0 -30
  155. package/sdd/03_build/03_architecture/build_ast_runtime_tree_governance.md +0 -24
  156. package/sdd/03_build/03_architecture/repository_governance.md +0 -18
  157. package/sdd/03_build/03_architecture/toolchain_governance.md +0 -36
  158. package/sdd/03_build/06_iac/README.md +0 -3
  159. package/sdd/03_build/06_iac/dev_runtime_delivery.md +0 -10
  160. package/sdd/03_build/06_iac/template_runtime_delivery.md +0 -49
  161. package/sdd/03_build/07_integration/README.md +0 -3
  162. package/sdd/03_build/07_integration/frontend_live_integration.md +0 -11
  163. package/sdd/03_build/08_nonfunctional/README.md +0 -3
  164. package/sdd/03_build/08_nonfunctional/repository_hygiene.md +0 -10
  165. package/sdd/03_build/10_test/README.md +0 -9
  166. package/sdd/03_build/10_test/regression_verification.md +0 -16
  167. package/sdd/03_build/10_test/verification_harness.md +0 -11
  168. package/sdd/03_build/README.md +0 -35
  169. package/sdd/03_verify/01_feature/README.md +0 -5
  170. package/sdd/03_verify/01_feature/domain_verification.md +0 -14
  171. package/sdd/03_verify/01_feature/service_verification.md +0 -22
  172. package/sdd/03_verify/02_screen/README.md +0 -6
  173. package/sdd/03_verify/02_screen/_screen_verify_template.md +0 -20
  174. package/sdd/03_verify/02_screen/admin/README.md +0 -4
  175. package/sdd/03_verify/02_screen/landing/README.md +0 -4
  176. package/sdd/03_verify/02_screen/mobile/README.md +0 -4
  177. package/sdd/03_verify/02_screen/web/README.md +0 -4
  178. package/sdd/03_verify/03_architecture/README.md +0 -10
  179. package/sdd/03_verify/03_architecture/architecture_document_governance.md +0 -15
  180. package/sdd/03_verify/03_architecture/build_ast_runtime_tree_governance.md +0 -28
  181. package/sdd/03_verify/03_architecture/repository_governance.md +0 -16
  182. package/sdd/03_verify/03_architecture/toolchain_governance.md +0 -58
  183. package/sdd/03_verify/06_iac/README.md +0 -3
  184. package/sdd/03_verify/06_iac/dev_runtime_delivery.md +0 -10
  185. package/sdd/03_verify/06_iac/template_runtime_delivery.md +0 -42
  186. package/sdd/03_verify/07_integration/README.md +0 -3
  187. package/sdd/03_verify/07_integration/frontend_live_integration.md +0 -16
  188. package/sdd/03_verify/08_nonfunctional/README.md +0 -3
  189. package/sdd/03_verify/08_nonfunctional/repository_hygiene.md +0 -14
  190. package/sdd/03_verify/10_test/README.md +0 -9
  191. package/sdd/03_verify/10_test/regression_verification.md +0 -16
  192. package/sdd/03_verify/10_test/ui_parity/README.md +0 -4
  193. package/sdd/03_verify/10_test/ui_parity/loop_runs/.gitkeep +0 -0
  194. package/sdd/03_verify/10_test/ui_parity/reference/.gitkeep +0 -0
  195. package/sdd/03_verify/10_test/ui_parity/staged_runs/.gitkeep +0 -0
  196. package/sdd/03_verify/10_test/verification_harness.md +0 -17
  197. package/sdd/03_verify/README.md +0 -22
  198. package/sdd/05_operate/01_runbooks/.gitkeep +0 -1
  199. package/sdd/05_operate/01_runbooks/README.md +0 -4
  200. package/sdd/05_operate/02_delivery_status/README.md +0 -4
  201. package/sdd/05_operate/02_delivery_status/service_status.md +0 -16
  202. package/sdd/05_operate/README.md +0 -12
  203. package/sdd/99_toolchain/01_automation/.gitkeep +0 -1
  204. package/sdd/99_toolchain/01_automation/README.md +0 -76
  205. package/sdd/99_toolchain/01_automation/agentic-dev/analyze_proof_results.py +0 -132
  206. package/sdd/99_toolchain/01_automation/agentic-dev/analyze_route_gap.py +0 -85
  207. package/sdd/99_toolchain/01_automation/agentic-dev/assets/repo-contract.template.json +0 -75
  208. package/sdd/99_toolchain/01_automation/agentic-dev/bootstrap_frontend_parity.sh +0 -84
  209. package/sdd/99_toolchain/01_automation/agentic-dev/init_frontend_parity.sh +0 -33
  210. package/sdd/99_toolchain/01_automation/agentic-dev/init_repo_contract.sh +0 -51
  211. package/sdd/99_toolchain/01_automation/agentic-dev/repo-contract.json +0 -76
  212. package/sdd/99_toolchain/01_automation/agentic-dev/resolve_frontend_target.py +0 -52
  213. package/sdd/99_toolchain/01_automation/agentic-dev/resolve_repo_contract.py +0 -56
  214. package/sdd/99_toolchain/01_automation/agentic-dev/run_frontend_target.sh +0 -100
  215. package/sdd/99_toolchain/01_automation/agentic-dev/run_repo_phase.sh +0 -140
  216. package/sdd/99_toolchain/01_automation/agentic-dev/validate_json_schema.py +0 -39
  217. package/sdd/99_toolchain/01_automation/agentic-parity-harness-design.md +0 -291
  218. package/sdd/99_toolchain/01_automation/assets/admin_screen_capture/dashboard.png +0 -0
  219. package/sdd/99_toolchain/01_automation/assets/admin_screen_capture/login.png +0 -0
  220. package/sdd/99_toolchain/01_automation/assets/admin_screen_capture/queue.png +0 -0
  221. package/sdd/99_toolchain/01_automation/assets/admin_screen_capture/support.png +0 -0
  222. package/sdd/99_toolchain/01_automation/assets/landing_screen_capture/home.png +0 -0
  223. package/sdd/99_toolchain/01_automation/assets/landing_screen_capture/login.png +0 -0
  224. package/sdd/99_toolchain/01_automation/assets/landing_screen_capture/workspace.png +0 -0
  225. package/sdd/99_toolchain/01_automation/assets/mobile_screen_capture/dashboard.png +0 -0
  226. package/sdd/99_toolchain/01_automation/assets/mobile_screen_capture/fulfillment.png +0 -0
  227. package/sdd/99_toolchain/01_automation/assets/mobile_screen_capture/login.png +0 -0
  228. package/sdd/99_toolchain/01_automation/assets/web_screen_capture/dashboard.png +0 -0
  229. package/sdd/99_toolchain/01_automation/assets/web_screen_capture/login.png +0 -0
  230. package/sdd/99_toolchain/01_automation/assets/web_screen_capture/orders.png +0 -0
  231. package/sdd/99_toolchain/01_automation/build_asset_recipes.py +0 -10
  232. package/sdd/99_toolchain/01_automation/build_screen_spec_pdf.py +0 -427
  233. package/sdd/99_toolchain/01_automation/capture_screen_assets.mjs +0 -148
  234. package/sdd/99_toolchain/01_automation/harness-layout.md +0 -34
  235. package/sdd/99_toolchain/01_automation/parity-execution-tooling-design.md +0 -319
  236. package/sdd/99_toolchain/01_automation/playwright_exactness_manifest.py +0 -21
  237. package/sdd/99_toolchain/01_automation/run_playwright_exactness.py +0 -87
  238. package/sdd/99_toolchain/01_automation/screen_spec_manifest.py +0 -321
  239. package/sdd/99_toolchain/01_automation/spec_asset_builder.py +0 -274
  240. package/sdd/99_toolchain/01_automation/ui-contract-projection.md +0 -79
  241. package/sdd/99_toolchain/01_automation/ui-parity/README.md +0 -60
  242. package/sdd/99_toolchain/01_automation/ui-parity/cli/extract-reference-pages.mjs +0 -2
  243. package/sdd/99_toolchain/01_automation/ui-parity/cli/materialize-reference-assets.mjs +0 -58
  244. package/sdd/99_toolchain/01_automation/ui-parity/cli/normalize-reference-assets.mjs +0 -2
  245. package/sdd/99_toolchain/01_automation/ui-parity/cli/route-gap-report.mjs +0 -187
  246. package/sdd/99_toolchain/01_automation/ui-parity/cli/run-proof.mjs +0 -50
  247. package/sdd/99_toolchain/01_automation/ui-parity/cli/scaffold-contract.mjs +0 -62
  248. package/sdd/99_toolchain/01_automation/ui-parity/cli/upload-parity1.mjs +0 -2
  249. package/sdd/99_toolchain/01_automation/ui-parity/contracts/collector-metadata.schema.json +0 -33
  250. package/sdd/99_toolchain/01_automation/ui-parity/contracts/proof-result.schema.json +0 -76
  251. package/sdd/99_toolchain/01_automation/ui-parity/contracts/route-gap-report.schema.json +0 -95
  252. package/sdd/99_toolchain/01_automation/ui-parity/core/capture-runner.mjs +0 -55
  253. package/sdd/99_toolchain/01_automation/ui-parity/core/load-adapter.mjs +0 -25
  254. package/sdd/99_toolchain/01_automation/ui-parity/core/load-contract.mjs +0 -81
  255. package/sdd/99_toolchain/01_automation/ui-parity/core/paths.mjs +0 -23
  256. package/sdd/99_toolchain/01_automation/ui-parity/core/proof-runner.mjs +0 -255
  257. package/sdd/99_toolchain/01_automation/ui-parity/interfaces/ui-parity-artifact-layout.md +0 -23
  258. package/sdd/99_toolchain/01_automation/ui-parity/interfaces/ui-parity-proof-interface.md +0 -60
  259. package/sdd/99_toolchain/01_automation/ui-parity/interfaces/ui-parity-route-gap-interface.md +0 -82
  260. package/sdd/99_toolchain/01_automation/ui-parity/runtime/playwright-runtime.mjs +0 -16
  261. package/sdd/99_toolchain/01_automation/ui-parity/runtime/static-runtime.mjs +0 -6
  262. package/sdd/99_toolchain/02_policies/.gitkeep +0 -1
  263. package/sdd/99_toolchain/02_policies/build-ast-governance-policy.md +0 -22
  264. package/sdd/99_toolchain/02_policies/compose-runtime-baseline-policy.md +0 -24
  265. package/sdd/99_toolchain/02_policies/convention-storage-policy.md +0 -26
  266. package/sdd/99_toolchain/02_policies/main-push-before-dev-deploy-policy.md +0 -27
  267. package/sdd/99_toolchain/02_policies/regression-verification-policy.md +0 -22
  268. package/sdd/99_toolchain/03_templates/.gitkeep +0 -1
  269. package/sdd/99_toolchain/03_templates/asset_recipe_manifest.example.py +0 -38
  270. package/sdd/99_toolchain/03_templates/generated_assets/README.md +0 -11
  271. package/sdd/99_toolchain/03_templates/generated_assets/example-brand-lockup.svg +0 -3
  272. package/sdd/99_toolchain/03_templates/generated_assets/example-brand-mark.svg +0 -3
  273. package/sdd/99_toolchain/03_templates/generated_assets/example-brand-wordmark.svg +0 -3
  274. package/sdd/99_toolchain/03_templates/playwright_exactness_manifest.example.py +0 -21
  275. package/sdd/99_toolchain/README.md +0 -23
  276. package/sdd/README.md +0 -21
package/README.md CHANGED
@@ -1,69 +1,87 @@
1
1
  # agentic-dev
2
2
 
3
- `agentic-dev`는 `say828`의 공개 `template-*` 레포를 설치하는 scaffold CLI다.
3
+ `agentic-dev`는 `say828/template-*` 레포를 조회해 설치하고, GitHub Project 기반 멀티에이전트 개발 환경까지 같이 구성하는 installer/orchestrator CLI다.
4
4
 
5
- ## 사용법
5
+ ## 역할
6
+
7
+ 이 저장소는 runtime app 자체를 들고 있는 template monorepo가 아니다.
8
+
9
+ - template app/runtime payload: `say828/template-*`
10
+ - installer/orchestration logic: `agentic-dev`
11
+ - shared sub-agent assets: `.agent`, `.claude`, `.codex`
12
+ - target repo workflow/runtime automation: install 시 target repo에 주입
13
+
14
+ ## Interactive Flow
6
15
 
7
16
  ```bash
8
17
  npx agentic-dev
9
18
  ```
10
19
 
11
- 또는 비대화형:
20
+ wizard는 아래 정보를 모두 먼저 받는다.
12
21
 
13
- ```bash
14
- npx agentic-dev init my-app --template template-fullstack-mono --yes
15
- npx agentic-dev init my-app --template template-web --yes --skip-bootstrap
16
- ```
22
+ - project directory
23
+ - project name
24
+ - GitHub repository
25
+ - GitHub auth mode
26
+ - GitHub project mode
27
+ - GitHub project title
28
+ - template repo
29
+ - app mode
30
+ - AI runtime profiles
31
+ - workspace agent surfaces
32
+ - non-empty directory 진행 여부
33
+ - final confirmation
17
34
 
18
- ## 동작
19
-
20
- 1. GitHub에서 공개 `say828/template-*` 레포 목록을 조회한다.
21
- 2. interactive TTY에서는 wizard 화면을 순서대로 보여준다.
22
- - `←/→`: 이전/다음 화면 이동
23
- - `↑/↓`: 고정 선택지 이동
24
- - `Space`: AI providers 다중 선택 토글
25
- - `Enter`: 현재 화면 값 확정
26
- 3. wizard는 최소한 아래 정보를 모두 먼저 받는다.
27
- - project directory
28
- - project name
29
- - GitHub auth mode
30
- - GitHub PAT (`auth mode = pat`일 때만)
31
- - template repo
32
- - app mode
33
- - AI providers
34
- - non-empty directory 진행 여부가 필요하면 그 확인
35
- 4. 모든 입력이 끝나면 실행 계획 요약과 최종 확인 화면을 보여준다.
36
- 5. 최종 확인 전에는 clone, install, bootstrap을 시작하지 않는다.
37
- 6. 확인 후에만 선택한 레포를 새 디렉터리로 복제한다.
38
- 7. `.env.example`이 있으면 `.env`를 자동 생성한다.
39
- 8. `pnpm install`을 자동 실행한다.
40
- 9. 템플릿의 `repo-contract.json`에서 `frontend.default_target`을 읽는다.
41
- 10. `app mode != backend`이면 그 target에 대해 `playwright install chromium`과 parity bootstrap을 실행한다.
42
- 11. `AI providers` 선택에 따라 `.codex`, `.claude` 디렉터리를 정리하고 `.agentic-dev/setup.json`에 wizard 입력값을 기록한다.
43
-
44
- `frontend.default_target`이 있으면 multi-surface 템플릿도 그대로 지원한다. 예를 들어 `template-fullstack-mono`는 `client/web`과 `client/admin`을 함께 포함하지만 기본 bootstrap 대상은 `web`이다.
45
-
46
- ## 예시
35
+ 조작:
47
36
 
48
- ```bash
49
- mkdir my-fullstack-app
50
- cd my-fullstack-app
51
- npx agentic-dev init . --template template-fullstack-mono --yes
52
- ```
37
+ - `←/→`: 이전/다음 화면 이동
38
+ - `↑/↓`: 선택 이동
39
+ - `Space`: multi-select toggle
40
+ - `Enter`: 현재 화면 확정
41
+
42
+ 중요:
53
43
 
54
- 설치가 끝나면 CLI가 아래까지 자동 처리한다.
44
+ - 모든 입력이 끝나기 전에는 clone/install/bootstrap을 실행하지 않는다.
45
+ - 최종 확인 뒤에만 GitHub repo/project, template install, workflow wiring을 실행한다.
55
46
 
56
- - `.env.example -> .env`
57
- - `pnpm install`
58
- - `pnpm --dir client/web exec playwright install chromium`
59
- - `bash sdd/99_toolchain/01_automation/agentic-dev/bootstrap_frontend_parity.sh . web`
60
- - `.agentic-dev/setup.json` 생성
47
+ ## After Confirm
61
48
 
62
- ## 옵션
49
+ CLI는 이 순서로 동작한다.
63
50
 
64
- - `--template`, `-t`: template repo name 또는 suffix
65
- - `--owner`: GitHub owner. 기본값 `say828`
66
- - `--force`: 비어 있지 않은 디렉터리 허용
67
- - `--yes`, `-y`: interactive prompt 생략
68
- - `--skip-bootstrap`: install까지만 하고 bootstrap은 생략
69
- - `--help`, `-h`: 도움말 출력
51
+ 1. GitHub repository create-or-use
52
+ 2. GitHub Project create-or-use
53
+ 3. selected `template-*` repo clone
54
+ 4. shared `.agent`, `.claude`, `.codex` asset install
55
+ 5. `.agentic-dev/orchestration.json` / `.agentic-dev/setup.json` write
56
+ 6. `.github/workflows/agentic-orchestration.yml` install
57
+ 7. `.agentic-dev/runtime/*.mjs` install
58
+ 8. `.env.example -> .env`
59
+ 9. `pnpm install`
60
+ 10. `app mode != backend`이면 Playwright/bootstrap
61
+
62
+ ## Workflow Contract
63
+
64
+ 설치된 repo는 아래 orchestration surface를 가진다.
65
+
66
+ - `sdd/02_plan/**` push
67
+ - `.agentic-dev/runtime/sdd_to_ir.mjs`
68
+ - `.agentic-dev/runtime/sync_project_tasks.mjs`
69
+ - `.agentic-dev/runtime/run_multi_agent_queue.mjs`
70
+ - `.agentic-dev/runtime/close_completed_tasks.mjs`
71
+ - `.github/workflows/agentic-orchestration.yml`
72
+
73
+ 즉 SDD planning 산출물이 push되면 workflow가 task IR를 만들고, GitHub task mirror와 multi-agent queue를 갱신하는 구조다.
74
+
75
+ ## Non-interactive Example
76
+
77
+ ```bash
78
+ npx agentic-dev init my-app \
79
+ --template template-fullstack-mono \
80
+ --project-name my-app \
81
+ --github-repo say828/my-app \
82
+ --github-project-title "My App Delivery" \
83
+ --github-project-mode create-if-missing \
84
+ --provider-profiles codex-subscription,openai-api \
85
+ --providers codex,claude \
86
+ --yes
87
+ ```
@@ -8,15 +8,18 @@ import {
8
8
  DEFAULT_TEMPLATE_OWNER,
9
9
  ensureTargetDir,
10
10
  fetchTemplateRepos,
11
+ finalizeRepositoryGit,
11
12
  installTemplateRepo,
12
13
  parseArgs,
13
14
  resolveTemplateRepo,
15
+ resolveGitHubOrchestration,
14
16
  usage,
15
17
  } from "../lib/scaffold.mjs";
16
18
 
17
19
  const DEFAULT_TARGET_DIR = ".";
18
20
  const DEFAULT_APP_MODE = "fullstack";
19
21
  const DEFAULT_AI_PROVIDERS = ["codex", "claude"];
22
+ const DEFAULT_PROVIDER_PROFILES = ["codex-subscription", "claude-subscription"];
20
23
 
21
24
  const GITHUB_AUTH_CHOICES = [
22
25
  {
@@ -72,6 +75,28 @@ const AI_PROVIDER_CHOICES = [
72
75
  },
73
76
  ];
74
77
 
78
+ const PROVIDER_PROFILE_CHOICES = [
79
+ { label: "codex-subscription", value: "codex-subscription", description: "Codex subscription/runtime access" },
80
+ { label: "codex-api", value: "codex-api", description: "Codex API access" },
81
+ { label: "claude-subscription", value: "claude-subscription", description: "Claude subscription/runtime access" },
82
+ { label: "claude-api", value: "claude-api", description: "Claude API access" },
83
+ { label: "openai-api", value: "openai-api", description: "OpenAI API access" },
84
+ { label: "ollama-self-hosted", value: "ollama-self-hosted", description: "Local Ollama runtime" },
85
+ ];
86
+
87
+ const GITHUB_PROJECT_MODE_CHOICES = [
88
+ {
89
+ label: "create-if-missing",
90
+ value: "create-if-missing",
91
+ description: "Use an existing GitHub Project with the same title, otherwise create it",
92
+ },
93
+ {
94
+ label: "use-existing",
95
+ value: "use-existing",
96
+ description: "Require an existing GitHub Project and fail if it does not exist",
97
+ },
98
+ ];
99
+
75
100
  const CONFIRM_CHOICES = [
76
101
  {
77
102
  label: "Proceed",
@@ -128,6 +153,16 @@ function uniqueProviders(providers) {
128
153
  : [];
129
154
  }
130
155
 
156
+ function normalizeProviderProfiles(providerProfiles) {
157
+ const normalized = Array.isArray(providerProfiles)
158
+ ? providerProfiles.map((profile) => profile.trim()).filter(Boolean)
159
+ : [];
160
+ if (normalized.length > 0) {
161
+ return [...new Set(normalized)];
162
+ }
163
+ return [...DEFAULT_PROVIDER_PROFILES];
164
+ }
165
+
131
166
  function hydrateOptions(options) {
132
167
  const state = {
133
168
  targetDir: (options.targetDir || DEFAULT_TARGET_DIR).trim() || DEFAULT_TARGET_DIR,
@@ -137,6 +172,10 @@ function hydrateOptions(options) {
137
172
  githubPat: options.githubPat || "",
138
173
  appMode: (options.appMode || DEFAULT_APP_MODE).trim() || DEFAULT_APP_MODE,
139
174
  aiProviders: normalizeProviders(options.aiProviders),
175
+ providerProfiles: normalizeProviderProfiles(options.providerProfiles),
176
+ githubRepositoryInput: (options.githubRepositoryInput || "").trim(),
177
+ githubProjectMode: (options.githubProjectMode || "create-if-missing").trim() || "create-if-missing",
178
+ githubProjectTitle: (options.githubProjectTitle || "").trim(),
140
179
  force: Boolean(options.force),
141
180
  skipBootstrap: Boolean(options.skipBootstrap),
142
181
  owner: options.owner || DEFAULT_TEMPLATE_OWNER,
@@ -145,6 +184,12 @@ function hydrateOptions(options) {
145
184
  if (!state.projectName) {
146
185
  state.projectName = inferProjectName(state.targetDir);
147
186
  }
187
+ if (!state.githubRepositoryInput) {
188
+ state.githubRepositoryInput = state.projectName;
189
+ }
190
+ if (!state.githubProjectTitle) {
191
+ state.githubProjectTitle = `${state.projectName} Delivery`;
192
+ }
148
193
 
149
194
  return state;
150
195
  }
@@ -166,6 +211,7 @@ function sanitizeStateForInstall(state) {
166
211
  targetDir: (state.targetDir || DEFAULT_TARGET_DIR).trim() || DEFAULT_TARGET_DIR,
167
212
  projectName: (state.projectName || inferProjectName(state.targetDir)).trim(),
168
213
  aiProviders: normalizeProviders(state.aiProviders),
214
+ providerProfiles: normalizeProviderProfiles(state.providerProfiles),
169
215
  };
170
216
  }
171
217
 
@@ -193,6 +239,13 @@ function buildSteps(state, repos) {
193
239
  description: "Written into scaffold metadata and Claude workspace nickname.",
194
240
  placeholder: inferProjectName(state.targetDir),
195
241
  },
242
+ {
243
+ key: "githubRepositoryInput",
244
+ type: "text",
245
+ label: "GitHub repository",
246
+ description: "Use owner/name, a GitHub URL, or just a repo name to create/use the repository.",
247
+ placeholder: state.projectName,
248
+ },
196
249
  {
197
250
  key: "githubAuthMode",
198
251
  type: "single",
@@ -213,6 +266,20 @@ function buildSteps(state, repos) {
213
266
  }
214
267
 
215
268
  steps.push(
269
+ {
270
+ key: "githubProjectMode",
271
+ type: "single",
272
+ label: "GitHub project mode",
273
+ description: "Choose whether the orchestration must reuse an existing GitHub Project or create one if needed.",
274
+ choices: GITHUB_PROJECT_MODE_CHOICES,
275
+ },
276
+ {
277
+ key: "githubProjectTitle",
278
+ type: "text",
279
+ label: "GitHub project title",
280
+ description: "This project is used for SDD task orchestration.",
281
+ placeholder: `${state.projectName} Delivery`,
282
+ },
216
283
  {
217
284
  key: "template",
218
285
  type: "single",
@@ -227,11 +294,18 @@ function buildSteps(state, repos) {
227
294
  description: "Choose how much of the bootstrap flow should run after clone.",
228
295
  choices: APP_MODE_CHOICES,
229
296
  },
297
+ {
298
+ key: "providerProfiles",
299
+ type: "multi",
300
+ label: "AI runtime profiles",
301
+ description: "Use Space to toggle provider/runtime profiles.",
302
+ choices: PROVIDER_PROFILE_CHOICES,
303
+ },
230
304
  {
231
305
  key: "aiProviders",
232
306
  type: "multi",
233
- label: "AI providers",
234
- description: "Use Space to toggle. At least one provider must stay selected.",
307
+ label: "Workspace agent surfaces",
308
+ description: "Use Space to toggle Codex/Claude workspace assets.",
235
309
  choices: AI_PROVIDER_CHOICES,
236
310
  },
237
311
  );
@@ -275,6 +349,12 @@ function stepValue(state, step) {
275
349
  if (step.key === "projectName") {
276
350
  return state.projectName || step.placeholder || inferProjectName(state.targetDir);
277
351
  }
352
+ if (step.key === "githubRepositoryInput") {
353
+ return state.githubRepositoryInput || step.placeholder || state.projectName;
354
+ }
355
+ if (step.key === "githubProjectTitle") {
356
+ return state.githubProjectTitle || step.placeholder || `${state.projectName} Delivery`;
357
+ }
278
358
  if (step.key === "githubPat") {
279
359
  return state.githubPat || "";
280
360
  }
@@ -356,10 +436,14 @@ function executionPreview(state, selectedRepo) {
356
436
  const lines = [
357
437
  `Project directory: ${path.resolve(process.cwd(), state.targetDir)}`,
358
438
  `Project name: ${state.projectName}`,
439
+ `GitHub repository: ${state.githubRepositoryInput}`,
440
+ `GitHub project mode: ${state.githubProjectMode}`,
441
+ `GitHub project title: ${state.githubProjectTitle}`,
359
442
  `GitHub auth mode: ${state.githubAuthMode}`,
360
443
  `Template repo: ${selectedRepo?.name || state.template}`,
361
444
  `App mode: ${state.appMode}`,
362
445
  `AI providers: ${state.aiProviders.join(", ")}`,
446
+ `Provider profiles: ${state.providerProfiles.join(", ")}`,
363
447
  `Allow non-empty directory: ${state.force ? "yes" : "no"}`,
364
448
  ];
365
449
 
@@ -368,14 +452,17 @@ function executionPreview(state, selectedRepo) {
368
452
  }
369
453
 
370
454
  lines.push("Run plan:");
371
- lines.push(` 1. Clone ${selectedRepo?.name || state.template}`);
372
- lines.push(" 2. Copy .env.example to .env if needed");
373
- lines.push(" 3. Run pnpm install");
455
+ lines.push(` 1. Ensure GitHub repo ${state.githubRepositoryInput}`);
456
+ lines.push(` 2. Ensure GitHub Project ${state.githubProjectTitle}`);
457
+ lines.push(` 3. Clone ${selectedRepo?.name || state.template}`);
458
+ lines.push(" 4. Install shared sub-agent assets and orchestration workflow");
459
+ lines.push(" 5. Copy .env.example to .env if needed");
460
+ lines.push(" 6. Run pnpm install");
374
461
  if (state.appMode === "backend") {
375
- lines.push(" 4. Skip browser install and parity bootstrap");
462
+ lines.push(" 7. Skip browser install and parity bootstrap");
376
463
  } else {
377
- lines.push(" 4. Install Playwright Chromium for the default frontend target");
378
- lines.push(" 5. Run frontend parity bootstrap");
464
+ lines.push(" 7. Install Playwright Chromium for the default frontend target");
465
+ lines.push(" 8. Run frontend parity bootstrap");
379
466
  }
380
467
 
381
468
  return lines;
@@ -464,6 +551,22 @@ function validateStepValue(step, state, value) {
464
551
  return trimmed;
465
552
  }
466
553
 
554
+ if (step.key === "githubRepositoryInput") {
555
+ const trimmed = value.trim();
556
+ if (!trimmed) {
557
+ throw new Error("GitHub repository cannot be empty.");
558
+ }
559
+ return trimmed;
560
+ }
561
+
562
+ if (step.key === "githubProjectTitle") {
563
+ const trimmed = value.trim();
564
+ if (!trimmed) {
565
+ throw new Error("GitHub project title cannot be empty.");
566
+ }
567
+ return trimmed;
568
+ }
569
+
467
570
  if (step.key === "githubPat") {
468
571
  const trimmed = value.trim();
469
572
  if (!trimmed) {
@@ -480,6 +583,14 @@ function validateStepValue(step, state, value) {
480
583
  return providers;
481
584
  }
482
585
 
586
+ if (step.key === "providerProfiles") {
587
+ const profiles = normalizeProviderProfiles(value);
588
+ if (profiles.length === 0) {
589
+ throw new Error("Select at least one provider profile.");
590
+ }
591
+ return profiles;
592
+ }
593
+
483
594
  if (step.key === "force" && value === false) {
484
595
  throw new Error("Prompt cancelled");
485
596
  }
@@ -603,14 +714,22 @@ async function runWizard(initialState, repos) {
603
714
  }
604
715
 
605
716
  if (step.type === "multi" && chunk === " ") {
606
- const selected = new Set(uniqueProviders(state.aiProviders));
717
+ const selected = new Set(
718
+ step.key === "providerProfiles"
719
+ ? normalizeProviderProfiles(state.providerProfiles)
720
+ : uniqueProviders(state.aiProviders),
721
+ );
607
722
  const currentChoice = step.choices[cursors.get(step.key)];
608
723
  if (selected.has(currentChoice.value)) {
609
724
  selected.delete(currentChoice.value);
610
725
  } else {
611
726
  selected.add(currentChoice.value);
612
727
  }
613
- state.aiProviders = [...selected];
728
+ if (step.key === "providerProfiles") {
729
+ state.providerProfiles = [...selected];
730
+ } else {
731
+ state.aiProviders = [...selected];
732
+ }
614
733
  rerender();
615
734
  return undefined;
616
735
  }
@@ -698,6 +817,10 @@ async function promptForMultiChoice(rl, label, choices, defaults) {
698
817
  }
699
818
  }
700
819
 
820
+ async function promptMultiProfiles(rl, label, choices, defaults) {
821
+ return promptForMultiChoice(rl, label, choices, defaults);
822
+ }
823
+
701
824
  function printFallbackPlan(state, repos) {
702
825
  const selectedRepo = resolveTemplateRepo(state.template, repos);
703
826
  console.log("");
@@ -719,6 +842,9 @@ async function promptLinearly(initialState, repos) {
719
842
  const projectNameAnswer = await rl.question(`Project name [${state.projectName || defaultProjectName}]: `);
720
843
  state.projectName = projectNameAnswer.trim() || state.projectName || defaultProjectName;
721
844
 
845
+ const repoAnswer = await rl.question(`GitHub repository [${state.githubRepositoryInput || state.projectName}]: `);
846
+ state.githubRepositoryInput = repoAnswer.trim() || state.githubRepositoryInput || state.projectName;
847
+
722
848
  state.githubAuthMode = await promptForChoice(rl, "GitHub auth mode", GITHUB_AUTH_CHOICES);
723
849
  if (state.githubAuthMode === "pat") {
724
850
  state.githubPat = (await rl.question("GitHub PAT: ")).trim();
@@ -727,8 +853,19 @@ async function promptLinearly(initialState, repos) {
727
853
  }
728
854
  }
729
855
 
856
+ state.githubProjectMode = await promptForChoice(rl, "GitHub project mode", GITHUB_PROJECT_MODE_CHOICES);
857
+ const projectTitleAnswer = await rl.question(`GitHub project title [${state.githubProjectTitle || `${state.projectName} Delivery`}]: `);
858
+ state.githubProjectTitle =
859
+ projectTitleAnswer.trim() || state.githubProjectTitle || `${state.projectName} Delivery`;
860
+
730
861
  state.template = await promptForChoice(rl, `Template repo from ${state.owner}`, buildTemplateChoices(repos));
731
862
  state.appMode = await promptForChoice(rl, "App mode", APP_MODE_CHOICES);
863
+ state.providerProfiles = await promptMultiProfiles(
864
+ rl,
865
+ "AI runtime profiles",
866
+ PROVIDER_PROFILE_CHOICES,
867
+ state.providerProfiles,
868
+ );
732
869
  state.aiProviders = await promptForMultiChoice(rl, "AI providers", AI_PROVIDER_CHOICES, state.aiProviders);
733
870
 
734
871
  if (!state.force && directoryHasUserFiles(state.targetDir)) {
@@ -789,6 +926,12 @@ function validateNonInteractiveState(state) {
789
926
  if (!state.projectName) {
790
927
  state.projectName = inferProjectName(state.targetDir);
791
928
  }
929
+ if (!state.githubRepositoryInput) {
930
+ state.githubRepositoryInput = state.projectName;
931
+ }
932
+ if (!state.githubProjectTitle) {
933
+ state.githubProjectTitle = `${state.projectName} Delivery`;
934
+ }
792
935
  if (state.githubAuthMode === "pat" && !state.githubPat) {
793
936
  throw new Error("`--github-auth pat` requires `--github-pat`.");
794
937
  }
@@ -843,6 +986,7 @@ async function main() {
843
986
  : await promptLinearly(state, repos);
844
987
 
845
988
  applyRuntimeGitHubAuth(resolvedState);
989
+ const orchestration = await resolveGitHubOrchestration(resolvedState);
846
990
  const selectedRepo = resolveTemplateRepo(resolvedState.template, repos);
847
991
  const destinationRoot = ensureTargetDir(resolvedState.targetDir, {
848
992
  force: resolvedState.force,
@@ -850,9 +994,16 @@ async function main() {
850
994
  const result = installTemplateRepo({
851
995
  destinationRoot: path.resolve(destinationRoot),
852
996
  templateRepo: selectedRepo,
853
- setupSelections: resolvedState,
997
+ setupSelections: {
998
+ ...resolvedState,
999
+ ...orchestration,
1000
+ },
854
1001
  skipBootstrap: resolvedState.skipBootstrap,
855
1002
  });
1003
+ finalizeRepositoryGit(path.resolve(destinationRoot), {
1004
+ ...resolvedState,
1005
+ ...orchestration,
1006
+ });
856
1007
  printSuccess(result);
857
1008
  } catch (error) {
858
1009
  console.error(error.message);