@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.
- package/.sduck/sduck-assets/agent-rules/antigravity.md +5 -0
- package/.sduck/sduck-assets/agent-rules/claude-code.md +19 -0
- package/.sduck/sduck-assets/agent-rules/codex.md +19 -0
- package/.sduck/sduck-assets/agent-rules/core.md +94 -0
- package/.sduck/sduck-assets/agent-rules/cursor.mdc +12 -0
- package/.sduck/sduck-assets/agent-rules/gemini-cli.md +19 -0
- package/.sduck/sduck-assets/agent-rules/hooks/sdd-guard.sh +125 -0
- package/.sduck/sduck-assets/agent-rules/opencode.md +19 -0
- package/.sduck/sduck-assets/eval/plan.yml +31 -0
- package/.sduck/sduck-assets/eval/spec.yml +31 -0
- package/.sduck/sduck-assets/eval/task.yml +31 -0
- package/.sduck/sduck-assets/types/build.md +194 -0
- package/.sduck/sduck-assets/types/chore.md +164 -0
- package/.sduck/sduck-assets/types/feature.md +187 -0
- package/.sduck/sduck-assets/types/fix.md +174 -0
- package/.sduck/sduck-assets/types/refactor.md +174 -0
- package/README.md +106 -2
- package/dist/cli.js +267 -73
- package/dist/cli.js.map +1 -1
- package/package.json +2 -2
|
@@ -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
|
+
-
|