agentic-dev 0.1.0 → 0.2.1
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.
- package/.agent/prd.json +29 -0
- package/.agent/progress.txt +1 -0
- package/.agent/prompt.md +21 -0
- package/.agent/ralph-loop-state.json +13 -0
- package/.agent/ralph-supervisor-state.json +12 -0
- package/.agent/ralph-supervisor.sh +238 -0
- package/.agent/ralph.sh +305 -0
- package/.agent/runs/README.md +7 -0
- package/.agent/sdd-build-ast-audit.json +13 -0
- package/.claude/CLAUDE.md +44 -0
- package/.claude/agentic-dev.json +3 -0
- package/.claude/agents/ai-dev.md +27 -0
- package/.claude/agents/backend-dev.md +26 -0
- package/.claude/agents/db-dev.md +26 -0
- package/.claude/agents/devops.md +27 -0
- package/.claude/agents/frontend-dev.md +25 -0
- package/.claude/agents/github-ops.md +25 -0
- package/.claude/agents/test-dev.md +26 -0
- package/.claude/agents/uiux-designer.md +25 -0
- package/.claude/settings.json +49 -0
- package/.claude/settings.local.json +8 -0
- package/.claude/skills/commit/SKILL.md +37 -0
- package/.claude/skills/dev-browser/SKILL.md +30 -0
- package/.claude/skills/otro/SKILL.md +43 -0
- package/.claude/skills/planning-with-files/SKILL.md +37 -0
- package/.claude/skills/prd/SKILL.md +27 -0
- package/.claude/skills/ralph-loop/SKILL.md +42 -0
- package/.claude/skills/sdd/SKILL.md +13 -0
- package/.claude/skills/sdd-dev/SKILL.md +71 -0
- package/.claude/skills/sdd-development/SKILL.md +13 -0
- package/.claude/workspace-config.json +3 -0
- package/.codex/agentic-dev.json +3 -0
- package/.codex/agents/README.md +22 -0
- package/.codex/agents/api.toml +11 -0
- package/.codex/agents/architecture.toml +11 -0
- package/.codex/agents/ci.toml +11 -0
- package/.codex/agents/gitops.toml +11 -0
- package/.codex/agents/orchestrator.toml +11 -0
- package/.codex/agents/quality.toml +11 -0
- package/.codex/agents/runtime.toml +11 -0
- package/.codex/agents/security.toml +11 -0
- package/.codex/agents/specs.toml +11 -0
- package/.codex/agents/ui.toml +11 -0
- package/.codex/config.toml +46 -0
- package/.codex/skills/SKILL.md +13 -0
- package/.codex/skills/agents/openai.yaml +4 -0
- package/.codex/skills/commit/SKILL.md +219 -0
- package/.codex/skills/commit/references/commit_examples.md +292 -0
- package/.codex/skills/dev-browser/SKILL.md +211 -0
- package/.codex/skills/dev-browser/bun.lock +443 -0
- package/.codex/skills/dev-browser/package-lock.json +2988 -0
- package/.codex/skills/dev-browser/package.json +31 -0
- package/.codex/skills/dev-browser/references/scraping.md +155 -0
- package/.codex/skills/dev-browser/scripts/start-relay.ts +32 -0
- package/.codex/skills/dev-browser/scripts/start-server.ts +117 -0
- package/.codex/skills/dev-browser/server.sh +24 -0
- package/.codex/skills/dev-browser/src/client.ts +474 -0
- package/.codex/skills/dev-browser/src/index.ts +287 -0
- package/.codex/skills/dev-browser/src/relay.ts +731 -0
- package/.codex/skills/dev-browser/src/snapshot/__tests__/snapshot.test.ts +223 -0
- package/.codex/skills/dev-browser/src/snapshot/browser-script.ts +877 -0
- package/.codex/skills/dev-browser/src/snapshot/index.ts +14 -0
- package/.codex/skills/dev-browser/src/snapshot/inject.ts +13 -0
- package/.codex/skills/dev-browser/src/types.ts +34 -0
- package/.codex/skills/dev-browser/tsconfig.json +36 -0
- package/.codex/skills/dev-browser/vitest.config.ts +12 -0
- package/.codex/skills/otro/SKILL.md +74 -0
- package/.codex/skills/otro/agents/openai.yaml +4 -0
- package/.codex/skills/otro/references/agent-prompts.md +61 -0
- package/.codex/skills/otro/references/contracts.md +146 -0
- package/.codex/skills/otro/references/orchestration-loop.md +51 -0
- package/.codex/skills/otro/references/runtime.md +79 -0
- package/.codex/skills/otro/runs/README.md +11 -0
- package/.codex/skills/otro/schemas/step_plan.schema.json +289 -0
- package/.codex/skills/otro/schemas/task_result.schema.json +142 -0
- package/.codex/skills/otro/schemas/wave_plan.schema.json +4 -0
- package/.codex/skills/otro/scripts/README.md +38 -0
- package/.codex/skills/otro/scripts/bump_validation_header.py +179 -0
- package/.codex/skills/otro/scripts/check_validation_header.py +84 -0
- package/.codex/skills/otro/scripts/common.py +303 -0
- package/.codex/skills/otro/scripts/init_run.sh +68 -0
- package/.codex/skills/otro/scripts/plan_loop.py +8 -0
- package/.codex/skills/otro/scripts/plan_step.py +367 -0
- package/.codex/skills/otro/scripts/plan_wave.py +8 -0
- package/.codex/skills/otro/scripts/reconcile_loop.py +8 -0
- package/.codex/skills/otro/scripts/reconcile_step.py +37 -0
- package/.codex/skills/otro/scripts/reconcile_wave.py +8 -0
- package/.codex/skills/otro/scripts/run_loop.py +300 -0
- package/.codex/skills/otro/scripts/run_loop_step.py +8 -0
- package/.codex/skills/otro/scripts/run_step.py +246 -0
- package/.codex/skills/otro/scripts/run_wave.py +8 -0
- package/.codex/skills/otro/validation/validation.md +15 -0
- package/.codex/skills/planning-with-files/SKILL.md +42 -0
- package/.codex/skills/planning-with-files/agents/openai.yaml +4 -0
- package/.codex/skills/planning-with-files/assets/plan-template.md +37 -0
- package/.codex/skills/planning-with-files/references/plan-rules.md +35 -0
- package/.codex/skills/planning-with-files/scripts/new_plan.sh +65 -0
- package/.codex/skills/prd/SKILL.md +235 -0
- package/.codex/skills/ralph-loop/SKILL.md +46 -0
- package/.codex/skills/ralph-loop/agents/openai.yaml +4 -0
- package/.codex/skills/ralph-loop/references/failure-triage.md +32 -0
- package/.codex/skills/ralph-loop/scripts/loop_until_success.sh +97 -0
- package/.codex/skills/sdd/SKILL.md +184 -0
- package/.codex/skills/sdd/agents/openai.yaml +4 -0
- package/.codex/skills/sdd/references/section-map.md +67 -0
- package/.dockerignore +8 -0
- package/.env.example +50 -0
- package/.gitignore +16 -0
- package/AGENTS.md +78 -0
- package/README.md +83 -47
- package/SDD_SKILL.md +589 -0
- package/bin/agentic-dev.mjs +97 -0
- package/client/admin/.dockerignore +3 -0
- package/client/admin/.env.example +1 -0
- package/client/admin/Dockerfile +16 -0
- package/client/admin/Dockerfile.dev +18 -0
- package/client/admin/README.md +20 -0
- package/client/admin/index.html +12 -0
- package/client/admin/package.json +41 -0
- package/client/admin/postcss.config.js +6 -0
- package/client/admin/scripts/ui-parity-admin-adapter.mjs +65 -0
- package/client/admin/src/api/alerts.ts +33 -0
- package/client/admin/src/api/client.ts +71 -0
- package/client/admin/src/api/orders.ts +33 -0
- package/client/admin/src/api/support.ts +11 -0
- package/client/admin/src/app/App.tsx +23 -0
- package/client/admin/src/auth/AuthProvider.tsx +122 -0
- package/client/admin/src/auth/ProtectedRoute.tsx +22 -0
- package/client/admin/src/auth/auth-client.ts +38 -0
- package/client/admin/src/auth/types.ts +18 -0
- package/client/admin/src/components/AdminNotificationsDrawer.tsx +162 -0
- package/client/admin/src/components/AdminShell.tsx +76 -0
- package/client/admin/src/components/ui/button.tsx +34 -0
- package/client/admin/src/components/ui/input.tsx +21 -0
- package/client/admin/src/lib/cn.ts +6 -0
- package/client/admin/src/lib/specRouteCatalog.json +30 -0
- package/client/admin/src/lib/specScreens.json +22 -0
- package/client/admin/src/main.tsx +17 -0
- package/client/admin/src/pages/AdminDashboardPage.tsx +171 -0
- package/client/admin/src/pages/AdminLoginPage.tsx +75 -0
- package/client/admin/src/pages/AdminQueuePage.tsx +107 -0
- package/client/admin/src/pages/AdminSupportPage.tsx +61 -0
- package/client/admin/src/styles/globals.css +17 -0
- package/client/admin/src/theme-vars.ts +18 -0
- package/client/admin/src/theme.ts +25 -0
- package/client/admin/src/vite-env.d.ts +1 -0
- package/client/admin/tailwind.config.js +8 -0
- package/client/admin/tsconfig.json +25 -0
- package/client/admin/vite.config.ts +12 -0
- package/client/landing/.dockerignore +3 -0
- package/client/landing/.env.example +1 -0
- package/client/landing/Dockerfile +16 -0
- package/client/landing/Dockerfile.dev +18 -0
- package/client/landing/README.md +18 -0
- package/client/landing/index.html +12 -0
- package/client/landing/package.json +41 -0
- package/client/landing/postcss.config.js +6 -0
- package/client/landing/scripts/ui-parity-landing-adapter.mjs +65 -0
- package/client/landing/src/App.tsx +21 -0
- package/client/landing/src/api/catalog.ts +30 -0
- package/client/landing/src/api/client.ts +30 -0
- package/client/landing/src/auth/AuthProvider.tsx +122 -0
- package/client/landing/src/auth/ProtectedRoute.tsx +22 -0
- package/client/landing/src/auth/auth-client.ts +38 -0
- package/client/landing/src/auth/types.ts +18 -0
- package/client/landing/src/components/LandingShell.tsx +34 -0
- package/client/landing/src/lib/specRouteCatalog.json +23 -0
- package/client/landing/src/lib/specScreens.json +17 -0
- package/client/landing/src/main.tsx +17 -0
- package/client/landing/src/pages/LandingHomePage.tsx +215 -0
- package/client/landing/src/pages/LandingLoginPage.tsx +90 -0
- package/client/landing/src/pages/LandingWorkspacePage.tsx +126 -0
- package/client/landing/src/styles/globals.css +17 -0
- package/client/landing/src/theme-vars.ts +16 -0
- package/client/landing/src/theme.ts +21 -0
- package/client/landing/src/vite-env.d.ts +1 -0
- package/client/landing/tailwind.config.js +8 -0
- package/client/landing/tsconfig.json +25 -0
- package/client/landing/vite.config.ts +12 -0
- package/client/mobile/.dockerignore +2 -0
- package/client/mobile/.env.example +1 -0
- package/client/mobile/Dockerfile +16 -0
- package/client/mobile/Dockerfile.dev +18 -0
- package/client/mobile/README.md +19 -0
- package/client/mobile/index.html +12 -0
- package/client/mobile/package.json +42 -0
- package/client/mobile/postcss.config.js +6 -0
- package/client/mobile/scripts/ui-parity-mobile-adapter.mjs +67 -0
- package/client/mobile/src/App.tsx +1 -0
- package/client/mobile/src/api/client.ts +62 -0
- package/client/mobile/src/api/fulfillment.ts +55 -0
- package/client/mobile/src/api/shipping.ts +56 -0
- package/client/mobile/src/app/App.tsx +23 -0
- package/client/mobile/src/auth/AuthProvider.tsx +122 -0
- package/client/mobile/src/auth/ProtectedRoute.tsx +27 -0
- package/client/mobile/src/auth/auth-client.ts +38 -0
- package/client/mobile/src/auth/types.ts +18 -0
- package/client/mobile/src/components/InShell.tsx +74 -0
- package/client/mobile/src/components/ui/button.tsx +35 -0
- package/client/mobile/src/components/ui/card.tsx +15 -0
- package/client/mobile/src/components/ui/input.tsx +21 -0
- package/client/mobile/src/lib/cn.ts +6 -0
- package/client/mobile/src/lib/specRouteCatalog.json +26 -0
- package/client/mobile/src/lib/specScreens.json +22 -0
- package/client/mobile/src/lib/useSpeechRecognitionInput.ts +271 -0
- package/client/mobile/src/main.tsx +17 -0
- package/client/mobile/src/pages/DashboardPage.tsx +172 -0
- package/client/mobile/src/pages/FulfillmentPage.tsx +138 -0
- package/client/mobile/src/pages/LoginPage.tsx +74 -0
- package/client/mobile/src/pages/ShippingPage.tsx +338 -0
- package/client/mobile/src/styles/globals.css +23 -0
- package/client/mobile/src/theme-vars.ts +16 -0
- package/client/mobile/src/theme.ts +21 -0
- package/client/mobile/src/vite-env.d.ts +1 -0
- package/client/mobile/tailwind.config.js +8 -0
- package/client/mobile/tsconfig.json +25 -0
- package/client/mobile/vite.config.ts +12 -0
- package/client/platform/.dockerignore +3 -0
- package/client/platform/.env.example +1 -0
- package/client/platform/Dockerfile +16 -0
- package/client/platform/Dockerfile.dev +18 -0
- package/client/platform/README.md +47 -0
- package/client/platform/index.html +12 -0
- package/client/platform/package.json +42 -0
- package/client/platform/postcss.config.js +6 -0
- package/client/platform/scripts/ui-parity-platform-adapter.mjs +66 -0
- package/client/platform/src/api/client.ts +30 -0
- package/client/platform/src/api/orders.ts +42 -0
- package/client/platform/src/app/App.tsx +21 -0
- package/client/platform/src/auth/AuthProvider.tsx +122 -0
- package/client/platform/src/auth/ProtectedRoute.tsx +22 -0
- package/client/platform/src/auth/auth-client.ts +38 -0
- package/client/platform/src/auth/types.ts +18 -0
- package/client/platform/src/components/AppShell.tsx +59 -0
- package/client/platform/src/components/ui/button.tsx +35 -0
- package/client/platform/src/components/ui/card.tsx +7 -0
- package/client/platform/src/components/ui/input.tsx +21 -0
- package/client/platform/src/lib/cn.ts +6 -0
- package/client/platform/src/lib/specRouteCatalog.json +23 -0
- package/client/platform/src/lib/specScreens.json +17 -0
- package/client/platform/src/main.tsx +17 -0
- package/client/platform/src/pages/DashboardPage.tsx +158 -0
- package/client/platform/src/pages/LoginPage.tsx +72 -0
- package/client/platform/src/pages/OrdersPage.tsx +123 -0
- package/client/platform/src/styles/globals.css +17 -0
- package/client/platform/src/theme-vars.ts +18 -0
- package/client/platform/src/theme.ts +25 -0
- package/client/platform/src/vite-env.d.ts +1 -0
- package/client/platform/tailwind.config.js +8 -0
- package/client/platform/tsconfig.json +25 -0
- package/client/platform/vite.config.ts +12 -0
- package/compose.yml +206 -0
- package/infra/compose/.env.dev.example +28 -0
- package/infra/compose/.env.prod.example +29 -0
- package/infra/compose/README.md +35 -0
- package/infra/compose/dev.yml +125 -0
- package/infra/compose/prod.yml +126 -0
- package/infra/terraform/README.md +34 -0
- package/infra/terraform/aws/data/.terraform.lock.hcl +25 -0
- package/infra/terraform/aws/data/README.md +18 -0
- package/infra/terraform/aws/data/main.tf +147 -0
- package/infra/terraform/aws/data/outputs.tf +14 -0
- package/infra/terraform/aws/data/variables.tf +57 -0
- package/infra/terraform/aws/data/versions.tf +10 -0
- package/infra/terraform/aws/domain/.terraform.lock.hcl +25 -0
- package/infra/terraform/aws/domain/README.md +20 -0
- package/infra/terraform/aws/domain/env/dev.tfvars.example +6 -0
- package/infra/terraform/aws/domain/env/prod.tfvars.example +7 -0
- package/infra/terraform/aws/domain/main.tf +149 -0
- package/infra/terraform/aws/domain/outputs.tf +29 -0
- package/infra/terraform/aws/domain/variables.tf +58 -0
- package/infra/terraform/aws/domain/versions.tf +10 -0
- package/infra/terraform/openstack/README.md +38 -0
- package/infra/terraform/openstack/dev/.terraform.lock.hcl +24 -0
- package/infra/terraform/openstack/dev/README.md +18 -0
- package/infra/terraform/openstack/dev/main.tf +49 -0
- package/infra/terraform/openstack/dev/providers.tf +15 -0
- package/infra/terraform/openstack/dev/terraform.tfvars.example +54 -0
- package/infra/terraform/openstack/dev/variables.tf +210 -0
- package/infra/terraform/openstack/dev/versions.tf +10 -0
- package/infra/terraform/openstack/modules/environment_host/main.tf +143 -0
- package/infra/terraform/openstack/modules/environment_host/outputs.tf +25 -0
- package/infra/terraform/openstack/modules/environment_host/templates/docker-host-user-data.sh.tftpl +40 -0
- package/infra/terraform/openstack/modules/environment_host/variables.tf +145 -0
- package/infra/terraform/openstack/modules/environment_host/versions.tf +7 -0
- package/infra/terraform/openstack/prod/.terraform.lock.hcl +24 -0
- package/infra/terraform/openstack/prod/README.md +18 -0
- package/infra/terraform/openstack/prod/main.tf +49 -0
- package/infra/terraform/openstack/prod/providers.tf +15 -0
- package/infra/terraform/openstack/prod/terraform.tfvars.example +55 -0
- package/infra/terraform/openstack/prod/variables.tf +210 -0
- package/infra/terraform/openstack/prod/versions.tf +10 -0
- package/infra/terraform/openstack/server/.terraform.lock.hcl +45 -0
- package/infra/terraform/openstack/server/README.md +47 -0
- package/infra/terraform/openstack/server/main.tf +161 -0
- package/infra/terraform/openstack/server/outputs.tf +30 -0
- package/infra/terraform/openstack/server/providers.tf +30 -0
- package/infra/terraform/openstack/server/templates/server-user-data.sh.tftpl +50 -0
- package/infra/terraform/openstack/server/variables.tf +233 -0
- package/infra/terraform/openstack/server/zz_aspace.auto.tfvars.example.json +29 -0
- package/lib/scaffold.mjs +379 -0
- package/package.json +33 -12
- package/pnpm-workspace.yaml +2 -0
- package/scripts/dev/audit_sdd_build_ast.py +277 -0
- package/sdd/01_planning/01_feature/INDEX.md +16 -0
- package/sdd/01_planning/01_feature/README.md +76 -0
- package/sdd/01_planning/01_feature/alerts_feature_spec.md +55 -0
- package/sdd/01_planning/01_feature/auth_feature_spec.md +57 -0
- package/sdd/01_planning/01_feature/catalog_feature_spec.md +61 -0
- package/sdd/01_planning/01_feature/fulfillment_feature_spec.md +58 -0
- package/sdd/01_planning/01_feature/health_feature_spec.md +52 -0
- package/sdd/01_planning/01_feature/inventory_feature_spec.md +60 -0
- package/sdd/01_planning/01_feature/order_feature_spec.md +63 -0
- package/sdd/01_planning/01_feature/shipping_feature_spec.md +55 -0
- package/sdd/01_planning/01_feature/support_feature_spec.md +53 -0
- package/sdd/01_planning/01_feature/user_feature_spec.md +54 -0
- package/sdd/01_planning/02_screen/INDEX.md +13 -0
- package/sdd/01_planning/02_screen/README.md +41 -0
- package/sdd/01_planning/02_screen/admin_screen_spec.pdf +0 -0
- package/sdd/01_planning/02_screen/assets/README.md +16 -0
- package/sdd/01_planning/02_screen/assets/example/README.md +13 -0
- package/sdd/01_planning/02_screen/landing_screen_spec.pdf +0 -0
- package/sdd/01_planning/02_screen/mobile_screen_spec.pdf +0 -0
- package/sdd/01_planning/02_screen/platform_screen_spec.pdf +0 -0
- package/sdd/01_planning/03_architecture/INDEX.md +9 -0
- package/sdd/01_planning/03_architecture/README.md +25 -0
- package/sdd/01_planning/03_architecture/architecture_document_structure.md +77 -0
- package/sdd/01_planning/03_architecture/backend/README.md +10 -0
- package/sdd/01_planning/03_architecture/frontend/README.md +12 -0
- package/sdd/01_planning/03_architecture/infra/README.md +10 -0
- package/sdd/01_planning/03_architecture/tech-research/README.md +4 -0
- package/sdd/01_planning/03_architecture/templates_system_architecture.md +84 -0
- package/sdd/01_planning/04_data/INDEX.md +4 -0
- package/sdd/01_planning/04_data/README.md +10 -0
- package/sdd/01_planning/04_data/templates_data_modeling.md +119 -0
- package/sdd/01_planning/05_api/README.md +12 -0
- package/sdd/01_planning/05_api/templates_api_contract.md +90 -0
- package/sdd/01_planning/06_iac/README.md +11 -0
- package/sdd/01_planning/06_iac/templates_runtime_and_cicd_baseline.md +46 -0
- package/sdd/01_planning/07_integration/README.md +11 -0
- package/sdd/01_planning/07_integration/templates_frontend_api_integration.md +46 -0
- package/sdd/01_planning/08_nonfunctional/README.md +7 -0
- package/sdd/01_planning/09_security/README.md +7 -0
- package/sdd/01_planning/10_test/README.md +12 -0
- package/sdd/01_planning/10_test/templates_test_strategy.md +60 -0
- package/sdd/01_planning/INDEX.md +19 -0
- package/sdd/01_planning/README.md +17 -0
- package/sdd/02_plan/01_feature/README.md +34 -0
- package/sdd/02_plan/01_feature/_feature_todo_template.md +29 -0
- package/sdd/02_plan/02_screen/INDEX.md +19 -0
- package/sdd/02_plan/02_screen/README.md +39 -0
- package/sdd/02_plan/02_screen/_screen_todo_template.md +60 -0
- package/sdd/02_plan/03_architecture/README.md +23 -0
- package/sdd/02_plan/03_architecture/architecture_document_governance.md +40 -0
- package/sdd/02_plan/03_architecture/build_ast_runtime_tree_governance.md +53 -0
- package/sdd/02_plan/03_architecture/repository_governance.md +39 -0
- package/sdd/02_plan/03_architecture/runtime_and_structure_governance.md +38 -0
- package/sdd/02_plan/03_architecture/templates-hexagonal-template-architecture.md +9 -0
- package/sdd/02_plan/03_architecture/toolchain_governance.md +98 -0
- package/sdd/02_plan/04_data/README.md +5 -0
- package/sdd/02_plan/05_api/README.md +5 -0
- package/sdd/02_plan/06_iac/README.md +11 -0
- package/sdd/02_plan/06_iac/dev_runtime_delivery.md +36 -0
- package/sdd/02_plan/06_iac/template_runtime_delivery.md +50 -0
- package/sdd/02_plan/07_integration/README.md +5 -0
- package/sdd/02_plan/07_integration/frontend_live_integration.md +31 -0
- package/sdd/02_plan/08_nonfunctional/README.md +5 -0
- package/sdd/02_plan/08_nonfunctional/repository_hygiene.md +26 -0
- package/sdd/02_plan/09_security/README.md +5 -0
- package/sdd/02_plan/10_test/README.md +11 -0
- package/sdd/02_plan/10_test/regression_verification.md +39 -0
- package/sdd/02_plan/10_test/templates/README.md +8 -0
- package/sdd/02_plan/10_test/templates/ui_parity_platform_contract.template.yaml +23 -0
- package/sdd/02_plan/10_test/verification_strategy.md +43 -0
- package/sdd/02_plan/99_generated/from_planning/ui_parity/.gitkeep +1 -0
- package/sdd/02_plan/README.md +40 -0
- package/sdd/03_build/01_feature/README.md +20 -0
- package/sdd/03_build/01_feature/domain/README.md +3 -0
- package/sdd/03_build/01_feature/domain/account_and_access.md +20 -0
- package/sdd/03_build/01_feature/domain/catalog_and_inventory.md +20 -0
- package/sdd/03_build/01_feature/domain/ordering_and_fulfillment.md +21 -0
- package/sdd/03_build/01_feature/domain/support_and_observability.md +21 -0
- package/sdd/03_build/01_feature/domain_surfaces.md +28 -0
- package/sdd/03_build/01_feature/service/README.md +3 -0
- package/sdd/03_build/01_feature/service/admin_surface.md +15 -0
- package/sdd/03_build/01_feature/service/landing_surface.md +13 -0
- package/sdd/03_build/01_feature/service/mobile_surface.md +14 -0
- package/sdd/03_build/01_feature/service/platform_surface.md +14 -0
- package/sdd/03_build/02_screen/README.md +25 -0
- package/sdd/03_build/02_screen/_screen_build_template.md +26 -0
- package/sdd/03_build/02_screen/admin/README.md +5 -0
- package/sdd/03_build/02_screen/landing/README.md +5 -0
- package/sdd/03_build/02_screen/mobile/README.md +5 -0
- package/sdd/03_build/02_screen/platform/README.md +5 -0
- package/sdd/03_build/03_architecture/README.md +10 -0
- package/sdd/03_build/03_architecture/architecture_document_governance.md +30 -0
- package/sdd/03_build/03_architecture/build_ast_runtime_tree_governance.md +24 -0
- package/sdd/03_build/03_architecture/repository_governance.md +18 -0
- package/sdd/03_build/03_architecture/toolchain_governance.md +36 -0
- package/sdd/03_build/06_iac/README.md +3 -0
- package/sdd/03_build/06_iac/dev_runtime_delivery.md +10 -0
- package/sdd/03_build/06_iac/template_runtime_delivery.md +49 -0
- package/sdd/03_build/07_integration/README.md +3 -0
- package/sdd/03_build/07_integration/frontend_live_integration.md +11 -0
- package/sdd/03_build/08_nonfunctional/README.md +3 -0
- package/sdd/03_build/08_nonfunctional/repository_hygiene.md +10 -0
- package/sdd/03_build/10_test/README.md +9 -0
- package/sdd/03_build/10_test/regression_verification.md +16 -0
- package/sdd/03_build/10_test/verification_harness.md +11 -0
- package/sdd/03_build/README.md +35 -0
- package/sdd/04_verify/01_feature/README.md +5 -0
- package/sdd/04_verify/01_feature/domain_verification.md +14 -0
- package/sdd/04_verify/01_feature/service_verification.md +22 -0
- package/sdd/04_verify/02_screen/README.md +6 -0
- package/sdd/04_verify/02_screen/_screen_verify_template.md +20 -0
- package/sdd/04_verify/02_screen/admin/README.md +4 -0
- package/sdd/04_verify/02_screen/landing/README.md +4 -0
- package/sdd/04_verify/02_screen/mobile/README.md +4 -0
- package/sdd/04_verify/02_screen/platform/README.md +4 -0
- package/sdd/04_verify/03_architecture/README.md +10 -0
- package/sdd/04_verify/03_architecture/architecture_document_governance.md +15 -0
- package/sdd/04_verify/03_architecture/build_ast_runtime_tree_governance.md +28 -0
- package/sdd/04_verify/03_architecture/repository_governance.md +16 -0
- package/sdd/04_verify/03_architecture/toolchain_governance.md +58 -0
- package/sdd/04_verify/06_iac/README.md +3 -0
- package/sdd/04_verify/06_iac/dev_runtime_delivery.md +10 -0
- package/sdd/04_verify/06_iac/template_runtime_delivery.md +42 -0
- package/sdd/04_verify/07_integration/README.md +3 -0
- package/sdd/04_verify/07_integration/frontend_live_integration.md +16 -0
- package/sdd/04_verify/08_nonfunctional/README.md +3 -0
- package/sdd/04_verify/08_nonfunctional/repository_hygiene.md +14 -0
- package/sdd/04_verify/10_test/README.md +9 -0
- package/sdd/04_verify/10_test/regression_verification.md +16 -0
- package/sdd/04_verify/10_test/ui_parity/README.md +4 -0
- package/sdd/04_verify/10_test/ui_parity/loop_runs/.gitkeep +0 -0
- package/sdd/04_verify/10_test/ui_parity/reference/.gitkeep +0 -0
- package/sdd/04_verify/10_test/ui_parity/staged_runs/.gitkeep +0 -0
- package/sdd/04_verify/10_test/verification_harness.md +17 -0
- package/sdd/04_verify/README.md +22 -0
- package/sdd/05_operate/01_runbooks/.gitkeep +1 -0
- package/sdd/05_operate/01_runbooks/README.md +4 -0
- package/sdd/05_operate/02_delivery_status/README.md +4 -0
- package/sdd/05_operate/02_delivery_status/service_status.md +16 -0
- package/sdd/05_operate/README.md +12 -0
- package/sdd/99_toolchain/01_automation/.gitkeep +1 -0
- package/sdd/99_toolchain/01_automation/README.md +76 -0
- package/sdd/99_toolchain/01_automation/agentic-dev/analyze_proof_results.py +132 -0
- package/sdd/99_toolchain/01_automation/agentic-dev/analyze_route_gap.py +85 -0
- package/sdd/99_toolchain/01_automation/agentic-dev/assets/repo-contract.template.json +75 -0
- package/sdd/99_toolchain/01_automation/agentic-dev/bootstrap_frontend_parity.sh +84 -0
- package/sdd/99_toolchain/01_automation/agentic-dev/init_frontend_parity.sh +33 -0
- package/sdd/99_toolchain/01_automation/agentic-dev/init_repo_contract.sh +51 -0
- package/sdd/99_toolchain/01_automation/agentic-dev/repo-contract.json +76 -0
- package/sdd/99_toolchain/01_automation/agentic-dev/resolve_frontend_target.py +52 -0
- package/sdd/99_toolchain/01_automation/agentic-dev/resolve_repo_contract.py +56 -0
- package/sdd/99_toolchain/01_automation/agentic-dev/run_frontend_target.sh +100 -0
- package/sdd/99_toolchain/01_automation/agentic-dev/run_repo_phase.sh +140 -0
- package/sdd/99_toolchain/01_automation/agentic-dev/validate_json_schema.py +39 -0
- package/sdd/99_toolchain/01_automation/agentic-parity-harness-design.md +291 -0
- package/sdd/99_toolchain/01_automation/assets/admin_screen_capture/dashboard.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/admin_screen_capture/login.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/admin_screen_capture/queue.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/admin_screen_capture/support.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/landing_screen_capture/home.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/landing_screen_capture/login.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/landing_screen_capture/workspace.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/mobile_screen_capture/dashboard.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/mobile_screen_capture/fulfillment.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/mobile_screen_capture/login.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/platform_screen_capture/dashboard.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/platform_screen_capture/login.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/platform_screen_capture/orders.png +0 -0
- package/sdd/99_toolchain/01_automation/build_asset_recipes.py +10 -0
- package/sdd/99_toolchain/01_automation/build_screen_spec_pdf.py +427 -0
- package/sdd/99_toolchain/01_automation/capture_screen_assets.mjs +148 -0
- package/sdd/99_toolchain/01_automation/harness-layout.md +34 -0
- package/sdd/99_toolchain/01_automation/parity-execution-tooling-design.md +319 -0
- package/sdd/99_toolchain/01_automation/playwright_exactness_manifest.py +21 -0
- package/sdd/99_toolchain/01_automation/run_playwright_exactness.py +87 -0
- package/sdd/99_toolchain/01_automation/screen_spec_manifest.py +321 -0
- package/sdd/99_toolchain/01_automation/spec_asset_builder.py +274 -0
- package/sdd/99_toolchain/01_automation/ui-contract-projection.md +79 -0
- package/sdd/99_toolchain/01_automation/ui-parity/README.md +60 -0
- package/sdd/99_toolchain/01_automation/ui-parity/cli/extract-reference-pages.mjs +2 -0
- package/sdd/99_toolchain/01_automation/ui-parity/cli/materialize-reference-assets.mjs +58 -0
- package/sdd/99_toolchain/01_automation/ui-parity/cli/normalize-reference-assets.mjs +2 -0
- package/sdd/99_toolchain/01_automation/ui-parity/cli/route-gap-report.mjs +187 -0
- package/sdd/99_toolchain/01_automation/ui-parity/cli/run-proof.mjs +50 -0
- package/sdd/99_toolchain/01_automation/ui-parity/cli/scaffold-contract.mjs +62 -0
- package/sdd/99_toolchain/01_automation/ui-parity/cli/upload-parity1.mjs +2 -0
- package/sdd/99_toolchain/01_automation/ui-parity/contracts/collector-metadata.schema.json +33 -0
- package/sdd/99_toolchain/01_automation/ui-parity/contracts/proof-result.schema.json +76 -0
- package/sdd/99_toolchain/01_automation/ui-parity/contracts/route-gap-report.schema.json +95 -0
- package/sdd/99_toolchain/01_automation/ui-parity/core/capture-runner.mjs +55 -0
- package/sdd/99_toolchain/01_automation/ui-parity/core/load-adapter.mjs +25 -0
- package/sdd/99_toolchain/01_automation/ui-parity/core/load-contract.mjs +81 -0
- package/sdd/99_toolchain/01_automation/ui-parity/core/paths.mjs +23 -0
- package/sdd/99_toolchain/01_automation/ui-parity/core/proof-runner.mjs +255 -0
- package/sdd/99_toolchain/01_automation/ui-parity/interfaces/ui-parity-artifact-layout.md +23 -0
- package/sdd/99_toolchain/01_automation/ui-parity/interfaces/ui-parity-proof-interface.md +60 -0
- package/sdd/99_toolchain/01_automation/ui-parity/interfaces/ui-parity-route-gap-interface.md +82 -0
- package/sdd/99_toolchain/01_automation/ui-parity/runtime/playwright-runtime.mjs +16 -0
- package/sdd/99_toolchain/01_automation/ui-parity/runtime/static-runtime.mjs +6 -0
- package/sdd/99_toolchain/02_policies/.gitkeep +1 -0
- package/sdd/99_toolchain/02_policies/build-ast-governance-policy.md +22 -0
- package/sdd/99_toolchain/02_policies/compose-runtime-baseline-policy.md +24 -0
- package/sdd/99_toolchain/02_policies/convention-storage-policy.md +26 -0
- package/sdd/99_toolchain/02_policies/main-push-before-dev-deploy-policy.md +27 -0
- package/sdd/99_toolchain/02_policies/otro-orchestration-policy.md +30 -0
- package/sdd/99_toolchain/02_policies/regression-verification-policy.md +22 -0
- package/sdd/99_toolchain/03_templates/.gitkeep +1 -0
- package/sdd/99_toolchain/03_templates/asset_recipe_manifest.example.py +38 -0
- package/sdd/99_toolchain/03_templates/generated_assets/README.md +11 -0
- package/sdd/99_toolchain/03_templates/generated_assets/example-brand-lockup.svg +3 -0
- package/sdd/99_toolchain/03_templates/generated_assets/example-brand-mark.svg +3 -0
- package/sdd/99_toolchain/03_templates/generated_assets/example-brand-wordmark.svg +3 -0
- package/sdd/99_toolchain/03_templates/playwright_exactness_manifest.example.py +21 -0
- package/sdd/99_toolchain/README.md +23 -0
- package/sdd/README.md +21 -0
- package/server/.dockerignore +4 -0
- package/server/.env.example +19 -0
- package/server/Dockerfile +22 -0
- package/server/Dockerfile.dev +19 -0
- package/server/README.md +33 -0
- package/server/__init__.py +0 -0
- package/server/api/__init__.py +1 -0
- package/server/api/http/__init__.py +4 -0
- package/server/api/http/app.py +53 -0
- package/server/api/http/router.py +24 -0
- package/server/config.py +52 -0
- package/server/contexts/__init__.py +12 -0
- package/server/contexts/alerts/__init__.py +1 -0
- package/server/contexts/alerts/application/__init__.py +13 -0
- package/server/contexts/alerts/application/services.py +41 -0
- package/server/contexts/alerts/contracts/__init__.py +3 -0
- package/server/contexts/alerts/contracts/http/__init__.py +3 -0
- package/server/contexts/alerts/contracts/http/router.py +37 -0
- package/server/contexts/alerts/domain/__init__.py +15 -0
- package/server/contexts/alerts/domain/models.py +29 -0
- package/server/contexts/alerts/infrastructure/__init__.py +11 -0
- package/server/contexts/alerts/infrastructure/repository.py +41 -0
- package/server/contexts/auth/__init__.py +1 -0
- package/server/contexts/auth/application/__init__.py +3 -0
- package/server/contexts/auth/application/ports.py +10 -0
- package/server/contexts/auth/application/services.py +64 -0
- package/server/contexts/auth/contracts/__init__.py +4 -0
- package/server/contexts/auth/contracts/http/__init__.py +4 -0
- package/server/contexts/auth/contracts/http/dependencies.py +37 -0
- package/server/contexts/auth/contracts/http/router.py +19 -0
- package/server/contexts/auth/domain/__init__.py +3 -0
- package/server/contexts/auth/domain/models.py +24 -0
- package/server/contexts/auth/infrastructure/__init__.py +4 -0
- package/server/contexts/auth/infrastructure/adapters/memory.py +19 -0
- package/server/contexts/auth/infrastructure/adapters/mongodb.py +24 -0
- package/server/contexts/auth/infrastructure/adapters/sqlalchemy.py +74 -0
- package/server/contexts/auth/infrastructure/repository.py +28 -0
- package/server/contexts/catalog/__init__.py +1 -0
- package/server/contexts/catalog/application/__init__.py +28 -0
- package/server/contexts/catalog/application/ports.py +15 -0
- package/server/contexts/catalog/application/services.py +154 -0
- package/server/contexts/catalog/contracts/__init__.py +3 -0
- package/server/contexts/catalog/contracts/http/__init__.py +3 -0
- package/server/contexts/catalog/contracts/http/router.py +60 -0
- package/server/contexts/catalog/domain/__init__.py +45 -0
- package/server/contexts/catalog/domain/models.py +113 -0
- package/server/contexts/catalog/infrastructure/__init__.py +4 -0
- package/server/contexts/catalog/infrastructure/adapters/memory.py +62 -0
- package/server/contexts/catalog/infrastructure/repository.py +8 -0
- package/server/contexts/fulfillment/__init__.py +1 -0
- package/server/contexts/fulfillment/application/__init__.py +13 -0
- package/server/contexts/fulfillment/application/ports.py +20 -0
- package/server/contexts/fulfillment/application/services.py +85 -0
- package/server/contexts/fulfillment/contracts/__init__.py +3 -0
- package/server/contexts/fulfillment/contracts/http/__init__.py +3 -0
- package/server/contexts/fulfillment/contracts/http/router.py +40 -0
- package/server/contexts/fulfillment/domain/__init__.py +25 -0
- package/server/contexts/fulfillment/domain/models.py +73 -0
- package/server/contexts/fulfillment/infrastructure/__init__.py +13 -0
- package/server/contexts/fulfillment/infrastructure/adapters/memory.py +43 -0
- package/server/contexts/fulfillment/infrastructure/repository.py +97 -0
- package/server/contexts/health/__init__.py +1 -0
- package/server/contexts/health/application/__init__.py +3 -0
- package/server/contexts/health/application/services.py +2 -0
- package/server/contexts/health/contracts/__init__.py +3 -0
- package/server/contexts/health/contracts/http/__init__.py +3 -0
- package/server/contexts/health/contracts/http/router.py +10 -0
- package/server/contexts/inventory/__init__.py +1 -0
- package/server/contexts/inventory/application/__init__.py +28 -0
- package/server/contexts/inventory/application/ports.py +11 -0
- package/server/contexts/inventory/application/services.py +214 -0
- package/server/contexts/inventory/contracts/__init__.py +3 -0
- package/server/contexts/inventory/contracts/http/__init__.py +3 -0
- package/server/contexts/inventory/contracts/http/router.py +82 -0
- package/server/contexts/inventory/domain/__init__.py +33 -0
- package/server/contexts/inventory/domain/models.py +93 -0
- package/server/contexts/inventory/infrastructure/__init__.py +4 -0
- package/server/contexts/inventory/infrastructure/adapters/memory.py +24 -0
- package/server/contexts/inventory/infrastructure/repository.py +8 -0
- package/server/contexts/orders/__init__.py +1 -0
- package/server/contexts/orders/application/__init__.py +19 -0
- package/server/contexts/orders/application/services.py +127 -0
- package/server/contexts/orders/contracts/__init__.py +3 -0
- package/server/contexts/orders/contracts/http/__init__.py +3 -0
- package/server/contexts/orders/contracts/http/router.py +82 -0
- package/server/contexts/orders/domain/__init__.py +29 -0
- package/server/contexts/orders/domain/models.py +95 -0
- package/server/contexts/orders/infrastructure/__init__.py +7 -0
- package/server/contexts/orders/infrastructure/repository.py +104 -0
- package/server/contexts/shipping/__init__.py +1 -0
- package/server/contexts/shipping/application/__init__.py +13 -0
- package/server/contexts/shipping/application/services.py +92 -0
- package/server/contexts/shipping/contracts/__init__.py +3 -0
- package/server/contexts/shipping/contracts/http/__init__.py +3 -0
- package/server/contexts/shipping/contracts/http/router.py +40 -0
- package/server/contexts/shipping/domain/__init__.py +19 -0
- package/server/contexts/shipping/domain/models.py +48 -0
- package/server/contexts/shipping/infrastructure/__init__.py +9 -0
- package/server/contexts/shipping/infrastructure/repository.py +50 -0
- package/server/contexts/support/__init__.py +1 -0
- package/server/contexts/support/application/__init__.py +13 -0
- package/server/contexts/support/application/services.py +29 -0
- package/server/contexts/support/contracts/__init__.py +3 -0
- package/server/contexts/support/contracts/http/__init__.py +3 -0
- package/server/contexts/support/contracts/http/router.py +40 -0
- package/server/contexts/support/domain/__init__.py +13 -0
- package/server/contexts/support/domain/models.py +27 -0
- package/server/contexts/support/infrastructure/__init__.py +11 -0
- package/server/contexts/support/infrastructure/repository.py +70 -0
- package/server/contexts/user/__init__.py +1 -0
- package/server/contexts/user/application/__init__.py +3 -0
- package/server/contexts/user/application/ports.py +11 -0
- package/server/contexts/user/application/services.py +44 -0
- package/server/contexts/user/contracts/__init__.py +3 -0
- package/server/contexts/user/contracts/http/__init__.py +3 -0
- package/server/contexts/user/contracts/http/router.py +26 -0
- package/server/contexts/user/domain/__init__.py +3 -0
- package/server/contexts/user/domain/models.py +22 -0
- package/server/contexts/user/infrastructure/__init__.py +3 -0
- package/server/contexts/user/infrastructure/adapters/memory.py +27 -0
- package/server/contexts/user/infrastructure/adapters/mongodb.py +41 -0
- package/server/contexts/user/infrastructure/adapters/sqlalchemy.py +94 -0
- package/server/contexts/user/infrastructure/factory.py +28 -0
- package/server/data/README.md +24 -0
- package/server/data/bootstrap/alerts.json +38 -0
- package/server/data/bootstrap/auth_accounts.json +18 -0
- package/server/data/bootstrap/catalog_products.json +179 -0
- package/server/data/bootstrap/fulfillment_events.json +5 -0
- package/server/data/bootstrap/fulfillment_notes.json +5 -0
- package/server/data/bootstrap/fulfillment_tasks.json +50 -0
- package/server/data/bootstrap/inventory_levels.json +80 -0
- package/server/data/bootstrap/orders.json +62 -0
- package/server/data/bootstrap/shipping_shipments.json +50 -0
- package/server/data/bootstrap/support_faqs.json +26 -0
- package/server/data/bootstrap/users.json +20 -0
- package/server/data/bootstrap_loader.py +15 -0
- package/server/docker-entrypoint.sh +56 -0
- package/server/main.py +3 -0
- package/server/pyproject.toml +36 -0
- package/server/shared/__init__.py +1 -0
- package/server/shared/application/__init__.py +3 -0
- package/server/shared/application/health.py +2 -0
- package/server/shared/infrastructure/__init__.py +10 -0
- package/server/shared/infrastructure/runtime.py +6 -0
- package/server/shared/infrastructure/security.py +33 -0
- package/server/tests/e2e/test_domain_feature_flows.py +483 -0
- package/server/tests/test_health.py +49 -0
- package/server/uv.lock +1169 -0
- package/bin/agentic-dev.js +0 -9
- package/src/cli.js +0 -37
- package/src/init-command.js +0 -230
- package/src/lib/command.js +0 -14
- package/src/lib/fs.js +0 -92
- package/src/lib/git.js +0 -57
- package/src/lib/github.js +0 -77
- package/src/lib/prompt.js +0 -52
- package/src/lib/system.js +0 -15
- package/src/lib/template.js +0 -143
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import argparse
|
|
6
|
+
import json
|
|
7
|
+
import re
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
ROOT = Path(__file__).resolve().parents[2]
|
|
12
|
+
|
|
13
|
+
SERVICE_DOCS = {
|
|
14
|
+
"mobile": ROOT / "sdd/03_build/01_feature/service/mobile_surface.md",
|
|
15
|
+
"platform": ROOT / "sdd/03_build/01_feature/service/platform_surface.md",
|
|
16
|
+
"admin": ROOT / "sdd/03_build/01_feature/service/admin_surface.md",
|
|
17
|
+
"landing": ROOT / "sdd/03_build/01_feature/service/landing_surface.md",
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
BUILD_AST_DOC = ROOT / "sdd/03_build/03_architecture/build_ast_runtime_tree_governance.md"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def read(path: Path) -> str:
|
|
24
|
+
return path.read_text(encoding="utf-8")
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def score(value: float, maximum: float) -> int:
|
|
28
|
+
if maximum <= 0:
|
|
29
|
+
return 0
|
|
30
|
+
scaled = round((value / maximum) * 10)
|
|
31
|
+
return max(0, min(10, scaled))
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def contains_all(text: str, needles: list[str]) -> bool:
|
|
35
|
+
return all(needle in text for needle in needles)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def ast_similarity() -> tuple[int, list[str]]:
|
|
39
|
+
findings: list[str] = []
|
|
40
|
+
points = 0.0
|
|
41
|
+
maximum = 10.0
|
|
42
|
+
|
|
43
|
+
mobile = read(SERVICE_DOCS["mobile"])
|
|
44
|
+
if contains_all(
|
|
45
|
+
mobile,
|
|
46
|
+
[
|
|
47
|
+
"client/mobile/src/main.tsx",
|
|
48
|
+
"AuthProvider",
|
|
49
|
+
"BrowserRouter",
|
|
50
|
+
"client/mobile/src/app/App.tsx",
|
|
51
|
+
"ProtectedRoute",
|
|
52
|
+
"InShell",
|
|
53
|
+
"DashboardPage",
|
|
54
|
+
"FulfillmentPage",
|
|
55
|
+
"ShippingPage",
|
|
56
|
+
],
|
|
57
|
+
):
|
|
58
|
+
points += 2.5
|
|
59
|
+
else:
|
|
60
|
+
findings.append("mobile surface summary does not reflect the real provider/router/shell chain.")
|
|
61
|
+
|
|
62
|
+
platform = read(SERVICE_DOCS["platform"])
|
|
63
|
+
if contains_all(
|
|
64
|
+
platform,
|
|
65
|
+
[
|
|
66
|
+
"client/platform/src/main.tsx",
|
|
67
|
+
"AuthProvider",
|
|
68
|
+
"BrowserRouter",
|
|
69
|
+
"client/platform/src/app/App.tsx",
|
|
70
|
+
"ProtectedRoute",
|
|
71
|
+
"AppShell",
|
|
72
|
+
"DashboardPage",
|
|
73
|
+
"OrdersPage",
|
|
74
|
+
],
|
|
75
|
+
):
|
|
76
|
+
points += 2.5
|
|
77
|
+
else:
|
|
78
|
+
findings.append("platform surface summary does not reflect the real app shell route tree.")
|
|
79
|
+
|
|
80
|
+
admin = read(SERVICE_DOCS["admin"])
|
|
81
|
+
if contains_all(
|
|
82
|
+
admin,
|
|
83
|
+
[
|
|
84
|
+
"client/admin/src/main.tsx",
|
|
85
|
+
"AuthProvider",
|
|
86
|
+
"BrowserRouter",
|
|
87
|
+
"client/admin/src/app/App.tsx",
|
|
88
|
+
"ProtectedRoute",
|
|
89
|
+
"AdminShell",
|
|
90
|
+
"AdminDashboardPage",
|
|
91
|
+
"AdminQueuePage",
|
|
92
|
+
"AdminSupportPage",
|
|
93
|
+
],
|
|
94
|
+
):
|
|
95
|
+
points += 2.5
|
|
96
|
+
else:
|
|
97
|
+
findings.append("admin surface summary does not reflect the real admin shell route tree.")
|
|
98
|
+
|
|
99
|
+
landing = read(SERVICE_DOCS["landing"])
|
|
100
|
+
if contains_all(
|
|
101
|
+
landing,
|
|
102
|
+
[
|
|
103
|
+
"client/landing/src/main.tsx",
|
|
104
|
+
"AuthProvider",
|
|
105
|
+
"BrowserRouter",
|
|
106
|
+
"client/landing/src/App.tsx",
|
|
107
|
+
"LandingHomePage",
|
|
108
|
+
"LandingLoginPage",
|
|
109
|
+
"ProtectedRoute",
|
|
110
|
+
"LandingShell",
|
|
111
|
+
"LandingWorkspacePage",
|
|
112
|
+
],
|
|
113
|
+
):
|
|
114
|
+
points += 2.5
|
|
115
|
+
else:
|
|
116
|
+
findings.append("landing surface summary does not reflect the public and gated route assembly.")
|
|
117
|
+
|
|
118
|
+
return score(points, maximum), findings
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def implementation_traceability() -> tuple[int, list[str]]:
|
|
122
|
+
findings: list[str] = []
|
|
123
|
+
points = 0.0
|
|
124
|
+
maximum = 10.0
|
|
125
|
+
|
|
126
|
+
mobile = read(SERVICE_DOCS["mobile"])
|
|
127
|
+
if contains_all(
|
|
128
|
+
mobile,
|
|
129
|
+
[
|
|
130
|
+
"server/main.py",
|
|
131
|
+
"server/api/http/app.py",
|
|
132
|
+
"server/api/http/router.py",
|
|
133
|
+
"contexts/auth/contracts/http/router.py",
|
|
134
|
+
"contexts/fulfillment/contracts/http/router.py",
|
|
135
|
+
"contexts/shipping/contracts/http/router.py",
|
|
136
|
+
],
|
|
137
|
+
):
|
|
138
|
+
points += 2.0
|
|
139
|
+
else:
|
|
140
|
+
findings.append("mobile surface summary does not trace route leaves to backend contract leaves.")
|
|
141
|
+
|
|
142
|
+
platform = read(SERVICE_DOCS["platform"])
|
|
143
|
+
if contains_all(
|
|
144
|
+
platform,
|
|
145
|
+
[
|
|
146
|
+
"server/main.py",
|
|
147
|
+
"server/api/http/app.py",
|
|
148
|
+
"server/api/http/router.py",
|
|
149
|
+
"contexts/auth/contracts/http/router.py",
|
|
150
|
+
"contexts/catalog/contracts/http/router.py",
|
|
151
|
+
"contexts/orders/contracts/http/router.py",
|
|
152
|
+
],
|
|
153
|
+
):
|
|
154
|
+
points += 2.0
|
|
155
|
+
else:
|
|
156
|
+
findings.append("platform surface summary does not trace dashboard and orders routes to backend contracts.")
|
|
157
|
+
|
|
158
|
+
admin = read(SERVICE_DOCS["admin"])
|
|
159
|
+
if contains_all(
|
|
160
|
+
admin,
|
|
161
|
+
[
|
|
162
|
+
"server/main.py",
|
|
163
|
+
"server/api/http/app.py",
|
|
164
|
+
"server/api/http/router.py",
|
|
165
|
+
"contexts/alerts/contracts/http/router.py",
|
|
166
|
+
"contexts/inventory/contracts/http/router.py",
|
|
167
|
+
"contexts/support/contracts/http/router.py",
|
|
168
|
+
],
|
|
169
|
+
):
|
|
170
|
+
points += 2.0
|
|
171
|
+
else:
|
|
172
|
+
findings.append("admin surface summary does not trace admin routes to backend contracts.")
|
|
173
|
+
|
|
174
|
+
landing = read(SERVICE_DOCS["landing"])
|
|
175
|
+
if contains_all(
|
|
176
|
+
landing,
|
|
177
|
+
[
|
|
178
|
+
"server/main.py",
|
|
179
|
+
"server/api/http/app.py",
|
|
180
|
+
"server/api/http/router.py",
|
|
181
|
+
"contexts/catalog/contracts/http/router.py",
|
|
182
|
+
"contexts/health/contracts/http/router.py",
|
|
183
|
+
"contexts/user/contracts/http/router.py",
|
|
184
|
+
],
|
|
185
|
+
):
|
|
186
|
+
points += 2.0
|
|
187
|
+
else:
|
|
188
|
+
findings.append("landing surface summary does not trace public/workspace routes to backend contracts.")
|
|
189
|
+
|
|
190
|
+
architecture = read(BUILD_AST_DOC)
|
|
191
|
+
if contains_all(
|
|
192
|
+
architecture,
|
|
193
|
+
[
|
|
194
|
+
".agent/ralph.sh",
|
|
195
|
+
".claude/agents/",
|
|
196
|
+
".codex/skills/SKILL.md",
|
|
197
|
+
"infra/terraform/README.md",
|
|
198
|
+
],
|
|
199
|
+
):
|
|
200
|
+
points += 2.0
|
|
201
|
+
else:
|
|
202
|
+
findings.append("build AST architecture summary does not retain the canonical harness and infra roots.")
|
|
203
|
+
|
|
204
|
+
return score(points, maximum), findings
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def human_agent_readability() -> tuple[int, list[str]]:
|
|
208
|
+
findings: list[str] = []
|
|
209
|
+
points = 10.0
|
|
210
|
+
maximum = 10.0
|
|
211
|
+
|
|
212
|
+
build_md_files = sorted((ROOT / "sdd/03_build").rglob("*.md"))
|
|
213
|
+
combined = "\n".join(read(path) for path in build_md_files)
|
|
214
|
+
|
|
215
|
+
pattern_penalties = [
|
|
216
|
+
(r"## Current Build Note", 2.0, "build docs still use a Current Build Note section instead of current-state structure."),
|
|
217
|
+
(r"\bRalph\b", 2.0, "build docs still contain Ralph loop narrative."),
|
|
218
|
+
(r"2026-\d{2}-\d{2}", 2.0, "build docs still contain dated history markers."),
|
|
219
|
+
(r"이번 턴", 1.0, "build docs still contain turn-specific execution narrative."),
|
|
220
|
+
(r"run `\d+", 1.0, "build docs still contain run-id style execution narrative."),
|
|
221
|
+
(r"\biteration\b", 1.0, "build docs still contain iteration-oriented loop narrative."),
|
|
222
|
+
]
|
|
223
|
+
|
|
224
|
+
for pattern, penalty, message in pattern_penalties:
|
|
225
|
+
if re.search(pattern, combined):
|
|
226
|
+
points -= penalty
|
|
227
|
+
findings.append(message)
|
|
228
|
+
|
|
229
|
+
for path in SERVICE_DOCS.values():
|
|
230
|
+
if len(read(path).splitlines()) > 80:
|
|
231
|
+
points -= 0.5
|
|
232
|
+
findings.append(f"{path.name} is too large to serve as a concise runtime tree summary.")
|
|
233
|
+
|
|
234
|
+
if points < 0:
|
|
235
|
+
points = 0
|
|
236
|
+
|
|
237
|
+
return score(points, maximum), findings
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def main() -> int:
|
|
241
|
+
parser = argparse.ArgumentParser()
|
|
242
|
+
parser.add_argument("--write", type=Path, default=None)
|
|
243
|
+
args = parser.parse_args()
|
|
244
|
+
|
|
245
|
+
ast_score, ast_findings = ast_similarity()
|
|
246
|
+
trace_score, trace_findings = implementation_traceability()
|
|
247
|
+
readability_score, readability_findings = human_agent_readability()
|
|
248
|
+
|
|
249
|
+
payload = {
|
|
250
|
+
"scores": {
|
|
251
|
+
"ast_similarity": ast_score,
|
|
252
|
+
"implementation_traceability": trace_score,
|
|
253
|
+
"human_agent_readability": readability_score,
|
|
254
|
+
},
|
|
255
|
+
"all_ten": ast_score == 10 and trace_score == 10 and readability_score == 10,
|
|
256
|
+
"findings": {
|
|
257
|
+
"ast_similarity": ast_findings,
|
|
258
|
+
"implementation_traceability": trace_findings,
|
|
259
|
+
"human_agent_readability": readability_findings,
|
|
260
|
+
},
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
output = json.dumps(payload, ensure_ascii=False, indent=2)
|
|
264
|
+
print(output)
|
|
265
|
+
|
|
266
|
+
if args.write is not None:
|
|
267
|
+
target = args.write
|
|
268
|
+
if not target.is_absolute():
|
|
269
|
+
target = ROOT / target
|
|
270
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
271
|
+
target.write_text(output + "\n", encoding="utf-8")
|
|
272
|
+
|
|
273
|
+
return 0 if payload["all_ten"] else 1
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
if __name__ == "__main__":
|
|
277
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Feature Index
|
|
2
|
+
|
|
3
|
+
현재 canonical feature spec은 backend domain 기준으로 작성한다.
|
|
4
|
+
|
|
5
|
+
- [auth_feature_spec.md](./auth_feature_spec.md)
|
|
6
|
+
- [alerts_feature_spec.md](./alerts_feature_spec.md)
|
|
7
|
+
- [catalog_feature_spec.md](./catalog_feature_spec.md)
|
|
8
|
+
- [fulfillment_feature_spec.md](./fulfillment_feature_spec.md)
|
|
9
|
+
- [health_feature_spec.md](./health_feature_spec.md)
|
|
10
|
+
- [inventory_feature_spec.md](./inventory_feature_spec.md)
|
|
11
|
+
- [order_feature_spec.md](./order_feature_spec.md)
|
|
12
|
+
- [shipping_feature_spec.md](./shipping_feature_spec.md)
|
|
13
|
+
- [support_feature_spec.md](./support_feature_spec.md)
|
|
14
|
+
- [user_feature_spec.md](./user_feature_spec.md)
|
|
15
|
+
|
|
16
|
+
현재 canonical owner domain은 `auth`, `user`, `catalog`, `inventory`, `orders`, `fulfillment`, `shipping`, `alerts`, `support`, `health`다.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Feature Planning
|
|
2
|
+
|
|
3
|
+
## Naming
|
|
4
|
+
|
|
5
|
+
- Folder name: `01_feature`
|
|
6
|
+
- Document naming: `{domain}_feature_spec.md`
|
|
7
|
+
- Source-of-truth feature spec files are backend domain based.
|
|
8
|
+
|
|
9
|
+
## Scope
|
|
10
|
+
|
|
11
|
+
- feature spec은 DDD 관점의 도메인 유스케이스 문서다.
|
|
12
|
+
- route, navigation, sidebar, modal, tab, client local state, 화면 전이는 feature spec에 쓰지 않는다.
|
|
13
|
+
- 위 항목은 `02_screen`에서 관리한다.
|
|
14
|
+
- 하나의 feature code는 하나의 핵심 query 또는 command 유스케이스를 대표한다.
|
|
15
|
+
|
|
16
|
+
## Implementation Basis
|
|
17
|
+
|
|
18
|
+
- `Bounded Context`는 실제 backend owner module에 맞춰 작성한다.
|
|
19
|
+
- feature spec은 현재 구현을 기준으로 먼저 정리하고, 미구현 요구는 `02_plan` backlog로 관리한다.
|
|
20
|
+
- frontend-only mock, redirect, client local state machine은 feature spec에 쓰지 않는다.
|
|
21
|
+
- 개별 domain feature spec은 `Purpose -> Scope -> Actor Summary -> Domain Summary -> Aggregate / Model -> Use Case Matrix` 흐름을 기본 뼈대로 사용한다.
|
|
22
|
+
|
|
23
|
+
## Code Rule
|
|
24
|
+
|
|
25
|
+
- Feature code format: `{DOMAIN}-F{NNN}`
|
|
26
|
+
- 각 segment는 고정 길이로 유지한다.
|
|
27
|
+
|
|
28
|
+
| Segment | Rule | Example |
|
|
29
|
+
| --- | --- | --- |
|
|
30
|
+
| `DOMAIN` | 3-letter uppercase domain code | `AUT`, `USR`, `CAT` |
|
|
31
|
+
| `TYPE` | feature 식별자 고정값 | `F` |
|
|
32
|
+
| `NNN` | 3-digit sequence | `001`, `002` |
|
|
33
|
+
|
|
34
|
+
현재 canonical backend domain code는 `AUT`, `USR`, `CAT`, `INV`, `ORD`, `FUL`, `SHP`, `ALR`, `SUP`, `HLT`다.
|
|
35
|
+
|
|
36
|
+
## Required Fields
|
|
37
|
+
|
|
38
|
+
모든 feature row는 아래 정보를 포함한다.
|
|
39
|
+
|
|
40
|
+
| Field | Purpose |
|
|
41
|
+
| --- | --- |
|
|
42
|
+
| `Feature Code` | 유스케이스의 고유 식별자 |
|
|
43
|
+
| `Use Case` | 비즈니스 의도 |
|
|
44
|
+
| `Actor` | 유스케이스를 시작하거나 소비하는 주체 |
|
|
45
|
+
| `Bounded Context` | 해당 유스케이스가 속한 DDD 경계 |
|
|
46
|
+
| `Aggregate / Model` | 핵심 aggregate, entity, policy, read model |
|
|
47
|
+
| `Type` | `Query` 또는 `Command` |
|
|
48
|
+
| `Preconditions` | 유스케이스가 성립하기 위한 선행 조건 |
|
|
49
|
+
| `Domain Outcome` | 도메인 상태 변화 또는 조회 결과 |
|
|
50
|
+
| `Invariant / Business Rule` | 반드시 지켜야 하는 규칙 |
|
|
51
|
+
|
|
52
|
+
개별 domain feature spec은 use case matrix 외에 아래 섹션을 포함한다.
|
|
53
|
+
|
|
54
|
+
| Section | Purpose |
|
|
55
|
+
| --- | --- |
|
|
56
|
+
| `Scope` | 포함/제외 범위를 분리해 screen, transport, backlog와의 경계를 명시한다 |
|
|
57
|
+
| `Actor Summary` | use case matrix에 등장하는 각 actor의 책임과 사용 맥락을 설명한다 |
|
|
58
|
+
|
|
59
|
+
## Document Boundary
|
|
60
|
+
|
|
61
|
+
| Folder | Role |
|
|
62
|
+
| --- | --- |
|
|
63
|
+
| `01_feature` | actor, use case, aggregate, invariant 중심의 도메인 유스케이스 |
|
|
64
|
+
| `02_screen` | route, UI surface, CTA, local interaction, transition |
|
|
65
|
+
| `03_architecture` | bounded context 관계, 시스템 경계, 런타임 구조 |
|
|
66
|
+
| `04_data` | 저장 모델, 관계, 키 정책 |
|
|
67
|
+
| `05_api` | request/response, endpoint contract, transport 규약 |
|
|
68
|
+
|
|
69
|
+
## Writing Rule
|
|
70
|
+
|
|
71
|
+
- feature spec은 도메인 유스케이스 문서다.
|
|
72
|
+
- `Type`은 `Query` 또는 `Command`만 사용한다.
|
|
73
|
+
- use case matrix에 등장하는 모든 actor는 같은 문서의 `Actor Summary`에서 최소 1회 설명한다.
|
|
74
|
+
- actor 이름은 화면 이름이 아니라 도메인 상호작용을 시작하거나 소비하는 주체 기준으로 유지한다.
|
|
75
|
+
- 식별자는 UUID v7을 기준으로 해석하고, legacy numeric id는 기준 식별자로 간주하지 않는다.
|
|
76
|
+
- 기본 정렬은 `created_at` 또는 time-ordered UUID v7을 사용하고, 명시 순서가 필요해질 때만 `order` 계열 필드를 추가한다.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# alerts feature spec
|
|
2
|
+
|
|
3
|
+
- 작성 버전: 1.0.0
|
|
4
|
+
|
|
5
|
+
## 1. Purpose
|
|
6
|
+
|
|
7
|
+
`alerts` bounded context가 제공하는 운영 알람 feed와 읽음 처리 기능을 구현 기준으로 정리한다.
|
|
8
|
+
|
|
9
|
+
## 2. Scope
|
|
10
|
+
|
|
11
|
+
- 포함 범위:
|
|
12
|
+
- admin surface의 운영 알람 목록 조회
|
|
13
|
+
- 알람 단건 읽음 처리와 전체 읽음 처리
|
|
14
|
+
- 제외 범위:
|
|
15
|
+
- email, SMS, push 같은 외부 발송 인프라
|
|
16
|
+
- 주문/배송/재고 도메인 내부의 원인 계산 로직 자체
|
|
17
|
+
|
|
18
|
+
## 3. Actor Summary
|
|
19
|
+
|
|
20
|
+
| Actor | Description | Appears In |
|
|
21
|
+
| --- | --- | --- |
|
|
22
|
+
| `Admin Operator` | admin 서비스에서 운영 이벤트와 예외 상황을 확인하고 알람 읽음 상태를 관리하는 운영 관리자다. | `ALR-F001`, `ALR-F002`, `ALR-F003` |
|
|
23
|
+
|
|
24
|
+
## 4. Bounded Context Summary
|
|
25
|
+
|
|
26
|
+
| Item | Value |
|
|
27
|
+
| --- | --- |
|
|
28
|
+
| Domain Code | `ALR` |
|
|
29
|
+
| Bounded Context | Alert Center |
|
|
30
|
+
| Primary Backend Owner | `server/contexts/alerts` |
|
|
31
|
+
| Related Context | `orders`, `shipping`, `inventory`, `support` |
|
|
32
|
+
| Main Entry Contract | `GET /api/v1/alerts`, `POST /api/v1/alerts/{alert_id}/read`, `POST /api/v1/alerts/read-all` |
|
|
33
|
+
|
|
34
|
+
## 5. Aggregate / Model Snapshot
|
|
35
|
+
|
|
36
|
+
| Aggregate / Model | Role |
|
|
37
|
+
| --- | --- |
|
|
38
|
+
| `AlertRecord` | 운영 알람 저장 모델 |
|
|
39
|
+
| `AlertItem` | 알람 feed 응답 모델 |
|
|
40
|
+
| `AlertsPayload` | unread count와 목록을 묶은 응답 모델 |
|
|
41
|
+
| `AlertReadResult` | 단건 읽음 처리 결과 |
|
|
42
|
+
| `AlertsReadAllResult` | 전체 읽음 처리 결과 |
|
|
43
|
+
|
|
44
|
+
## 6. Use Case Matrix
|
|
45
|
+
|
|
46
|
+
| Feature Code | Use Case | Actor | Bounded Context | Aggregate / Model | Type | Preconditions | Domain Outcome | Invariant / Business Rule |
|
|
47
|
+
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
|
48
|
+
| `ALR-F001` | 운영 알람 feed를 조회한다 | Admin Operator | Alert Center | `AlertsPayload`, `AlertItem`, `AlertRecord` | Query | 관리자 토큰이 유효하고 alert bootstrap 데이터가 존재해야 한다 | unread count와 최신 운영 알람 목록을 반환한다 | feed 조회는 알람 읽음 상태를 변경하지 않는다 |
|
|
49
|
+
| `ALR-F002` | 운영 알람 1건을 읽음 처리한다 | Admin Operator | Alert Center | `AlertReadResult`, `AlertRecord` | Command | 관리자 토큰이 유효하고 요청한 `alert_id`가 존재해야 한다 | 선택한 알람의 `read` 상태가 `true`가 된다 | 존재하지 않는 `alert_id`면 `404`를 반환한다 |
|
|
50
|
+
| `ALR-F003` | 운영 알람 전체를 읽음 처리한다 | Admin Operator | Alert Center | `AlertsReadAllResult`, `AlertRecord` | Command | 관리자 토큰이 유효하고 alert bootstrap 데이터가 존재해야 한다 | 미읽음 알람이 모두 읽음 상태로 갱신된다 | 이미 읽은 알람은 중복 변경하지 않는다 |
|
|
51
|
+
|
|
52
|
+
## 7. Notes
|
|
53
|
+
|
|
54
|
+
- `alerts`는 admin dashboard의 보조 read model이 아니라 독립 운영 피드로 취급한다.
|
|
55
|
+
- 원인 도메인이 무엇이든 admin이 소비하는 알람 표현과 읽음 상태는 `alerts` context가 소유한다.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# auth feature spec
|
|
2
|
+
|
|
3
|
+
- 작성 버전: 1.1.0
|
|
4
|
+
|
|
5
|
+
## 1. Purpose
|
|
6
|
+
|
|
7
|
+
`auth` bounded context가 제공하는 인증과 현재 세션 해석 기능을 구현 기준으로 정리한다.
|
|
8
|
+
|
|
9
|
+
## 2. Scope
|
|
10
|
+
|
|
11
|
+
- 포함 범위:
|
|
12
|
+
- 이메일/비밀번호 기반 로그인과 bearer token 기반 현재 세션 해석
|
|
13
|
+
- `auth_accounts.json`이 소유하는 credential 검증과 공통 session contract
|
|
14
|
+
- 제외 범위:
|
|
15
|
+
- 사용자 프로필 조회/변경과 role 관리
|
|
16
|
+
- 로그인 이후 서비스별 route 분기나 client-side token 저장 방식
|
|
17
|
+
|
|
18
|
+
## 3. Actor Summary
|
|
19
|
+
|
|
20
|
+
| Actor | Description | Appears In |
|
|
21
|
+
| --- | --- | --- |
|
|
22
|
+
| `Platform User` | platform 서비스에서 주문/운영 기능에 접근하기 위해 인증 세션을 발급받는 사용자다. | `AUT-F001` |
|
|
23
|
+
| `Mobile Operator` | mobile 서비스에서 이행 작업을 수행하기 위해 로그인하는 현장 운영자다. | `AUT-F001` |
|
|
24
|
+
| `Admin Operator` | admin 서비스에서 카탈로그, 재고, 사용자 운영 명령을 수행하기 위해 관리자 세션을 발급받는 주체다. | `AUT-F001` |
|
|
25
|
+
| `Landing Member` | landing 서비스에서 회원 전용 자원이나 개인화 동작을 사용하기 위해 로그인하는 사용자다. | `AUT-F001` |
|
|
26
|
+
| `Authenticated Client` | 이미 bearer token을 보유한 frontend runtime 또는 HTTP client로 현재 세션 사용자 해석을 요청하는 주체다. | `AUT-F002` |
|
|
27
|
+
|
|
28
|
+
## 4. Bounded Context Summary
|
|
29
|
+
|
|
30
|
+
| Item | Value |
|
|
31
|
+
| --- | --- |
|
|
32
|
+
| Domain Code | `AUT` |
|
|
33
|
+
| Bounded Context | Authentication & Session |
|
|
34
|
+
| Primary Backend Owner | `server/contexts/auth` |
|
|
35
|
+
| Related Context | `server/contexts/user` |
|
|
36
|
+
| Main Entry Contract | `POST /api/v1/auth/login`, `GET /api/v1/auth/me` |
|
|
37
|
+
|
|
38
|
+
## 5. Aggregate / Model Snapshot
|
|
39
|
+
|
|
40
|
+
| Aggregate / Model | Role |
|
|
41
|
+
| --- | --- |
|
|
42
|
+
| `LoginCommand` | 로그인 명령 입력 모델 |
|
|
43
|
+
| `AuthToken` | bearer token 응답 모델 |
|
|
44
|
+
| `AuthAccountRecord` | 인증 계정 저장 모델 |
|
|
45
|
+
| `AuthenticatedUser` | 현재 세션 사용자 응답 모델 |
|
|
46
|
+
|
|
47
|
+
## 6. Use Case Matrix
|
|
48
|
+
|
|
49
|
+
| Feature Code | Use Case | Actor | Bounded Context | Aggregate / Model | Type | Preconditions | Domain Outcome | Invariant / Business Rule |
|
|
50
|
+
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
|
51
|
+
| `AUT-F001` | 이메일/비밀번호로 로그인하고 access token을 발급한다 | Platform User, Mobile Operator, Admin Operator, Landing Member | Authentication & Session | `LoginCommand`, `AuthToken`, `AuthAccountRecord` | Command | 이메일과 비밀번호가 전달되고, 인증 계정 저장소에 해당 사용자가 존재해야 한다 | access token과 `user_id`가 발급된다 | credential이 일치하지 않으면 `401 Invalid credentials`를 반환한다 |
|
|
52
|
+
| `AUT-F002` | bearer token으로 현재 세션 사용자를 해석한다 | Authenticated Client | Authentication & Session | `AuthToken`, `AuthenticatedUser`, `AuthAccountRecord` | Query | 유효한 bearer token이 전달되고 token subject가 인증 계정 저장소에 존재해야 한다 | 현재 사용자 summary를 반환한다 | token이 위조되었거나 subject 사용자가 없으면 `401 Invalid token`을 반환한다 |
|
|
53
|
+
|
|
54
|
+
## 7. Notes
|
|
55
|
+
|
|
56
|
+
- `auth`는 `auth_accounts.json` bootstrap을 소유하며 `user` profile 저장과 credential 저장을 분리한다.
|
|
57
|
+
- 인증 성공 이후 권한별 화면 분기는 frontend service에서 처리하고, backend는 공통 session contract만 제공한다.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# catalog feature spec
|
|
2
|
+
|
|
3
|
+
- 작성 버전: 1.1.0
|
|
4
|
+
|
|
5
|
+
## 1. Purpose
|
|
6
|
+
|
|
7
|
+
`catalog` bounded context가 제공하는 상품 카탈로그 조회와 관리자 상품 편집 기능을 구현 기준으로 정리한다.
|
|
8
|
+
|
|
9
|
+
## 2. Scope
|
|
10
|
+
|
|
11
|
+
- 포함 범위:
|
|
12
|
+
- landing/public 상품 카탈로그 조회와 단일 상품 상세 조회
|
|
13
|
+
- admin surface의 상품 생성, 수정, 상태 변경 command
|
|
14
|
+
- 제외 범위:
|
|
15
|
+
- landing 화면의 정렬, 탭, CTA 같은 UI 상호작용
|
|
16
|
+
- 주문 생성이나 재고 선점 같은 타 context orchestration
|
|
17
|
+
|
|
18
|
+
## 3. Actor Summary
|
|
19
|
+
|
|
20
|
+
| Actor | Description | Appears In |
|
|
21
|
+
| --- | --- | --- |
|
|
22
|
+
| `Landing Visitor` | 비로그인 상태로 공개 상품 카탈로그와 상품 상세를 탐색하는 방문자다. | `CAT-F001`, `CAT-F002` |
|
|
23
|
+
| `Landing Member` | 로그인된 landing 회원으로 공개 상품을 둘러보고 구매 전 탐색을 수행하는 사용자다. | `CAT-F001`, `CAT-F002` |
|
|
24
|
+
| `Platform User` | platform 서비스에서 주문 생성이나 운영 판단을 위해 상품 정보를 조회하는 내부 사용자다. | `CAT-F001`, `CAT-F002` |
|
|
25
|
+
| `Admin Operator` | admin 서비스에서 상품을 등록, 수정, 상태 변경하는 운영 관리자다. | `CAT-F003`, `CAT-F004`, `CAT-F005` |
|
|
26
|
+
|
|
27
|
+
## 4. Bounded Context Summary
|
|
28
|
+
|
|
29
|
+
| Item | Value |
|
|
30
|
+
| --- | --- |
|
|
31
|
+
| Domain Code | `CAT` |
|
|
32
|
+
| Bounded Context | Product Catalog |
|
|
33
|
+
| Primary Backend Owner | `server/contexts/catalog` |
|
|
34
|
+
| Related Context | `auth`, `inventory`, `orders`, `landing` |
|
|
35
|
+
| Main Entry Contract | `GET /api/v1/catalog/products`, `GET /api/v1/catalog/products/{product_id}`, `POST /api/v1/catalog/products`, `PUT /api/v1/catalog/products/{product_id}`, `PATCH /api/v1/catalog/products/{product_id}/status` |
|
|
36
|
+
|
|
37
|
+
## 5. Aggregate / Model Snapshot
|
|
38
|
+
|
|
39
|
+
| Aggregate / Model | Role |
|
|
40
|
+
| --- | --- |
|
|
41
|
+
| `ProductRecord` | 상품 원본 저장 모델 |
|
|
42
|
+
| `ProductSummary` | 상품 목록 응답 모델 |
|
|
43
|
+
| `ProductDetail` | 상품 상세 응답 모델 |
|
|
44
|
+
| `CreateProductCommand` | 상품 생성 명령 |
|
|
45
|
+
| `UpdateProductCommand` | 상품 수정 명령 |
|
|
46
|
+
| `UpdateProductStatusCommand` | 상품 상태 변경 명령 |
|
|
47
|
+
|
|
48
|
+
## 6. Use Case Matrix
|
|
49
|
+
|
|
50
|
+
| Feature Code | Use Case | Actor | Bounded Context | Aggregate / Model | Type | Preconditions | Domain Outcome | Invariant / Business Rule |
|
|
51
|
+
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
|
52
|
+
| `CAT-F001` | 상품 카탈로그 목록을 조회한다 | Landing Visitor, Landing Member, Platform User | Product Catalog | `ProductSummary`, `ProductRecord` | Query | 상품 bootstrap 데이터가 존재해야 한다 | 공개 가능한 상품 목록을 필터와 검색 조건에 맞게 반환한다 | `status`, `category`, `q` 조건은 모두 현재 카탈로그 집합 안에서 계산한다 |
|
|
53
|
+
| `CAT-F002` | 단일 상품 상세를 조회한다 | Landing Visitor, Landing Member, Platform User | Product Catalog | `ProductDetail`, `ProductRecord` | Query | 요청한 `product_id`가 저장소에 존재해야 한다 | 상세 페이지 구성을 위한 상품 전체 속성을 반환한다 | 존재하지 않는 `product_id`면 `404 Catalog product not found`를 반환한다 |
|
|
54
|
+
| `CAT-F003` | 관리자가 새 상품을 등록한다 | Admin Operator | Product Catalog | `CreateProductCommand`, `ProductDetail`, `ProductRecord` | Command | 관리자 토큰이 유효하고 slug, 이름, 가격, variant 정보가 전달되어야 한다 | 새 상품 레코드가 생성되어 카탈로그 목록에 합류한다 | `slug`는 카탈로그 내에서 유일해야 하며 variant는 최소 1개 이상이어야 한다 |
|
|
55
|
+
| `CAT-F004` | 관리자가 상품 속성을 수정한다 | Admin Operator | Product Catalog | `UpdateProductCommand`, `ProductDetail`, `ProductRecord` | Command | 관리자 토큰이 유효하고 요청한 `product_id`가 존재해야 한다 | 상품 속성이 부분 갱신되고 `updated_at`이 갱신된다 | 빈 수정 요청은 `400 No catalog product fields provided`, 중복 slug는 `409`를 반환한다 |
|
|
56
|
+
| `CAT-F005` | 관리자가 상품 상태를 변경한다 | Admin Operator | Product Catalog | `UpdateProductStatusCommand`, `ProductDetail`, `ProductRecord` | Command | 관리자 토큰이 유효하고 요청한 `product_id`가 존재해야 한다 | 상품 `status`가 `draft`, `active`, `archived` 중 하나로 전환된다 | 존재하지 않는 `product_id`면 `404 Catalog product not found`를 반환한다 |
|
|
57
|
+
|
|
58
|
+
## 7. Notes
|
|
59
|
+
|
|
60
|
+
- `catalog`는 landing/public read surface와 admin write surface를 함께 소유한다.
|
|
61
|
+
- 카탈로그의 가격, 이미지, 속성, variant는 모두 product aggregate 내부 속성으로 유지한다.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# fulfillment feature spec
|
|
2
|
+
|
|
3
|
+
- 작성 버전: 1.1.0
|
|
4
|
+
|
|
5
|
+
## 1. Purpose
|
|
6
|
+
|
|
7
|
+
`fulfillment` bounded context가 제공하는 모바일 운영 overview와 task board 기능을 구현 기준으로 정리한다.
|
|
8
|
+
|
|
9
|
+
## 2. Scope
|
|
10
|
+
|
|
11
|
+
- 포함 범위:
|
|
12
|
+
- mobile 서비스의 fulfillment overview, board, note read model
|
|
13
|
+
- fulfillment task 상태 전이 command
|
|
14
|
+
- 제외 범위:
|
|
15
|
+
- route 최적화나 배차 같은 고도화 계획
|
|
16
|
+
- fulfillment 외부 context를 직접 갱신하는 orchestration
|
|
17
|
+
|
|
18
|
+
## 3. Actor Summary
|
|
19
|
+
|
|
20
|
+
| Actor | Description | Appears In |
|
|
21
|
+
| --- | --- | --- |
|
|
22
|
+
| `Mobile Operator` | mobile 서비스에서 현장 이행 작업을 수행하며 task 현황을 보고 상태를 갱신하는 운영자다. | `FUL-F001`, `FUL-F002`, `FUL-F003` |
|
|
23
|
+
|
|
24
|
+
## 4. Bounded Context Summary
|
|
25
|
+
|
|
26
|
+
| Item | Value |
|
|
27
|
+
| --- | --- |
|
|
28
|
+
| Domain Code | `FUL` |
|
|
29
|
+
| Bounded Context | Fulfillment Operations |
|
|
30
|
+
| Primary Backend Owner | `server/contexts/fulfillment` |
|
|
31
|
+
| Related Context | `auth`, `orders`, `inventory` |
|
|
32
|
+
| Main Entry Contract | `GET /api/v1/fulfillment/overview`, `GET /api/v1/fulfillment/board`, `PATCH /api/v1/fulfillment/tasks/{task_id}/status` |
|
|
33
|
+
|
|
34
|
+
## 5. Aggregate / Model Snapshot
|
|
35
|
+
|
|
36
|
+
| Aggregate / Model | Role |
|
|
37
|
+
| --- | --- |
|
|
38
|
+
| `FulfillmentTaskRecord` | 이행 task 원본 |
|
|
39
|
+
| `FulfillmentOverview` | 모바일 dashboard overview 응답 |
|
|
40
|
+
| `FulfillmentBoardPayload` | 모바일 task board 응답 |
|
|
41
|
+
| `FulfillmentEvent` | timeline 이벤트 모델 |
|
|
42
|
+
| `FulfillmentNote` | 운영 note 모델 |
|
|
43
|
+
| `FulfillmentTaskStatusTransitionCommand` | task 상태 전이 명령 |
|
|
44
|
+
| `FulfillmentTaskStatusTransition` | task 상태 전이 결과 |
|
|
45
|
+
|
|
46
|
+
## 6. Use Case Matrix
|
|
47
|
+
|
|
48
|
+
| Feature Code | Use Case | Actor | Bounded Context | Aggregate / Model | Type | Preconditions | Domain Outcome | Invariant / Business Rule |
|
|
49
|
+
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
|
50
|
+
| `FUL-F001` | 이행 overview를 조회한다 | Mobile Operator | Fulfillment Operations | `FulfillmentOverview`, `FulfillmentTaskRecord`, `FulfillmentEvent` | Query | 인증 토큰이 유효하고 task/event bootstrap 데이터가 존재해야 한다 | throughput, stat, timeline, stage load를 반환한다 | `Blocked`와 `Outbound` 지표는 현재 task 상태 집합으로 계산한다 |
|
|
51
|
+
| `FUL-F002` | 이행 board와 note 목록을 조회한다 | Mobile Operator | Fulfillment Operations | `FulfillmentBoardPayload`, `FulfillmentTaskRecord`, `FulfillmentNote` | Query | 인증 토큰이 유효하고 task/note bootstrap 데이터가 존재해야 한다 | task board 목록과 note 목록을 함께 반환한다 | board payload는 `tasks`와 `notes` 두 블록을 항상 함께 반환한다 |
|
|
52
|
+
| `FUL-F003` | 이행 task 상태를 전환한다 | Mobile Operator | Fulfillment Operations | `FulfillmentTaskStatusTransitionCommand`, `FulfillmentTaskStatusTransition`, `FulfillmentTaskRecord` | Command | 인증 토큰이 유효하고 요청한 `task_id`가 존재해야 한다 | task의 `status`와 선택적 `stage`가 갱신된다 | 존재하지 않는 `task_id`면 `404`를 반환한다 |
|
|
53
|
+
|
|
54
|
+
## 7. Notes
|
|
55
|
+
|
|
56
|
+
- `fulfillment`는 mobile 서비스의 canonical backend surface다.
|
|
57
|
+
- 출고 이후 배송 추적과 carrier 진행 상태는 별도 `shipping` context가 소유한다.
|
|
58
|
+
- timeline과 notes는 별도 bootstrap source를 사용하지만, screen 단위에서는 fulfillment context가 함께 조합해 반환한다.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# health feature spec
|
|
2
|
+
|
|
3
|
+
- 작성 버전: 1.1.0
|
|
4
|
+
|
|
5
|
+
## 1. Purpose
|
|
6
|
+
|
|
7
|
+
`health` bounded context가 제공하는 기술 상태 확인 contract를 구현 기준으로 정리한다.
|
|
8
|
+
|
|
9
|
+
## 2. Scope
|
|
10
|
+
|
|
11
|
+
- 포함 범위:
|
|
12
|
+
- 무인증 liveness/status probe contract
|
|
13
|
+
- runtime이 기동 중인지 확인하는 최소 운영 신호
|
|
14
|
+
- 제외 범위:
|
|
15
|
+
- 알림 전파, auto-recovery, runbook 절차 같은 운영 후속 조치
|
|
16
|
+
- business domain readiness나 데이터 정합성 검증
|
|
17
|
+
|
|
18
|
+
## 3. Actor Summary
|
|
19
|
+
|
|
20
|
+
| Actor | Description | Appears In |
|
|
21
|
+
| --- | --- | --- |
|
|
22
|
+
| `CI Runner` | CI 파이프라인에서 서버 기동과 기본 응답 계약을 확인하는 자동 검증 주체다. | `HLT-F001`, `HLT-F002` |
|
|
23
|
+
| `Compose Runtime` | compose healthcheck나 container supervisor처럼 주기적으로 프로브를 호출하는 런타임 주체다. | `HLT-F001`, `HLT-F002` |
|
|
24
|
+
| `External Monitor` | 외부 uptime/monitoring 시스템에서 서비스 생존 여부를 확인하는 감시 주체다. | `HLT-F001`, `HLT-F002` |
|
|
25
|
+
|
|
26
|
+
## 4. Bounded Context Summary
|
|
27
|
+
|
|
28
|
+
| Item | Value |
|
|
29
|
+
| --- | --- |
|
|
30
|
+
| Domain Code | `HLT` |
|
|
31
|
+
| Bounded Context | Technical Health |
|
|
32
|
+
| Primary Backend Owner | `server/contexts/health` |
|
|
33
|
+
| Related Context | `server/api/http/app.py` |
|
|
34
|
+
| Main Entry Contract | `GET /health`, `GET /api/v1/status` |
|
|
35
|
+
|
|
36
|
+
## 5. Aggregate / Model Snapshot
|
|
37
|
+
|
|
38
|
+
| Aggregate / Model | Role |
|
|
39
|
+
| --- | --- |
|
|
40
|
+
| `health_response()` | 루트 프로브 응답 생성 함수 |
|
|
41
|
+
| `get_status_payload()` | API prefix 하의 상태 응답 생성 함수 |
|
|
42
|
+
|
|
43
|
+
## 6. Use Case Matrix
|
|
44
|
+
|
|
45
|
+
| Feature Code | Use Case | Actor | Bounded Context | Aggregate / Model | Type | Preconditions | Domain Outcome | Invariant / Business Rule |
|
|
46
|
+
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
|
47
|
+
| `HLT-F001` | 루트 health probe를 조회한다 | CI Runner, Compose Runtime, External Monitor | Technical Health | `health_response()` | Query | FastAPI app이 기동 중이어야 한다 | `{"status":"ok"}` 응답을 반환한다 | 인증 없이 호출 가능해야 한다 |
|
|
48
|
+
| `HLT-F002` | API status probe를 조회한다 | CI Runner, Compose Runtime, External Monitor | Technical Health | `get_status_payload()` | Query | API router가 정상 mount되어야 한다 | `{"service":"template-server","status":"healthy"}` 응답을 반환한다 | 인증 없이 호출 가능해야 한다 |
|
|
49
|
+
|
|
50
|
+
## 7. Notes
|
|
51
|
+
|
|
52
|
+
- `health`는 비즈니스 도메인이 아니라 technical bounded context지만, 운영/검증 contract를 위해 canonical feature spec에 포함한다.
|