agentic-dev 0.1.0 → 0.2.0
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 +373 -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,26 @@
|
|
|
1
|
+
# Convention Storage Policy
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
저장소 전반에서 반복 참조되는 컨벤션, 워크플로우, 실행 규약의 정본 위치를 고정한다.
|
|
6
|
+
|
|
7
|
+
## Rules
|
|
8
|
+
|
|
9
|
+
- 공통 컨벤션의 정본은 항상 `sdd/99_toolchain/02_policies`에 저장한다.
|
|
10
|
+
- `AGENTS.md`에는 실행 시 반드시 기억해야 할 짧은 핵심 규칙만 둔다.
|
|
11
|
+
- `sdd/`는 history 저장소가 아니라 overwrite-only current-state delivery system으로 유지한다.
|
|
12
|
+
- `sdd/02_plan`의 active planning은 `01_feature`, `02_screen`, `03_architecture`, `06_iac`, `10_test` 기준 durable 문서를 직접 갱신한다.
|
|
13
|
+
- feature 계획은 `<domain>_todos.md`, screen 계획은 `<service>_todos.md` 파일을 single source of truth로 사용한다.
|
|
14
|
+
- 컨벤션 관련 변경은 다음 순서를 따른다.
|
|
15
|
+
1. `sdd/99_toolchain/02_policies` 문서를 먼저 수정한다.
|
|
16
|
+
2. 필요한 경우에만 `AGENTS.md`, 런북, 템플릿, 자동화 문서를 최소 범위로 동기화한다.
|
|
17
|
+
- 저장소 루트 하네스(`.codex`, `.claude`)는 toolchain 정책을 구현하는 자산으로 취급한다.
|
|
18
|
+
- 하네스 사용법, 자동화 진입점, 템플릿화 가능한 예시는 `sdd/99_toolchain/01_automation`에 정리한다.
|
|
19
|
+
- Playwright suite registry와 canonical runner도 `sdd/99_toolchain/01_automation`이 소유한다.
|
|
20
|
+
|
|
21
|
+
## Canonical References
|
|
22
|
+
|
|
23
|
+
- 워크플로우/배포 규칙: `main-push-before-dev-deploy-policy.md`
|
|
24
|
+
- compose/runtime 기준선: `compose-runtime-baseline-policy.md`
|
|
25
|
+
- 회귀 검수 규칙: `regression-verification-policy.md`
|
|
26
|
+
- 하네스 설명: `../01_automation/harness-layout.md`
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Main Push Before DEV Deploy Policy
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
템플릿 저장소에서도 `branch -> main -> DEV` 반영 순서를 고정하고, 완료된 branch를 retire해 재현 가능성과 추적 가능성을 확보한다.
|
|
6
|
+
|
|
7
|
+
## Required Order
|
|
8
|
+
|
|
9
|
+
1. 관련 작업에 맞는 work branch를 생성한다.
|
|
10
|
+
2. 관련 변경을 구현하고 work branch를 origin에 push한다.
|
|
11
|
+
3. root compose baseline 또는 해당 검증 surface build를 확인한다.
|
|
12
|
+
4. 관련 변경을 `main`에 반영한다.
|
|
13
|
+
5. Git 원격 `main` push를 완료한다.
|
|
14
|
+
6. 그 커밋 기준으로 `DEV(개발계)` 배포를 수행한다.
|
|
15
|
+
7. 배포된 DEV 환경에서 실제 동작을 검증한다.
|
|
16
|
+
8. 필요한 SDD 문서를 현재 상태 기준으로 갱신한다.
|
|
17
|
+
9. 완료된 local/remote work branch를 삭제한다.
|
|
18
|
+
|
|
19
|
+
## Rules
|
|
20
|
+
|
|
21
|
+
- `DEV` 반영이 필요한 작업은 task-fit work branch를 먼저 만들고 branch push를 남긴다.
|
|
22
|
+
- `DEV` 반영이 필요한 작업은 `main` push 이전에 선배포하지 않는다.
|
|
23
|
+
- 수동 배포 단계여도 `branch push -> build -> main merge/push -> DEV 배포 -> DEV 검증 -> 문서 갱신` 순서를 유지한다.
|
|
24
|
+
- 작업 완료 전 최소 정합성 체크로 `관련 검증 명령`, `worktree clean 상태`, `최종 변경의 main 포함 여부`를 확인한다.
|
|
25
|
+
- 완료된 작업은 `main` 반영 후 local branch와 remote branch를 모두 삭제한다. 사용자가 branch 보존을 명시한 경우만 예외다.
|
|
26
|
+
- 검증 중 문제가 발견되면 다시 `수정(branch) -> branch push -> build -> main merge/push -> DEV 재배포 -> DEV 재검증`을 반복한다.
|
|
27
|
+
- 템플릿 샘플 앱/서버도 실제로 부팅되고 검증 가능한 상태를 유지한다.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# OTRO Orchestration Policy
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
This repository treats OTRO (Overlap-Tolerant Residual Orchestration) as a reusable toolchain runtime for repository-wide artifact-grounded development.
|
|
6
|
+
|
|
7
|
+
## Canonical Terms
|
|
8
|
+
|
|
9
|
+
- `loop`: the top-level OTRO control cycle
|
|
10
|
+
- `step`: the execution slice grouped inside a plan for one loop frontier
|
|
11
|
+
- `loop_done`: the current plan backlog is exhausted
|
|
12
|
+
- `run_done`: a fresh repository-wide rescan after `loop_done` yields no materially new tasks
|
|
13
|
+
- `scope_done`: `run_done` plus scope-level deployment and verification gates pass
|
|
14
|
+
- task IDs: `T{step}{ordinal}` canonical numbering, rewritten per step before a plan is persisted
|
|
15
|
+
|
|
16
|
+
Obsolete alternate field names must not appear in runtime contracts, prompts, plans, or docs. Use `step`, `steps`, and `scope_done` only.
|
|
17
|
+
|
|
18
|
+
## Runtime Rules
|
|
19
|
+
|
|
20
|
+
- OTRO plans must keep run-local state under `.codex/skills/otro/runs/<run-name>/`.
|
|
21
|
+
- The canonical plan schema is `.codex/skills/otro/schemas/step_plan.schema.json`.
|
|
22
|
+
- OTRO runtime must resolve the target repository from run-local configuration or run ancestry, not from a skill directory hard-binding.
|
|
23
|
+
- New OTRO plans must emit `step` on tasks and `steps` on grouped frontier entries.
|
|
24
|
+
- No compatibility adapter is allowed for obsolete field names. Existing historical evidence may stay as history, but the live runtime must not read or write those fields.
|
|
25
|
+
|
|
26
|
+
## Template Ownership
|
|
27
|
+
|
|
28
|
+
- The canonical OTRO skill assets for downstream repositories live under `.codex/skills/otro/`.
|
|
29
|
+
- Downstream repositories should copy or vendor the OTRO skill from this template surface instead of inventing repo-local variants.
|
|
30
|
+
- When OTRO terminology or contracts change, update this policy and the template skill together.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Regression Verification Policy
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
템플릿 저장소에서도 회귀 검수 범위를 direct target에 한정하지 않고, retained current-state workflow로 고정한다.
|
|
6
|
+
|
|
7
|
+
## Rules
|
|
8
|
+
|
|
9
|
+
- `sdd` 작업은 direct target verification만으로 완료 처리하지 않는다.
|
|
10
|
+
- 회귀 검수 범위는 `sdd/02_plan/10_test/regression_verification.md`를 기준으로 direct, upstream, downstream, shared surface까지 선택한다.
|
|
11
|
+
- shared route, shell, auth/session, component, contract, generated asset, builder output을 변경한 경우 adjacent consumer와 shared surface를 함께 검수한다.
|
|
12
|
+
- Playwright exactness suite가 있는 screen/local UI surface는 `sdd/99_toolchain/01_automation/run_playwright_exactness.py`를 canonical local gate로 사용한다.
|
|
13
|
+
- direct `npx playwright test ...` 호출은 디버깅 예외로만 쓰고, retained verification command는 toolchain wrapper 기준으로 남긴다.
|
|
14
|
+
- 자동화가 없는 회귀 surface는 가능한 command/manual verification으로 대체하고, automation gap은 residual risk로 남긴다.
|
|
15
|
+
- 선택한 회귀 검수 범위, 실행한 check, 생략 사유, residual risk는 `sdd/02_plan`, `sdd/03_build`, `sdd/04_verify`에 current-state로 유지한다.
|
|
16
|
+
|
|
17
|
+
## Canonical References
|
|
18
|
+
|
|
19
|
+
- `AGENTS.md`
|
|
20
|
+
- `.codex/skills/sdd/SKILL.md`
|
|
21
|
+
- `sdd/99_toolchain/01_automation/README.md`
|
|
22
|
+
- `sdd/02_plan/10_test/regression_verification.md`
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
ROOT = Path(__file__).resolve().parents[3]
|
|
7
|
+
SCREEN_SPEC = ROOT / "sdd/01_planning/02_screen/mobile_screen_spec.pdf"
|
|
8
|
+
OUTPUT_DIR = ROOT / "sdd/99_toolchain/03_templates/generated_assets"
|
|
9
|
+
|
|
10
|
+
# Template example output lives under `03_templates/generated_assets`.
|
|
11
|
+
# Replace this path with the consuming project's runtime asset directory.
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
ASSET_RECIPES = [
|
|
15
|
+
{
|
|
16
|
+
"id": "example-brand-lockup-source",
|
|
17
|
+
"source": {"kind": "pdf_page", "path": SCREEN_SPEC, "page": 2, "dpi": 150},
|
|
18
|
+
"crop_box": (294, 750, 738, 1151),
|
|
19
|
+
"transparent_white_threshold": 245,
|
|
20
|
+
"trim": True,
|
|
21
|
+
"children": [
|
|
22
|
+
{
|
|
23
|
+
"id": "example-brand-lockup",
|
|
24
|
+
"output": OUTPUT_DIR / "example-brand-lockup.svg",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "example-brand-mark",
|
|
28
|
+
"crop_box": (123, 0, 288, 180),
|
|
29
|
+
"output": OUTPUT_DIR / "example-brand-mark.svg",
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": "example-brand-wordmark",
|
|
33
|
+
"crop_box": (50, 324, 363, 381),
|
|
34
|
+
"output": OUTPUT_DIR / "example-brand-wordmark.svg",
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
}
|
|
38
|
+
]
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Example Generated Assets
|
|
2
|
+
|
|
3
|
+
## Role
|
|
4
|
+
|
|
5
|
+
- 이 폴더는 `스펙에셋빌더` example manifest 실행 결과를 저장한다.
|
|
6
|
+
- template consumer는 이 산출물을 golden sample로 보고 자신의 project-specific output 경로로 치환하면 된다.
|
|
7
|
+
|
|
8
|
+
## Regeneration
|
|
9
|
+
|
|
10
|
+
- `python3 sdd/99_toolchain/01_automation/spec_asset_builder.py --manifest sdd/99_toolchain/03_templates/asset_recipe_manifest.example.py --verify-exact`
|
|
11
|
+
- 또는 `python3 sdd/99_toolchain/01_automation/build_asset_recipes.py --verify-exact`
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="444" height="273" viewBox="0 0 444 273" fill="none" role="img" aria-hidden="true">
|
|
2
|
+
<image width="444" height="273" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbwAAAERCAYAAAAAMhLvAAAEe0lEQVR4nO3dQUrDUBRA0Uaz/3VWpDpIUSftd2AXIEJMm3sOZNDBI2+QcElo6bS8HccBAHbuaesFAOA/CB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQMJ8nZ633gEAVjeNMbbeAQBW55UmAAmCB0CC4AGQIHgAJAgeAAmCB0CC4AGQIHgAJAgeAAmCB0CC4AGQIHgAJAgeAAmCB0CC4AGQMB9fXv0hHgC7N59O71vvAACrm5bzlyc8AHZvvlwuW+8AAKubxvCAB8D+zcv5c/x8WXPcjul2/PbzI81e/3Aes/c/+0jXoNn7vY7M7v1+nZbzxzgAwM75HR4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACYIHQILgAZAgeAAkCB4ACd/iAv4AZg+FSAAAAABJRU5ErkJggg==" />
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="165" height="180" viewBox="0 0 165 180" fill="none" role="img" aria-hidden="true">
|
|
2
|
+
<image width="165" height="180" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKUAAAC0CAYAAAD1oezkAAACRElEQVR4nO3bsU6EQBRAUVj5/+9cY1YLiG7DjoU2mGhhwy3OSSgImfCKmyEhMK+v1zFByOXsAeAnUZIjSnJESY4oyRElOaIkR5TkiJIcUZIjSnJESY4oyRElOaIkR5TkiJIcUZIjSnJESY4oyRElOaIkR5TkiJIcUZIjSnJESY4oyRElOaIkR5TkiJIcUZIjSnJESY4oyRElOaIkR5TkiJIcUZIjSnJESY4oyRElOaIkR5TkiJIcUZIjSnJESY4oyRElOaIkR5TkiJIcUZIjSnJESY4oyRElOaIkR5TkiJIcUZIjSnKWx/x09gxwMI8xzp4BDjy+yRElOaIkR5TkiJIcUZIjSnJESY4oyRElOaIkR5TkiJIcUZIjSnKW6/OLDypJWW63t7NngIN53e52SlKWfd/PngEO/KNDzrJuH2Oa5unrGN/Hb+ePP67V1l7+cR9rC2vndXu3VZLiPSU5oiRHlOSIkhxRkiNKckRJjijJESU5oiRHlOSIkhxRkiNKckRJjijJESU5oiRHlOSIkhxRkiNKckRJjijJESU5oiRHlOSIkhxRkiNKckRJjijJESU5oiRHlOSIkhxRkiNKckRJjijJESU5oiRHlOSIkhxRkiNKckRJjijJESU5oiRHlOSIkhxRkiNKckRJjijJESU5oiRHlOSIkhxRkiNKckRJjijJESU5oiRHlOSIkhxRkiNKckRJjijJESU5oiRHlOSIkhxRkiNKckRJjijJESU5oiRHlOSIkhxRkiNKckRJjijJ+QQO+HVFgvyROwAAAABJRU5ErkJggg==" />
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="313" height="57" viewBox="0 0 313 57" fill="none" role="img" aria-hidden="true">
|
|
2
|
+
<image width="313" height="57" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATkAAAA5CAYAAABNllxFAAAAXElEQVR4nO3BAQ0AAADCoPdPbQ8HFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwKEBFwwAAbnbqkcAAAAASUVORK5CYII=" />
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
PLAYWRIGHT_SUITES = [
|
|
5
|
+
{
|
|
6
|
+
"id": "service-screen-batch",
|
|
7
|
+
"spec": "service-screen-batch.spec.js",
|
|
8
|
+
"kind": "screen-exactness",
|
|
9
|
+
"service": "mobile",
|
|
10
|
+
"targets": ["SERVICE-S001", "SERVICE-S002"],
|
|
11
|
+
"description": "example screen exactness batch",
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"id": "shared-shell-regression",
|
|
15
|
+
"spec": "shared-shell-regression.spec.js",
|
|
16
|
+
"kind": "shared-ui-regression",
|
|
17
|
+
"service": "platform",
|
|
18
|
+
"targets": ["shared-shell"],
|
|
19
|
+
"description": "example shared shell regression batch",
|
|
20
|
+
},
|
|
21
|
+
]
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Toolchain
|
|
2
|
+
|
|
3
|
+
`99_toolchain`은 SDD 산출물을 만들고 검증하는 generator, harness, 정책 문서를 둔다.
|
|
4
|
+
|
|
5
|
+
## Structure
|
|
6
|
+
|
|
7
|
+
- `01_automation`
|
|
8
|
+
- SDD generator, parity harness, projection 문서, capture automation, agentic repo contract
|
|
9
|
+
- `02_policies`
|
|
10
|
+
- 저장소 공통 규칙의 정본
|
|
11
|
+
- `03_templates`
|
|
12
|
+
- 재사용 가능한 템플릿 자산
|
|
13
|
+
|
|
14
|
+
## Rule
|
|
15
|
+
|
|
16
|
+
- planning 산출물은 `01_planning`에 둔다.
|
|
17
|
+
- 그 planning 산출물을 생성하거나 검증하는 스크립트와 asset은 `99_toolchain`에 둔다.
|
|
18
|
+
- screen spec generator, capture policy, manifest는 `01_automation`에 둔다.
|
|
19
|
+
- 정책 문서는 `02_policies`를 정본으로 사용하고, `AGENTS.md`에는 핵심 실행 규칙만 요약한다.
|
|
20
|
+
- compose/runtime 기준선은 `02_policies/compose-runtime-baseline-policy.md`를 정본으로 사용한다.
|
|
21
|
+
- 현재 canonical screen toolchain은 `build_screen_spec_pdf.py`, `capture_screen_assets.mjs`, `screen_spec_manifest.py`다.
|
|
22
|
+
- Claude/Codex/Ralph 하네스는 저장소 루트 `.claude`, `.codex`, `.agent`에 두고, 그 계약 설명은 `01_automation`과 `02_policies`에 둔다.
|
|
23
|
+
- `sdd/03_build`는 AST-style runtime tree current-state를 유지하고, 관련 gate는 `scripts/dev/audit_sdd_build_ast.py`와 `04_verify` summary로 관리한다.
|
package/sdd/README.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# SDD Governance
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
- `sdd/`는 템플릿 레포의 canonical delivery system이다.
|
|
6
|
+
- 모든 SDD 산출물은 현재 기준의 최종 일관성만 설명한다.
|
|
7
|
+
|
|
8
|
+
## Final-Only Rule
|
|
9
|
+
|
|
10
|
+
- `sdd/` 안에는 날짜별 히스토리, archive, release log, gate log 같은 누적 기록을 두지 않는다.
|
|
11
|
+
- 같은 대상의 후속 작업은 새 문서를 만들지 않고 기존 durable 문서를 덮어써 갱신한다.
|
|
12
|
+
- raw runtime log, backend log, infrastructure log는 SDD가 아니라 해당 운영 시스템의 역할이다.
|
|
13
|
+
|
|
14
|
+
## Section Map
|
|
15
|
+
|
|
16
|
+
- `01_planning/`: 현재 canonical spec과 source reference
|
|
17
|
+
- `02_plan/`: 에이전트의 current executable plan
|
|
18
|
+
- `03_build/`: 현재 구현 요약
|
|
19
|
+
- `04_verify/`: 현재 retained verification summary
|
|
20
|
+
- `05_operate/`: 현재 delivery status와 runbook
|
|
21
|
+
- `99_toolchain/`: SDD를 유지하는 생성기, 자동화, 정책 문서
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
APP_NAME=Template Server
|
|
2
|
+
ENVIRONMENT=development
|
|
3
|
+
API_PREFIX=/api/v1
|
|
4
|
+
CORS_ORIGINS=http://localhost:3000,http://127.0.0.1:3000,http://localhost:3001,http://127.0.0.1:3001,http://localhost:3002,http://127.0.0.1:3002,http://localhost:4000,http://127.0.0.1:4000
|
|
5
|
+
DATABASE_BACKEND=postgres
|
|
6
|
+
POSTGRES_URL=postgresql+psycopg://template:template@postgres:5432/template
|
|
7
|
+
MYSQL_URL=mysql+pymysql://template:template@mysql:3306/template
|
|
8
|
+
MARIADB_URL=mysql+pymysql://template:template@mariadb:3306/template
|
|
9
|
+
MONGODB_URL=mongodb://mongo:27017
|
|
10
|
+
MONGODB_DATABASE=template
|
|
11
|
+
JWT_SECRET=change-me
|
|
12
|
+
JWT_ALGORITHM=HS256
|
|
13
|
+
ACCESS_TOKEN_TTL_MINUTES=120
|
|
14
|
+
BOOTSTRAP_ADMIN_EMAIL=admin@example.com
|
|
15
|
+
BOOTSTRAP_ADMIN_PASSWORD=<CHANGE_ME>
|
|
16
|
+
BOOTSTRAP_ADMIN_NAME=Template Admin
|
|
17
|
+
BOOTSTRAP_OPERATOR_EMAIL=operator@example.com
|
|
18
|
+
BOOTSTRAP_OPERATOR_PASSWORD=<CHANGE_ME>
|
|
19
|
+
BOOTSTRAP_OPERATOR_NAME=Template Operator
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
FROM python:3.12-slim
|
|
2
|
+
|
|
3
|
+
ENV PYTHONDONTWRITEBYTECODE=1 \
|
|
4
|
+
PYTHONUNBUFFERED=1
|
|
5
|
+
|
|
6
|
+
WORKDIR /app
|
|
7
|
+
|
|
8
|
+
COPY pyproject.toml README.md ./
|
|
9
|
+
COPY api ./api
|
|
10
|
+
COPY contexts ./contexts
|
|
11
|
+
COPY shared ./shared
|
|
12
|
+
COPY data ./data
|
|
13
|
+
COPY config.py ./config.py
|
|
14
|
+
COPY main.py ./main.py
|
|
15
|
+
COPY tests ./tests
|
|
16
|
+
COPY .env.example ./.env.example
|
|
17
|
+
|
|
18
|
+
RUN pip install --no-cache-dir -e ".[dev]"
|
|
19
|
+
|
|
20
|
+
EXPOSE 8000
|
|
21
|
+
|
|
22
|
+
CMD ["uvicorn", "api.http.app:app", "--host", "0.0.0.0", "--port", "8000"]
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
FROM python:3.12-slim
|
|
2
|
+
|
|
3
|
+
ENV PYTHONDONTWRITEBYTECODE=1 \
|
|
4
|
+
PYTHONUNBUFFERED=1 \
|
|
5
|
+
PIP_DISABLE_PIP_VERSION_CHECK=1
|
|
6
|
+
|
|
7
|
+
WORKDIR /app
|
|
8
|
+
|
|
9
|
+
COPY server /app/server
|
|
10
|
+
|
|
11
|
+
RUN python -m pip install --no-cache-dir --upgrade pip && \
|
|
12
|
+
python -m pip install --no-cache-dir -e "/app/server[dev]" && \
|
|
13
|
+
chmod +x /app/server/docker-entrypoint.sh
|
|
14
|
+
|
|
15
|
+
WORKDIR /app/server
|
|
16
|
+
|
|
17
|
+
EXPOSE 8000
|
|
18
|
+
|
|
19
|
+
CMD ["bash", "/app/server/docker-entrypoint.sh"]
|
package/server/README.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# server
|
|
2
|
+
|
|
3
|
+
hexagonal/DDD 구조를 따르는 HTTP 서버 보일러플레이트다.
|
|
4
|
+
|
|
5
|
+
포함 패턴:
|
|
6
|
+
|
|
7
|
+
- `api/http`, `contexts`, `data`, `tests` root layout
|
|
8
|
+
- `contexts/*/(application|domain|infrastructure|contracts)` 중심 DDD 분리
|
|
9
|
+
- `contexts/auth`, `contexts/user`, `contexts/shipping`, `contexts/alerts` 예시 도메인과 실제 호출 가능한 sample logic
|
|
10
|
+
- HTTP 계약은 `contexts/*/contracts/http`에 둔다
|
|
11
|
+
- `shared/(application|infrastructure)` 공통 레이어
|
|
12
|
+
- `memory`, `postgres`, `mysql`, `mariadb`, `mongodb` adapter 선택 가능
|
|
13
|
+
- `api/http/app.py` FastAPI app entrypoint
|
|
14
|
+
- `config.py` settings cache
|
|
15
|
+
- `api/http/router.py` 중심의 HTTP router aggregation
|
|
16
|
+
- `/health`와 `/api/v1/*` 기본 계약
|
|
17
|
+
- `.env.example`와 pytest 기본 테스트
|
|
18
|
+
|
|
19
|
+
시작:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
uv sync --extra dev
|
|
23
|
+
uv run uvicorn api.http.app:app --reload
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
기본 인증 예시:
|
|
27
|
+
|
|
28
|
+
- `POST /api/v1/auth/login`
|
|
29
|
+
- `GET /api/v1/auth/me`
|
|
30
|
+
- `GET /api/v1/users`
|
|
31
|
+
- `GET /api/v1/users/{user_id}`
|
|
32
|
+
- `GET /api/v1/shipping/overview`
|
|
33
|
+
- `GET /api/v1/alerts`
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__all__ = ["http"]
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
from collections.abc import AsyncIterator
|
|
2
|
+
from contextlib import asynccontextmanager
|
|
3
|
+
|
|
4
|
+
from fastapi import FastAPI
|
|
5
|
+
from fastapi.middleware.cors import CORSMiddleware
|
|
6
|
+
|
|
7
|
+
from api.http.router import api_router
|
|
8
|
+
from config import get_settings
|
|
9
|
+
from contexts.alerts.application import prepare_alert_store
|
|
10
|
+
from contexts.auth.application import prepare_auth_store
|
|
11
|
+
from contexts.catalog.application import prepare_catalog_store
|
|
12
|
+
from contexts.fulfillment.application import prepare_fulfillment_store
|
|
13
|
+
from contexts.inventory.application import prepare_inventory_store
|
|
14
|
+
from contexts.orders.application import prepare_order_store
|
|
15
|
+
from contexts.shipping.application import prepare_shipping_store
|
|
16
|
+
from contexts.support.application import prepare_support_store
|
|
17
|
+
from contexts.user.application import prepare_user_store
|
|
18
|
+
from shared.application import health_response
|
|
19
|
+
|
|
20
|
+
settings = get_settings()
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@asynccontextmanager
|
|
24
|
+
async def lifespan(_: FastAPI) -> AsyncIterator[None]:
|
|
25
|
+
prepare_alert_store()
|
|
26
|
+
prepare_auth_store()
|
|
27
|
+
prepare_catalog_store()
|
|
28
|
+
prepare_fulfillment_store()
|
|
29
|
+
prepare_inventory_store()
|
|
30
|
+
prepare_order_store()
|
|
31
|
+
prepare_shipping_store()
|
|
32
|
+
prepare_support_store()
|
|
33
|
+
prepare_user_store()
|
|
34
|
+
yield
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
app = FastAPI(title=settings.app_name, version="0.1.0", lifespan=lifespan)
|
|
38
|
+
|
|
39
|
+
app.add_middleware(
|
|
40
|
+
CORSMiddleware,
|
|
41
|
+
allow_origins=settings.cors_origins,
|
|
42
|
+
allow_credentials=True,
|
|
43
|
+
allow_methods=["*"],
|
|
44
|
+
allow_headers=["*"],
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@app.get("/health")
|
|
49
|
+
def health() -> dict[str, str]:
|
|
50
|
+
return health_response()
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
app.include_router(api_router, prefix=settings.api_prefix)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from fastapi import APIRouter
|
|
2
|
+
|
|
3
|
+
from contexts.alerts.contracts.http.router import router as alerts_router
|
|
4
|
+
from contexts.auth.contracts.http.router import router as auth_router
|
|
5
|
+
from contexts.catalog.contracts.http.router import router as catalog_router
|
|
6
|
+
from contexts.fulfillment.contracts.http.router import router as fulfillment_router
|
|
7
|
+
from contexts.health.contracts.http.router import router as health_router
|
|
8
|
+
from contexts.inventory.contracts.http.router import router as inventory_router
|
|
9
|
+
from contexts.orders.contracts.http.router import router as orders_router
|
|
10
|
+
from contexts.shipping.contracts.http.router import router as shipping_router
|
|
11
|
+
from contexts.support.contracts.http.router import router as support_router
|
|
12
|
+
from contexts.user.contracts.http.router import router as user_router
|
|
13
|
+
|
|
14
|
+
api_router = APIRouter()
|
|
15
|
+
api_router.include_router(alerts_router)
|
|
16
|
+
api_router.include_router(auth_router)
|
|
17
|
+
api_router.include_router(catalog_router)
|
|
18
|
+
api_router.include_router(fulfillment_router)
|
|
19
|
+
api_router.include_router(health_router)
|
|
20
|
+
api_router.include_router(inventory_router)
|
|
21
|
+
api_router.include_router(orders_router)
|
|
22
|
+
api_router.include_router(shipping_router)
|
|
23
|
+
api_router.include_router(support_router)
|
|
24
|
+
api_router.include_router(user_router)
|
package/server/config.py
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
from functools import lru_cache
|
|
2
|
+
from typing import Literal
|
|
3
|
+
|
|
4
|
+
from pydantic import Field, field_validator
|
|
5
|
+
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Settings(BaseSettings):
|
|
9
|
+
model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore")
|
|
10
|
+
|
|
11
|
+
app_name: str = "Template Server"
|
|
12
|
+
environment: str = "development"
|
|
13
|
+
api_prefix: str = "/api/v1"
|
|
14
|
+
database_backend: Literal["memory", "postgres", "mysql", "mariadb", "mongodb"] = "memory"
|
|
15
|
+
postgres_url: str = "postgresql+psycopg://template:template@postgres:5432/template"
|
|
16
|
+
mysql_url: str = "mysql+pymysql://template:template@mysql:3306/template"
|
|
17
|
+
mariadb_url: str = "mysql+pymysql://template:template@mariadb:3306/template"
|
|
18
|
+
mongodb_url: str = "mongodb://mongo:27017"
|
|
19
|
+
mongodb_database: str = "template"
|
|
20
|
+
jwt_secret: str = "change-me"
|
|
21
|
+
jwt_algorithm: str = "HS256"
|
|
22
|
+
access_token_ttl_minutes: int = 120
|
|
23
|
+
bootstrap_admin_email: str = "admin@example.com"
|
|
24
|
+
bootstrap_admin_password: str = "<CHANGE_ME>"
|
|
25
|
+
bootstrap_admin_name: str = "Template Admin"
|
|
26
|
+
bootstrap_operator_email: str = "operator@example.com"
|
|
27
|
+
bootstrap_operator_password: str = "<CHANGE_ME>"
|
|
28
|
+
bootstrap_operator_name: str = "Template Operator"
|
|
29
|
+
cors_origins: list[str] = Field(
|
|
30
|
+
default_factory=lambda: [
|
|
31
|
+
"http://localhost:3000",
|
|
32
|
+
"http://127.0.0.1:3000",
|
|
33
|
+
"http://localhost:3001",
|
|
34
|
+
"http://127.0.0.1:3001",
|
|
35
|
+
"http://localhost:3002",
|
|
36
|
+
"http://127.0.0.1:3002",
|
|
37
|
+
"http://localhost:4000",
|
|
38
|
+
"http://127.0.0.1:4000",
|
|
39
|
+
]
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
@field_validator("cors_origins", mode="before")
|
|
43
|
+
@classmethod
|
|
44
|
+
def parse_cors_origins(cls, value: str | list[str]) -> list[str]:
|
|
45
|
+
if isinstance(value, str):
|
|
46
|
+
return [item.strip() for item in value.split(",") if item.strip()]
|
|
47
|
+
return value
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@lru_cache
|
|
51
|
+
def get_settings() -> Settings:
|
|
52
|
+
return Settings()
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__all__ = ["application", "contracts", "domain", "infrastructure"]
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
from contexts.alerts.domain import (
|
|
2
|
+
AlertItem,
|
|
3
|
+
AlertReadResult,
|
|
4
|
+
AlertsPayload,
|
|
5
|
+
AlertsReadAllResult,
|
|
6
|
+
)
|
|
7
|
+
from contexts.alerts.infrastructure import (
|
|
8
|
+
list_seed_alerts,
|
|
9
|
+
mark_all_seed_alerts_read,
|
|
10
|
+
mark_seed_alert_read,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _to_alert_item(record: AlertItem) -> AlertItem:
|
|
15
|
+
return AlertItem(**record.model_dump())
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def get_alerts() -> AlertsPayload:
|
|
19
|
+
records = list_seed_alerts()
|
|
20
|
+
return AlertsPayload(
|
|
21
|
+
unread_count=sum(1 for record in records if not record.read),
|
|
22
|
+
items=[_to_alert_item(record) for record in records],
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def mark_alert_read(alert_id: str) -> AlertReadResult:
|
|
27
|
+
record = mark_seed_alert_read(alert_id)
|
|
28
|
+
return AlertReadResult(**record.model_dump())
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def mark_all_alerts_read() -> AlertsReadAllResult:
|
|
32
|
+
updated_count = mark_all_seed_alerts_read()
|
|
33
|
+
unread_count = sum(1 for record in list_seed_alerts() if not record.read)
|
|
34
|
+
return AlertsReadAllResult(
|
|
35
|
+
updated_count=updated_count,
|
|
36
|
+
unread_count=unread_count,
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def prepare_alert_store() -> None:
|
|
41
|
+
list_seed_alerts()
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from fastapi import APIRouter, Depends, HTTPException
|
|
2
|
+
|
|
3
|
+
from contexts.alerts.application import (
|
|
4
|
+
get_alerts,
|
|
5
|
+
mark_alert_read,
|
|
6
|
+
mark_all_alerts_read,
|
|
7
|
+
)
|
|
8
|
+
from contexts.alerts.domain import (
|
|
9
|
+
AlertReadResult,
|
|
10
|
+
AlertsPayload,
|
|
11
|
+
AlertsReadAllResult,
|
|
12
|
+
)
|
|
13
|
+
from contexts.auth.contracts.http.dependencies import require_admin_user
|
|
14
|
+
|
|
15
|
+
router = APIRouter(
|
|
16
|
+
prefix="/alerts",
|
|
17
|
+
tags=["alerts"],
|
|
18
|
+
dependencies=[Depends(require_admin_user)],
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@router.get("", response_model=AlertsPayload)
|
|
23
|
+
def list_alerts() -> AlertsPayload:
|
|
24
|
+
return get_alerts()
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@router.post("/read-all", response_model=AlertsReadAllResult)
|
|
28
|
+
def read_all_alerts() -> AlertsReadAllResult:
|
|
29
|
+
return mark_all_alerts_read()
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@router.post("/{alert_id}/read", response_model=AlertReadResult)
|
|
33
|
+
def read_alert(alert_id: str) -> AlertReadResult:
|
|
34
|
+
try:
|
|
35
|
+
return mark_alert_read(alert_id)
|
|
36
|
+
except LookupError as exc:
|
|
37
|
+
raise HTTPException(status_code=404, detail=str(exc)) from exc
|