agentic-dev 0.2.2 → 0.2.4
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/.claude/CLAUDE.md +1 -1
- package/.claude/skills/sdd/SKILL.md +178 -7
- package/.claude/skills/sdd/agents/openai.yaml +4 -0
- package/.claude/skills/sdd/references/section-map.md +67 -0
- package/.env.example +2 -2
- package/README.md +5 -5
- package/client/{platform → web}/Dockerfile +3 -3
- package/client/web/Dockerfile.dev +18 -0
- package/client/{platform → web}/README.md +3 -3
- package/client/{platform → web}/index.html +1 -1
- package/client/{platform → web}/package.json +7 -7
- package/client/{platform/scripts/ui-parity-platform-adapter.mjs → web/scripts/ui-parity-web-adapter.mjs} +7 -7
- package/client/{platform → web}/src/auth/AuthProvider.tsx +1 -1
- package/compose.yml +6 -6
- package/infra/compose/.env.dev.example +3 -3
- package/infra/compose/.env.prod.example +3 -3
- package/infra/compose/README.md +1 -1
- package/infra/compose/dev.yml +5 -5
- package/infra/compose/prod.yml +6 -6
- package/infra/terraform/openstack/dev/terraform.tfvars.example +3 -3
- package/infra/terraform/openstack/prod/terraform.tfvars.example +3 -3
- package/lib/scaffold.mjs +7 -7
- package/package.json +2 -2
- package/scripts/dev/audit_sdd_build_ast.py +9 -9
- package/sdd/01_planning/01_feature/auth_feature_spec.md +2 -2
- package/sdd/01_planning/01_feature/catalog_feature_spec.md +3 -3
- package/sdd/01_planning/01_feature/order_feature_spec.md +11 -11
- package/sdd/01_planning/02_screen/INDEX.md +2 -2
- package/sdd/01_planning/02_screen/README.md +2 -2
- package/sdd/01_planning/03_architecture/templates_system_architecture.md +3 -3
- package/sdd/01_planning/05_api/templates_api_contract.md +3 -3
- package/sdd/01_planning/06_iac/templates_runtime_and_cicd_baseline.md +1 -1
- package/sdd/01_planning/07_integration/templates_frontend_api_integration.md +3 -3
- package/sdd/01_planning/10_test/templates_test_strategy.md +2 -2
- package/sdd/01_planning/INDEX.md +1 -1
- package/sdd/02_plan/02_screen/INDEX.md +1 -1
- package/sdd/02_plan/02_screen/README.md +1 -1
- package/sdd/02_plan/03_architecture/build_ast_runtime_tree_governance.md +1 -1
- package/sdd/02_plan/03_architecture/repository_governance.md +1 -1
- package/sdd/02_plan/07_integration/frontend_live_integration.md +3 -3
- package/sdd/02_plan/10_test/templates/{ui_parity_platform_contract.template.yaml → ui_parity_web_contract.template.yaml} +1 -1
- package/sdd/03_build/01_feature/domain/account_and_access.md +1 -1
- package/sdd/03_build/01_feature/domain/catalog_and_inventory.md +1 -1
- package/sdd/03_build/01_feature/domain/ordering_and_fulfillment.md +1 -1
- package/sdd/03_build/01_feature/service/README.md +1 -1
- package/sdd/03_build/01_feature/service/{platform_surface.md → web_surface.md} +3 -3
- package/sdd/03_build/02_screen/README.md +1 -1
- package/sdd/03_build/02_screen/web/README.md +5 -0
- package/sdd/03_build/06_iac/template_runtime_delivery.md +1 -1
- package/sdd/03_build/07_integration/frontend_live_integration.md +1 -1
- package/sdd/04_verify/01_feature/service_verification.md +2 -2
- package/sdd/04_verify/02_screen/web/README.md +4 -0
- package/sdd/04_verify/06_iac/template_runtime_delivery.md +3 -3
- package/sdd/99_toolchain/01_automation/agentic-dev/assets/repo-contract.template.json +11 -11
- package/sdd/99_toolchain/01_automation/agentic-dev/repo-contract.json +13 -13
- package/sdd/99_toolchain/01_automation/agentic-parity-harness-design.md +5 -5
- package/sdd/99_toolchain/01_automation/capture_screen_assets.mjs +4 -4
- package/sdd/99_toolchain/01_automation/harness-layout.md +2 -2
- package/sdd/99_toolchain/01_automation/parity-execution-tooling-design.md +5 -5
- package/sdd/99_toolchain/01_automation/screen_spec_manifest.py +17 -17
- package/sdd/99_toolchain/01_automation/ui-parity/README.md +10 -10
- package/sdd/99_toolchain/01_automation/ui-parity/interfaces/ui-parity-artifact-layout.md +1 -1
- package/sdd/99_toolchain/01_automation/ui-parity/interfaces/ui-parity-route-gap-interface.md +2 -2
- package/sdd/99_toolchain/03_templates/playwright_exactness_manifest.example.py +1 -1
- package/server/data/README.md +1 -1
- package/.claude/skills/commit/SKILL.md +0 -37
- package/.claude/skills/dev-browser/SKILL.md +0 -30
- package/.claude/skills/otro/SKILL.md +0 -43
- package/.claude/skills/planning-with-files/SKILL.md +0 -37
- package/.claude/skills/prd/SKILL.md +0 -27
- package/.claude/skills/ralph-loop/SKILL.md +0 -42
- package/.claude/skills/sdd-dev/SKILL.md +0 -71
- package/.claude/skills/sdd-development/SKILL.md +0 -13
- package/.codex/skills/agents/openai.yaml +0 -4
- package/.codex/skills/commit/SKILL.md +0 -219
- package/.codex/skills/commit/references/commit_examples.md +0 -292
- package/.codex/skills/dev-browser/SKILL.md +0 -211
- package/.codex/skills/dev-browser/bun.lock +0 -443
- package/.codex/skills/dev-browser/package-lock.json +0 -2988
- package/.codex/skills/dev-browser/package.json +0 -31
- package/.codex/skills/dev-browser/references/scraping.md +0 -155
- package/.codex/skills/dev-browser/scripts/start-relay.ts +0 -32
- package/.codex/skills/dev-browser/scripts/start-server.ts +0 -117
- package/.codex/skills/dev-browser/server.sh +0 -24
- package/.codex/skills/dev-browser/src/client.ts +0 -474
- package/.codex/skills/dev-browser/src/index.ts +0 -287
- package/.codex/skills/dev-browser/src/relay.ts +0 -731
- package/.codex/skills/dev-browser/src/snapshot/__tests__/snapshot.test.ts +0 -223
- package/.codex/skills/dev-browser/src/snapshot/browser-script.ts +0 -877
- package/.codex/skills/dev-browser/src/snapshot/index.ts +0 -14
- package/.codex/skills/dev-browser/src/snapshot/inject.ts +0 -13
- package/.codex/skills/dev-browser/src/types.ts +0 -34
- package/.codex/skills/dev-browser/tsconfig.json +0 -36
- package/.codex/skills/dev-browser/vitest.config.ts +0 -12
- package/.codex/skills/otro/SKILL.md +0 -74
- package/.codex/skills/otro/agents/openai.yaml +0 -4
- package/.codex/skills/otro/references/agent-prompts.md +0 -61
- package/.codex/skills/otro/references/contracts.md +0 -146
- package/.codex/skills/otro/references/orchestration-loop.md +0 -51
- package/.codex/skills/otro/references/runtime.md +0 -79
- package/.codex/skills/otro/runs/README.md +0 -11
- package/.codex/skills/otro/schemas/step_plan.schema.json +0 -289
- package/.codex/skills/otro/schemas/task_result.schema.json +0 -142
- package/.codex/skills/otro/schemas/wave_plan.schema.json +0 -4
- package/.codex/skills/otro/scripts/README.md +0 -38
- package/.codex/skills/otro/scripts/bump_validation_header.py +0 -179
- package/.codex/skills/otro/scripts/check_validation_header.py +0 -84
- package/.codex/skills/otro/scripts/common.py +0 -303
- package/.codex/skills/otro/scripts/init_run.sh +0 -68
- package/.codex/skills/otro/scripts/plan_loop.py +0 -8
- package/.codex/skills/otro/scripts/plan_step.py +0 -367
- package/.codex/skills/otro/scripts/plan_wave.py +0 -8
- package/.codex/skills/otro/scripts/reconcile_loop.py +0 -8
- package/.codex/skills/otro/scripts/reconcile_step.py +0 -37
- package/.codex/skills/otro/scripts/reconcile_wave.py +0 -8
- package/.codex/skills/otro/scripts/run_loop.py +0 -300
- package/.codex/skills/otro/scripts/run_loop_step.py +0 -8
- package/.codex/skills/otro/scripts/run_step.py +0 -246
- package/.codex/skills/otro/scripts/run_wave.py +0 -8
- package/.codex/skills/otro/validation/validation.md +0 -15
- package/.codex/skills/planning-with-files/SKILL.md +0 -42
- package/.codex/skills/planning-with-files/agents/openai.yaml +0 -4
- package/.codex/skills/planning-with-files/assets/plan-template.md +0 -37
- package/.codex/skills/planning-with-files/references/plan-rules.md +0 -35
- package/.codex/skills/planning-with-files/scripts/new_plan.sh +0 -65
- package/.codex/skills/prd/SKILL.md +0 -235
- package/.codex/skills/ralph-loop/SKILL.md +0 -46
- package/.codex/skills/ralph-loop/agents/openai.yaml +0 -4
- package/.codex/skills/ralph-loop/references/failure-triage.md +0 -32
- package/.codex/skills/ralph-loop/scripts/loop_until_success.sh +0 -97
- package/client/platform/Dockerfile.dev +0 -18
- package/sdd/03_build/02_screen/platform/README.md +0 -5
- package/sdd/04_verify/02_screen/platform/README.md +0 -4
- package/sdd/99_toolchain/02_policies/otro-orchestration-policy.md +0 -30
- /package/client/{platform → web}/.dockerignore +0 -0
- /package/client/{platform → web}/.env.example +0 -0
- /package/client/{platform → web}/postcss.config.js +0 -0
- /package/client/{platform → web}/src/api/client.ts +0 -0
- /package/client/{platform → web}/src/api/orders.ts +0 -0
- /package/client/{platform → web}/src/app/App.tsx +0 -0
- /package/client/{platform → web}/src/auth/ProtectedRoute.tsx +0 -0
- /package/client/{platform → web}/src/auth/auth-client.ts +0 -0
- /package/client/{platform → web}/src/auth/types.ts +0 -0
- /package/client/{platform → web}/src/components/AppShell.tsx +0 -0
- /package/client/{platform → web}/src/components/ui/button.tsx +0 -0
- /package/client/{platform → web}/src/components/ui/card.tsx +0 -0
- /package/client/{platform → web}/src/components/ui/input.tsx +0 -0
- /package/client/{platform → web}/src/lib/cn.ts +0 -0
- /package/client/{platform → web}/src/lib/specRouteCatalog.json +0 -0
- /package/client/{platform → web}/src/lib/specScreens.json +0 -0
- /package/client/{platform → web}/src/main.tsx +0 -0
- /package/client/{platform → web}/src/pages/DashboardPage.tsx +0 -0
- /package/client/{platform → web}/src/pages/LoginPage.tsx +0 -0
- /package/client/{platform → web}/src/pages/OrdersPage.tsx +0 -0
- /package/client/{platform → web}/src/styles/globals.css +0 -0
- /package/client/{platform → web}/src/theme-vars.ts +0 -0
- /package/client/{platform → web}/src/theme.ts +0 -0
- /package/client/{platform → web}/src/vite-env.d.ts +0 -0
- /package/client/{platform → web}/tailwind.config.js +0 -0
- /package/client/{platform → web}/tsconfig.json +0 -0
- /package/client/{platform → web}/vite.config.ts +0 -0
- /package/sdd/01_planning/02_screen/{platform_screen_spec.pdf → web_screen_spec.pdf} +0 -0
- /package/sdd/99_toolchain/01_automation/assets/{platform_screen_capture → web_screen_capture}/dashboard.png +0 -0
- /package/sdd/99_toolchain/01_automation/assets/{platform_screen_capture → web_screen_capture}/login.png +0 -0
- /package/sdd/99_toolchain/01_automation/assets/{platform_screen_capture → web_screen_capture}/orders.png +0 -0
package/.claude/CLAUDE.md
CHANGED
|
@@ -19,7 +19,7 @@ templates/
|
|
|
19
19
|
│ └── skills/ # Claude Code repo-local skills (.claude/skills/<name>/SKILL.md)
|
|
20
20
|
├── .codex/ # Codex 설정, 에이전트, 스킬
|
|
21
21
|
├── client/
|
|
22
|
-
│ ├──
|
|
22
|
+
│ ├── web/ # 일반 앱 템플릿
|
|
23
23
|
│ ├── admin/ # 어드민 템플릿
|
|
24
24
|
│ ├── mobile/ # 현장형 모바일 템플릿
|
|
25
25
|
│ └── landing/ # 랜딩 템플릿
|
|
@@ -1,13 +1,184 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sdd
|
|
3
|
-
description: "
|
|
4
|
-
user_invocable: true
|
|
3
|
+
description: "Use for any software development request in a repository that treats `sdd/` as the canonical delivery system. Trigger on requests like develop, implement, build, code, work on, modify, fix, patch, refactor, test, verify, deploy, monitor, or screen/UI-driven prompts such as 화면명세서, 화면설계서, 화면 설계, 화면, 화면 스펙, UI, 디자인, 디자인 가이드, screen spec, screen design, or design guide. The workflow is always SDD-first: inspect and update `sdd/01_planning`, create or update the task plan under `sdd/02_plan`, implement the change, record execution in `sdd/03_build`, capture validation in `sdd/04_verify`, and record deployment or monitoring in `sdd/05_operate` when rollout happens."
|
|
5
4
|
---
|
|
6
5
|
|
|
7
|
-
|
|
6
|
+
# SDD Development
|
|
8
7
|
|
|
9
|
-
|
|
8
|
+
## Overview
|
|
10
9
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
Use this skill for implementation work in repositories that treat `sdd/` as the canonical delivery record.
|
|
11
|
+
|
|
12
|
+
This skill enforces one workflow:
|
|
13
|
+
1. inspect and fix relevant `sdd/01_planning` artifacts first,
|
|
14
|
+
2. create or update the task plan under `sdd/02_plan/<section>/`,
|
|
15
|
+
3. perform the code work,
|
|
16
|
+
4. record the current implementation summary in `sdd/03_build`,
|
|
17
|
+
5. record the current retained verification summary in `sdd/04_verify`,
|
|
18
|
+
6. record deployment and monitoring outcomes in `sdd/05_operate` when rollout happens.
|
|
19
|
+
|
|
20
|
+
When rollout is explicitly in scope, and the repository has separate DEV and PROD environments, this skill enforces a staged release rule: deploy to DEV first, complete the retained full-layer validation surface there, promote to PROD only after DEV passes, then rerun the same retained validation surface in PROD. If PROD validation fails, rollback is required unless the user explicitly redirects and that risk is recorded.
|
|
21
|
+
For persistence-affecting work, this skill also enforces schema-parity verification. Always compare migration or model intent against the real DEV and PROD schema state for the affected database objects instead of assuming deployed reality matches the code.
|
|
22
|
+
|
|
23
|
+
Read [references/section-map.md](references/section-map.md) when you need the exact destination inside `sdd/`.
|
|
24
|
+
For screen-spec-driven UI work, reusable static assets from the spec must be extracted through the repo's canonical asset builder before being used in code.
|
|
25
|
+
For screen-spec-driven layout work, inspect the repo's canonical design guide builder first when one exists.
|
|
26
|
+
For local screen exactness, treat the repo's Playwright exactness runner and suite registry as the canonical automation gate when they exist.
|
|
27
|
+
For verification work, treat regression scope selection as a required retained artifact and carry it through `sdd/02_plan`, `sdd/03_build`, and `sdd/04_verify`.
|
|
28
|
+
Do not infer rollout scope from the existence of `sdd/05_operate` alone; require rollout only when the user asks for deployment or the repo's current policy/plan makes rollout part of completion.
|
|
29
|
+
When a repo or team treats DEV deployment from `main` as the completion bar, temporary branches or worktrees are only working space. Before calling the task deployed, land the final retained change on `main` and push `origin/main`.
|
|
30
|
+
|
|
31
|
+
## When To Use
|
|
32
|
+
|
|
33
|
+
Use this skill when:
|
|
34
|
+
- the repository has `sdd/01_planning`, `02_plan`, `03_build`, `04_verify`, `05_operate`,
|
|
35
|
+
- the user gives a development instruction such as `개발해`, `작업해`, `구현해`, `수정해`, `고쳐`, `리팩토링해`, `테스트해`, `배포해`,
|
|
36
|
+
- the user asks for screen/UI work with prompts such as `화면명세서`, `화면설계서`, `화면 설계`, `화면`, `화면 스펙`, `UI`, `디자인`, `디자인 가이드`, `screen spec`, `screen design`, or `design guide`,
|
|
37
|
+
- the user wants work to be traceable through those folders,
|
|
38
|
+
- the task includes both implementation and documentation/verification updates,
|
|
39
|
+
- the task may end in deployment or operational follow-up.
|
|
40
|
+
|
|
41
|
+
Do not use this skill for:
|
|
42
|
+
- casual questions with no repo changes,
|
|
43
|
+
- one-off local debugging where no durable SDD record is needed,
|
|
44
|
+
- repositories that do not use `sdd/` as their primary document system.
|
|
45
|
+
|
|
46
|
+
## Workflow
|
|
47
|
+
|
|
48
|
+
### 1. Inspect Planning First
|
|
49
|
+
|
|
50
|
+
- Identify the impacted planning area before editing code.
|
|
51
|
+
- Open only the relevant artifacts in `sdd/01_planning`:
|
|
52
|
+
- feature
|
|
53
|
+
- screen
|
|
54
|
+
- architecture
|
|
55
|
+
- data
|
|
56
|
+
- api
|
|
57
|
+
- iac
|
|
58
|
+
- integration
|
|
59
|
+
- nonfunctional
|
|
60
|
+
- security
|
|
61
|
+
- test
|
|
62
|
+
- If the implementation has already drifted from planning, update the planning artifact first or at least record the drift before coding.
|
|
63
|
+
|
|
64
|
+
### 2. Create Or Update The Plan
|
|
65
|
+
|
|
66
|
+
- Create or reuse a durable plan file under `sdd/02_plan/<section>/`.
|
|
67
|
+
- Prefer the repo's planning scaffold if available.
|
|
68
|
+
- The plan must include:
|
|
69
|
+
- scope
|
|
70
|
+
- assumptions
|
|
71
|
+
- acceptance criteria
|
|
72
|
+
- execution checklist
|
|
73
|
+
- current notes
|
|
74
|
+
- validation
|
|
75
|
+
- For any task that may end in deployment, acceptance criteria must explicitly include the DEV gate, the matching PROD gate, the retained full-layer test surface, and the rollback trigger/path.
|
|
76
|
+
- For any task that touches persistence, models, repositories, migrations, SQL, ORM mappings, or runtime failures that may involve schema drift, acceptance criteria must explicitly include DEV/PROD schema verification.
|
|
77
|
+
- Keep exactly one checklist item in progress.
|
|
78
|
+
|
|
79
|
+
### 3. Implement Against The Plan
|
|
80
|
+
|
|
81
|
+
- Make code changes only after the impacted planning artifact and plan are aligned enough to proceed.
|
|
82
|
+
- Update the plan current notes after meaningful edits or decisions.
|
|
83
|
+
- When document generators or capture pipelines are involved, keep those tools under `sdd/99_toolchain`.
|
|
84
|
+
- For local screen exactness, treat Playwright as the canonical automation gate unless the repo documents a stronger exact gate for that surface.
|
|
85
|
+
- In repos created from this template, prefer `python3 sdd/99_toolchain/01_automation/run_playwright_exactness.py --suite <suite-id>` over ad-hoc `npx playwright test ...`.
|
|
86
|
+
- Keep the suite registry in `sdd/99_toolchain/01_automation/playwright_exactness_manifest.py`.
|
|
87
|
+
- Browser Use, manual screenshots, or semantic extraction can supplement diagnosis, but they do not replace the retained Playwright exactness gate when a suite exists.
|
|
88
|
+
- If the needed suite does not exist yet, add or extend it in the same task and register it before calling the work complete.
|
|
89
|
+
- When the task depends on icons, logos, illustrations, or other static assets visible in a screen spec, use the repo's canonical Asset Spec Builder first.
|
|
90
|
+
- In repos created from this template, this is typically `sdd/99_toolchain/01_automation/spec_asset_builder.py` or a wrapper/manifest around it.
|
|
91
|
+
- Reusable asset planning records belong under `sdd/01_planning/02_screen/assets/`.
|
|
92
|
+
- Build the runtime asset from the approved PDF/image source instead of hand-tracing or screenshot-cropping it.
|
|
93
|
+
- Use exact verification such as `--verify-exact` when the asset is expected to match the source crop exactly.
|
|
94
|
+
- Record the source, manifest, generated asset path, and any exception in `sdd/03_build` and `sdd/04_verify`.
|
|
95
|
+
- Only fall back to manual recreation when the builder cannot express the asset, and explicitly document that exception in the plan/build/verify trail.
|
|
96
|
+
- When the task depends on spacing, layout density, typography, color rhythm, or component hierarchy derived from a screen spec, inspect the repo's canonical design guide builder first.
|
|
97
|
+
- In repos created from this template, inspect `sdd/99_toolchain/01_automation/README.md` and use the actual builder, wrapper, or manifest that exists in the repo.
|
|
98
|
+
- Use the generated guide as the working baseline before manual spacing or palette tweaks.
|
|
99
|
+
- If the repo does not provide a design guide builder yet, document the manual interpretation source in plan/build/verify.
|
|
100
|
+
- Define the regression surface before calling implementation complete.
|
|
101
|
+
- Start from `sdd/02_plan/10_test/regression_verification.md`.
|
|
102
|
+
- Identify the direct target plus any upstream, downstream, and shared surfaces affected by the change.
|
|
103
|
+
- If the change touches shared routing, shell/auth, shared state, common components, contracts, generated assets, or builder output, widen the regression scope instead of validating only the edited module.
|
|
104
|
+
- Record the selected regression scope and any justified exclusions in plan/build/verify.
|
|
105
|
+
- When rollout is in scope, define one retained full-layer validation surface and reuse it in DEV and PROD.
|
|
106
|
+
- Include the relevant app/runtime entrypoints, API/contracts, persistence/schema, jobs or workflow side effects, shared integrations, and health/monitoring checks affected by the change.
|
|
107
|
+
- Do not promote to PROD with a narrower verification surface than the DEV gate unless the user explicitly approves that exception and it is recorded.
|
|
108
|
+
|
|
109
|
+
### 4. Record Build Summary
|
|
110
|
+
|
|
111
|
+
- Record what you implemented in `sdd/03_build`.
|
|
112
|
+
- Use:
|
|
113
|
+
- `03_build/01_feature` for feature implementation summaries
|
|
114
|
+
- `03_build/02_screen` for screen implementation summaries
|
|
115
|
+
- `03_build/03_architecture`, `06_iac`, `10_test` for current-state cross-cutting summaries
|
|
116
|
+
- Keep entries factual and current-state only: implemented scope, modules, assets, contracts, and current user-visible behavior.
|
|
117
|
+
|
|
118
|
+
### 5. Record Verification
|
|
119
|
+
|
|
120
|
+
- Record retained verification status in `sdd/04_verify`.
|
|
121
|
+
- Use:
|
|
122
|
+
- `04_verify/01_feature` for feature verification summaries
|
|
123
|
+
- `04_verify/02_screen` for screen verification summaries
|
|
124
|
+
- `04_verify/03_architecture`, `06_iac`, `10_test` for current retained checks and residual risk
|
|
125
|
+
- Never claim completion without command-level validation evidence.
|
|
126
|
+
- For staged DEV -> PROD rollout, verification must use the same retained full-layer validation surface in both environments.
|
|
127
|
+
- Run the full-layer validation in DEV after deployment and treat it as a hard gate before PROD promotion.
|
|
128
|
+
- After PROD deployment, rerun the same retained validation surface in PROD.
|
|
129
|
+
- If PROD validation fails, execute rollback or the approved recovery procedure immediately and record the failure and recovery outcome.
|
|
130
|
+
- For persistence-affecting work, verification must include real schema evidence from both DEV and PROD when those environments exist.
|
|
131
|
+
- Check migration state and actual runtime schema separately.
|
|
132
|
+
- Validate the tables, columns, indexes, constraints, triggers, defaults, and any legacy compatibility objects touched by the change.
|
|
133
|
+
- Record the commands or queries used, the environments checked, and the drift or parity result.
|
|
134
|
+
- Regression verification is mandatory.
|
|
135
|
+
- Verification must cover the direct surface and the retained upstream/downstream/shared surfaces selected from the regression baseline.
|
|
136
|
+
- If no automation exists for a needed regression slice yet, run the best available manual or command checks and record that gap as current residual risk.
|
|
137
|
+
- When a Playwright suite exists for the surface, record the canonical runner command, suite id, screenshot/json artifact paths, and any live-vs-local split explicitly.
|
|
138
|
+
|
|
139
|
+
### 6. Record Operate Outcomes
|
|
140
|
+
|
|
141
|
+
- If deployment or runtime follow-up happens, update `sdd/05_operate`.
|
|
142
|
+
- Use:
|
|
143
|
+
- `05_operate/01_runbooks` for durable operating procedure changes
|
|
144
|
+
- `05_operate/02_delivery_status` for the current live state and monitoring baseline
|
|
145
|
+
- Record:
|
|
146
|
+
- what was deployed
|
|
147
|
+
- which live baseline is current
|
|
148
|
+
- how it is monitored
|
|
149
|
+
- any current residual risk
|
|
150
|
+
- For staged DEV -> PROD rollout, record the DEV gate, PROD gate, and any rollback outcome explicitly.
|
|
151
|
+
- When the DEV deployment baseline is tied to `main`, do not treat a side-branch push as sufficient. Merge, cherry-pick, or otherwise replay the final change onto `main`, push `origin/main`, then record the deployment evidence against that `main` baseline.
|
|
152
|
+
|
|
153
|
+
## Guardrails
|
|
154
|
+
|
|
155
|
+
- Do not create or repopulate a parallel `docs/` tree when `sdd/` exists.
|
|
156
|
+
- Do not skip planning review just because the code change looks small.
|
|
157
|
+
- Do not leave build, verify, or operate evidence only in chat text when it should live in `sdd/`.
|
|
158
|
+
- When PROD rollout is in scope, do not promote to PROD before the retained full-layer DEV validation surface has passed.
|
|
159
|
+
- When PROD rollout is in scope, do not use a weaker PROD validation surface than the one that gated DEV unless the user explicitly approves and that risk is recorded.
|
|
160
|
+
- When PROD rollout is in scope, do not stop at "PROD deployment succeeded"; post-deploy PROD validation is mandatory.
|
|
161
|
+
- When PROD rollout is in scope, do not leave a failed PROD deployment unreconciled; rollback or the approved recovery procedure must be executed and recorded.
|
|
162
|
+
- Do not assume local tests, migration heads, or current model code prove deployed schema parity.
|
|
163
|
+
- Do not skip DEV/PROD schema inspection for persistence-affecting work when schema drift could influence behavior.
|
|
164
|
+
- Do not manually redraw screen-spec static assets when a canonical Asset Spec Builder exists for the repo; extract them first and use the generated asset.
|
|
165
|
+
- Do not skip a relevant screen automation builder just because the requested UI change looks like a small manual tweak.
|
|
166
|
+
- Do not stop verification at the edited file, route, or screen when the change can affect shared or adjacent behavior.
|
|
167
|
+
- Do not omit regression scope selection from the retained SDD trail.
|
|
168
|
+
- Do not update `05_operate` for tasks that never reached deployment; explicitly note that rollout did not happen instead.
|
|
169
|
+
- Do not call a DEV rollout complete from a temporary branch when the repo or team baseline expects the deployed change to be on `origin/main`.
|
|
170
|
+
|
|
171
|
+
## Output Standard
|
|
172
|
+
|
|
173
|
+
By the end of an implementation task, the expected trail is:
|
|
174
|
+
- planning artifact reviewed or corrected,
|
|
175
|
+
- plan file updated,
|
|
176
|
+
- build summary written,
|
|
177
|
+
- verification summary written, including selected regression scope and residual risk,
|
|
178
|
+
- operate status updated if rollout occurred.
|
|
179
|
+
|
|
180
|
+
When PROD rollout is in scope, the retained completion state also requires:
|
|
181
|
+
- DEV deployment happened first and the retained full-layer DEV validation surface passed,
|
|
182
|
+
- the same retained full-layer validation surface was executed again in PROD,
|
|
183
|
+
- DEV/PROD schema state was checked and recorded when schema could influence behavior,
|
|
184
|
+
- any PROD validation failure produced rollback or recovery evidence in verify/operate.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "SDD Development"
|
|
3
|
+
short_description: "Use SDD-first flow with schema parity, regression scope, and staged rollout gates"
|
|
4
|
+
default_prompt: "Use $sdd to handle this development task through sdd planning, build, verify, and operate, including regression scope selection, schema parity checks for persistence-affecting work, and staged DEV-first validation when multiple environments exist."
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# SDD Section Map
|
|
2
|
+
|
|
3
|
+
## Planning
|
|
4
|
+
|
|
5
|
+
- `sdd/01_planning/01_feature`
|
|
6
|
+
- domain or service feature specifications
|
|
7
|
+
- `sdd/01_planning/02_screen`
|
|
8
|
+
- service-level screen specifications and PDFs
|
|
9
|
+
- `sdd/01_planning/03_architecture`
|
|
10
|
+
- bounded context, runtime, and structural design
|
|
11
|
+
- `sdd/01_planning/04_data`
|
|
12
|
+
- data model and relationship definitions
|
|
13
|
+
- `sdd/01_planning/05_api`
|
|
14
|
+
- transport contracts and API definitions
|
|
15
|
+
- `sdd/01_planning/06_iac`
|
|
16
|
+
- infrastructure planning and deployment design
|
|
17
|
+
- `sdd/01_planning/07_integration`
|
|
18
|
+
- integration contracts and external dependency planning
|
|
19
|
+
- `sdd/01_planning/08_nonfunctional`
|
|
20
|
+
- performance, reliability, scalability, and operational constraints
|
|
21
|
+
- `sdd/01_planning/09_security`
|
|
22
|
+
- security posture, threat model, and control planning
|
|
23
|
+
- `sdd/01_planning/10_test`
|
|
24
|
+
- test strategy and planned cases
|
|
25
|
+
|
|
26
|
+
## Plan
|
|
27
|
+
|
|
28
|
+
- `sdd/02_plan/<section>`
|
|
29
|
+
- executable plan files and migration backlogs
|
|
30
|
+
|
|
31
|
+
## Build
|
|
32
|
+
|
|
33
|
+
- `sdd/03_build/01_feature`
|
|
34
|
+
- feature implementation summaries
|
|
35
|
+
- `sdd/03_build/02_screen`
|
|
36
|
+
- screen implementation summaries
|
|
37
|
+
- `sdd/03_build/03_architecture`
|
|
38
|
+
- structural and governance implementation summaries
|
|
39
|
+
- `sdd/03_build/06_iac`
|
|
40
|
+
- current delivery/runtime implementation summaries
|
|
41
|
+
- `sdd/03_build/10_test`
|
|
42
|
+
- current harness and validation implementation summaries
|
|
43
|
+
|
|
44
|
+
## Verify
|
|
45
|
+
|
|
46
|
+
- `sdd/04_verify/01_feature`
|
|
47
|
+
- feature verification summaries
|
|
48
|
+
- `sdd/04_verify/02_screen`
|
|
49
|
+
- screen verification summaries
|
|
50
|
+
- `sdd/04_verify/03_architecture`
|
|
51
|
+
- governance and structure verification summaries
|
|
52
|
+
- `sdd/04_verify/06_iac`
|
|
53
|
+
- delivery/runtime verification summaries
|
|
54
|
+
- `sdd/04_verify/10_test`
|
|
55
|
+
- current harness outputs and retained validation references
|
|
56
|
+
|
|
57
|
+
## Operate
|
|
58
|
+
|
|
59
|
+
- `sdd/05_operate/01_runbooks`
|
|
60
|
+
- durable operating procedures
|
|
61
|
+
- `sdd/05_operate/02_delivery_status`
|
|
62
|
+
- current live state, monitoring baseline, and residual risk
|
|
63
|
+
|
|
64
|
+
## Tooling
|
|
65
|
+
|
|
66
|
+
- `sdd/99_toolchain`
|
|
67
|
+
- generators, capture tooling, manifests, and other SDD automation
|
package/.env.example
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
SERVER_HTTP_PORT=8000
|
|
2
2
|
CLIENT_LANDING_PORT=3000
|
|
3
|
-
|
|
3
|
+
CLIENT_WEB_PORT=3001
|
|
4
4
|
CLIENT_MOBILE_PORT=3002
|
|
5
5
|
CLIENT_ADMIN_PORT=4000
|
|
6
6
|
|
|
@@ -44,7 +44,7 @@ SERVER_BOOTSTRAP_OPERATOR_NAME=Template Operator
|
|
|
44
44
|
SERVER_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"]
|
|
45
45
|
|
|
46
46
|
CLIENT_LANDING_VITE_API_BASE_URL=http://127.0.0.1:8000/api/v1
|
|
47
|
-
|
|
47
|
+
CLIENT_WEB_VITE_API_BASE_URL=http://127.0.0.1:8000/api/v1
|
|
48
48
|
CLIENT_MOBILE_VITE_API_BASE_URL=http://127.0.0.1:8000/api/v1
|
|
49
49
|
CLIENT_ADMIN_VITE_API_BASE_URL=http://127.0.0.1:8000/api/v1
|
|
50
50
|
CLIENT_WATCH_USE_POLLING=false
|
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
포함 템플릿:
|
|
6
6
|
|
|
7
7
|
- [landing](./client/landing): 마케팅/브랜드 랜딩 패턴
|
|
8
|
-
- [
|
|
8
|
+
- [web](./client/web): 일반 제품형 웹 앱 shell, dashboard/list/detail 패턴
|
|
9
9
|
- [mobile](./client/mobile): 다국어/현장 업무형 모바일 IN workspace 패턴
|
|
10
10
|
- [admin](./client/admin): 운영 콘솔형 shell, sidebar/topbar/drawer/table 패턴
|
|
11
11
|
- [server](./server): HTTP 기반 hexagonal/DDD 서버 패턴
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
- 제품 DOM은 유지하고, 스타일 조정값은 `theme.ts` + CSS custom properties로 노출
|
|
18
18
|
- proof/spec 전용 DOM 복제 대신 fixture data + parameter surface로 정렬
|
|
19
19
|
- `server`는 hexagonal architecture 기준으로 `contracts + application + domain + infrastructure`를 사용
|
|
20
|
-
- `landing`, `
|
|
20
|
+
- `landing`, `web`, `mobile`, `admin`은 실제 `/api/v1/auth/login`과 `/api/v1/auth/me`를 사용하는 기준 템플릿이다.
|
|
21
21
|
- runtime baseline은 루트 `compose.yml`을 기준으로 유지하고, 여기서 4개 frontend surface, `server`, 기본 `postgres`, optional DB profile을 함께 올린다.
|
|
22
22
|
- agentic baseline은 `.claude`, `.codex`, `.agent`를 함께 유지하고 downstream repo가 role agent, skill alias, Ralph harness를 그대로 가져가도록 설계한다.
|
|
23
23
|
- `sdd/03_build`는 단순 구현 목록이 아니라 실제 runtime assembly를 따라 읽는 AST-style current-state 설명을 기준으로 유지한다.
|
|
@@ -42,12 +42,12 @@ SDD / delivery 원칙:
|
|
|
42
42
|
설치형 scaffold:
|
|
43
43
|
|
|
44
44
|
```bash
|
|
45
|
-
npx agentic-dev init my-app --template
|
|
45
|
+
npx agentic-dev init my-app --template web
|
|
46
46
|
cd my-app
|
|
47
47
|
cp .env.example .env
|
|
48
48
|
npm install -g pnpm
|
|
49
49
|
pnpm install
|
|
50
|
-
cd client/
|
|
50
|
+
cd client/web
|
|
51
51
|
npm run ui:parity:bootstrap
|
|
52
52
|
```
|
|
53
53
|
|
|
@@ -74,7 +74,7 @@ docker compose up --build
|
|
|
74
74
|
기본 compose 포트:
|
|
75
75
|
|
|
76
76
|
- `client/landing`: `3000`
|
|
77
|
-
- `client/
|
|
77
|
+
- `client/web`: `3001`
|
|
78
78
|
- `client/mobile`: `3002`
|
|
79
79
|
- `client/admin`: `4000`
|
|
80
80
|
- `server/http`: `8000`
|
|
@@ -3,13 +3,13 @@ FROM node:20-slim
|
|
|
3
3
|
WORKDIR /app
|
|
4
4
|
|
|
5
5
|
COPY pnpm-lock.yaml pnpm-workspace.yaml ./
|
|
6
|
-
COPY client/
|
|
6
|
+
COPY client/web/package.json ./client/web/package.json
|
|
7
7
|
|
|
8
|
-
RUN npm install -g pnpm@10.32.0 && pnpm install --filter @do4ai/client-
|
|
8
|
+
RUN npm install -g pnpm@10.32.0 && pnpm install --filter @do4ai/client-web-template...
|
|
9
9
|
|
|
10
10
|
COPY . .
|
|
11
11
|
|
|
12
|
-
WORKDIR /app/client/
|
|
12
|
+
WORKDIR /app/client/web
|
|
13
13
|
|
|
14
14
|
EXPOSE 3001
|
|
15
15
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
FROM node:20-slim
|
|
2
|
+
|
|
3
|
+
WORKDIR /app
|
|
4
|
+
|
|
5
|
+
RUN npm install -g pnpm@10.32.0
|
|
6
|
+
|
|
7
|
+
COPY pnpm-lock.yaml pnpm-workspace.yaml ./
|
|
8
|
+
COPY client/web/package.json ./client/web/package.json
|
|
9
|
+
|
|
10
|
+
RUN pnpm install --frozen-lockfile --filter @do4ai/client-web-template...
|
|
11
|
+
|
|
12
|
+
COPY client/web ./client/web
|
|
13
|
+
|
|
14
|
+
WORKDIR /app/client/web
|
|
15
|
+
|
|
16
|
+
EXPOSE 3001
|
|
17
|
+
|
|
18
|
+
CMD ["sh", "-lc", "pnpm exec vite --host 0.0.0.0 --port ${PORT:-3001}"]
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# web
|
|
2
2
|
|
|
3
3
|
일반 사용자용 제품 앱 보일러플레이트다.
|
|
4
4
|
|
|
@@ -25,7 +25,7 @@ npm run dev
|
|
|
25
25
|
npm run ui:parity:init
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
이 단계는 repo-level contract, `
|
|
28
|
+
이 단계는 repo-level contract, `ui_parity_web_contract.yaml`, route-gap manifest를 생성한다.
|
|
29
29
|
|
|
30
30
|
첫 proof 부트스트랩:
|
|
31
31
|
|
|
@@ -44,4 +44,4 @@ npm run ui:parity:route-gap
|
|
|
44
44
|
npm run ui:parity:proof
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
이 템플릿은 repo root의 `sdd/99_toolchain/01_automation` 도구를 사용하고, `client/
|
|
47
|
+
이 템플릿은 repo root의 `sdd/99_toolchain/01_automation` 도구를 사용하고, `client/web/scripts/ui-parity-web-adapter.mjs`는 앱별 adapter 예시다.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "@do4ai/client-
|
|
2
|
+
"name": "@do4ai/client-web-template",
|
|
3
3
|
"private": true,
|
|
4
4
|
"version": "0.1.0",
|
|
5
5
|
"type": "module",
|
|
@@ -8,12 +8,12 @@
|
|
|
8
8
|
"dev": "vite --host 0.0.0.0 --port 3001",
|
|
9
9
|
"build": "tsc -b && vite build",
|
|
10
10
|
"preview": "vite preview --host 0.0.0.0 --port 4301",
|
|
11
|
-
"ui:parity:init": "bash ../../sdd/99_toolchain/01_automation/agentic-dev/init_frontend_parity.sh ../..
|
|
12
|
-
"ui:parity:bootstrap": "bash ../../sdd/99_toolchain/01_automation/agentic-dev/bootstrap_frontend_parity.sh ../..
|
|
13
|
-
"ui:parity:scaffold": "bash ../../sdd/99_toolchain/01_automation/agentic-dev/run_frontend_target.sh scaffold ../..
|
|
14
|
-
"ui:parity:materialize-references": "bash ../../sdd/99_toolchain/01_automation/agentic-dev/run_frontend_target.sh materialize_references ../..
|
|
15
|
-
"ui:parity:route-gap": "bash ../../sdd/99_toolchain/01_automation/agentic-dev/run_frontend_target.sh route_gap ../..
|
|
16
|
-
"ui:parity:proof": "bash ../../sdd/99_toolchain/01_automation/agentic-dev/run_frontend_target.sh proof ../..
|
|
11
|
+
"ui:parity:init": "bash ../../sdd/99_toolchain/01_automation/agentic-dev/init_frontend_parity.sh ../.. web",
|
|
12
|
+
"ui:parity:bootstrap": "bash ../../sdd/99_toolchain/01_automation/agentic-dev/bootstrap_frontend_parity.sh ../.. web",
|
|
13
|
+
"ui:parity:scaffold": "bash ../../sdd/99_toolchain/01_automation/agentic-dev/run_frontend_target.sh scaffold ../.. web",
|
|
14
|
+
"ui:parity:materialize-references": "bash ../../sdd/99_toolchain/01_automation/agentic-dev/run_frontend_target.sh materialize_references ../.. web",
|
|
15
|
+
"ui:parity:route-gap": "bash ../../sdd/99_toolchain/01_automation/agentic-dev/run_frontend_target.sh route_gap ../.. web",
|
|
16
|
+
"ui:parity:proof": "bash ../../sdd/99_toolchain/01_automation/agentic-dev/run_frontend_target.sh proof ../.. web",
|
|
17
17
|
"ui:parity": "npm run ui:parity:proof"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
@@ -13,7 +13,7 @@ const routes = JSON.parse(
|
|
|
13
13
|
const routeMap = new Map(routes.map((entry) => [entry.id, entry.route]));
|
|
14
14
|
|
|
15
15
|
export default {
|
|
16
|
-
service: "templates-
|
|
16
|
+
service: "templates-web",
|
|
17
17
|
targetBaseUrl: "http://127.0.0.1:4301",
|
|
18
18
|
viewport: {
|
|
19
19
|
width: 1440,
|
|
@@ -26,7 +26,7 @@ export default {
|
|
|
26
26
|
referenceImage: `sdd/04_verify/10_test/ui_parity/reference/${screen.id}.png`,
|
|
27
27
|
readySelector: "body",
|
|
28
28
|
readyTimeoutMs: 10000,
|
|
29
|
-
tags: ["template", "
|
|
29
|
+
tags: ["template", "web"],
|
|
30
30
|
})),
|
|
31
31
|
async preparePage(page, { route }) {
|
|
32
32
|
await page.route("**/auth/me", async (routeRequest) => {
|
|
@@ -34,8 +34,8 @@ export default {
|
|
|
34
34
|
status: 200,
|
|
35
35
|
contentType: "application/json",
|
|
36
36
|
body: JSON.stringify({
|
|
37
|
-
id: "tmpl-
|
|
38
|
-
name: "Template
|
|
37
|
+
id: "tmpl-web",
|
|
38
|
+
name: "Template Web User",
|
|
39
39
|
email: "operator@example.com",
|
|
40
40
|
role: "member",
|
|
41
41
|
}),
|
|
@@ -43,17 +43,17 @@ export default {
|
|
|
43
43
|
});
|
|
44
44
|
await page.addInitScript(() => {
|
|
45
45
|
window.localStorage.setItem(
|
|
46
|
-
"
|
|
46
|
+
"web.auth.token",
|
|
47
47
|
JSON.stringify({
|
|
48
48
|
access_token: "template-access-token",
|
|
49
49
|
token_type: "bearer",
|
|
50
|
-
user_id: "tmpl-
|
|
50
|
+
user_id: "tmpl-web",
|
|
51
51
|
}),
|
|
52
52
|
);
|
|
53
53
|
});
|
|
54
54
|
if (route === "/login") {
|
|
55
55
|
await page.addInitScript(() => {
|
|
56
|
-
window.localStorage.removeItem("
|
|
56
|
+
window.localStorage.removeItem("web.auth.token");
|
|
57
57
|
});
|
|
58
58
|
}
|
|
59
59
|
},
|
|
@@ -3,7 +3,7 @@ import { createContext, useContext, useEffect, useMemo, useState, type ReactNode
|
|
|
3
3
|
import { getMe, login as loginRequest } from "@/auth/auth-client";
|
|
4
4
|
import type { AuthToken, AuthUser, LoginCommand } from "@/auth/types";
|
|
5
5
|
|
|
6
|
-
const STORAGE_KEY = "
|
|
6
|
+
const STORAGE_KEY = "web.auth.token";
|
|
7
7
|
|
|
8
8
|
interface AuthContextValue {
|
|
9
9
|
user: AuthUser | null;
|
package/compose.yml
CHANGED
|
@@ -138,19 +138,19 @@ services:
|
|
|
138
138
|
networks:
|
|
139
139
|
- template-dev
|
|
140
140
|
|
|
141
|
-
client-
|
|
141
|
+
client-web:
|
|
142
142
|
build:
|
|
143
143
|
context: .
|
|
144
|
-
dockerfile: client/
|
|
144
|
+
dockerfile: client/web/Dockerfile.dev
|
|
145
145
|
network: host
|
|
146
146
|
environment:
|
|
147
|
-
PORT: ${
|
|
148
|
-
VITE_API_BASE_URL: ${
|
|
147
|
+
PORT: ${CLIENT_WEB_PORT:-3001}
|
|
148
|
+
VITE_API_BASE_URL: ${CLIENT_WEB_VITE_API_BASE_URL:-http://127.0.0.1:8000/api/v1}
|
|
149
149
|
CHOKIDAR_USEPOLLING: ${CLIENT_WATCH_USE_POLLING:-false}
|
|
150
150
|
ports:
|
|
151
|
-
- "${
|
|
151
|
+
- "${CLIENT_WEB_PORT:-3001}:${CLIENT_WEB_PORT:-3001}"
|
|
152
152
|
volumes:
|
|
153
|
-
- ./client/
|
|
153
|
+
- ./client/web:/app/client/web
|
|
154
154
|
depends_on:
|
|
155
155
|
server:
|
|
156
156
|
condition: service_started
|
|
@@ -15,14 +15,14 @@ DEV_SERVER_MONGODB_URL=mongodb://mongo:27017
|
|
|
15
15
|
DEV_SERVER_MONGODB_DATABASE=template
|
|
16
16
|
DEV_SERVER_JWT_SECRET=change-me
|
|
17
17
|
DEV_SERVER_ACCESS_TOKEN_TTL_MINUTES=120
|
|
18
|
-
DEV_SERVER_CORS_ORIGINS=https://dev-landing.example.com,https://dev-
|
|
18
|
+
DEV_SERVER_CORS_ORIGINS=https://dev-landing.example.com,https://dev-web.example.com,https://dev-mobile.example.com,https://dev-admin.example.com
|
|
19
19
|
|
|
20
20
|
DEV_CLIENT_LANDING_PORT=13000
|
|
21
|
-
|
|
21
|
+
DEV_CLIENT_WEB_PORT=13001
|
|
22
22
|
DEV_CLIENT_MOBILE_PORT=13002
|
|
23
23
|
DEV_CLIENT_ADMIN_PORT=14000
|
|
24
24
|
|
|
25
25
|
DEV_CLIENT_LANDING_VITE_API_BASE_URL=https://dev-api.example.com/api/v1
|
|
26
|
-
|
|
26
|
+
DEV_CLIENT_WEB_VITE_API_BASE_URL=https://dev-api.example.com/api/v1
|
|
27
27
|
DEV_CLIENT_MOBILE_VITE_API_BASE_URL=https://dev-api.example.com/api/v1
|
|
28
28
|
DEV_CLIENT_ADMIN_VITE_API_BASE_URL=https://dev-api.example.com/api/v1
|
|
@@ -16,14 +16,14 @@ PROD_SERVER_MONGODB_URL=mongodb://mongo:27017
|
|
|
16
16
|
PROD_SERVER_MONGODB_DATABASE=template
|
|
17
17
|
PROD_SERVER_JWT_SECRET=change-me
|
|
18
18
|
PROD_SERVER_ACCESS_TOKEN_TTL_MINUTES=120
|
|
19
|
-
PROD_SERVER_CORS_ORIGINS=https://landing.example.com,https://
|
|
19
|
+
PROD_SERVER_CORS_ORIGINS=https://landing.example.com,https://web.example.com,https://mobile.example.com,https://admin.example.com
|
|
20
20
|
|
|
21
21
|
PROD_CLIENT_LANDING_PORT=23000
|
|
22
|
-
|
|
22
|
+
PROD_CLIENT_WEB_PORT=23001
|
|
23
23
|
PROD_CLIENT_MOBILE_PORT=23002
|
|
24
24
|
PROD_CLIENT_ADMIN_PORT=24000
|
|
25
25
|
|
|
26
26
|
PROD_CLIENT_LANDING_VITE_API_BASE_URL=https://api.example.com/api/v1
|
|
27
|
-
|
|
27
|
+
PROD_CLIENT_WEB_VITE_API_BASE_URL=https://api.example.com/api/v1
|
|
28
28
|
PROD_CLIENT_MOBILE_VITE_API_BASE_URL=https://api.example.com/api/v1
|
|
29
29
|
PROD_CLIENT_ADMIN_VITE_API_BASE_URL=https://api.example.com/api/v1
|
package/infra/compose/README.md
CHANGED
|
@@ -30,6 +30,6 @@ docker compose --env-file infra/compose/.env.prod -f infra/compose/prod.yml up -
|
|
|
30
30
|
- `infra/compose/dev.yml`, `infra/compose/prod.yml`은 dedicated host/runtime split이 필요할 때 쓰는 overlay이며, root compose baseline을 대체하는 문서 기준선은 아니다.
|
|
31
31
|
- provider-first canonical delivery split은 `AWS edge/domain -> OpenStack backend compute -> AWS data plane`이고, 세부 구조는 `infra/terraform/README.md`를 기준으로 설명한다.
|
|
32
32
|
- `VITE_API_BASE_URL`은 컨테이너 내부 DNS가 아니라 브라우저가 도달 가능한 API URL이어야 한다.
|
|
33
|
-
- 포트 역할은 root compose baseline과 같은 순서를 따른다: landing,
|
|
33
|
+
- 포트 역할은 root compose baseline과 같은 순서를 따른다: landing, web, mobile, admin, server/http.
|
|
34
34
|
- PROD 웹 앱은 `pnpm build + pnpm preview`로 기동한다.
|
|
35
35
|
- OpenStack에서 자동 배포까지 묶고 싶으면 `infra/terraform/openstack/server` 또는 lower-level `openstack/dev`, `openstack/prod` root를 사용한다.
|
package/infra/compose/dev.yml
CHANGED
|
@@ -65,20 +65,20 @@ services:
|
|
|
65
65
|
networks:
|
|
66
66
|
- templates-dev
|
|
67
67
|
|
|
68
|
-
client-
|
|
68
|
+
client-web:
|
|
69
69
|
build:
|
|
70
70
|
context: ../..
|
|
71
|
-
dockerfile: client/
|
|
72
|
-
container_name: templates-client-
|
|
71
|
+
dockerfile: client/web/Dockerfile
|
|
72
|
+
container_name: templates-client-web-dev
|
|
73
73
|
restart: unless-stopped
|
|
74
74
|
depends_on:
|
|
75
75
|
server:
|
|
76
76
|
condition: service_started
|
|
77
77
|
environment:
|
|
78
|
-
VITE_API_BASE_URL: ${
|
|
78
|
+
VITE_API_BASE_URL: ${DEV_CLIENT_WEB_VITE_API_BASE_URL}
|
|
79
79
|
PORT: 3001
|
|
80
80
|
ports:
|
|
81
|
-
- "${
|
|
81
|
+
- "${DEV_CLIENT_WEB_PORT:-13001}:3001"
|
|
82
82
|
networks:
|
|
83
83
|
- templates-dev
|
|
84
84
|
|
package/infra/compose/prod.yml
CHANGED
|
@@ -43,7 +43,7 @@ services:
|
|
|
43
43
|
MONGODB_DATABASE: ${PROD_SERVER_MONGODB_DATABASE:-template}
|
|
44
44
|
JWT_SECRET: ${PROD_SERVER_JWT_SECRET:-change-me}
|
|
45
45
|
ACCESS_TOKEN_TTL_MINUTES: ${PROD_SERVER_ACCESS_TOKEN_TTL_MINUTES:-120}
|
|
46
|
-
CORS_ORIGINS: ${PROD_SERVER_CORS_ORIGINS:-https://landing.example.com,https://
|
|
46
|
+
CORS_ORIGINS: ${PROD_SERVER_CORS_ORIGINS:-https://landing.example.com,https://web.example.com,https://mobile.example.com,https://admin.example.com}
|
|
47
47
|
ports:
|
|
48
48
|
- "${PROD_SERVER_HTTP_PORT:-28000}:8000"
|
|
49
49
|
networks:
|
|
@@ -66,20 +66,20 @@ services:
|
|
|
66
66
|
networks:
|
|
67
67
|
- templates-prod
|
|
68
68
|
|
|
69
|
-
client-
|
|
69
|
+
client-web:
|
|
70
70
|
build:
|
|
71
71
|
context: ../..
|
|
72
|
-
dockerfile: client/
|
|
73
|
-
container_name: templates-client-
|
|
72
|
+
dockerfile: client/web/Dockerfile
|
|
73
|
+
container_name: templates-client-web-prod
|
|
74
74
|
restart: unless-stopped
|
|
75
75
|
depends_on:
|
|
76
76
|
server:
|
|
77
77
|
condition: service_started
|
|
78
78
|
command: ["sh", "-lc", "pnpm build && pnpm preview --host 0.0.0.0 --port 4301"]
|
|
79
79
|
environment:
|
|
80
|
-
VITE_API_BASE_URL: ${
|
|
80
|
+
VITE_API_BASE_URL: ${PROD_CLIENT_WEB_VITE_API_BASE_URL}
|
|
81
81
|
ports:
|
|
82
|
-
- "${
|
|
82
|
+
- "${PROD_CLIENT_WEB_PORT:-23001}:4301"
|
|
83
83
|
networks:
|
|
84
84
|
- templates-prod
|
|
85
85
|
|