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,483 +0,0 @@
1
- from collections.abc import Generator
2
-
3
- import pytest
4
- from fastapi.testclient import TestClient
5
-
6
- from api.http.app import app
7
- from contexts.auth.application import services as auth_services
8
- from contexts.auth.infrastructure import repository as auth_repository
9
- from contexts.alerts.infrastructure import repository as alerts_repository
10
- from contexts.catalog.application import services as catalog_services
11
- from contexts.catalog.infrastructure import repository as catalog_repository
12
- from contexts.fulfillment.infrastructure import repository as fulfillment_repository
13
- from contexts.inventory.application import services as inventory_services
14
- from contexts.inventory.infrastructure import repository as inventory_repository
15
- from contexts.orders.infrastructure import repository as orders_repository
16
- from contexts.shipping.infrastructure import repository as shipping_repository
17
- from contexts.support.infrastructure import repository as support_repository
18
- from contexts.user.infrastructure import factory as user_factory
19
-
20
-
21
- ADMIN_EMAIL = "admin@example.com"
22
- OPERATOR_EMAIL = "operator@example.com"
23
- PASSWORD = "<CHANGE_ME>"
24
-
25
-
26
- @pytest.fixture(autouse=True)
27
- def reset_in_memory_state() -> Generator[None, None, None]:
28
- auth_services._seed_auth_store.cache_clear()
29
- auth_repository.get_auth_repository.cache_clear()
30
- catalog_services._seed_catalog_store.cache_clear()
31
- catalog_repository.get_catalog_repository.cache_clear()
32
- inventory_services._seed_inventory_store.cache_clear()
33
- inventory_repository.get_inventory_repository.cache_clear()
34
- user_factory.get_user_repository.cache_clear()
35
- alerts_repository._alert_store = None
36
- orders_repository._order_store = None
37
- shipping_repository._shipment_store = None
38
- support_repository._support_faq_store = None
39
- fulfillment_repository._task_store = None
40
- fulfillment_repository._event_store = None
41
- fulfillment_repository._note_store = None
42
- yield
43
- auth_services._seed_auth_store.cache_clear()
44
- auth_repository.get_auth_repository.cache_clear()
45
- catalog_services._seed_catalog_store.cache_clear()
46
- catalog_repository.get_catalog_repository.cache_clear()
47
- inventory_services._seed_inventory_store.cache_clear()
48
- inventory_repository.get_inventory_repository.cache_clear()
49
- user_factory.get_user_repository.cache_clear()
50
- alerts_repository._alert_store = None
51
- orders_repository._order_store = None
52
- shipping_repository._shipment_store = None
53
- support_repository._support_faq_store = None
54
- fulfillment_repository._task_store = None
55
- fulfillment_repository._event_store = None
56
- fulfillment_repository._note_store = None
57
-
58
-
59
- def _login(client: TestClient, email: str = ADMIN_EMAIL) -> str:
60
- response = client.post(
61
- "/api/v1/auth/login",
62
- json={"email": email, "password": PASSWORD},
63
- )
64
- assert response.status_code == 200
65
- return response.json()["access_token"]
66
-
67
-
68
- def _auth_headers(token: str) -> dict[str, str]:
69
- return {"Authorization": f"Bearer {token}"}
70
-
71
-
72
- def test_aut_f001_login_and_me_issue_authenticated_identity() -> None:
73
- with TestClient(app) as client:
74
- token = _login(client)
75
- me_response = client.get("/api/v1/auth/me", headers=_auth_headers(token))
76
-
77
- assert me_response.status_code == 200
78
- assert me_response.json() == {
79
- "id": "user-1",
80
- "name": "Template Admin",
81
- "email": ADMIN_EMAIL,
82
- "role": "admin",
83
- "status": "active",
84
- }
85
-
86
-
87
- def test_usr_f001_admin_can_read_and_update_users_while_operator_is_forbidden() -> None:
88
- with TestClient(app) as client:
89
- admin_token = _login(client, ADMIN_EMAIL)
90
- operator_token = _login(client, OPERATOR_EMAIL)
91
-
92
- forbidden_response = client.get("/api/v1/users", headers=_auth_headers(operator_token))
93
- list_response = client.get("/api/v1/users", headers=_auth_headers(admin_token))
94
- detail_response = client.get("/api/v1/users/user-2", headers=_auth_headers(admin_token))
95
- patch_response = client.patch(
96
- "/api/v1/users/user-2/status",
97
- json={"status": "suspended"},
98
- headers=_auth_headers(admin_token),
99
- )
100
-
101
- assert forbidden_response.status_code == 403
102
- assert list_response.status_code == 200
103
- assert len(list_response.json()) == 2
104
- assert detail_response.status_code == 200
105
- assert detail_response.json()["email"] == OPERATOR_EMAIL
106
- assert patch_response.status_code == 200
107
- assert patch_response.json()["status"] == "suspended"
108
-
109
-
110
- def test_cat_f001_public_catalog_read_surfaces_return_live_product_data() -> None:
111
- with TestClient(app) as client:
112
- list_response = client.get("/api/v1/catalog/products")
113
- filtered_response = client.get("/api/v1/catalog/products", params={"status": "active"})
114
- detail_response = client.get("/api/v1/catalog/products/prd-1001")
115
-
116
- assert list_response.status_code == 200
117
- assert len(list_response.json()) == 3
118
- assert filtered_response.status_code == 200
119
- assert len(filtered_response.json()) == 1
120
- assert detail_response.status_code == 200
121
- assert detail_response.json()["slug"] == "trailshell-pack-jacket"
122
-
123
-
124
- def test_cat_f002_admin_can_create_update_and_archive_catalog_products() -> None:
125
- payload = {
126
- "slug": "metro-pack-vest",
127
- "name": "Metro Pack Vest",
128
- "brand": "Northstar Supply",
129
- "category": "outerwear",
130
- "status": "draft",
131
- "short_description": "Packable insulated vest for shoulder-season layering.",
132
- "description": "Metro Pack Vest blends light insulation with a compact stow pouch for travel days.",
133
- "hero_image": {
134
- "url": "https://images.templates.dev/catalog/metro-pack-vest/hero.jpg",
135
- "alt": "Metro Pack Vest in slate",
136
- },
137
- "gallery": [],
138
- "price": {"amount": 149000, "currency": "KRW"},
139
- "compare_at_price": None,
140
- "tags": ["new-drop"],
141
- "attributes": [{"name": "Fit", "value": "Regular"}],
142
- "variants": [
143
- {
144
- "sku": "MPV-SLT-M",
145
- "name": "Slate / M",
146
- "option_values": ["Slate", "M"],
147
- }
148
- ],
149
- }
150
-
151
- with TestClient(app) as client:
152
- admin_token = _login(client)
153
- create_response = client.post(
154
- "/api/v1/catalog/products",
155
- json=payload,
156
- headers=_auth_headers(admin_token),
157
- )
158
- created_product_id = create_response.json()["id"]
159
- update_response = client.put(
160
- f"/api/v1/catalog/products/{created_product_id}",
161
- json={
162
- "short_description": "Packable insulated vest for transit and weekend travel.",
163
- "tags": ["new-drop", "travel"],
164
- },
165
- headers=_auth_headers(admin_token),
166
- )
167
- status_response = client.patch(
168
- f"/api/v1/catalog/products/{created_product_id}/status",
169
- json={"status": "archived"},
170
- headers=_auth_headers(admin_token),
171
- )
172
-
173
- assert create_response.status_code == 201
174
- assert create_response.json()["slug"] == payload["slug"]
175
- assert update_response.status_code == 200
176
- assert update_response.json()["short_description"].startswith("Packable insulated vest")
177
- assert status_response.status_code == 200
178
- assert status_response.json()["status"] == "archived"
179
-
180
-
181
- def test_inv_f001_admin_can_read_and_mutate_inventory_levels() -> None:
182
- with TestClient(app) as client:
183
- admin_token = _login(client)
184
- operator_token = _login(client, OPERATOR_EMAIL)
185
-
186
- forbidden_response = client.get("/api/v1/inventory/levels", headers=_auth_headers(operator_token))
187
- list_response = client.get("/api/v1/inventory/levels", headers=_auth_headers(admin_token))
188
- detail_response = client.get(
189
- "/api/v1/inventory/levels/TSJ-BLK-S/fc-seoul",
190
- headers=_auth_headers(admin_token),
191
- )
192
- adjust_response = client.post(
193
- "/api/v1/inventory/levels/TSJ-BLK-S/fc-seoul/adjustments",
194
- json={"quantity_delta": 4, "reason": "cycle_count"},
195
- headers=_auth_headers(admin_token),
196
- )
197
- reserve_response = client.post(
198
- "/api/v1/inventory/levels/TSJ-BLK-S/fc-seoul/reservations",
199
- json={"quantity": 2, "reference_id": "ORD-NEW-1"},
200
- headers=_auth_headers(admin_token),
201
- )
202
- release_response = client.post(
203
- "/api/v1/inventory/levels/TSJ-BLK-S/fc-seoul/releases",
204
- json={"quantity": 1, "reference_id": "ORD-NEW-1"},
205
- headers=_auth_headers(admin_token),
206
- )
207
- set_response = client.put(
208
- "/api/v1/inventory/levels/TSJ-BLK-S/fc-seoul",
209
- json={
210
- "on_hand": 20,
211
- "reserved": 3,
212
- "safety_stock": 4,
213
- "reorder_point": 8,
214
- },
215
- headers=_auth_headers(admin_token),
216
- )
217
-
218
- assert forbidden_response.status_code == 403
219
- assert list_response.status_code == 200
220
- assert len(list_response.json()) == 6
221
- assert detail_response.status_code == 200
222
- assert detail_response.json()["available_to_sell"] == 15
223
- assert adjust_response.status_code == 200
224
- assert adjust_response.json()["action"] == "adjusted"
225
- assert adjust_response.json()["level"]["on_hand"] == 22
226
- assert reserve_response.status_code == 200
227
- assert reserve_response.json()["level"]["reserved"] == 5
228
- assert release_response.status_code == 200
229
- assert release_response.json()["level"]["reserved"] == 4
230
- assert set_response.status_code == 200
231
- assert set_response.json()["level"]["available_to_sell"] == 17
232
-
233
-
234
- def test_ord_f001_authenticated_users_can_read_create_and_update_orders() -> None:
235
- with TestClient(app) as client:
236
- operator_token = _login(client, OPERATOR_EMAIL)
237
-
238
- unauthorized_response = client.get("/api/v1/orders")
239
- overview_response = client.get("/api/v1/orders/overview", headers=_auth_headers(operator_token))
240
- list_response = client.get("/api/v1/orders", headers=_auth_headers(operator_token))
241
- create_response = client.post(
242
- "/api/v1/orders",
243
- json={
244
- "product_id": "prd-1002",
245
- "product_name": "Commuter Utility Sling",
246
- "customer_name": "Daegu Concept Store",
247
- "seller_name": "Harbor Line",
248
- "amount_krw": 129000,
249
- "stage": "결제 검증",
250
- "status": "Pending",
251
- "fulfillment_status": "Queued",
252
- "sla": "35 min",
253
- },
254
- headers=_auth_headers(operator_token),
255
- )
256
- created_order_id = create_response.json()["id"]
257
- status_response = client.patch(
258
- f"/api/v1/orders/{created_order_id}/status",
259
- json={
260
- "status": "Paid",
261
- "fulfillment_status": "Packing",
262
- "stage": "패킹 준비",
263
- },
264
- headers=_auth_headers(operator_token),
265
- )
266
-
267
- assert unauthorized_response.status_code == 401
268
- assert overview_response.status_code == 200
269
- assert overview_response.json()["selected_order"]["product_name"]
270
- assert list_response.status_code == 200
271
- assert len(list_response.json()) == 4
272
- assert create_response.status_code == 201
273
- assert create_response.json()["customer_name"] == "Daegu Concept Store"
274
- assert status_response.status_code == 200
275
- assert status_response.json()["status"] == "Paid"
276
- assert status_response.json()["fulfillment_status"] == "Packing"
277
-
278
-
279
- def test_ord_f002_admin_only_order_surfaces_require_admin_role() -> None:
280
- with TestClient(app) as client:
281
- admin_token = _login(client, ADMIN_EMAIL)
282
- operator_token = _login(client, OPERATOR_EMAIL)
283
-
284
- forbidden_response = client.get(
285
- "/api/v1/orders/admin/overview",
286
- headers=_auth_headers(operator_token),
287
- )
288
- overview_response = client.get(
289
- "/api/v1/orders/admin/overview",
290
- headers=_auth_headers(admin_token),
291
- )
292
- queue_response = client.get(
293
- "/api/v1/orders/admin/queue",
294
- headers=_auth_headers(admin_token),
295
- )
296
-
297
- assert forbidden_response.status_code == 403
298
- assert overview_response.status_code == 200
299
- assert len(overview_response.json()["cards"]) == 3
300
- assert "alerts" not in overview_response.json()
301
- assert queue_response.status_code == 200
302
- assert queue_response.json()[0]["product_name"]
303
-
304
-
305
- def test_sup_f001_admin_can_read_create_and_hide_support_faqs() -> None:
306
- with TestClient(app) as client:
307
- admin_token = _login(client, ADMIN_EMAIL)
308
- operator_token = _login(client, OPERATOR_EMAIL)
309
-
310
- forbidden_response = client.get(
311
- "/api/v1/support/faqs",
312
- headers=_auth_headers(operator_token),
313
- )
314
- list_response = client.get(
315
- "/api/v1/support/faqs",
316
- headers=_auth_headers(admin_token),
317
- )
318
- create_response = client.post(
319
- "/api/v1/support/faqs",
320
- json={
321
- "question": "교환 요청은 어디서 확인하나요?",
322
- "answer": "교환 요청은 운영 지원 큐와 주문 상세에서 함께 확인합니다.",
323
- "category": "교환",
324
- "visibility": "노출",
325
- },
326
- headers=_auth_headers(admin_token),
327
- )
328
- created_faq_id = create_response.json()["id"]
329
- visibility_response = client.patch(
330
- f"/api/v1/support/faqs/{created_faq_id}/visibility",
331
- json={"visibility": "숨김"},
332
- headers=_auth_headers(admin_token),
333
- )
334
-
335
- assert forbidden_response.status_code == 403
336
- assert list_response.status_code == 200
337
- assert len(list_response.json()) == 3
338
- assert create_response.status_code == 201
339
- assert create_response.json()["category"] == "교환"
340
- assert visibility_response.status_code == 200
341
- assert visibility_response.json()["visibility"] == "숨김"
342
-
343
-
344
- def test_ful_f001_authenticated_users_can_read_and_transition_fulfillment_tasks() -> None:
345
- with TestClient(app) as client:
346
- operator_token = _login(client, OPERATOR_EMAIL)
347
-
348
- unauthorized_response = client.get("/api/v1/fulfillment/overview")
349
- overview_response = client.get(
350
- "/api/v1/fulfillment/overview",
351
- headers=_auth_headers(operator_token),
352
- )
353
- board_response = client.get(
354
- "/api/v1/fulfillment/board",
355
- headers=_auth_headers(operator_token),
356
- )
357
- transition_response = client.patch(
358
- "/api/v1/fulfillment/tasks/ft-1/status",
359
- json={"status": "In progress", "stage": "Packing"},
360
- headers=_auth_headers(operator_token),
361
- )
362
-
363
- assert unauthorized_response.status_code == 401
364
- assert overview_response.status_code == 200
365
- assert overview_response.json()["throughput_total"] == "5"
366
- assert board_response.status_code == 200
367
- assert len(board_response.json()["tasks"]) == 4
368
- assert len(board_response.json()["notes"]) == 3
369
- assert transition_response.status_code == 200
370
- assert transition_response.json()["previous_status"] == "Queued"
371
- assert transition_response.json()["status"] == "In progress"
372
-
373
-
374
- def test_shp_f001_authenticated_users_can_read_shipping_overview() -> None:
375
- with TestClient(app) as client:
376
- operator_token = _login(client, OPERATOR_EMAIL)
377
-
378
- unauthorized_response = client.get("/api/v1/shipping/overview")
379
- overview_response = client.get(
380
- "/api/v1/shipping/overview",
381
- headers=_auth_headers(operator_token),
382
- )
383
-
384
- assert unauthorized_response.status_code == 401
385
- assert overview_response.status_code == 200
386
- assert len(overview_response.json()["stats"]) == 3
387
- assert len(overview_response.json()["carriers"]) == 3
388
- assert overview_response.json()["highlighted_route"]
389
-
390
-
391
- def test_shp_f002_authenticated_users_can_read_shipping_shipments() -> None:
392
- with TestClient(app) as client:
393
- operator_token = _login(client, OPERATOR_EMAIL)
394
- list_response = client.get(
395
- "/api/v1/shipping/shipments",
396
- headers=_auth_headers(operator_token),
397
- )
398
-
399
- assert list_response.status_code == 200
400
- assert len(list_response.json()) == 4
401
- assert list_response.json()[0]["shipment_id"] == "shp-1001"
402
- assert list_response.json()[0]["tracking_number"]
403
-
404
-
405
- def test_shp_f003_authenticated_users_can_transition_shipping_shipments() -> None:
406
- with TestClient(app) as client:
407
- operator_token = _login(client, OPERATOR_EMAIL)
408
- transition_response = client.patch(
409
- "/api/v1/shipping/shipments/shp-1001/status",
410
- json={"status": "Delivered", "last_event": "고객 인수 완료"},
411
- headers=_auth_headers(operator_token),
412
- )
413
- list_response = client.get(
414
- "/api/v1/shipping/shipments",
415
- headers=_auth_headers(operator_token),
416
- )
417
-
418
- assert transition_response.status_code == 200
419
- assert transition_response.json()["shipment_id"] == "shp-1001"
420
- assert transition_response.json()["previous_status"] == "In transit"
421
- assert transition_response.json()["status"] == "Delivered"
422
- assert transition_response.json()["last_event"] == "고객 인수 완료"
423
- assert list_response.status_code == 200
424
- assert list_response.json()[0]["status"] == "Delivered"
425
-
426
-
427
- def test_alr_f001_admin_only_alert_feed_requires_admin_role() -> None:
428
- with TestClient(app) as client:
429
- admin_token = _login(client, ADMIN_EMAIL)
430
- operator_token = _login(client, OPERATOR_EMAIL)
431
-
432
- forbidden_response = client.get(
433
- "/api/v1/alerts",
434
- headers=_auth_headers(operator_token),
435
- )
436
- list_response = client.get(
437
- "/api/v1/alerts",
438
- headers=_auth_headers(admin_token),
439
- )
440
-
441
- assert forbidden_response.status_code == 403
442
- assert list_response.status_code == 200
443
- assert list_response.json()["unread_count"] == 3
444
- assert len(list_response.json()["items"]) == 4
445
-
446
-
447
- def test_alr_f002_admin_can_mark_single_alert_as_read() -> None:
448
- with TestClient(app) as client:
449
- admin_token = _login(client, ADMIN_EMAIL)
450
- read_response = client.post(
451
- "/api/v1/alerts/alr-1001/read",
452
- headers=_auth_headers(admin_token),
453
- )
454
- list_response = client.get(
455
- "/api/v1/alerts",
456
- headers=_auth_headers(admin_token),
457
- )
458
-
459
- assert read_response.status_code == 200
460
- assert read_response.json()["id"] == "alr-1001"
461
- assert read_response.json()["read"] is True
462
-
463
- assert list_response.status_code == 200
464
- assert list_response.json()["unread_count"] == 2
465
-
466
-
467
- def test_alr_f003_admin_can_mark_all_alerts_as_read() -> None:
468
- with TestClient(app) as client:
469
- admin_token = _login(client, ADMIN_EMAIL)
470
- read_all_response = client.post(
471
- "/api/v1/alerts/read-all",
472
- headers=_auth_headers(admin_token),
473
- )
474
- list_response = client.get(
475
- "/api/v1/alerts",
476
- headers=_auth_headers(admin_token),
477
- )
478
-
479
- assert read_all_response.status_code == 200
480
- assert read_all_response.json()["updated_count"] == 3
481
- assert read_all_response.json()["unread_count"] == 0
482
- assert list_response.status_code == 200
483
- assert list_response.json()["unread_count"] == 0
@@ -1,49 +0,0 @@
1
- from fastapi.testclient import TestClient
2
-
3
- from api.http.app import app
4
-
5
-
6
- def test_health() -> None:
7
- with TestClient(app) as client:
8
- response = client.get("/health")
9
- assert response.status_code == 200
10
- assert response.json() == {"status": "ok"}
11
-
12
-
13
- def test_status() -> None:
14
- with TestClient(app) as client:
15
- response = client.get("/api/v1/status")
16
- assert response.status_code == 200
17
- assert response.json()["status"] == "healthy"
18
-
19
-
20
- def test_login_and_me() -> None:
21
- with TestClient(app) as client:
22
- login_response = client.post(
23
- "/api/v1/auth/login",
24
- json={"email": "admin@example.com", "password": "<CHANGE_ME>"},
25
- )
26
- assert login_response.status_code == 200
27
- token = login_response.json()["access_token"]
28
-
29
- me_response = client.get("/api/v1/auth/me", headers={"Authorization": f"Bearer {token}"})
30
- assert me_response.status_code == 200
31
- assert me_response.json()["email"] == "admin@example.com"
32
-
33
-
34
- def test_users_context_examples() -> None:
35
- with TestClient(app) as client:
36
- login_response = client.post(
37
- "/api/v1/auth/login",
38
- json={"email": "admin@example.com", "password": "<CHANGE_ME>"},
39
- )
40
- assert login_response.status_code == 200
41
- headers = {"Authorization": f"Bearer {login_response.json()['access_token']}"}
42
-
43
- users_response = client.get("/api/v1/users", headers=headers)
44
- assert users_response.status_code == 200
45
- assert len(users_response.json()) == 2
46
-
47
- user_response = client.get("/api/v1/users/user-1", headers=headers)
48
- assert user_response.status_code == 200
49
- assert user_response.json()["timezone"] == "Asia/Seoul"