agentic-dev 0.2.10 → 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 (603) hide show
  1. package/README.md +50 -29
  2. package/bin/agentic-dev.mjs +656 -124
  3. package/lib/scaffold.mjs +109 -6
  4. package/package.json +8 -22
  5. package/.agent/prd.json +0 -29
  6. package/.agent/progress.txt +0 -1
  7. package/.agent/prompt.md +0 -21
  8. package/.agent/ralph-loop-state.json +0 -13
  9. package/.agent/ralph-supervisor-state.json +0 -12
  10. package/.agent/ralph-supervisor.sh +0 -238
  11. package/.agent/ralph.sh +0 -305
  12. package/.agent/runs/README.md +0 -7
  13. package/.agent/sdd-build-ast-audit.json +0 -13
  14. package/.claude/CLAUDE.md +0 -44
  15. package/.claude/agentic-dev.json +0 -3
  16. package/.claude/agents/ai-dev.md +0 -27
  17. package/.claude/agents/backend-dev.md +0 -26
  18. package/.claude/agents/db-dev.md +0 -26
  19. package/.claude/agents/devops.md +0 -27
  20. package/.claude/agents/frontend-dev.md +0 -25
  21. package/.claude/agents/github-ops.md +0 -25
  22. package/.claude/agents/test-dev.md +0 -26
  23. package/.claude/agents/uiux-designer.md +0 -25
  24. package/.claude/settings.json +0 -49
  25. package/.claude/settings.local.json +0 -8
  26. package/.claude/skills/sdd/SKILL.md +0 -189
  27. package/.claude/skills/sdd/agents/openai.yaml +0 -4
  28. package/.claude/skills/sdd/references/section-map.md +0 -67
  29. package/.claude/workspace-config.json +0 -3
  30. package/.codex/agentic-dev.json +0 -3
  31. package/.codex/agents/README.md +0 -22
  32. package/.codex/agents/api.toml +0 -11
  33. package/.codex/agents/architecture.toml +0 -11
  34. package/.codex/agents/ci.toml +0 -11
  35. package/.codex/agents/gitops.toml +0 -11
  36. package/.codex/agents/orchestrator.toml +0 -11
  37. package/.codex/agents/quality.toml +0 -11
  38. package/.codex/agents/runtime.toml +0 -11
  39. package/.codex/agents/security.toml +0 -11
  40. package/.codex/agents/specs.toml +0 -11
  41. package/.codex/agents/ui.toml +0 -11
  42. package/.codex/config.toml +0 -46
  43. package/.codex/skills/SKILL.md +0 -13
  44. package/.codex/skills/sdd/SKILL.md +0 -189
  45. package/.codex/skills/sdd/agents/openai.yaml +0 -4
  46. package/.codex/skills/sdd/references/section-map.md +0 -67
  47. package/.dockerignore +0 -8
  48. package/.env.example +0 -50
  49. package/.gitignore +0 -16
  50. package/AGENTS.md +0 -86
  51. package/SDD_SKILL.md +0 -589
  52. package/client/admin/.dockerignore +0 -3
  53. package/client/admin/.env.example +0 -1
  54. package/client/admin/Dockerfile +0 -16
  55. package/client/admin/Dockerfile.dev +0 -18
  56. package/client/admin/README.md +0 -20
  57. package/client/admin/index.html +0 -12
  58. package/client/admin/package.json +0 -41
  59. package/client/admin/postcss.config.js +0 -6
  60. package/client/admin/scripts/ui-parity-admin-adapter.mjs +0 -65
  61. package/client/admin/src/api/alerts.ts +0 -33
  62. package/client/admin/src/api/client.ts +0 -71
  63. package/client/admin/src/api/orders.ts +0 -33
  64. package/client/admin/src/api/support.ts +0 -11
  65. package/client/admin/src/app/App.tsx +0 -23
  66. package/client/admin/src/auth/AuthProvider.tsx +0 -122
  67. package/client/admin/src/auth/ProtectedRoute.tsx +0 -22
  68. package/client/admin/src/auth/auth-client.ts +0 -38
  69. package/client/admin/src/auth/types.ts +0 -18
  70. package/client/admin/src/components/AdminNotificationsDrawer.tsx +0 -162
  71. package/client/admin/src/components/AdminShell.tsx +0 -76
  72. package/client/admin/src/components/ui/button.tsx +0 -34
  73. package/client/admin/src/components/ui/input.tsx +0 -21
  74. package/client/admin/src/lib/cn.ts +0 -6
  75. package/client/admin/src/lib/specRouteCatalog.json +0 -30
  76. package/client/admin/src/lib/specScreens.json +0 -22
  77. package/client/admin/src/main.tsx +0 -17
  78. package/client/admin/src/pages/AdminDashboardPage.tsx +0 -171
  79. package/client/admin/src/pages/AdminLoginPage.tsx +0 -75
  80. package/client/admin/src/pages/AdminQueuePage.tsx +0 -107
  81. package/client/admin/src/pages/AdminSupportPage.tsx +0 -61
  82. package/client/admin/src/styles/globals.css +0 -17
  83. package/client/admin/src/theme-vars.ts +0 -18
  84. package/client/admin/src/theme.ts +0 -25
  85. package/client/admin/src/vite-env.d.ts +0 -1
  86. package/client/admin/tailwind.config.js +0 -8
  87. package/client/admin/tsconfig.json +0 -25
  88. package/client/admin/vite.config.ts +0 -12
  89. package/client/landing/.dockerignore +0 -3
  90. package/client/landing/.env.example +0 -1
  91. package/client/landing/Dockerfile +0 -16
  92. package/client/landing/Dockerfile.dev +0 -18
  93. package/client/landing/README.md +0 -18
  94. package/client/landing/index.html +0 -12
  95. package/client/landing/package.json +0 -41
  96. package/client/landing/postcss.config.js +0 -6
  97. package/client/landing/scripts/ui-parity-landing-adapter.mjs +0 -65
  98. package/client/landing/src/App.tsx +0 -21
  99. package/client/landing/src/api/catalog.ts +0 -30
  100. package/client/landing/src/api/client.ts +0 -30
  101. package/client/landing/src/auth/AuthProvider.tsx +0 -122
  102. package/client/landing/src/auth/ProtectedRoute.tsx +0 -22
  103. package/client/landing/src/auth/auth-client.ts +0 -38
  104. package/client/landing/src/auth/types.ts +0 -18
  105. package/client/landing/src/components/LandingShell.tsx +0 -34
  106. package/client/landing/src/lib/specRouteCatalog.json +0 -23
  107. package/client/landing/src/lib/specScreens.json +0 -17
  108. package/client/landing/src/main.tsx +0 -17
  109. package/client/landing/src/pages/LandingHomePage.tsx +0 -215
  110. package/client/landing/src/pages/LandingLoginPage.tsx +0 -90
  111. package/client/landing/src/pages/LandingWorkspacePage.tsx +0 -126
  112. package/client/landing/src/styles/globals.css +0 -17
  113. package/client/landing/src/theme-vars.ts +0 -16
  114. package/client/landing/src/theme.ts +0 -21
  115. package/client/landing/src/vite-env.d.ts +0 -1
  116. package/client/landing/tailwind.config.js +0 -8
  117. package/client/landing/tsconfig.json +0 -25
  118. package/client/landing/vite.config.ts +0 -12
  119. package/client/mobile/.dockerignore +0 -2
  120. package/client/mobile/.env.example +0 -1
  121. package/client/mobile/Dockerfile +0 -16
  122. package/client/mobile/Dockerfile.dev +0 -18
  123. package/client/mobile/README.md +0 -19
  124. package/client/mobile/index.html +0 -12
  125. package/client/mobile/package.json +0 -42
  126. package/client/mobile/postcss.config.js +0 -6
  127. package/client/mobile/scripts/ui-parity-mobile-adapter.mjs +0 -67
  128. package/client/mobile/src/App.tsx +0 -1
  129. package/client/mobile/src/api/client.ts +0 -62
  130. package/client/mobile/src/api/fulfillment.ts +0 -55
  131. package/client/mobile/src/api/shipping.ts +0 -56
  132. package/client/mobile/src/app/App.tsx +0 -23
  133. package/client/mobile/src/auth/AuthProvider.tsx +0 -122
  134. package/client/mobile/src/auth/ProtectedRoute.tsx +0 -27
  135. package/client/mobile/src/auth/auth-client.ts +0 -38
  136. package/client/mobile/src/auth/types.ts +0 -18
  137. package/client/mobile/src/components/InShell.tsx +0 -74
  138. package/client/mobile/src/components/ui/button.tsx +0 -35
  139. package/client/mobile/src/components/ui/card.tsx +0 -15
  140. package/client/mobile/src/components/ui/input.tsx +0 -21
  141. package/client/mobile/src/lib/cn.ts +0 -6
  142. package/client/mobile/src/lib/specRouteCatalog.json +0 -26
  143. package/client/mobile/src/lib/specScreens.json +0 -22
  144. package/client/mobile/src/lib/useSpeechRecognitionInput.ts +0 -271
  145. package/client/mobile/src/main.tsx +0 -17
  146. package/client/mobile/src/pages/DashboardPage.tsx +0 -172
  147. package/client/mobile/src/pages/FulfillmentPage.tsx +0 -138
  148. package/client/mobile/src/pages/LoginPage.tsx +0 -74
  149. package/client/mobile/src/pages/ShippingPage.tsx +0 -338
  150. package/client/mobile/src/styles/globals.css +0 -23
  151. package/client/mobile/src/theme-vars.ts +0 -16
  152. package/client/mobile/src/theme.ts +0 -21
  153. package/client/mobile/src/vite-env.d.ts +0 -1
  154. package/client/mobile/tailwind.config.js +0 -8
  155. package/client/mobile/tsconfig.json +0 -25
  156. package/client/mobile/vite.config.ts +0 -12
  157. package/client/web/.dockerignore +0 -3
  158. package/client/web/.env.example +0 -1
  159. package/client/web/Dockerfile +0 -16
  160. package/client/web/Dockerfile.dev +0 -18
  161. package/client/web/README.md +0 -47
  162. package/client/web/index.html +0 -12
  163. package/client/web/package.json +0 -42
  164. package/client/web/postcss.config.js +0 -6
  165. package/client/web/scripts/ui-parity-web-adapter.mjs +0 -66
  166. package/client/web/src/api/client.ts +0 -30
  167. package/client/web/src/api/orders.ts +0 -42
  168. package/client/web/src/app/App.tsx +0 -21
  169. package/client/web/src/auth/AuthProvider.tsx +0 -122
  170. package/client/web/src/auth/ProtectedRoute.tsx +0 -22
  171. package/client/web/src/auth/auth-client.ts +0 -38
  172. package/client/web/src/auth/types.ts +0 -18
  173. package/client/web/src/components/AppShell.tsx +0 -59
  174. package/client/web/src/components/ui/button.tsx +0 -35
  175. package/client/web/src/components/ui/card.tsx +0 -7
  176. package/client/web/src/components/ui/input.tsx +0 -21
  177. package/client/web/src/lib/cn.ts +0 -6
  178. package/client/web/src/lib/specRouteCatalog.json +0 -23
  179. package/client/web/src/lib/specScreens.json +0 -17
  180. package/client/web/src/main.tsx +0 -17
  181. package/client/web/src/pages/DashboardPage.tsx +0 -158
  182. package/client/web/src/pages/LoginPage.tsx +0 -72
  183. package/client/web/src/pages/OrdersPage.tsx +0 -123
  184. package/client/web/src/styles/globals.css +0 -17
  185. package/client/web/src/theme-vars.ts +0 -18
  186. package/client/web/src/theme.ts +0 -25
  187. package/client/web/src/vite-env.d.ts +0 -1
  188. package/client/web/tailwind.config.js +0 -8
  189. package/client/web/tsconfig.json +0 -25
  190. package/client/web/vite.config.ts +0 -12
  191. package/compose.yml +0 -206
  192. package/infra/compose/.env.dev.example +0 -28
  193. package/infra/compose/.env.prod.example +0 -29
  194. package/infra/compose/README.md +0 -35
  195. package/infra/compose/dev.yml +0 -125
  196. package/infra/compose/prod.yml +0 -126
  197. package/infra/terraform/README.md +0 -34
  198. package/infra/terraform/aws/data/.terraform.lock.hcl +0 -25
  199. package/infra/terraform/aws/data/README.md +0 -18
  200. package/infra/terraform/aws/data/main.tf +0 -147
  201. package/infra/terraform/aws/data/outputs.tf +0 -14
  202. package/infra/terraform/aws/data/variables.tf +0 -57
  203. package/infra/terraform/aws/data/versions.tf +0 -10
  204. package/infra/terraform/aws/domain/.terraform.lock.hcl +0 -25
  205. package/infra/terraform/aws/domain/README.md +0 -20
  206. package/infra/terraform/aws/domain/env/dev.tfvars.example +0 -6
  207. package/infra/terraform/aws/domain/env/prod.tfvars.example +0 -7
  208. package/infra/terraform/aws/domain/main.tf +0 -149
  209. package/infra/terraform/aws/domain/outputs.tf +0 -29
  210. package/infra/terraform/aws/domain/variables.tf +0 -58
  211. package/infra/terraform/aws/domain/versions.tf +0 -10
  212. package/infra/terraform/openstack/README.md +0 -38
  213. package/infra/terraform/openstack/dev/.terraform.lock.hcl +0 -24
  214. package/infra/terraform/openstack/dev/README.md +0 -18
  215. package/infra/terraform/openstack/dev/main.tf +0 -49
  216. package/infra/terraform/openstack/dev/providers.tf +0 -15
  217. package/infra/terraform/openstack/dev/terraform.tfvars.example +0 -54
  218. package/infra/terraform/openstack/dev/variables.tf +0 -210
  219. package/infra/terraform/openstack/dev/versions.tf +0 -10
  220. package/infra/terraform/openstack/modules/environment_host/main.tf +0 -143
  221. package/infra/terraform/openstack/modules/environment_host/outputs.tf +0 -25
  222. package/infra/terraform/openstack/modules/environment_host/templates/docker-host-user-data.sh.tftpl +0 -40
  223. package/infra/terraform/openstack/modules/environment_host/variables.tf +0 -145
  224. package/infra/terraform/openstack/modules/environment_host/versions.tf +0 -7
  225. package/infra/terraform/openstack/prod/.terraform.lock.hcl +0 -24
  226. package/infra/terraform/openstack/prod/README.md +0 -18
  227. package/infra/terraform/openstack/prod/main.tf +0 -49
  228. package/infra/terraform/openstack/prod/providers.tf +0 -15
  229. package/infra/terraform/openstack/prod/terraform.tfvars.example +0 -55
  230. package/infra/terraform/openstack/prod/variables.tf +0 -210
  231. package/infra/terraform/openstack/prod/versions.tf +0 -10
  232. package/infra/terraform/openstack/server/.terraform.lock.hcl +0 -45
  233. package/infra/terraform/openstack/server/README.md +0 -47
  234. package/infra/terraform/openstack/server/main.tf +0 -161
  235. package/infra/terraform/openstack/server/outputs.tf +0 -30
  236. package/infra/terraform/openstack/server/providers.tf +0 -30
  237. package/infra/terraform/openstack/server/templates/server-user-data.sh.tftpl +0 -50
  238. package/infra/terraform/openstack/server/variables.tf +0 -233
  239. package/infra/terraform/openstack/server/zz_aspace.auto.tfvars.example.json +0 -29
  240. package/pnpm-workspace.yaml +0 -2
  241. package/scripts/dev/audit_sdd_build_ast.py +0 -277
  242. package/sdd/01_planning/01_feature/INDEX.md +0 -16
  243. package/sdd/01_planning/01_feature/README.md +0 -76
  244. package/sdd/01_planning/01_feature/alerts_feature_spec.md +0 -55
  245. package/sdd/01_planning/01_feature/auth_feature_spec.md +0 -57
  246. package/sdd/01_planning/01_feature/catalog_feature_spec.md +0 -61
  247. package/sdd/01_planning/01_feature/fulfillment_feature_spec.md +0 -58
  248. package/sdd/01_planning/01_feature/health_feature_spec.md +0 -52
  249. package/sdd/01_planning/01_feature/inventory_feature_spec.md +0 -60
  250. package/sdd/01_planning/01_feature/order_feature_spec.md +0 -63
  251. package/sdd/01_planning/01_feature/shipping_feature_spec.md +0 -55
  252. package/sdd/01_planning/01_feature/support_feature_spec.md +0 -53
  253. package/sdd/01_planning/01_feature/user_feature_spec.md +0 -54
  254. package/sdd/01_planning/02_screen/INDEX.md +0 -13
  255. package/sdd/01_planning/02_screen/README.md +0 -41
  256. package/sdd/01_planning/02_screen/admin_screen_spec.pdf +0 -0
  257. package/sdd/01_planning/02_screen/assets/README.md +0 -16
  258. package/sdd/01_planning/02_screen/assets/example/README.md +0 -13
  259. package/sdd/01_planning/02_screen/landing_screen_spec.pdf +0 -0
  260. package/sdd/01_planning/02_screen/mobile_screen_spec.pdf +0 -0
  261. package/sdd/01_planning/02_screen/web_screen_spec.pdf +0 -0
  262. package/sdd/01_planning/03_architecture/INDEX.md +0 -9
  263. package/sdd/01_planning/03_architecture/README.md +0 -25
  264. package/sdd/01_planning/03_architecture/architecture_document_structure.md +0 -77
  265. package/sdd/01_planning/03_architecture/backend/README.md +0 -10
  266. package/sdd/01_planning/03_architecture/frontend/README.md +0 -12
  267. package/sdd/01_planning/03_architecture/infra/README.md +0 -10
  268. package/sdd/01_planning/03_architecture/tech-research/README.md +0 -4
  269. package/sdd/01_planning/03_architecture/templates_system_architecture.md +0 -84
  270. package/sdd/01_planning/04_data/INDEX.md +0 -4
  271. package/sdd/01_planning/04_data/README.md +0 -10
  272. package/sdd/01_planning/04_data/templates_data_modeling.md +0 -119
  273. package/sdd/01_planning/05_api/README.md +0 -12
  274. package/sdd/01_planning/05_api/templates_api_contract.md +0 -90
  275. package/sdd/01_planning/06_iac/README.md +0 -11
  276. package/sdd/01_planning/06_iac/templates_runtime_and_cicd_baseline.md +0 -46
  277. package/sdd/01_planning/07_integration/README.md +0 -11
  278. package/sdd/01_planning/07_integration/templates_frontend_api_integration.md +0 -46
  279. package/sdd/01_planning/08_nonfunctional/README.md +0 -7
  280. package/sdd/01_planning/09_security/README.md +0 -7
  281. package/sdd/01_planning/10_test/README.md +0 -12
  282. package/sdd/01_planning/10_test/templates_test_strategy.md +0 -60
  283. package/sdd/01_planning/INDEX.md +0 -19
  284. package/sdd/01_planning/README.md +0 -17
  285. package/sdd/02_plan/01_feature/README.md +0 -34
  286. package/sdd/02_plan/01_feature/_feature_todo_template.md +0 -29
  287. package/sdd/02_plan/02_screen/INDEX.md +0 -19
  288. package/sdd/02_plan/02_screen/README.md +0 -39
  289. package/sdd/02_plan/02_screen/_screen_todo_template.md +0 -60
  290. package/sdd/02_plan/03_architecture/README.md +0 -23
  291. package/sdd/02_plan/03_architecture/architecture_document_governance.md +0 -40
  292. package/sdd/02_plan/03_architecture/build_ast_runtime_tree_governance.md +0 -53
  293. package/sdd/02_plan/03_architecture/repository_governance.md +0 -39
  294. package/sdd/02_plan/03_architecture/runtime_and_structure_governance.md +0 -38
  295. package/sdd/02_plan/03_architecture/templates-hexagonal-template-architecture.md +0 -9
  296. package/sdd/02_plan/03_architecture/toolchain_governance.md +0 -98
  297. package/sdd/02_plan/04_data/README.md +0 -5
  298. package/sdd/02_plan/05_api/README.md +0 -5
  299. package/sdd/02_plan/06_iac/README.md +0 -11
  300. package/sdd/02_plan/06_iac/dev_runtime_delivery.md +0 -36
  301. package/sdd/02_plan/06_iac/template_runtime_delivery.md +0 -50
  302. package/sdd/02_plan/07_integration/README.md +0 -5
  303. package/sdd/02_plan/07_integration/frontend_live_integration.md +0 -31
  304. package/sdd/02_plan/08_nonfunctional/README.md +0 -5
  305. package/sdd/02_plan/08_nonfunctional/repository_hygiene.md +0 -26
  306. package/sdd/02_plan/09_security/README.md +0 -5
  307. package/sdd/02_plan/10_test/README.md +0 -11
  308. package/sdd/02_plan/10_test/regression_verification.md +0 -39
  309. package/sdd/02_plan/10_test/templates/README.md +0 -8
  310. package/sdd/02_plan/10_test/templates/ui_parity_web_contract.template.yaml +0 -23
  311. package/sdd/02_plan/10_test/verification_strategy.md +0 -43
  312. package/sdd/02_plan/99_generated/from_planning/ui_parity/.gitkeep +0 -1
  313. package/sdd/02_plan/README.md +0 -40
  314. package/sdd/03_build/01_feature/README.md +0 -20
  315. package/sdd/03_build/01_feature/domain/README.md +0 -3
  316. package/sdd/03_build/01_feature/domain/account_and_access.md +0 -20
  317. package/sdd/03_build/01_feature/domain/catalog_and_inventory.md +0 -20
  318. package/sdd/03_build/01_feature/domain/ordering_and_fulfillment.md +0 -21
  319. package/sdd/03_build/01_feature/domain/support_and_observability.md +0 -21
  320. package/sdd/03_build/01_feature/domain_surfaces.md +0 -28
  321. package/sdd/03_build/01_feature/service/README.md +0 -3
  322. package/sdd/03_build/01_feature/service/admin_surface.md +0 -15
  323. package/sdd/03_build/01_feature/service/landing_surface.md +0 -13
  324. package/sdd/03_build/01_feature/service/mobile_surface.md +0 -14
  325. package/sdd/03_build/01_feature/service/web_surface.md +0 -14
  326. package/sdd/03_build/02_screen/README.md +0 -25
  327. package/sdd/03_build/02_screen/_screen_build_template.md +0 -26
  328. package/sdd/03_build/02_screen/admin/README.md +0 -5
  329. package/sdd/03_build/02_screen/landing/README.md +0 -5
  330. package/sdd/03_build/02_screen/mobile/README.md +0 -5
  331. package/sdd/03_build/02_screen/web/README.md +0 -5
  332. package/sdd/03_build/03_architecture/README.md +0 -10
  333. package/sdd/03_build/03_architecture/architecture_document_governance.md +0 -30
  334. package/sdd/03_build/03_architecture/build_ast_runtime_tree_governance.md +0 -24
  335. package/sdd/03_build/03_architecture/repository_governance.md +0 -18
  336. package/sdd/03_build/03_architecture/toolchain_governance.md +0 -36
  337. package/sdd/03_build/06_iac/README.md +0 -3
  338. package/sdd/03_build/06_iac/dev_runtime_delivery.md +0 -10
  339. package/sdd/03_build/06_iac/template_runtime_delivery.md +0 -49
  340. package/sdd/03_build/07_integration/README.md +0 -3
  341. package/sdd/03_build/07_integration/frontend_live_integration.md +0 -11
  342. package/sdd/03_build/08_nonfunctional/README.md +0 -3
  343. package/sdd/03_build/08_nonfunctional/repository_hygiene.md +0 -10
  344. package/sdd/03_build/10_test/README.md +0 -9
  345. package/sdd/03_build/10_test/regression_verification.md +0 -16
  346. package/sdd/03_build/10_test/verification_harness.md +0 -11
  347. package/sdd/03_build/README.md +0 -35
  348. package/sdd/03_verify/01_feature/README.md +0 -5
  349. package/sdd/03_verify/01_feature/domain_verification.md +0 -14
  350. package/sdd/03_verify/01_feature/service_verification.md +0 -22
  351. package/sdd/03_verify/02_screen/README.md +0 -6
  352. package/sdd/03_verify/02_screen/_screen_verify_template.md +0 -20
  353. package/sdd/03_verify/02_screen/admin/README.md +0 -4
  354. package/sdd/03_verify/02_screen/landing/README.md +0 -4
  355. package/sdd/03_verify/02_screen/mobile/README.md +0 -4
  356. package/sdd/03_verify/02_screen/web/README.md +0 -4
  357. package/sdd/03_verify/03_architecture/README.md +0 -10
  358. package/sdd/03_verify/03_architecture/architecture_document_governance.md +0 -15
  359. package/sdd/03_verify/03_architecture/build_ast_runtime_tree_governance.md +0 -28
  360. package/sdd/03_verify/03_architecture/repository_governance.md +0 -16
  361. package/sdd/03_verify/03_architecture/toolchain_governance.md +0 -58
  362. package/sdd/03_verify/06_iac/README.md +0 -3
  363. package/sdd/03_verify/06_iac/dev_runtime_delivery.md +0 -10
  364. package/sdd/03_verify/06_iac/template_runtime_delivery.md +0 -42
  365. package/sdd/03_verify/07_integration/README.md +0 -3
  366. package/sdd/03_verify/07_integration/frontend_live_integration.md +0 -16
  367. package/sdd/03_verify/08_nonfunctional/README.md +0 -3
  368. package/sdd/03_verify/08_nonfunctional/repository_hygiene.md +0 -14
  369. package/sdd/03_verify/10_test/README.md +0 -9
  370. package/sdd/03_verify/10_test/regression_verification.md +0 -16
  371. package/sdd/03_verify/10_test/ui_parity/README.md +0 -4
  372. package/sdd/03_verify/10_test/ui_parity/loop_runs/.gitkeep +0 -0
  373. package/sdd/03_verify/10_test/ui_parity/reference/.gitkeep +0 -0
  374. package/sdd/03_verify/10_test/ui_parity/staged_runs/.gitkeep +0 -0
  375. package/sdd/03_verify/10_test/verification_harness.md +0 -17
  376. package/sdd/03_verify/README.md +0 -22
  377. package/sdd/05_operate/01_runbooks/.gitkeep +0 -1
  378. package/sdd/05_operate/01_runbooks/README.md +0 -4
  379. package/sdd/05_operate/02_delivery_status/README.md +0 -4
  380. package/sdd/05_operate/02_delivery_status/service_status.md +0 -16
  381. package/sdd/05_operate/README.md +0 -12
  382. package/sdd/99_toolchain/01_automation/.gitkeep +0 -1
  383. package/sdd/99_toolchain/01_automation/README.md +0 -76
  384. package/sdd/99_toolchain/01_automation/agentic-dev/analyze_proof_results.py +0 -132
  385. package/sdd/99_toolchain/01_automation/agentic-dev/analyze_route_gap.py +0 -85
  386. package/sdd/99_toolchain/01_automation/agentic-dev/assets/repo-contract.template.json +0 -75
  387. package/sdd/99_toolchain/01_automation/agentic-dev/bootstrap_frontend_parity.sh +0 -84
  388. package/sdd/99_toolchain/01_automation/agentic-dev/init_frontend_parity.sh +0 -33
  389. package/sdd/99_toolchain/01_automation/agentic-dev/init_repo_contract.sh +0 -51
  390. package/sdd/99_toolchain/01_automation/agentic-dev/repo-contract.json +0 -76
  391. package/sdd/99_toolchain/01_automation/agentic-dev/resolve_frontend_target.py +0 -52
  392. package/sdd/99_toolchain/01_automation/agentic-dev/resolve_repo_contract.py +0 -56
  393. package/sdd/99_toolchain/01_automation/agentic-dev/run_frontend_target.sh +0 -100
  394. package/sdd/99_toolchain/01_automation/agentic-dev/run_repo_phase.sh +0 -140
  395. package/sdd/99_toolchain/01_automation/agentic-dev/validate_json_schema.py +0 -39
  396. package/sdd/99_toolchain/01_automation/agentic-parity-harness-design.md +0 -291
  397. package/sdd/99_toolchain/01_automation/assets/admin_screen_capture/dashboard.png +0 -0
  398. package/sdd/99_toolchain/01_automation/assets/admin_screen_capture/login.png +0 -0
  399. package/sdd/99_toolchain/01_automation/assets/admin_screen_capture/queue.png +0 -0
  400. package/sdd/99_toolchain/01_automation/assets/admin_screen_capture/support.png +0 -0
  401. package/sdd/99_toolchain/01_automation/assets/landing_screen_capture/home.png +0 -0
  402. package/sdd/99_toolchain/01_automation/assets/landing_screen_capture/login.png +0 -0
  403. package/sdd/99_toolchain/01_automation/assets/landing_screen_capture/workspace.png +0 -0
  404. package/sdd/99_toolchain/01_automation/assets/mobile_screen_capture/dashboard.png +0 -0
  405. package/sdd/99_toolchain/01_automation/assets/mobile_screen_capture/fulfillment.png +0 -0
  406. package/sdd/99_toolchain/01_automation/assets/mobile_screen_capture/login.png +0 -0
  407. package/sdd/99_toolchain/01_automation/assets/web_screen_capture/dashboard.png +0 -0
  408. package/sdd/99_toolchain/01_automation/assets/web_screen_capture/login.png +0 -0
  409. package/sdd/99_toolchain/01_automation/assets/web_screen_capture/orders.png +0 -0
  410. package/sdd/99_toolchain/01_automation/build_asset_recipes.py +0 -10
  411. package/sdd/99_toolchain/01_automation/build_screen_spec_pdf.py +0 -427
  412. package/sdd/99_toolchain/01_automation/capture_screen_assets.mjs +0 -148
  413. package/sdd/99_toolchain/01_automation/harness-layout.md +0 -34
  414. package/sdd/99_toolchain/01_automation/parity-execution-tooling-design.md +0 -319
  415. package/sdd/99_toolchain/01_automation/playwright_exactness_manifest.py +0 -21
  416. package/sdd/99_toolchain/01_automation/run_playwright_exactness.py +0 -87
  417. package/sdd/99_toolchain/01_automation/screen_spec_manifest.py +0 -321
  418. package/sdd/99_toolchain/01_automation/spec_asset_builder.py +0 -274
  419. package/sdd/99_toolchain/01_automation/ui-contract-projection.md +0 -79
  420. package/sdd/99_toolchain/01_automation/ui-parity/README.md +0 -60
  421. package/sdd/99_toolchain/01_automation/ui-parity/cli/extract-reference-pages.mjs +0 -2
  422. package/sdd/99_toolchain/01_automation/ui-parity/cli/materialize-reference-assets.mjs +0 -58
  423. package/sdd/99_toolchain/01_automation/ui-parity/cli/normalize-reference-assets.mjs +0 -2
  424. package/sdd/99_toolchain/01_automation/ui-parity/cli/route-gap-report.mjs +0 -187
  425. package/sdd/99_toolchain/01_automation/ui-parity/cli/run-proof.mjs +0 -50
  426. package/sdd/99_toolchain/01_automation/ui-parity/cli/scaffold-contract.mjs +0 -62
  427. package/sdd/99_toolchain/01_automation/ui-parity/cli/upload-parity1.mjs +0 -2
  428. package/sdd/99_toolchain/01_automation/ui-parity/contracts/collector-metadata.schema.json +0 -33
  429. package/sdd/99_toolchain/01_automation/ui-parity/contracts/proof-result.schema.json +0 -76
  430. package/sdd/99_toolchain/01_automation/ui-parity/contracts/route-gap-report.schema.json +0 -95
  431. package/sdd/99_toolchain/01_automation/ui-parity/core/capture-runner.mjs +0 -55
  432. package/sdd/99_toolchain/01_automation/ui-parity/core/load-adapter.mjs +0 -25
  433. package/sdd/99_toolchain/01_automation/ui-parity/core/load-contract.mjs +0 -81
  434. package/sdd/99_toolchain/01_automation/ui-parity/core/paths.mjs +0 -23
  435. package/sdd/99_toolchain/01_automation/ui-parity/core/proof-runner.mjs +0 -255
  436. package/sdd/99_toolchain/01_automation/ui-parity/interfaces/ui-parity-artifact-layout.md +0 -23
  437. package/sdd/99_toolchain/01_automation/ui-parity/interfaces/ui-parity-proof-interface.md +0 -60
  438. package/sdd/99_toolchain/01_automation/ui-parity/interfaces/ui-parity-route-gap-interface.md +0 -82
  439. package/sdd/99_toolchain/01_automation/ui-parity/runtime/playwright-runtime.mjs +0 -16
  440. package/sdd/99_toolchain/01_automation/ui-parity/runtime/static-runtime.mjs +0 -6
  441. package/sdd/99_toolchain/02_policies/.gitkeep +0 -1
  442. package/sdd/99_toolchain/02_policies/build-ast-governance-policy.md +0 -22
  443. package/sdd/99_toolchain/02_policies/compose-runtime-baseline-policy.md +0 -24
  444. package/sdd/99_toolchain/02_policies/convention-storage-policy.md +0 -26
  445. package/sdd/99_toolchain/02_policies/main-push-before-dev-deploy-policy.md +0 -27
  446. package/sdd/99_toolchain/02_policies/regression-verification-policy.md +0 -22
  447. package/sdd/99_toolchain/03_templates/.gitkeep +0 -1
  448. package/sdd/99_toolchain/03_templates/asset_recipe_manifest.example.py +0 -38
  449. package/sdd/99_toolchain/03_templates/generated_assets/README.md +0 -11
  450. package/sdd/99_toolchain/03_templates/generated_assets/example-brand-lockup.svg +0 -3
  451. package/sdd/99_toolchain/03_templates/generated_assets/example-brand-mark.svg +0 -3
  452. package/sdd/99_toolchain/03_templates/generated_assets/example-brand-wordmark.svg +0 -3
  453. package/sdd/99_toolchain/03_templates/playwright_exactness_manifest.example.py +0 -21
  454. package/sdd/99_toolchain/README.md +0 -23
  455. package/sdd/README.md +0 -21
  456. package/server/.dockerignore +0 -4
  457. package/server/.env.example +0 -19
  458. package/server/Dockerfile +0 -22
  459. package/server/Dockerfile.dev +0 -19
  460. package/server/README.md +0 -33
  461. package/server/__init__.py +0 -0
  462. package/server/api/__init__.py +0 -1
  463. package/server/api/http/__init__.py +0 -4
  464. package/server/api/http/app.py +0 -53
  465. package/server/api/http/router.py +0 -24
  466. package/server/config.py +0 -52
  467. package/server/contexts/__init__.py +0 -12
  468. package/server/contexts/alerts/__init__.py +0 -1
  469. package/server/contexts/alerts/application/__init__.py +0 -13
  470. package/server/contexts/alerts/application/services.py +0 -41
  471. package/server/contexts/alerts/contracts/__init__.py +0 -3
  472. package/server/contexts/alerts/contracts/http/__init__.py +0 -3
  473. package/server/contexts/alerts/contracts/http/router.py +0 -37
  474. package/server/contexts/alerts/domain/__init__.py +0 -15
  475. package/server/contexts/alerts/domain/models.py +0 -29
  476. package/server/contexts/alerts/infrastructure/__init__.py +0 -11
  477. package/server/contexts/alerts/infrastructure/repository.py +0 -41
  478. package/server/contexts/auth/__init__.py +0 -1
  479. package/server/contexts/auth/application/__init__.py +0 -3
  480. package/server/contexts/auth/application/ports.py +0 -10
  481. package/server/contexts/auth/application/services.py +0 -64
  482. package/server/contexts/auth/contracts/__init__.py +0 -4
  483. package/server/contexts/auth/contracts/http/__init__.py +0 -4
  484. package/server/contexts/auth/contracts/http/dependencies.py +0 -37
  485. package/server/contexts/auth/contracts/http/router.py +0 -19
  486. package/server/contexts/auth/domain/__init__.py +0 -3
  487. package/server/contexts/auth/domain/models.py +0 -24
  488. package/server/contexts/auth/infrastructure/__init__.py +0 -4
  489. package/server/contexts/auth/infrastructure/adapters/memory.py +0 -19
  490. package/server/contexts/auth/infrastructure/adapters/mongodb.py +0 -24
  491. package/server/contexts/auth/infrastructure/adapters/sqlalchemy.py +0 -74
  492. package/server/contexts/auth/infrastructure/repository.py +0 -28
  493. package/server/contexts/catalog/__init__.py +0 -1
  494. package/server/contexts/catalog/application/__init__.py +0 -28
  495. package/server/contexts/catalog/application/ports.py +0 -15
  496. package/server/contexts/catalog/application/services.py +0 -154
  497. package/server/contexts/catalog/contracts/__init__.py +0 -3
  498. package/server/contexts/catalog/contracts/http/__init__.py +0 -3
  499. package/server/contexts/catalog/contracts/http/router.py +0 -60
  500. package/server/contexts/catalog/domain/__init__.py +0 -45
  501. package/server/contexts/catalog/domain/models.py +0 -113
  502. package/server/contexts/catalog/infrastructure/__init__.py +0 -4
  503. package/server/contexts/catalog/infrastructure/adapters/memory.py +0 -62
  504. package/server/contexts/catalog/infrastructure/repository.py +0 -8
  505. package/server/contexts/fulfillment/__init__.py +0 -1
  506. package/server/contexts/fulfillment/application/__init__.py +0 -13
  507. package/server/contexts/fulfillment/application/ports.py +0 -20
  508. package/server/contexts/fulfillment/application/services.py +0 -85
  509. package/server/contexts/fulfillment/contracts/__init__.py +0 -3
  510. package/server/contexts/fulfillment/contracts/http/__init__.py +0 -3
  511. package/server/contexts/fulfillment/contracts/http/router.py +0 -40
  512. package/server/contexts/fulfillment/domain/__init__.py +0 -25
  513. package/server/contexts/fulfillment/domain/models.py +0 -73
  514. package/server/contexts/fulfillment/infrastructure/__init__.py +0 -13
  515. package/server/contexts/fulfillment/infrastructure/adapters/memory.py +0 -43
  516. package/server/contexts/fulfillment/infrastructure/repository.py +0 -97
  517. package/server/contexts/health/__init__.py +0 -1
  518. package/server/contexts/health/application/__init__.py +0 -3
  519. package/server/contexts/health/application/services.py +0 -2
  520. package/server/contexts/health/contracts/__init__.py +0 -3
  521. package/server/contexts/health/contracts/http/__init__.py +0 -3
  522. package/server/contexts/health/contracts/http/router.py +0 -10
  523. package/server/contexts/inventory/__init__.py +0 -1
  524. package/server/contexts/inventory/application/__init__.py +0 -28
  525. package/server/contexts/inventory/application/ports.py +0 -11
  526. package/server/contexts/inventory/application/services.py +0 -214
  527. package/server/contexts/inventory/contracts/__init__.py +0 -3
  528. package/server/contexts/inventory/contracts/http/__init__.py +0 -3
  529. package/server/contexts/inventory/contracts/http/router.py +0 -82
  530. package/server/contexts/inventory/domain/__init__.py +0 -33
  531. package/server/contexts/inventory/domain/models.py +0 -93
  532. package/server/contexts/inventory/infrastructure/__init__.py +0 -4
  533. package/server/contexts/inventory/infrastructure/adapters/memory.py +0 -24
  534. package/server/contexts/inventory/infrastructure/repository.py +0 -8
  535. package/server/contexts/orders/__init__.py +0 -1
  536. package/server/contexts/orders/application/__init__.py +0 -19
  537. package/server/contexts/orders/application/services.py +0 -127
  538. package/server/contexts/orders/contracts/__init__.py +0 -3
  539. package/server/contexts/orders/contracts/http/__init__.py +0 -3
  540. package/server/contexts/orders/contracts/http/router.py +0 -82
  541. package/server/contexts/orders/domain/__init__.py +0 -29
  542. package/server/contexts/orders/domain/models.py +0 -95
  543. package/server/contexts/orders/infrastructure/__init__.py +0 -7
  544. package/server/contexts/orders/infrastructure/repository.py +0 -104
  545. package/server/contexts/shipping/__init__.py +0 -1
  546. package/server/contexts/shipping/application/__init__.py +0 -13
  547. package/server/contexts/shipping/application/services.py +0 -92
  548. package/server/contexts/shipping/contracts/__init__.py +0 -3
  549. package/server/contexts/shipping/contracts/http/__init__.py +0 -3
  550. package/server/contexts/shipping/contracts/http/router.py +0 -40
  551. package/server/contexts/shipping/domain/__init__.py +0 -19
  552. package/server/contexts/shipping/domain/models.py +0 -48
  553. package/server/contexts/shipping/infrastructure/__init__.py +0 -9
  554. package/server/contexts/shipping/infrastructure/repository.py +0 -50
  555. package/server/contexts/support/__init__.py +0 -1
  556. package/server/contexts/support/application/__init__.py +0 -13
  557. package/server/contexts/support/application/services.py +0 -29
  558. package/server/contexts/support/contracts/__init__.py +0 -3
  559. package/server/contexts/support/contracts/http/__init__.py +0 -3
  560. package/server/contexts/support/contracts/http/router.py +0 -40
  561. package/server/contexts/support/domain/__init__.py +0 -13
  562. package/server/contexts/support/domain/models.py +0 -27
  563. package/server/contexts/support/infrastructure/__init__.py +0 -11
  564. package/server/contexts/support/infrastructure/repository.py +0 -70
  565. package/server/contexts/user/__init__.py +0 -1
  566. package/server/contexts/user/application/__init__.py +0 -3
  567. package/server/contexts/user/application/ports.py +0 -11
  568. package/server/contexts/user/application/services.py +0 -44
  569. package/server/contexts/user/contracts/__init__.py +0 -3
  570. package/server/contexts/user/contracts/http/__init__.py +0 -3
  571. package/server/contexts/user/contracts/http/router.py +0 -26
  572. package/server/contexts/user/domain/__init__.py +0 -3
  573. package/server/contexts/user/domain/models.py +0 -22
  574. package/server/contexts/user/infrastructure/__init__.py +0 -3
  575. package/server/contexts/user/infrastructure/adapters/memory.py +0 -27
  576. package/server/contexts/user/infrastructure/adapters/mongodb.py +0 -41
  577. package/server/contexts/user/infrastructure/adapters/sqlalchemy.py +0 -94
  578. package/server/contexts/user/infrastructure/factory.py +0 -28
  579. package/server/data/README.md +0 -24
  580. package/server/data/bootstrap/alerts.json +0 -38
  581. package/server/data/bootstrap/auth_accounts.json +0 -18
  582. package/server/data/bootstrap/catalog_products.json +0 -179
  583. package/server/data/bootstrap/fulfillment_events.json +0 -5
  584. package/server/data/bootstrap/fulfillment_notes.json +0 -5
  585. package/server/data/bootstrap/fulfillment_tasks.json +0 -50
  586. package/server/data/bootstrap/inventory_levels.json +0 -80
  587. package/server/data/bootstrap/orders.json +0 -62
  588. package/server/data/bootstrap/shipping_shipments.json +0 -50
  589. package/server/data/bootstrap/support_faqs.json +0 -26
  590. package/server/data/bootstrap/users.json +0 -20
  591. package/server/data/bootstrap_loader.py +0 -15
  592. package/server/docker-entrypoint.sh +0 -56
  593. package/server/main.py +0 -3
  594. package/server/pyproject.toml +0 -36
  595. package/server/shared/__init__.py +0 -1
  596. package/server/shared/application/__init__.py +0 -3
  597. package/server/shared/application/health.py +0 -2
  598. package/server/shared/infrastructure/__init__.py +0 -10
  599. package/server/shared/infrastructure/runtime.py +0 -6
  600. package/server/shared/infrastructure/security.py +0 -33
  601. package/server/tests/e2e/test_domain_feature_flows.py +0 -483
  602. package/server/tests/test_health.py +0 -49
  603. package/server/uv.lock +0 -1169
