@sduck/sduck-cli 0.1.2 → 0.1.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.
@@ -0,0 +1,5 @@
1
+ # Antigravity Instructions
2
+
3
+ - Follow the repository SDD workflow exactly.
4
+ - Use this workspace rule file together with the shared SDD workflow block.
5
+ - 승인된 spec.md/plan.md를 수정하지 않는다. 요구사항이 바뀌면 새 태스크를 시작한다.
@@ -0,0 +1,19 @@
1
+ 이 프로젝트는 **Spec-Driven Development(SDD)** 워크플로우를 따른다.
2
+ `sduck` CLI가 없으므로 Claude가 직접 파일을 생성하고 상태를 관리한다.
3
+ 워크플로우 구조와 규칙은 `sduck` CLI와 동일하다.
4
+
5
+ ## 절대 규칙
6
+
7
+ 다음 두 가지 승인은 절대 Claude가 직접 처리하지 않는다.
8
+
9
+ - **스펙 승인**은 사용자가 명시적으로 승인해야 한다
10
+ - **플랜 승인**은 사용자가 명시적으로 승인해야 한다
11
+
12
+ 승인 전에는 어떤 코드도 작성하지 않는다.
13
+ 승인된 spec.md/plan.md를 수정하지 않는다. 요구사항이 바뀌면 새 태스크를 시작한다.
14
+
15
+ ## Claude Code Instructions
16
+
17
+ - Follow the repository SDD workflow exactly.
18
+ - Use `CLAUDE.md` as project-level instruction context.
19
+ - Keep plans highly detailed: list exact file paths, likely functions or sections to edit, concrete change intent, and verification commands.
@@ -0,0 +1,19 @@
1
+ 이 프로젝트는 **Spec-Driven Development(SDD)** 워크플로우를 따른다.
2
+ 생성된 `AGENT.md`는 codex 계열 도구가 참고할 project-level instruction context다.
3
+ 워크플로우 구조와 규칙은 `sduck` CLI와 동일하다.
4
+
5
+ ## 절대 규칙
6
+
7
+ 다음 두 가지 승인은 에이전트가 직접 처리하지 않는다.
8
+
9
+ - **스펙 승인**은 사용자가 명시적으로 승인해야 한다
10
+ - **플랜 승인**은 사용자가 명시적으로 승인해야 한다
11
+
12
+ 승인 전에는 어떤 코드도 작성하지 않는다.
13
+ 승인된 spec.md/plan.md를 수정하지 않는다. 요구사항이 바뀌면 새 태스크를 시작한다.
14
+
15
+ ## Codex Instructions
16
+
17
+ - Follow the repository SDD workflow exactly.
18
+ - Use `AGENT.md` as project-level instruction context.
19
+ - Keep plans highly detailed: list exact file paths, likely functions or sections to edit, concrete change intent, and verification commands.
@@ -0,0 +1,94 @@
1
+ # SDD Workflow Rules
2
+
3
+ ## ⚠️ CRITICAL: 상태별 파일 접근 제한
4
+
5
+ - 코드를 작성하기 전에 반드시 `.sduck/sduck-workspace/`의 활성 태스크 `meta.yml`을 읽고 `status`를 확인한다.
6
+ - `IN_PROGRESS` 상태에서만 구현 코드를 작성할 수 있다.
7
+ - 승인된 `spec.md`/`plan.md`는 수정하지 않는다. 요구사항이 바뀌면 새 태스크를 시작한다.
8
+ - `spec.md` 또는 `plan.md`를 작성한 직후라도, 사용자가 승인하기 전까지 구현하지 않는다.
9
+ - "같은 세션"이라는 이유로 승인을 생략하지 않는다.
10
+
11
+ | 상태 | spec.md | plan.md | 구현 파일 |
12
+ |---|---|---|---|
13
+ | PENDING_SPEC_APPROVAL | 허용 | 허용 | 차단 |
14
+ | SPEC_APPROVED | 차단 | 허용 | 차단 |
15
+ | IN_PROGRESS | 차단 | 차단 | 허용 |
16
+ | DONE | 차단 | 차단 | 차단 |
17
+
18
+ ## 디렉토리 구조
19
+
20
+ 에이전트는 아래 경로를 기준으로 `sduck` 상태를 읽고 쓴다.
21
+
22
+ ```text
23
+ 프로젝트 루트/
24
+ ├── .sduck/sduck-assets/
25
+ │ ├── eval/
26
+ │ │ ├── plan.yml
27
+ │ │ ├── spec.yml
28
+ │ │ └── task.yml
29
+ │ ├── types/
30
+ │ │ ├── build.md
31
+ │ │ ├── chore.md
32
+ │ │ ├── feature.md
33
+ │ │ ├── fix.md
34
+ │ │ └── refactor.md
35
+ │ └── agent-rules/
36
+
37
+ └── .sduck/sduck-workspace/
38
+ └── {timestamp}-{type}-{slug}/
39
+ ├── meta.yml
40
+ ├── spec.md
41
+ └── plan.md
42
+ ```
43
+
44
+ ## 세션 시작 시 필수 확인
45
+
46
+ 작업을 시작하기 전에 반드시 아래를 확인한다.
47
+
48
+ 1. `.sduck/sduck-workspace/` 디렉토리가 있는지 확인
49
+ 2. 진행 중인 작업(`IN_PROGRESS`, `PENDING_*`)이 있는지 확인
50
+ 3. 있다면 해당 작업의 `meta.yml`을 읽고 현재 상태를 파악한 뒤 이어서 진행
51
+
52
+ ## 사용자 메모 규칙
53
+
54
+ 사용자가 `spec.md`, `plan.md` 같은 문서의 특정 라인 끝에 `<-` 형식으로 메모를 추가할 수 있다.
55
+
56
+ - `<-` 뒤의 내용은 사용자 메모로 간주한다
57
+ - 에이전트는 문서를 읽을 때 본문과 함께 이 메모도 반드시 반영한다
58
+ - 사용자 메모가 기존 본문과 충돌하면, 사용자 메모를 최신 지시사항으로 우선 해석한다
59
+ - 메모는 가능하면 해당 문장을 수정하거나 정식 섹션에 흡수해 문서 본문에 반영한다
60
+ - 여러 줄에 메모가 흩어져 있어도 무시하지 말고 작업 전 확인한다
61
+
62
+ ## 워크플로우 규칙
63
+
64
+ - Use the shipped CLI commands for workflow operations: `sduck init`, `sduck start <type> <slug>`, `sduck fast-track <type> <slug>`, `sduck spec approve [target]`, and `sduck plan approve [target]`.
65
+ - Do not write implementation code before spec approval.
66
+ - Do not start implementation before plan approval.
67
+ - Follow the workflow order: `spec -> approval -> plan -> approval -> implementation`.
68
+ - Respect `meta.yml` state transitions and update step completion immediately.
69
+ - Write `plan.md` in detailed implementation units: include target files, the functions/sections or rough line ranges to inspect, the exact change intent for each file, and the tests or commands to verify the step.
70
+
71
+ ## fast-track 규칙
72
+
73
+ - `sduck fast-track <type> <slug>`는 `spec.md`를 생략하지 않고 minimal spec + minimal plan을 생성하는 빠른 경로다.
74
+ - fast-track은 반복적이거나 범위가 작고 명확한 작업에서만 사용한다.
75
+ - 범위가 크거나 요구사항이 불확실한 작업에는 fast-track 대신 일반 `start -> spec -> plan` 흐름을 사용한다.
76
+ - fast-track은 사용자 승인 자체를 우회하지 않는다.
77
+ - interactive 환경에서만 확인 1회로 spec/plan 승인을 묶을 수 있다.
78
+ - 비대화형 환경에서는 문서 생성만 수행하고, 이후 `sduck spec approve`, `sduck plan approve`로 이어간다.
79
+
80
+ ## 승인 규칙
81
+
82
+ - 스펙 승인은 반드시 사용자가 직접 승인 의사를 전달해야 한다
83
+ - 플랜 승인도 반드시 사용자가 직접 승인 의사를 전달해야 한다
84
+ - `PENDING_SPEC_APPROVAL` 상태에서는 spec.md 작성/수정만 가능하고 코드 작성은 금지한다
85
+ - `PENDING_PLAN_APPROVAL` 상태에서는 plan.md 작성/수정만 가능하고 코드 작성은 금지한다
86
+ - `IN_PROGRESS` 상태에서만 구현과 step 완료 기록을 진행한다
87
+ - Do not mark a task `DONE` until all completion criteria are satisfied.
88
+
89
+ ## 평가 규칙
90
+
91
+ - spec을 새로 작성하거나 수정한 직후, 반드시 `.sduck/sduck-assets/eval/spec.yml`을 읽고 그 기준으로 자체 평가 점수를 남긴다
92
+ - plan을 새로 작성하거나 수정한 직후, 반드시 `.sduck/sduck-assets/eval/plan.yml`을 읽고 그 기준으로 자체 평가 점수를 남긴다
93
+ - 모든 Step 완료 후 `spec.md`의 완료 조건 체크리스트를 검증하고, `.sduck/sduck-assets/eval/task.yml`을 읽어 task 평가를 수행한다
94
+ - After implementation is complete, run task evaluation, show the results, and only then move to completion processing.
@@ -0,0 +1,12 @@
1
+ ---
2
+ description: sduck SDD workflow rules
3
+ globs:
4
+ - "**/*"
5
+ alwaysApply: true
6
+ ---
7
+
8
+ ## Cursor Instructions
9
+
10
+ - Follow the repository SDD workflow exactly.
11
+ - Use this rule file together with the shared SDD workflow block.
12
+ - 승인된 spec.md/plan.md를 수정하지 않는다. 요구사항이 바뀌면 새 태스크를 시작한다.
@@ -0,0 +1,19 @@
1
+ 이 프로젝트는 **Spec-Driven Development(SDD)** 워크플로우를 따른다.
2
+ `GEMINI.md`는 Gemini CLI가 직접 파일을 생성하고 상태를 관리할 때 참고하는 project-level instruction context다.
3
+ 워크플로우 구조와 규칙은 `sduck` CLI와 동일하다.
4
+
5
+ ## 절대 규칙
6
+
7
+ 다음 두 가지 승인은 절대 에이전트가 직접 처리하지 않는다.
8
+
9
+ - **스펙 승인**은 사용자가 명시적으로 승인해야 한다
10
+ - **플랜 승인**은 사용자가 명시적으로 승인해야 한다
11
+
12
+ 승인 전에는 어떤 코드도 작성하지 않는다.
13
+ 승인된 spec.md/plan.md를 수정하지 않는다. 요구사항이 바뀌면 새 태스크를 시작한다.
14
+
15
+ ## Gemini CLI Instructions
16
+
17
+ - Follow the repository SDD workflow exactly.
18
+ - Use `GEMINI.md` as project-level instruction context.
19
+ - Keep plans highly detailed: list exact file paths, likely functions or sections to edit, concrete change intent, and verification commands.
@@ -0,0 +1,125 @@
1
+ #!/usr/bin/env bash
2
+ # sduck SDD guard hook for Claude Code
3
+ # Enforces the state-based file access matrix via PreToolUse hook.
4
+ # Exit 0 = allow, Exit 2 = block (message sent to Claude via stderr)
5
+
6
+ set -euo pipefail
7
+
8
+ INPUT=$(cat)
9
+
10
+ FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
11
+
12
+ # No file path (e.g. Bash tool) → allow
13
+ if [[ -z "$FILE_PATH" ]]; then
14
+ exit 0
15
+ fi
16
+
17
+ # Resolve relative to cwd
18
+ CWD=$(echo "$INPUT" | jq -r '.cwd // empty')
19
+ if [[ -z "$CWD" ]]; then
20
+ exit 0
21
+ fi
22
+
23
+ # Find sduck workspace
24
+ WORKSPACE_DIR="$CWD/.sduck/sduck-workspace"
25
+ if [[ ! -d "$WORKSPACE_DIR" ]]; then
26
+ exit 0
27
+ fi
28
+
29
+ # Always-allowed paths (relative check)
30
+ REL_PATH="${FILE_PATH#"$CWD"/}"
31
+
32
+ # Always allow: meta.yml, sduck assets, agent rule files, editor configs
33
+ case "$REL_PATH" in
34
+ */meta.yml|.sduck/sduck-assets/*|.sduck/sduck-archive/*|\
35
+ CLAUDE.md|AGENT.md|GEMINI.md|\
36
+ .cursor/*|.agents/*|.claude/*|\
37
+ .serena/*)
38
+ exit 0
39
+ ;;
40
+ esac
41
+
42
+ # Find the most recent active task (non-DONE)
43
+ STATUS=""
44
+ TASK_DIR=""
45
+ for dir in "$WORKSPACE_DIR"/*/; do
46
+ [[ -d "$dir" ]] || continue
47
+ META="$dir/meta.yml"
48
+ [[ -f "$META" ]] || continue
49
+
50
+ TASK_STATUS=$(grep -m1 '^status:' "$META" | sed 's/^status:[[:space:]]*//')
51
+
52
+ case "$TASK_STATUS" in
53
+ PENDING_SPEC_APPROVAL|SPEC_APPROVED|PENDING_PLAN_APPROVAL|IN_PROGRESS)
54
+ STATUS="$TASK_STATUS"
55
+ TASK_DIR="$dir"
56
+ ;;
57
+ DONE)
58
+ # Track DONE as fallback if no active task found
59
+ if [[ -z "$STATUS" ]]; then
60
+ STATUS="DONE"
61
+ TASK_DIR="$dir"
62
+ fi
63
+ ;;
64
+ esac
65
+ done
66
+
67
+ # No task at all → allow
68
+ if [[ -z "$STATUS" ]]; then
69
+ exit 0
70
+ fi
71
+
72
+ # Check if the file is spec.md or plan.md (within the task workspace)
73
+ IS_SPEC=false
74
+ IS_PLAN=false
75
+ case "$REL_PATH" in
76
+ */spec.md|spec.md) IS_SPEC=true ;;
77
+ */plan.md|plan.md) IS_PLAN=true ;;
78
+ esac
79
+
80
+ # Apply the state-based access matrix
81
+ case "$STATUS" in
82
+ PENDING_SPEC_APPROVAL)
83
+ # spec.md, plan.md → allow; implementation files → block
84
+ if $IS_SPEC || $IS_PLAN; then
85
+ exit 0
86
+ fi
87
+ echo "⛔ [sduck] 현재 상태: $STATUS — 스펙 승인 전에는 구현 코드를 작성할 수 없습니다. \`sduck spec approve\`를 먼저 실행하세요." >&2
88
+ exit 2
89
+ ;;
90
+ SPEC_APPROVED|PENDING_PLAN_APPROVAL)
91
+ # plan.md → allow; spec.md, implementation files → block
92
+ if $IS_PLAN; then
93
+ exit 0
94
+ fi
95
+ if $IS_SPEC; then
96
+ echo "⛔ [sduck] 현재 상태: $STATUS — 승인된 스펙은 수정할 수 없습니다. 요구사항이 바뀌었다면 새 태스크를 시작하세요." >&2
97
+ exit 2
98
+ fi
99
+ echo "⛔ [sduck] 현재 상태: $STATUS — 플랜 승인 전에는 구현 코드를 작성할 수 없습니다. \`sduck plan approve\`를 먼저 실행하세요." >&2
100
+ exit 2
101
+ ;;
102
+ IN_PROGRESS)
103
+ # implementation files → allow; spec.md, plan.md → block
104
+ if $IS_SPEC; then
105
+ echo "⛔ [sduck] 현재 상태: IN_PROGRESS — 승인된 스펙은 수정할 수 없습니다. 요구사항이 바뀌었다면 새 태스크를 시작하세요." >&2
106
+ exit 2
107
+ fi
108
+ if $IS_PLAN; then
109
+ echo "⛔ [sduck] 현재 상태: IN_PROGRESS — 승인된 플랜은 수정할 수 없습니다. 요구사항이 바뀌었다면 새 태스크를 시작하세요." >&2
110
+ exit 2
111
+ fi
112
+ exit 0
113
+ ;;
114
+ DONE)
115
+ # everything blocked except always-allowed paths (already handled above)
116
+ if $IS_SPEC || $IS_PLAN; then
117
+ echo "⛔ [sduck] 현재 상태: DONE — 완료된 태스크의 문서는 수정할 수 없습니다. \`sduck start\`로 새 태스크를 시작하세요." >&2
118
+ exit 2
119
+ fi
120
+ echo "⛔ [sduck] 현재 상태: DONE — 새 코드를 작성하려면 \`sduck start\`로 새 태스크를 시작하세요." >&2
121
+ exit 2
122
+ ;;
123
+ esac
124
+
125
+ exit 0
@@ -0,0 +1,19 @@
1
+ 이 프로젝트는 **Spec-Driven Development(SDD)** 워크플로우를 따른다.
2
+ `sduck` CLI가 없으므로 opencode가 직접 파일을 생성하고 상태를 관리한다.
3
+ 워크플로우 구조와 규칙은 `sduck` CLI와 동일하다.
4
+
5
+ ## 절대 규칙
6
+
7
+ 다음 두 가지 승인은 절대 opencode가 직접 처리하지 않는다.
8
+
9
+ - **스펙 승인**은 사용자가 명시적으로 승인해야 한다
10
+ - **플랜 승인**은 사용자가 명시적으로 승인해야 한다
11
+
12
+ 승인 전에는 어떤 코드도 작성하지 않는다.
13
+ 승인된 spec.md/plan.md를 수정하지 않는다. 요구사항이 바뀌면 새 태스크를 시작한다.
14
+
15
+ ## OpenCode Instructions
16
+
17
+ - Follow the repository SDD workflow exactly.
18
+ - Use `AGENT.md` as project-level instruction context.
19
+ - Keep plans highly detailed: list exact file paths, likely functions or sections to edit, concrete change intent, and verification commands.
@@ -0,0 +1,31 @@
1
+ version: 1
2
+
3
+ plan_evaluation:
4
+ scale:
5
+ min: 1
6
+ max: 5
7
+
8
+ criteria:
9
+ - key: semantic_clarity
10
+ label: semantic clarity
11
+ question: 의미가 분명한가
12
+
13
+ - key: abstraction
14
+ label: abstraction
15
+ question: 추상화 수준이 적절한가
16
+
17
+ - key: typing
18
+ label: typing
19
+ question: 타입 안정성을 충분히 고려했는가
20
+
21
+ - key: security
22
+ label: security
23
+ question: 보안상 문제 가능성을 줄였는가
24
+
25
+ - key: maintainability
26
+ label: maintainability
27
+ question: 유지보수하기 쉬운 구조인가
28
+
29
+ - key: testability
30
+ label: testability
31
+ question: 테스트하기 쉬운가
@@ -0,0 +1,31 @@
1
+ version: 1
2
+
3
+ spec_evaluation:
4
+ scale:
5
+ min: 1
6
+ max: 5
7
+
8
+ criteria:
9
+ - key: problem_clarity
10
+ label: problem clarity
11
+ question: 문제와 목표가 분명한가
12
+
13
+ - key: scope_definition
14
+ label: scope definition
15
+ question: 범위와 제외 범위가 명확한가
16
+
17
+ - key: completion_criteria
18
+ label: completion criteria
19
+ question: 완료 조건이 검증 가능하게 정의되었는가
20
+
21
+ - key: feasibility
22
+ label: feasibility
23
+ question: 현재 시스템 기준으로 실행 가능한가
24
+
25
+ - key: risk_coverage
26
+ label: risk coverage
27
+ question: 엣지 케이스와 영향 범위를 충분히 고려했는가
28
+
29
+ - key: testability
30
+ label: testability
31
+ question: 테스트 및 검증 방법이 드러나는가
@@ -0,0 +1,31 @@
1
+ version: 1
2
+
3
+ task_evaluation:
4
+ scale:
5
+ min: 1
6
+ max: 5
7
+
8
+ criteria:
9
+ - key: spec_alignment
10
+ label: spec alignment
11
+ question: 구현 결과가 승인된 spec과 일치하는가
12
+
13
+ - key: plan_alignment
14
+ label: plan alignment
15
+ question: 구현 결과가 승인된 plan의 단계와 의도를 충실히 반영하는가
16
+
17
+ - key: implementation_quality
18
+ label: implementation quality
19
+ question: 구현 품질과 구조가 충분히 명확하고 견고한가
20
+
21
+ - key: test_completeness
22
+ label: test completeness
23
+ question: 테스트가 핵심 동작과 회귀 위험을 충분히 검증하는가
24
+
25
+ - key: documentation_quality
26
+ label: documentation quality
27
+ question: 필요한 문서와 사용 흐름이 구현과 일치하게 정리되었는가
28
+
29
+ - key: maintainability
30
+ label: maintainability
31
+ question: 이후 수정과 확장이 쉬운 상태로 정리되었는가
@@ -0,0 +1,194 @@
1
+ # [build] {프로젝트명} — 프로젝트 초기 설정
2
+
3
+ > **작업 타입:** `build` (Project Init/Build)
4
+ > **작성자:**
5
+ > **작성일:** YYYY-MM-DD
6
+ > **연관 티켓:**
7
+
8
+ ---
9
+
10
+ ## 1. 프로젝트 개요
11
+
12
+ ### 목적 및 배경
13
+
14
+ <!-- 이 프로젝트가 왜 존재하는지, 어떤 문제를 해결하는지 서술 -->
15
+
16
+ ### 핵심 목표
17
+
18
+ <!-- 이 빌드 작업을 통해 달성하고자 하는 구체적인 결과물을 나열 -->
19
+
20
+ - [ ]
21
+ - [ ]
22
+ - [ ]
23
+
24
+ ---
25
+
26
+ ## 2. 기술 스택
27
+
28
+ | 구분 | 선택 | 버전 | 선택 이유 |
29
+ | ------------------- | ---- | ---- | --------- |
30
+ | 언어 | | | |
31
+ | 런타임 | | | |
32
+ | 프레임워크 | | | |
33
+ | DB | | | |
34
+ | ORM / Query Builder | | | |
35
+ | 상태 관리 | | | |
36
+ | 테스트 프레임워크 | | | |
37
+ | CI/CD | | | |
38
+ | 컨테이너 | | | |
39
+
40
+ ---
41
+
42
+ ## 3. 아키텍처
43
+
44
+ ### 전체 구조
45
+
46
+ <!-- 디렉토리 구조 및 레이어 분리 방식 기술 (예: Clean Architecture, MVC 등) -->
47
+
48
+ ```
49
+ {project-root}/
50
+ ├── src/
51
+ │ ├── ...
52
+ ├── tests/
53
+ │ ├── ...
54
+ └── ...
55
+ ```
56
+
57
+ ### 계층 및 의존성 규칙
58
+
59
+ <!-- 각 계층(Layer)의 역할과 의존 방향을 명시 -->
60
+
61
+ ---
62
+
63
+ ## 4. 코드 컨벤션
64
+
65
+ ### 네이밍 규칙
66
+
67
+ | 대상 | 규칙 | 예시 |
68
+ | ----------------- | ---- | ---- |
69
+ | 파일명 | | |
70
+ | 클래스 / 컴포넌트 | | |
71
+ | 함수 / 메서드 | | |
72
+ | 변수 | | |
73
+ | 상수 | | |
74
+ | 타입 / 인터페이스 | | |
75
+
76
+ ### 포맷팅
77
+
78
+ <!-- 들여쓰기, 줄 길이, 세미콜론 등 -->
79
+
80
+ - 들여쓰기:
81
+ - 최대 줄 길이:
82
+ - 기타:
83
+
84
+ ---
85
+
86
+ ## 5. 린팅 및 타입 검사
87
+
88
+ | 도구 | 설정 파일 | 주요 규칙 |
89
+ | ------------ | --------- | --------- |
90
+ | Linter | | |
91
+ | Formatter | | |
92
+ | Type Checker | | |
93
+
94
+ ```
95
+ <!-- 핵심 설정 값 또는 extends/plugins 목록 -->
96
+ ```
97
+
98
+ ---
99
+
100
+ ## 6. 테스트 전략
101
+
102
+ ### 목표 커버리지
103
+
104
+ - 전체: **80%** 이상 (기본값)
105
+ - 비즈니스 로직 (Unit): **%** 이상
106
+ - API / 통합 (Integration): **%** 이상
107
+
108
+ ### 테스트 레벨별 전략
109
+
110
+ | 레벨 | 도구 | 대상 범위 | 비고 |
111
+ | ----------- | ---- | --------- | ---- |
112
+ | Unit | | | |
113
+ | Integration | | | |
114
+ | E2E | | | |
115
+
116
+ ---
117
+
118
+ ## 7. 환경 구성
119
+
120
+ ### 환경 목록
121
+
122
+ | 환경 | 목적 | 배포 방식 |
123
+ | ------------ | ----------- | --------- |
124
+ | `local` | 개발자 로컬 | 수동 |
125
+ | `dev` | 통합 개발 | CI 자동 |
126
+ | `staging` | QA / 검증 | 수동 승인 |
127
+ | `production` | 운영 | 수동 승인 |
128
+
129
+ ### 환경 변수
130
+
131
+ ```
132
+ # 필수 환경 변수 목록 (값 제외, 키만 명시)
133
+ APP_ENV=
134
+ DATABASE_URL=
135
+ SECRET_KEY=
136
+ ```
137
+
138
+ ---
139
+
140
+ ## 8. Git 전략
141
+
142
+ ### 브랜치 모델
143
+
144
+ <!-- 예: Git Flow / GitHub Flow / Trunk-based 중 선택 및 이유 -->
145
+
146
+ ### 커밋 메시지 컨벤션
147
+
148
+ ```
149
+ <type>(<scope>): <subject>
150
+
151
+ 예) feat(auth): add JWT refresh token logic
152
+ fix(api): resolve null pointer on user fetch
153
+ ```
154
+
155
+ ### PR / MR 규칙
156
+
157
+ - 최소 리뷰어 수:
158
+ - 머지 방식: (Squash / Rebase / Merge Commit)
159
+
160
+ ---
161
+
162
+ ## 9. CI/CD 파이프라인
163
+
164
+ ```
165
+ Push → Lint & Type Check → Unit Test → Build → (Integration Test) → Deploy
166
+ ```
167
+
168
+ - **Lint / Type Check:** 실패 시 파이프라인 즉시 중단
169
+ - **테스트 커버리지 임계값:** 미달 시 배포 차단
170
+
171
+ ---
172
+
173
+ ## 10. 제약 조건 및 비기능 요구사항
174
+
175
+ | 항목 | 요구사항 | 측정 기준 |
176
+ | ----------------------- | -------- | --------- |
177
+ | 성능 | | |
178
+ | 보안 | | |
179
+ | 접근성 | | |
180
+ | 브라우저 / OS 지원 범위 | | |
181
+
182
+ ---
183
+
184
+ ## 11. 미결 사항 (Open Questions)
185
+
186
+ <!-- 아직 결정되지 않았거나 추가 논의가 필요한 항목 -->
187
+
188
+ - [ ]
189
+
190
+ ---
191
+
192
+ ## 12. 참고 자료
193
+
194
+ -