@@ -1,40 +0,0 @@
1
- from fastapi import APIRouter, Depends, HTTPException
2
-
3
- from contexts.auth.contracts.http.dependencies import require_admin_user
4
- from contexts.support.application import (
5
- change_faq_visibility,
6
- create_support_faq,
7
- get_support_faqs,
8
- )
9
- from contexts.support.domain import (
10
- ChangeFaqVisibilityCommand,
11
- CreateSupportFaqCommand,
12
- SupportFaq,
13
- SupportFaqRecord,
14
- )
15
-
16
- router = APIRouter(
17
- prefix="/support",
18
- tags=["support"],
19
- dependencies=[Depends(require_admin_user)],
20
- )
21
-
22
-
23
- @router.get("/faqs", response_model=list[SupportFaq])
24
- def support_faqs() -> list[SupportFaq]:
25
- return get_support_faqs()
26
-
27
-
28
- @router.post("/faqs", response_model=SupportFaqRecord, status_code=201)
29
- def create_support_faq_entry(command: CreateSupportFaqCommand) -> SupportFaqRecord:
30
- return create_support_faq(command)
31
-
32
-
33
- @router.patch("/faqs/{faq_id}/visibility", response_model=SupportFaqRecord)
34
- def change_support_faq_visibility(
35
- faq_id: str, command: ChangeFaqVisibilityCommand
36
- ) -> SupportFaqRecord:
37
- try:
38
- return change_faq_visibility(faq_id, command)
39
- except LookupError as exc:
40
- raise HTTPException(status_code=404, detail=str(exc)) from exc
@@ -1,13 +0,0 @@
1
- from .models import (
2
- ChangeFaqVisibilityCommand,
3
- CreateSupportFaqCommand,
4
- SupportFaq,
5
- SupportFaqRecord,
6
- )
7
-
8
- __all__ = [
9
- "ChangeFaqVisibilityCommand",
10
- "CreateSupportFaqCommand",
11
- "SupportFaq",
12
- "SupportFaqRecord",
13
- ]
@@ -1,27 +0,0 @@
1
- from pydantic import BaseModel
2
-
3
-
4
- class SupportFaq(BaseModel):
5
- id: str
6
- question: str
7
- visibility: str
8
-
9
-
10
- class SupportFaqRecord(BaseModel):
11
- id: str
12
- question: str
13
- answer: str
14
- category: str
15
- visibility: str
16
- updated_at: str
17
-
18
-
19
- class CreateSupportFaqCommand(BaseModel):
20
- question: str
21
- answer: str
22
- category: str = "General"
23
- visibility: str = "노출"
24
-
25
-
26
- class ChangeFaqVisibilityCommand(BaseModel):
27
- visibility: str
@@ -1,11 +0,0 @@
1
- from .repository import (
2
- create_seed_support_faq,
3
- list_seed_support_faqs,
4
- update_seed_support_faq_visibility,
5
- )
6
-
7
- __all__ = [
8
- "create_seed_support_faq",
9
- "list_seed_support_faqs",
10
- "update_seed_support_faq_visibility",
11
- ]
@@ -1,70 +0,0 @@
1
- from datetime import date
2
-
3
- from contexts.support.domain import (
4
- ChangeFaqVisibilityCommand,
5
- CreateSupportFaqCommand,
6
- SupportFaq,
7
- SupportFaqRecord,
8
- )
9
- from data.bootstrap_loader import load_bootstrap_json
10
-
11
- _support_faq_store: list[SupportFaqRecord] | None = None
12
-
13
-
14
- def _get_support_faq_store() -> list[SupportFaqRecord]:
15
- global _support_faq_store
16
- if _support_faq_store is None:
17
- _support_faq_store = [
18
- SupportFaqRecord(**entry)
19
- for entry in load_bootstrap_json("support_faqs.json")
20
- ]
21
- return _support_faq_store
22
-
23
-
24
- def _copy_support_faq(record: SupportFaqRecord) -> SupportFaqRecord:
25
- return record.model_copy(deep=True)
26
-
27
-
28
- def _next_faq_number(records: list[SupportFaqRecord]) -> int:
29
- return max((int(record.id.split("-")[-1]) for record in records), default=0) + 1
30
-
31
-
32
- def list_seed_support_faqs() -> list[SupportFaq]:
33
- return [
34
- SupportFaq(id=record.id, question=record.question, visibility=record.visibility)
35
- for record in _get_support_faq_store()
36
- ]
37
-
38
-
39
- def create_seed_support_faq(command: CreateSupportFaqCommand) -> SupportFaqRecord:
40
- records = _get_support_faq_store()
41
- record = SupportFaqRecord(
42
- id=f"faq-{_next_faq_number(records)}",
43
- question=command.question,
44
- answer=command.answer,
45
- category=command.category,
46
- visibility=command.visibility,
47
- updated_at=date.today().isoformat(),
48
- )
49
- records.insert(0, record)
50
- return _copy_support_faq(record)
51
-
52
-
53
- def update_seed_support_faq_visibility(
54
- faq_id: str, command: ChangeFaqVisibilityCommand
55
- ) -> SupportFaqRecord:
56
- records = _get_support_faq_store()
57
- for index, record in enumerate(records):
58
- if record.id != faq_id:
59
- continue
60
-
61
- updated_record = record.model_copy(
62
- update={
63
- "visibility": command.visibility,
64
- "updated_at": date.today().isoformat(),
65
- }
66
- )
67
- records[index] = updated_record
68
- return _copy_support_faq(updated_record)
69
-
70
- raise LookupError(f"Support FAQ {faq_id} not found")
@@ -1 +0,0 @@
1
- __all__ = ["contracts", "application", "domain", "infrastructure"]
@@ -1,3 +0,0 @@
1
- from .services import get_user_or_404, list_user_summaries, prepare_user_store, update_user_status_or_404
2
-
3
- __all__ = ["get_user_or_404", "list_user_summaries", "prepare_user_store", "update_user_status_or_404"]
@@ -1,11 +0,0 @@
1
- from typing import Protocol
2
-
3
- from contexts.user.domain import UserRecord, UserSummary
4
-
5
-
6
- class UserRepository(Protocol):
7
- def initialize(self) -> None: ...
8
- def seed_users(self, users: list[UserRecord]) -> None: ...
9
- def get_by_id(self, user_id: str) -> UserRecord | None: ...
10
- def list_summaries(self) -> list[UserSummary]: ...
11
- def update_status(self, user_id: str, status: str) -> UserRecord | None: ...
@@ -1,44 +0,0 @@
1
- from fastapi import HTTPException, status
2
-
3
- from contexts.user.domain import UpdateUserStatusCommand, UserDetail, UserRecord, UserSummary
4
- from contexts.user.infrastructure import get_user_repository
5
- from data.bootstrap_loader import load_bootstrap_json
6
-
7
-
8
- def list_user_summaries() -> list[UserSummary]:
9
- repository = get_user_repository()
10
- return repository.list_summaries()
11
-
12
-
13
- def get_user_or_404(user_id: str) -> UserDetail:
14
- repository = get_user_repository()
15
- user = repository.get_by_id(user_id)
16
- if user is None:
17
- raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="User not found")
18
- return UserDetail(**user.model_dump())
19
-
20
-
21
- def update_user_status_or_404(user_id: str, command: UpdateUserStatusCommand) -> UserDetail:
22
- repository = get_user_repository()
23
- user = repository.update_status(user_id, command.status)
24
- if user is None:
25
- raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="User not found")
26
- return UserDetail(**user.model_dump())
27
-
28
-
29
- def prepare_user_store() -> None:
30
- repository = get_user_repository()
31
- repository.initialize()
32
- records = [
33
- UserRecord(
34
- id=entry["id"],
35
- name=entry["name"],
36
- email=entry["email"],
37
- role=entry["role"],
38
- status=entry["status"],
39
- timezone=entry["timezone"],
40
- last_login_at=entry["last_login_at"],
41
- )
42
- for entry in load_bootstrap_json("users.json")
43
- ]
44
- repository.seed_users(records)
@@ -1,3 +0,0 @@
1
- from .http.router import router
2
-
3
- __all__ = ["router"]
@@ -1,3 +0,0 @@
1
- from .router import router
2
-
3
- __all__ = ["router"]
@@ -1,26 +0,0 @@
1
- from fastapi import APIRouter, Depends
2
-
3
- from contexts.auth.contracts.http.dependencies import require_admin_user
4
- from contexts.user.application import get_user_or_404, list_user_summaries, update_user_status_or_404
5
- from contexts.user.domain import UpdateUserStatusCommand, UserDetail, UserSummary
6
-
7
- router = APIRouter(
8
- prefix="/users",
9
- tags=["users"],
10
- dependencies=[Depends(require_admin_user)],
11
- )
12
-
13
-
14
- @router.get("", response_model=list[UserSummary])
15
- def list_users() -> list[UserSummary]:
16
- return list_user_summaries()
17
-
18
-
19
- @router.get("/{user_id}", response_model=UserDetail)
20
- def get_user(user_id: str) -> UserDetail:
21
- return get_user_or_404(user_id)
22
-
23
-
24
- @router.patch("/{user_id}/status", response_model=UserDetail)
25
- def update_user_status(user_id: str, command: UpdateUserStatusCommand) -> UserDetail:
26
- return update_user_status_or_404(user_id, command)
@@ -1,3 +0,0 @@
1
- from .models import UpdateUserStatusCommand, UserDetail, UserRecord, UserSummary
2
-
3
- __all__ = ["UserSummary", "UserDetail", "UserRecord", "UpdateUserStatusCommand"]
@@ -1,22 +0,0 @@
1
- from pydantic import BaseModel, EmailStr
2
-
3
-
4
- class UserSummary(BaseModel):
5
- id: str
6
- name: str
7
- email: EmailStr
8
- role: str
9
- status: str
10
-
11
-
12
- class UserDetail(UserSummary):
13
- timezone: str
14
- last_login_at: str
15
-
16
-
17
- class UserRecord(UserDetail):
18
- pass
19
-
20
-
21
- class UpdateUserStatusCommand(BaseModel):
22
- status: str
@@ -1,3 +0,0 @@
1
- from .factory import get_user_repository
2
-
3
- __all__ = ["get_user_repository"]
@@ -1,27 +0,0 @@
1
- from contexts.user.domain import UserRecord, UserSummary
2
-
3
-
4
- class MemoryUserRepository:
5
- def __init__(self) -> None:
6
- self._users: dict[str, UserRecord] = {}
7
-
8
- def initialize(self) -> None:
9
- return None
10
-
11
- def seed_users(self, users: list[UserRecord]) -> None:
12
- for user in users:
13
- self._users[user.id] = user
14
-
15
- def get_by_id(self, user_id: str) -> UserRecord | None:
16
- return self._users.get(user_id)
17
-
18
- def list_summaries(self) -> list[UserSummary]:
19
- return [UserSummary(**user.model_dump(exclude={"timezone", "last_login_at"})) for user in self._users.values()]
20
-
21
- def update_status(self, user_id: str, status: str) -> UserRecord | None:
22
- user = self._users.get(user_id)
23
- if user is None:
24
- return None
25
- updated_user = user.model_copy(update={"status": status})
26
- self._users[user_id] = updated_user
27
- return updated_user
@@ -1,41 +0,0 @@
1
- from pymongo import ASCENDING, MongoClient, ReturnDocument
2
-
3
- from contexts.user.domain import UserRecord, UserSummary
4
-
5
-
6
- class MongoUserRepository:
7
- def __init__(self, mongodb_url: str, database_name: str) -> None:
8
- self.client = MongoClient(mongodb_url)
9
- self.collection = self.client[database_name]["users"]
10
-
11
- def initialize(self) -> None:
12
- self.collection.create_index([("email", ASCENDING)], unique=True)
13
-
14
- def seed_users(self, users: list[UserRecord]) -> None:
15
- for user in users:
16
- self.collection.update_one({"id": user.id}, {"$set": user.model_dump()}, upsert=True)
17
-
18
- def get_by_id(self, user_id: str) -> UserRecord | None:
19
- record = self.collection.find_one({"id": user_id}, {"_id": 0})
20
- return UserRecord(**record) if record else None
21
-
22
- def list_summaries(self) -> list[UserSummary]:
23
- return [
24
- UserSummary(
25
- id=record["id"],
26
- name=record["name"],
27
- email=record["email"],
28
- role=record["role"],
29
- status=record["status"],
30
- )
31
- for record in self.collection.find({}, {"_id": 0}).sort("id", ASCENDING)
32
- ]
33
-
34
- def update_status(self, user_id: str, status: str) -> UserRecord | None:
35
- record = self.collection.find_one_and_update(
36
- {"id": user_id},
37
- {"$set": {"status": status}},
38
- return_document=ReturnDocument.AFTER,
39
- projection={"_id": 0},
40
- )
41
- return UserRecord(**record) if record else None
@@ -1,94 +0,0 @@
1
- from sqlalchemy import String, create_engine, select
2
- from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, sessionmaker
3
-
4
- from contexts.user.domain import UserRecord, UserSummary
5
-
6
-
7
- class Base(DeclarativeBase):
8
- pass
9
-
10
-
11
- class UserTable(Base):
12
- __tablename__ = "users"
13
-
14
- id: Mapped[str] = mapped_column(String(64), primary_key=True)
15
- name: Mapped[str] = mapped_column(String(128))
16
- email: Mapped[str] = mapped_column(String(255), unique=True, index=True)
17
- role: Mapped[str] = mapped_column(String(64))
18
- status: Mapped[str] = mapped_column(String(32))
19
- timezone: Mapped[str] = mapped_column(String(64))
20
- last_login_at: Mapped[str] = mapped_column(String(64))
21
-
22
-
23
- class SqlAlchemyUserRepository:
24
- def __init__(self, database_url: str) -> None:
25
- self.engine = create_engine(database_url, future=True)
26
- self.session_factory = sessionmaker(bind=self.engine, expire_on_commit=False)
27
-
28
- def initialize(self) -> None:
29
- Base.metadata.create_all(self.engine)
30
-
31
- def seed_users(self, users: list[UserRecord]) -> None:
32
- with self.session_factory() as session:
33
- for user in users:
34
- existing = session.get(UserTable, user.id)
35
- if existing is None:
36
- session.add(UserTable(**user.model_dump()))
37
- continue
38
- for field, value in user.model_dump().items():
39
- setattr(existing, field, value)
40
- session.commit()
41
-
42
- def get_by_id(self, user_id: str) -> UserRecord | None:
43
- with self.session_factory() as session:
44
- record = session.get(UserTable, user_id)
45
- return self._to_record(record)
46
-
47
- def list_summaries(self) -> list[UserSummary]:
48
- with self.session_factory() as session:
49
- records = session.scalars(select(UserTable).order_by(UserTable.id)).all()
50
- return [
51
- UserSummary(
52
- id=record.id,
53
- name=record.name,
54
- email=record.email,
55
- role=record.role,
56
- status=record.status,
57
- )
58
- for record in records
59
- ]
60
-
61
- def update_status(self, user_id: str, status: str) -> UserRecord | None:
62
- with self.session_factory() as session:
63
- record = session.get(UserTable, user_id)
64
- if record is None:
65
- return None
66
- record.status = status
67
- session.commit()
68
- return self._to_record(record)
69
-
70
- @staticmethod
71
- def _to_record(record: UserTable | None) -> UserRecord | None:
72
- if record is None:
73
- return None
74
- return UserRecord(
75
- id=record.id,
76
- name=record.name,
77
- email=record.email,
78
- role=record.role,
79
- status=record.status,
80
- timezone=record.timezone,
81
- last_login_at=record.last_login_at,
82
- )
83
-
84
-
85
- class PostgresUserRepository(SqlAlchemyUserRepository):
86
- pass
87
-
88
-
89
- class MySqlUserRepository(SqlAlchemyUserRepository):
90
- pass
91
-
92
-
93
- class MariaDbUserRepository(SqlAlchemyUserRepository):
94
- pass
@@ -1,28 +0,0 @@
1
- from functools import lru_cache
2
- from typing import TYPE_CHECKING
3
-
4
- from config import get_settings
5
- from contexts.user.infrastructure.adapters.memory import MemoryUserRepository
6
- from contexts.user.infrastructure.adapters.mongodb import MongoUserRepository
7
- from contexts.user.infrastructure.adapters.sqlalchemy import (
8
- MariaDbUserRepository,
9
- MySqlUserRepository,
10
- PostgresUserRepository,
11
- )
12
-
13
- if TYPE_CHECKING:
14
- from contexts.user.application.ports import UserRepository
15
-
16
-
17
- @lru_cache
18
- def get_user_repository() -> "UserRepository":
19
- settings = get_settings()
20
- if settings.database_backend == "postgres":
21
- return PostgresUserRepository(settings.postgres_url)
22
- if settings.database_backend == "mysql":
23
- return MySqlUserRepository(settings.mysql_url)
24
- if settings.database_backend == "mariadb":
25
- return MariaDbUserRepository(settings.mariadb_url)
26
- if settings.database_backend == "mongodb":
27
- return MongoUserRepository(settings.mongodb_url, settings.mongodb_database)
28
- return MemoryUserRepository()
@@ -1,24 +0,0 @@
1
- `data/`는 sample payload, fixture, seed data를 두는 루트다.
2
-
3
- 기본 정책:
4
-
5
- - domain/application logic는 `contexts/*`에 둔다
6
- - 재사용 가능한 fixture와 seed payload는 `data/`에 둔다
7
- - adapter별 local bootstrap 데이터도 이 루트에 둔다
8
-
9
- 현재 canonical bootstrap:
10
-
11
- - `bootstrap/auth_accounts.json`: auth credential/account bootstrap 원본
12
- - `bootstrap/users.json`: user profile bootstrap 원본
13
- - `bootstrap/catalog_products.json`: catalog product 원본
14
- - `bootstrap/inventory_levels.json`: inventory level 원본
15
- - `bootstrap/orders.json`: web/admin order surface 원본
16
- - `bootstrap/fulfillment_tasks.json`: mobile fulfillment board task 원본
17
- - `bootstrap/fulfillment_events.json`: mobile fulfillment timeline 원본
18
- - `bootstrap/fulfillment_notes.json`: mobile fulfillment note 원본
19
- - `bootstrap/support_faqs.json`: admin support surface 원본
20
-
21
- 규칙:
22
-
23
- - 코드 안에 seed 레코드를 하드코딩하지 않는다
24
- - memory/postgres/mysql/mariadb/mongodb adapter는 같은 `data/bootstrap/*` 원본을 consume한다
@@ -1,38 +0,0 @@
1
- [
2
- {
3
- "id": "alr-1001",
4
- "source": "orders",
5
- "title": "예외 검토 대기",
6
- "message": "주소 검증 보류 거래가 2건 누적되었습니다.",
7
- "tone": "danger",
8
- "created_at": "2026-03-14 09:12",
9
- "read": false
10
- },
11
- {
12
- "id": "alr-1002",
13
- "source": "shipping",
14
- "title": "배송 지연 감지",
15
- "message": "Hanjin 라인에서 지연 shipment가 1건 발생했습니다.",
16
- "tone": "warning",
17
- "created_at": "2026-03-14 08:40",
18
- "read": false
19
- },
20
- {
21
- "id": "alr-1003",
22
- "source": "inventory",
23
- "title": "안전재고 임계치",
24
- "message": "TSJ-BLK-S sku가 safety stock에 근접했습니다.",
25
- "tone": "neutral",
26
- "created_at": "2026-03-13 18:30",
27
- "read": false
28
- },
29
- {
30
- "id": "alr-1004",
31
- "source": "support",
32
- "title": "운영 지원 처리 완료",
33
- "message": "교환 문의 1건이 해결 처리되었습니다.",
34
- "tone": "neutral",
35
- "created_at": "2026-03-13 15:10",
36
- "read": true
37
- }
38
- ]
@@ -1,18 +0,0 @@
1
- [
2
- {
3
- "id": "user-1",
4
- "name": "Template Admin",
5
- "email": "admin@example.com",
6
- "role": "admin",
7
- "status": "active",
8
- "password_source": "bootstrap_admin_password"
9
- },
10
- {
11
- "id": "user-2",
12
- "name": "Template Operator",
13
- "email": "operator@example.com",
14
- "role": "operator",
15
- "status": "active",
16
- "password_source": "bootstrap_operator_password"
17
- }
18
- ]