@simplysm/sd-claude 14.0.46 → 14.0.48
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/references/sd-simplysm14/sd-claude/usage.md → README.md} +2 -2
- package/claude/rules/sd-claude-rules.md +27 -9
- package/claude/rules/sd-options.md +11 -6
- package/claude/sd-subagent-start.sh +6 -0
- package/claude/settings.json +1 -12
- package/claude/skills/sd-check/SKILL.md +18 -9
- package/claude/skills/sd-claude-docs/SKILL.md +29 -58
- package/claude/skills/sd-claude-docs/references/package-claudemd.md +12 -0
- package/claude/skills/sd-claude-docs/references/package-doc-gen.md +22 -12
- package/claude/skills/sd-debug/SKILL.md +5 -3
- package/claude/skills/sd-deliverable/SKILL.md +0 -1
- package/claude/skills/sd-dev/SKILL.md +14 -9
- package/claude/skills/sd-doc-extract/SKILL.md +7 -9
- package/claude/skills/sd-doc-extract/_common.py +8 -1
- package/claude/skills/sd-doc-extract/_extract_docx.py +74 -34
- package/claude/skills/sd-doc-extract/_extract_pdf.py +12 -1
- package/claude/skills/sd-doc-extract/_extract_pptx.py +103 -23
- package/claude/skills/sd-doc-extract/_extract_xlsb.py +93 -4
- package/claude/skills/sd-doc-extract/_extract_xlsx.py +98 -36
- package/claude/skills/sd-doc-extract/extract.py +22 -3
- package/claude/skills/sd-inner-clarify/SKILL.md +78 -0
- package/claude/skills/sd-inner-debug/SKILL.md +1 -1
- package/claude/skills/sd-inner-review/SKILL.md +13 -0
- package/claude/skills/sd-plan/SKILL.md +50 -17
- package/claude/skills/sd-prompt/SKILL.md +180 -178
- package/claude/skills/sd-prompt/references/eval-runner.md +5 -31
- package/claude/skills/sd-prompt/references/sd-eval-env-template.md +23 -0
- package/claude/skills/sd-refactor/SKILL.md +2 -2
- package/claude/skills/sd-tdd/SKILL.md +46 -10
- package/claude/skills/sd-use/SKILL.md +84 -80
- package/claude/skills/sd-wbs/SKILL.md +85 -27
- package/{claude/references/sd-simplysm14/sd-claude/docs → docs}/assets.md +2 -3
- package/{claude/references/sd-simplysm14/sd-claude/docs → docs}/hooks.md +7 -6
- package/{claude/references/sd-simplysm14/sd-claude/docs → docs}/scripts.md +1 -9
- package/package.json +3 -2
- package/scripts/sync.mjs +4 -2
- package/claude/references/sd-simplysm14/angular/docs/bootstrap.md +0 -48
- package/claude/references/sd-simplysm14/angular/docs/directives.md +0 -236
- package/claude/references/sd-simplysm14/angular/docs/features.md +0 -379
- package/claude/references/sd-simplysm14/angular/docs/pipes.md +0 -32
- package/claude/references/sd-simplysm14/angular/docs/plugins.md +0 -37
- package/claude/references/sd-simplysm14/angular/docs/provider-types.md +0 -283
- package/claude/references/sd-simplysm14/angular/docs/providers.md +0 -370
- package/claude/references/sd-simplysm14/angular/docs/styling.md +0 -222
- package/claude/references/sd-simplysm14/angular/docs/type-utilities.md +0 -250
- package/claude/references/sd-simplysm14/angular/docs/ui-data.md +0 -275
- package/claude/references/sd-simplysm14/angular/docs/ui-form.md +0 -490
- package/claude/references/sd-simplysm14/angular/docs/ui-layout.md +0 -140
- package/claude/references/sd-simplysm14/angular/docs/ui-navigation.md +0 -241
- package/claude/references/sd-simplysm14/angular/docs/ui-overlay.md +0 -157
- package/claude/references/sd-simplysm14/angular/docs/ui-visual.md +0 -127
- package/claude/references/sd-simplysm14/angular/docs/utils.md +0 -295
- package/claude/references/sd-simplysm14/angular/usage.md +0 -489
- package/claude/references/sd-simplysm14/capacitor-plugin-auto-update/usage.md +0 -182
- package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/file-operations.md +0 -154
- package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/permissions.md +0 -84
- package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/storage-paths.md +0 -107
- package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/types.md +0 -83
- package/claude/references/sd-simplysm14/capacitor-plugin-file-system/usage.md +0 -133
- package/claude/references/sd-simplysm14/capacitor-plugin-intent/usage.md +0 -203
- package/claude/references/sd-simplysm14/capacitor-plugin-usb-storage/usage.md +0 -258
- package/claude/references/sd-simplysm14/core-browser/usage.md +0 -306
- package/claude/references/sd-simplysm14/core-common/docs/errors.md +0 -82
- package/claude/references/sd-simplysm14/core-common/docs/extensions.md +0 -167
- package/claude/references/sd-simplysm14/core-common/docs/features.md +0 -136
- package/claude/references/sd-simplysm14/core-common/docs/types.md +0 -245
- package/claude/references/sd-simplysm14/core-common/docs/utils.md +0 -591
- package/claude/references/sd-simplysm14/core-common/usage.md +0 -255
- package/claude/references/sd-simplysm14/core-node/docs/child-process.md +0 -182
- package/claude/references/sd-simplysm14/core-node/docs/features.md +0 -214
- package/claude/references/sd-simplysm14/core-node/docs/file-system.md +0 -509
- package/claude/references/sd-simplysm14/core-node/docs/file-watching.md +0 -139
- package/claude/references/sd-simplysm14/core-node/docs/logging.md +0 -180
- package/claude/references/sd-simplysm14/core-node/docs/path.md +0 -176
- package/claude/references/sd-simplysm14/core-node/docs/utilities-cpx.md +0 -194
- package/claude/references/sd-simplysm14/core-node/docs/utilities-fsx.md +0 -469
- package/claude/references/sd-simplysm14/core-node/docs/utilities-pathx.md +0 -151
- package/claude/references/sd-simplysm14/core-node/docs/worker-threads.md +0 -334
- package/claude/references/sd-simplysm14/core-node/docs/worker.md +0 -205
- package/claude/references/sd-simplysm14/core-node/usage.md +0 -259
- package/claude/references/sd-simplysm14/excel/docs/core-classes.md +0 -443
- package/claude/references/sd-simplysm14/excel/docs/types.md +0 -455
- package/claude/references/sd-simplysm14/excel/docs/utilities.md +0 -194
- package/claude/references/sd-simplysm14/excel/docs/wrapper.md +0 -73
- package/claude/references/sd-simplysm14/excel/usage.md +0 -134
- package/claude/references/sd-simplysm14/lint/usage.md +0 -130
- package/claude/references/sd-simplysm14/orm-common/docs/core.md +0 -188
- package/claude/references/sd-simplysm14/orm-common/docs/expression.md +0 -190
- package/claude/references/sd-simplysm14/orm-common/docs/models.md +0 -17
- package/claude/references/sd-simplysm14/orm-common/docs/query-builder.md +0 -97
- package/claude/references/sd-simplysm14/orm-common/docs/queryable-executable.md +0 -250
- package/claude/references/sd-simplysm14/orm-common/docs/schema-builders.md +0 -364
- package/claude/references/sd-simplysm14/orm-common/docs/types.md +0 -522
- package/claude/references/sd-simplysm14/orm-common/usage.md +0 -229
- package/claude/references/sd-simplysm14/orm-node/docs/connections.md +0 -137
- package/claude/references/sd-simplysm14/orm-node/docs/core.md +0 -131
- package/claude/references/sd-simplysm14/orm-node/docs/types.md +0 -173
- package/claude/references/sd-simplysm14/orm-node/usage.md +0 -143
- package/claude/references/sd-simplysm14/sd-cli/usage.md +0 -782
- package/claude/references/sd-simplysm14/service-client/docs/features.md +0 -217
- package/claude/references/sd-simplysm14/service-client/docs/main.md +0 -148
- package/claude/references/sd-simplysm14/service-client/docs/protocol.md +0 -53
- package/claude/references/sd-simplysm14/service-client/docs/transport.md +0 -131
- package/claude/references/sd-simplysm14/service-client/docs/types.md +0 -129
- package/claude/references/sd-simplysm14/service-client/usage.md +0 -202
- package/claude/references/sd-simplysm14/service-common/docs/app-structure.md +0 -175
- package/claude/references/sd-simplysm14/service-common/docs/events.md +0 -64
- package/claude/references/sd-simplysm14/service-common/docs/protocol.md +0 -331
- package/claude/references/sd-simplysm14/service-common/docs/service-types.md +0 -90
- package/claude/references/sd-simplysm14/service-common/docs/types.md +0 -19
- package/claude/references/sd-simplysm14/service-common/usage.md +0 -154
- package/claude/references/sd-simplysm14/service-server/docs/auth.md +0 -64
- package/claude/references/sd-simplysm14/service-server/docs/core.md +0 -174
- package/claude/references/sd-simplysm14/service-server/docs/legacy.md +0 -25
- package/claude/references/sd-simplysm14/service-server/docs/main.md +0 -88
- package/claude/references/sd-simplysm14/service-server/docs/protocol.md +0 -33
- package/claude/references/sd-simplysm14/service-server/docs/services.md +0 -94
- package/claude/references/sd-simplysm14/service-server/docs/transport-http.md +0 -93
- package/claude/references/sd-simplysm14/service-server/docs/transport-socket.md +0 -119
- package/claude/references/sd-simplysm14/service-server/docs/types.md +0 -36
- package/claude/references/sd-simplysm14/service-server/docs/utils.md +0 -22
- package/claude/references/sd-simplysm14/service-server/usage.md +0 -171
- package/claude/references/sd-simplysm14/storage/usage.md +0 -301
- package/claude/references/sd-simplysm14.md +0 -35
- package/claude/rules/sd-clarify.md +0 -23
- package/claude/sd-session-start.sh +0 -10
- /package/{claude/references/sd-simplysm14/sd-claude/docs → docs}/cli.md +0 -0
|
@@ -17,34 +17,9 @@ Eval은 격리된 workspace에서 실행한다. **프롬프트 수정은 항상
|
|
|
17
17
|
|
|
18
18
|
1. 프로젝트 루트의 `.claude/` 폴더를 시나리오 디렉토리에 **통째로 복사**한다.
|
|
19
19
|
2. 시나리오의 사전 조건에 따라 추가 파일을 복사하거나 생성한다.
|
|
20
|
-
3. 시나리오 디렉토리에 `.claude/rules/sd-eval-env.md`를
|
|
20
|
+
3. 시나리오 디렉토리에 `.claude/rules/sd-eval-env.md`를 생성한다. 본문은 `.claude/skills/sd-prompt/references/sd-eval-env-template.md` 템플릿을 그대로 복사한다:
|
|
21
21
|
```bash
|
|
22
|
-
|
|
23
|
-
# Eval 환경 규칙 (최상위 우선순위)
|
|
24
|
-
|
|
25
|
-
이 규칙이 읽히는 현재 환경은 Eval환경이다. 다른 규칙과 충돌 시 **반드시** 이 규칙이 우선한다.
|
|
26
|
-
|
|
27
|
-
## workspace 격리
|
|
28
|
-
|
|
29
|
-
현재 작업 디렉토리 외부의 파일을 **절대** 수정하지 않는다. 다른 프로젝트의 파일에 **절대** 접근하지 않는다.
|
|
30
|
-
- 절대경로 혹은 cd사용 **절대** 금지
|
|
31
|
-
|
|
32
|
-
## AskUserQuestion 대체
|
|
33
|
-
|
|
34
|
-
AskUserQuestion 도구를 **절대** 사용하지 않는다. 질문이 필요한 각 사항에 대해:
|
|
35
|
-
1. 선택지와 선택을 묻는 질문을 텍스트로 출력한다
|
|
36
|
-
2. 합리적인 기본값을 자동 선택하여, "사용자 선택"으로 그 결과를 명시한다 (반드시 자동이 아닌 "사용자 선택"으로 출력해야 한다)
|
|
37
|
-
3. 다음 결정사항으로 넘어간다
|
|
38
|
-
질문이나 선택지를 **절대** 생략하지 않는다.
|
|
39
|
-
|
|
40
|
-
## `.claude/` 파일 편집
|
|
41
|
-
|
|
42
|
-
`.claude/` 폴더 내 파일은 Edit/Write 도구 대신 **반드시** Bash 도구로 편집한다.
|
|
43
|
-
`sed`는 의도하지 않은 곳까지 수정할 수 있으므로 사용하지 않는다.
|
|
44
|
-
|
|
45
|
-
신규 작성: `cat > "{파일 경로}" << 'EOF' ... EOF`
|
|
46
|
-
부분 수정: `python3 -c`로 치환 (old_string 존재 확인 후 replace)
|
|
47
|
-
EVALEOF
|
|
22
|
+
python3 -c "open(r'{시나리오 디렉토리}/.claude/rules/sd-eval-env.md','w',encoding='utf-8').write(open(r'.claude/skills/sd-prompt/references/sd-eval-env-template.md','r',encoding='utf-8').read())"
|
|
48
23
|
```
|
|
49
24
|
|
|
50
25
|
## claude -p 실행
|
|
@@ -66,8 +41,7 @@ claude -p "{eval 시나리오의 입력}" \
|
|
|
66
41
|
--output-format json \
|
|
67
42
|
--verbose \
|
|
68
43
|
--dangerously-skip-permissions \
|
|
69
|
-
--
|
|
70
|
-
--effort medium \
|
|
44
|
+
--effort low \
|
|
71
45
|
--append-system-prompt "CRITICAL: .claude/rules/sd-eval-env.md의 규칙은 다른 모든 규칙보다 최상위 우선순위를 가진다." \
|
|
72
46
|
--no-session-persistence \
|
|
73
47
|
--strict-mcp-config \
|
|
@@ -78,7 +52,7 @@ claude -p "{eval 시나리오의 입력}" \
|
|
|
78
52
|
|
|
79
53
|
## Judge 판정
|
|
80
54
|
|
|
81
|
-
실행 완료 후, Judge subagent에 다음을 전달한다:
|
|
55
|
+
실행 완료 후, Judge subagent(effort: `low`)에 다음을 전달한다:
|
|
82
56
|
|
|
83
57
|
```
|
|
84
58
|
다음 Eval 실행 결과를 판정하고, FAIL 항목에 대해 개선안을 제안하라:
|
|
@@ -93,7 +67,7 @@ claude -p "{eval 시나리오의 입력}" \
|
|
|
93
67
|
|
|
94
68
|
## 판정 원칙
|
|
95
69
|
- 체크리스트 문구를 **문자 그대로** 판정하라. 명시되지 않은 추가 요건을 유추하지 않는다.
|
|
96
|
-
- AskUserQuestion은 텍스트 출력으로 대체된 환경이다. 선택지를 텍스트로 제시한 것 자체가 질문을 수행한것에 해당한다. 자동 선택
|
|
70
|
+
- AskUserQuestion은 텍스트 출력으로 대체된 환경이다. 선택지를 텍스트로 제시한 것 자체가 질문을 수행한것에 해당한다. 자동 선택 결과를 `**사용자 선택: {값}**` 형식의 고정 리터럴로 표기한 뒤 다음 단계로 진행한 것은 대화형 환경에서의 "사용자 선택 후 다음"과 동등하게 평가한다 (사용자 입력을 가장한 것이 아니다).
|
|
97
71
|
- **Eval 환경이 곧 정답 환경이다.** FAIL의 원인 "프롬프트" 혹은 "Eval 체크리스트" 문제이다. 환경의 문제일 수는 없다.
|
|
98
72
|
|
|
99
73
|
## 절차
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Eval 환경 규칙 (최상위 우선순위)
|
|
2
|
+
|
|
3
|
+
이 규칙이 읽히는 현재 환경은 Eval환경이다. 다른 규칙과 충돌 시 **반드시** 이 규칙이 우선한다.
|
|
4
|
+
|
|
5
|
+
## workspace 격리
|
|
6
|
+
|
|
7
|
+
현재 작업 디렉토리 외부의 파일을 **절대** 수정하지 않는다. 다른 프로젝트의 파일에 **절대** 접근하지 않는다.
|
|
8
|
+
- 절대경로 혹은 cd사용 **절대** 금지
|
|
9
|
+
|
|
10
|
+
## AskUserQuestion 대체
|
|
11
|
+
|
|
12
|
+
AskUserQuestion 도구를 **절대** 사용하지 않는다. 질문이 필요한 각 사항에 대해:
|
|
13
|
+
1. 선택지와 선택을 묻는 질문을 텍스트로 출력한다
|
|
14
|
+
2. 합리적인 기본값을 자동 선택한 뒤, `**사용자 선택: {값}**` 형식의 **고정 리터럴 표기**로 출력한다. 이는 실제 사용자 입력을 가장하는 것이 아니라, 대화형 환경에서 "사용자가 해당 값을 골라 다음으로 진행"한 상태와 동등함을 나타내는 Eval 전용 약속 표기이다
|
|
15
|
+
3. 다음 결정사항으로 넘어간다
|
|
16
|
+
질문이나 선택지를 **절대** 생략하지 않는다.
|
|
17
|
+
|
|
18
|
+
## `.claude/` 파일 편집
|
|
19
|
+
|
|
20
|
+
`.claude/` 폴더 내 파일은 Edit/Write 도구 대신 **반드시** Bash 도구로 편집한다.
|
|
21
|
+
`sed`는 의도하지 않은 곳까지 수정할 수 있으므로 사용하지 않는다.
|
|
22
|
+
|
|
23
|
+
신규 작성/부분 수정 모두: Bash 내에서 `python -c`로 `open(..., 'w').write(...)` 사용
|
|
@@ -16,7 +16,7 @@ sd-refactor는 "구조 개선 방향 제안"(패키지/아키텍처 수준)에
|
|
|
16
16
|
- **린터/타입체커 영역**: 타입 누락, `any` 사용, 미사용 변수, 코드 스타일
|
|
17
17
|
- **거짓 양성**: 프레임워크가 요구하는 패턴, 프로젝트 컨벤션에 의한 의도적 구조
|
|
18
18
|
|
|
19
|
-
이슈가 의도된 설계인지 불확실하거나, 제안이 기존 기능의 동작 변경을 수반하는 경우
|
|
19
|
+
이슈가 의도된 설계인지 불확실하거나, 제안이 기존 기능의 동작 변경을 수반하는 경우 `/sd-inner-clarify` 스킬을 호출하여 명확화한다. 사용자 확인 없이 기능 변경을 리포트에 포함하지 않는다.
|
|
20
20
|
|
|
21
21
|
## Step 1: 대상 결정
|
|
22
22
|
|
|
@@ -95,7 +95,7 @@ Step 3에서 탐지된 이슈를 사용자에게 제시하기 전에 거짓 양
|
|
|
95
95
|
각 이슈에 대해:
|
|
96
96
|
1. **코드 재대조**: 해당 위치의 코드를 Read 도구로 **반드시 다시 읽고**, 이슈가 실제로 존재하는지 확인한다. 거짓 양성으로 판단된 이슈는 제거한다.
|
|
97
97
|
2. **중복 이슈 병합**: 동일 근본 원인에서 파생된 이슈를 하나로 병합한다.
|
|
98
|
-
3. **명확화 판단**: 코드 주석·변수명 등에 의도적 설계를 시사하는 표현("의도적", "팀 규칙", "컨벤션" 등)이 있는 경우, 해당 이슈를 제외하기 전에 반드시
|
|
98
|
+
3. **명확화 판단**: 코드 주석·변수명 등에 의도적 설계를 시사하는 표현("의도적", "팀 규칙", "컨벤션" 등)이 있는 경우, 해당 이슈를 제외하기 전에 반드시 `/sd-inner-clarify` 스킬을 호출하여 분류를 수행한다. 코드 주석만으로는 VERIFIED가 아니며, CLAUDE.md나 공식 문서에 근거가 없으면 INFERRED Medium 이하로 분류한다.
|
|
99
99
|
|
|
100
100
|
검증을 통과한 이슈만 Step 5로 진행한다.
|
|
101
101
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sd-tdd
|
|
3
3
|
description: 구현계획(plan) 기반으로 TDD 개발하는 스킬. "TDD 개발", "테스트 주도 개발", "plan 기반 구현" 등을 요청할 때 사용한다.
|
|
4
|
+
effort: low
|
|
4
5
|
---
|
|
5
6
|
|
|
6
7
|
# sd-tdd: TDD 개발
|
|
@@ -102,22 +103,41 @@ Feature 문서의 `## 참조 자료` 섹션 및 그 하위섹션을 반드시
|
|
|
102
103
|
|
|
103
104
|
- wbs.md의 참조 자료 섹션도 모두 읽는다. 참조 자료의 구체적 정보(업무 규칙, 데이터 형식, 기술 제약 등)를 구현에 반영한다.
|
|
104
105
|
|
|
105
|
-
### 1-2.
|
|
106
|
+
### 1-2. 기준 코드 탐색·확인
|
|
106
107
|
|
|
107
|
-
|
|
108
|
+
**CRITICAL: 코드가 source of truth이다.** 문서가 아닌 실제 코드를 기준으로 파악한다.
|
|
109
|
+
**CRITICAL: 탐색 없이 코드 작성으로 넘어가는 것은 위반이다.**
|
|
108
110
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
-
|
|
112
|
-
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
111
|
+
#### (a) Feature 문서의 `## 기준 코드` 섹션 활용
|
|
112
|
+
|
|
113
|
+
- `## 기준 코드` 섹션이 있으면, 인용된 **모든 파일을 Read 도구로 직접 읽는다**. 요약만 보고 넘어가지 않는다.
|
|
114
|
+
- 인용 라인 주변 컨텍스트(±20줄 권장)를 함께 읽어 패턴의 전체 형태를 파악한다.
|
|
115
|
+
|
|
116
|
+
#### (b) 섹션이 없거나 부실할 때 — 직접 탐색
|
|
117
|
+
|
|
118
|
+
sd-plan Step 4 절차를 그대로 수행한다:
|
|
119
|
+
|
|
120
|
+
- 코드베이스에서 이 Feature와 가장 유사한 기존 기능을 찾는다.
|
|
121
|
+
- 탐색 대상: 관련 엔티티/모델, 기존 API 엔드포인트 및 패턴, 사용 중인 프레임워크·아키텍처, 기존 시스템 연동 방식, 성능/보안 제약, 관련 테스트 구조, 관련 의존성과 설정.
|
|
122
|
+
- 발견한 항목을 `파일경로:라인번호` 인용과 함께 작업 메모로 정리한다. 인용 없는 항목은 신뢰하지 않는다.
|
|
123
|
+
|
|
124
|
+
#### (c) 패턴 메모 정리
|
|
125
|
+
|
|
126
|
+
다음 관점에서 이번 Feature 구현 시 따를 패턴을 명시적으로 적어둔다:
|
|
127
|
+
|
|
128
|
+
- 네이밍 규칙 (파일·클래스·함수·변수)
|
|
129
|
+
- 디렉토리 구조 / 파일 배치
|
|
130
|
+
- 에러 처리·검증 방식
|
|
131
|
+
- 의존성 주입·import 패턴
|
|
132
|
+
- 테스트 구조·헬퍼 사용 패턴
|
|
133
|
+
- **UI 구조·레이아웃 / 컴포넌트 구성·생김새** (HTML 골격, CSS 클래스 네이밍, 컨트롤 배치, 반응형/스타일 토큰 사용 패턴 등)
|
|
134
|
+
|
|
135
|
+
이 메모는 Step 2 구현 시 매번 참조한다.
|
|
116
136
|
|
|
117
137
|
### 1-3. 문서 정합성 확인
|
|
118
138
|
|
|
119
139
|
요구명세의 각 Scenario에서 참조하는 기능·메서드를 구현계획과 대조한다.
|
|
120
|
-
|
|
140
|
+
`/sd-inner-clarify` 스킬을 호출하여 누락된 기능등 불명확한 부분을 명확화한다.
|
|
121
141
|
|
|
122
142
|
## Step 2: Double Loop TDD
|
|
123
143
|
|
|
@@ -131,6 +151,16 @@ Feature 문서의 `## 참조 자료` 섹션 및 그 하위섹션을 반드시
|
|
|
131
151
|
|
|
132
152
|
**CRITICAL: 프로젝트에 이미 존재하는 기존 테스트부터 점검하고 선수정한다.**
|
|
133
153
|
|
|
154
|
+
#### 점검·선수정 절차
|
|
155
|
+
|
|
156
|
+
1. 이번 Scenario의 대상 모듈/함수를 import하는 기존 테스트 파일을 검색한다.
|
|
157
|
+
2. 각 테스트를 3분류로 판정한다:
|
|
158
|
+
- **스펙 충돌**: 이번 Feature의 요구명세와 다른 동작을 기대 → 스펙에 맞게 선수정
|
|
159
|
+
- **실제 버그**: 기존 구현의 버그를 미검증 → 이번 Feature 범위 내면 수정, 범위 밖이면 사용자에게 보고 후 판단
|
|
160
|
+
- **무관**: 이번 Scenario와 무관한 동작 검증 → 건드리지 않음
|
|
161
|
+
3. 판단이 모호하면 `/sd-inner-clarify`로 명확화한다.
|
|
162
|
+
4. 선수정이 끝난 뒤 새 Acceptance Test 작성으로 진행한다.
|
|
163
|
+
|
|
134
164
|
Gherkin Scenario의 Given/When/Then을 프로젝트 테스트 프레임워크의 Acceptance Test로 변환한다.
|
|
135
165
|
|
|
136
166
|
- Scenario 하나를 하나의 test 함수로 변환하되, Scenario 내 여러 When/Then이 있으면 하나의 test 함수 안에서 순차 검증한다(통합 수준).
|
|
@@ -191,6 +221,12 @@ Feature 전체의 테스트 코드를 "지속적 회귀 테스트로 남길 가
|
|
|
191
221
|
|
|
192
222
|
- **중복 Unit Test 삭제** — `test`/`it` 단위로 판단한다. Acceptance Test와 검증 대상·입력값이 동일한 개별 테스트 케이스만 삭제한다(파일 단위 삭제 금지). Scenario 간 중복 포함
|
|
193
223
|
- **구현 결합 테스트 전환/삭제** — 내부 상태 값, 메서드 호출 횟수 등 구현 세부사항을 검증하는 테스트
|
|
224
|
+
- **TDD 중 쓴 mock 정리** — TDD Red 단계에서 의존성이 미구현이라 부득이 작성한 mock은, 실제 구현이 완성된 이 시점에 **전부 재점검**한다. 절차:
|
|
225
|
+
1. 테스트 파일의 모든 `vi.mock()`/`vi.spyOn()`/수동 mock 객체를 나열한다
|
|
226
|
+
2. 각 mock이 @.claude/references/sd-testing.md 의 화이트리스트(외부 네트워크·DB·하드웨어/OS·타이머)에 해당하는지 확인한다
|
|
227
|
+
3. 해당하지 않으면 실제 인스턴스로 교체한다. 호출 추적이 목적이었다면 `vi.spyOn()`으로만 남긴다
|
|
228
|
+
|
|
229
|
+
남겨두면 실제 코드 변경에 반응하지 않아 false positive를 양산하고, 리팩토링 시 한꺼번에 터진다.
|
|
194
230
|
- **공통 setup 추출** — 중복되는 arrange 코드를 헬퍼/beforeEach로
|
|
195
231
|
- **테스트 네이밍 개선** — 검증하는 동작을 문장처럼 읽히게
|
|
196
232
|
|
|
@@ -1,80 +1,84 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sd-use
|
|
3
|
-
description: 자연어 요청을 적절한 sd-* 스킬로 라우팅하는 스킬. "sd-use 커밋해줘", "sd-use --help" 등을 요청할 때 사용한다.
|
|
4
|
-
model: haiku
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# sd-use: SD 스킬 라우터
|
|
8
|
-
|
|
9
|
-
사용자의 요청을 적절한 sd-* 스킬로 라우팅한다. 개별 sd-* 스킬에 익숙하지 않은 사용자가 원하는 작업을 자연어로 설명하면, sd-use가 가장 적합한 스킬을 선택하여 실행한다.
|
|
10
|
-
|
|
11
|
-
## 인자
|
|
12
|
-
|
|
13
|
-
| 인자 | 설명 |
|
|
14
|
-
|------|------|
|
|
15
|
-
| `{request}` | 사용자가 원하는 작업의 자연어 설명 |
|
|
16
|
-
| `--help` | 워크플로우 개요 및 스킬 카탈로그 표시 |
|
|
17
|
-
|
|
18
|
-
## Step 1: 입력 파싱
|
|
19
|
-
|
|
20
|
-
- 인자가 없거나 `--help`이면 → Step 2
|
|
21
|
-
- 그 외 → Step 3
|
|
22
|
-
|
|
23
|
-
## Step 2: Help 모드
|
|
24
|
-
|
|
25
|
-
아래 코드 블록을 그대로 출력한 후 종료한다. Skill 도구를 호출하지 않는다.
|
|
26
|
-
마크다운 표나 리스트로 변환하지 않는다. 반드시 단일 코드 블록(``` 안)으로 출력한다.
|
|
27
|
-
|
|
28
|
-
````
|
|
29
|
-
sd-use — SD 스킬 라우터
|
|
30
|
-
|
|
31
|
-
USAGE
|
|
32
|
-
/sd-use <request> 자연어 요청을 적절한 스킬로 라우팅
|
|
33
|
-
/sd-use --help 이 도움말 표시
|
|
34
|
-
|
|
35
|
-
FLOWS
|
|
36
|
-
진입점 개발 파이프라인
|
|
37
|
-
sd-wbs 프로젝트 → Feature 분해 ─┐
|
|
38
|
-
sd-review 코드 리뷰 → 리포트 생성 ├→ sd-plan → sd-tdd
|
|
39
|
-
sd-debug 에러 → 근본 원인 분석 │ │ │
|
|
40
|
-
(없음) 바로 개발 시작 ─┘ └────────┘
|
|
41
|
-
sd-dev (순차 실행)
|
|
42
|
-
|
|
43
|
-
SKILLS
|
|
44
|
-
개발
|
|
45
|
-
sd-dev Feature 전체 개발 (wbs → plan → TDD → check → review)
|
|
46
|
-
sd-wbs 프로젝트 → Feature 분해 (WBS)
|
|
47
|
-
sd-plan Feature 요구명세 + 구현계획 작성
|
|
48
|
-
sd-tdd 구현 계획 → TDD 코드 구현
|
|
49
|
-
|
|
50
|
-
품질
|
|
51
|
-
sd-check typecheck / lint / test 실행 및 에러 수정
|
|
52
|
-
sd-review 로직 버그, 보안, 성능, 설계 이슈 리뷰
|
|
53
|
-
sd-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
sd-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
sd-
|
|
62
|
-
sd-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
sd-
|
|
67
|
-
sd-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
### 3-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
1
|
+
---
|
|
2
|
+
name: sd-use
|
|
3
|
+
description: 자연어 요청을 적절한 sd-* 스킬로 라우팅하는 스킬. "sd-use 커밋해줘", "sd-use --help" 등을 요청할 때 사용한다.
|
|
4
|
+
model: haiku
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# sd-use: SD 스킬 라우터
|
|
8
|
+
|
|
9
|
+
사용자의 요청을 적절한 sd-* 스킬로 라우팅한다. 개별 sd-* 스킬에 익숙하지 않은 사용자가 원하는 작업을 자연어로 설명하면, sd-use가 가장 적합한 스킬을 선택하여 실행한다.
|
|
10
|
+
|
|
11
|
+
## 인자
|
|
12
|
+
|
|
13
|
+
| 인자 | 설명 |
|
|
14
|
+
|------|------|
|
|
15
|
+
| `{request}` | 사용자가 원하는 작업의 자연어 설명 |
|
|
16
|
+
| `--help` | 워크플로우 개요 및 스킬 카탈로그 표시 |
|
|
17
|
+
|
|
18
|
+
## Step 1: 입력 파싱
|
|
19
|
+
|
|
20
|
+
- 인자가 없거나 `--help`이면 → Step 2
|
|
21
|
+
- 그 외 → Step 3
|
|
22
|
+
|
|
23
|
+
## Step 2: Help 모드
|
|
24
|
+
|
|
25
|
+
아래 코드 블록을 그대로 출력한 후 종료한다. Skill 도구를 호출하지 않는다.
|
|
26
|
+
마크다운 표나 리스트로 변환하지 않는다. 반드시 단일 코드 블록(``` 안)으로 출력한다.
|
|
27
|
+
|
|
28
|
+
````
|
|
29
|
+
sd-use — SD 스킬 라우터
|
|
30
|
+
|
|
31
|
+
USAGE
|
|
32
|
+
/sd-use <request> 자연어 요청을 적절한 스킬로 라우팅
|
|
33
|
+
/sd-use --help 이 도움말 표시
|
|
34
|
+
|
|
35
|
+
FLOWS
|
|
36
|
+
진입점 개발 파이프라인
|
|
37
|
+
sd-wbs 프로젝트 → Feature 분해 ─┐
|
|
38
|
+
sd-review 코드 리뷰 → 리포트 생성 ├→ sd-plan → sd-tdd
|
|
39
|
+
sd-debug 에러 → 근본 원인 분석 │ │ │
|
|
40
|
+
(없음) 바로 개발 시작 ─┘ └────────┘
|
|
41
|
+
sd-dev (순차 실행)
|
|
42
|
+
|
|
43
|
+
SKILLS
|
|
44
|
+
개발
|
|
45
|
+
sd-dev Feature 전체 개발 (wbs → plan → TDD → check → review)
|
|
46
|
+
sd-wbs 프로젝트 → Feature 분해 (WBS)
|
|
47
|
+
sd-plan Feature 요구명세 + 구현계획 작성
|
|
48
|
+
sd-tdd 구현 계획 → TDD 코드 구현
|
|
49
|
+
|
|
50
|
+
품질
|
|
51
|
+
sd-check typecheck / lint / test 실행 및 에러 수정
|
|
52
|
+
sd-review 로직 버그, 보안, 성능, 설계 이슈 리뷰
|
|
53
|
+
sd-refactor 구조·설계·아키텍처 리팩토링 분석 리포트
|
|
54
|
+
sd-debug 버그/에러 근본 원인 분석
|
|
55
|
+
|
|
56
|
+
Git
|
|
57
|
+
sd-commit 전체 변경사항 단일 커밋 생성
|
|
58
|
+
sd-issue GitHub 이슈 생성
|
|
59
|
+
|
|
60
|
+
문서
|
|
61
|
+
sd-claude-docs CLAUDE.md + usage 문서 생성
|
|
62
|
+
sd-doc-extract 문서에서 텍스트/이미지 추출
|
|
63
|
+
sd-deliverable 매뉴얼 & SIT 문서 생성
|
|
64
|
+
|
|
65
|
+
도구
|
|
66
|
+
sd-prompt 스킬/프롬프트 파일 생성·개선
|
|
67
|
+
sd-outlook Outlook 메일 검색/다운로드
|
|
68
|
+
|
|
69
|
+
기타
|
|
70
|
+
my-apk-decompile APK 디컴파일 및 소스 분석
|
|
71
|
+
playwright-cli 브라우저 자동화 및 Playwright 테스트
|
|
72
|
+
````
|
|
73
|
+
|
|
74
|
+
## Step 3: 스킬 실행
|
|
75
|
+
|
|
76
|
+
### 3-1. 스킬 라우팅
|
|
77
|
+
|
|
78
|
+
스킬 카탈로그를 참조하여 사용자의 요청을 가장 적합한 스킬에 라우팅한다. 단일 스킬에 명확히 라우팅되지 않으면 후보 스킬들을 선택지로 제시하여 사용자에게 확인한다. (`.claude/rules/sd-options.md`를 읽고 따른다)
|
|
79
|
+
|
|
80
|
+
### 3-2. 안내 및 실행
|
|
81
|
+
|
|
82
|
+
선택된 스킬을 사용자에게 알리는 텍스트 메시지를 출력한 후 Skill 도구를 호출한다. 안내는 필수이다. 예시: `> **sd-commit** 스킬을 실행합니다.`
|
|
83
|
+
|
|
84
|
+
선택된 스킬 이름과 함께 사용자의 원래 요청을 `args`로 전달한다.
|
|
@@ -12,7 +12,7 @@ description: 프로젝트 요구사항을 Feature 단위로 분해하는 스킬.
|
|
|
12
12
|
기존 wbs 경로를 제공하고 수정하기를 원하는 경우, 해당 문서를 읽고 업데이트한다.
|
|
13
13
|
마이그레이션 등 기존 시스템이 요구사항 원천인 경우, 기존 코드베이스를 참조하여 기능을 파악한다.
|
|
14
14
|
요구사항과 함께 **프로젝트 개요**(배경, 환경, 전제조건, 기술적 제약)를 파악한다.
|
|
15
|
-
|
|
15
|
+
`/sd-inner-clarify` 스킬을 호출하여 명확화한다.
|
|
16
16
|
|
|
17
17
|
## Step 2: Impact Mapping
|
|
18
18
|
|
|
@@ -23,7 +23,7 @@ Impact Mapping 트리(Goal → Actor → Impact → Deliverable)를 구축한다
|
|
|
23
23
|
비즈니스 요구사항(What)에 대한 분석만 한다.
|
|
24
24
|
|
|
25
25
|
- 기술적 구현 방법(How) — 인증 방식, 통신 프로토콜, 프레임워크, 아키텍처 패턴 등 — 에 대한 결정은 분석 단계에서 하지 않는다.
|
|
26
|
-
-
|
|
26
|
+
- `/sd-inner-clarify` 스킬을 호출하여 명확화한다.
|
|
27
27
|
|
|
28
28
|
### 명확화 항목
|
|
29
29
|
|
|
@@ -43,7 +43,7 @@ Impact Mapping 트리(Goal → Actor → Impact → Deliverable)를 구축한다
|
|
|
43
43
|
### Impact Mapping 규칙
|
|
44
44
|
|
|
45
45
|
- 모든 Feature가 Goal까지 역추적 가능해야 한다 — Goal에 연결되지 않는 기능은 제외 사항으로 보낸다
|
|
46
|
-
- Goal은
|
|
46
|
+
- Goal은 구체적 목적을 명확히 기술한다. "효율화한다"(X) → "대출·반납 기록을 시스템으로 관리하여 분실을 방지한다"(O). 수치 기반이 가능하면 좋지만 필수 아님.
|
|
47
47
|
- Impact는 기능이 아닌 **행동 변화**를 기술한다. "대시보드를 본다"(X) → "업무 상태를 빠르게 파악한다"(O)
|
|
48
48
|
|
|
49
49
|
## Step 3: Feature Breakdown
|
|
@@ -54,12 +54,11 @@ Deliverable을 Epic → Feature로 구조화한다.
|
|
|
54
54
|
|
|
55
55
|
Epic은 **사용자 관점의 기능 영역**(비즈니스 기능) 단위로 그룹화한다.
|
|
56
56
|
기술 계층(서버/클라이언트), 패키지, 아키텍처 레이어별로 분류하지 않는다(NEVER).
|
|
57
|
-
하나의 기능이 서버와 클라이언트에 걸쳐 있으면 하나의 Epic 안에 Feature로 나열한다.
|
|
58
57
|
|
|
59
58
|
**좋은 예:**
|
|
60
59
|
|
|
61
|
-
- "
|
|
62
|
-
- "
|
|
60
|
+
- "인증" Epic → Feature 1: 사용자 로그인, Feature 2: 비밀번호 재설정
|
|
61
|
+
- "알림" Epic → Feature 1: 토스트 알림, Feature 2: 이메일 알림
|
|
63
62
|
|
|
64
63
|
**나쁜 예:**
|
|
65
64
|
|
|
@@ -68,46 +67,105 @@ Epic은 **사용자 관점의 기능 영역**(비즈니스 기능) 단위로 그
|
|
|
68
67
|
|
|
69
68
|
### Feature 분해 원칙
|
|
70
69
|
|
|
71
|
-
Feature는 독립적으로 설계·개발·검증할 수 있는 최소
|
|
70
|
+
Feature는 독립적으로 설계·개발·검증할 수 있는 최소 **기능** 단위이다.
|
|
72
71
|
|
|
73
|
-
|
|
74
|
-
|
|
72
|
+
**CRITICAL: Feature를 아키텍처 레이어(DB/서비스/UI, 서버/클라이언트, 프론트엔드/백엔드, 패키지 등)로 분할하는 것은 절대 금지(NEVER).**
|
|
73
|
+
하나의 Feature는 해당 기능을 완성하기 위한 모든 레이어(DB 스키마, API, UI 화면 등)의 산출물을 end-to-end로 포함한다.
|
|
74
|
+
|
|
75
|
+
- **좋은 예:** "사용자 로그인" Feature → DB users 테이블 + 토큰 발급 API + 로그인 화면을 모두 한 Feature에 포함
|
|
76
|
+
- **나쁜 예:** Feature 1 "users 테이블 스키마" / Feature 2 "로그인 API" / Feature 3 "로그인 화면" — 레이어 분할 금지
|
|
77
|
+
- **나쁜 예:** Feature 1 "인증 토큰 발급(서버)" / Feature 2 "로그인 화면(클라이언트)" — 서버/클라이언트 분할 금지
|
|
78
|
+
- **나쁜 예:** Feature 1 "도서 관리(관리자)" / Feature 2 "도서 조회(직원)" — 동일 도메인("도서")을 Actor(역할)로 분할 금지. "도서 관리" 단일 Feature에 관리자 화면 + 직원 화면을 함께 포함
|
|
79
|
+
|
|
80
|
+
**CRITICAL: 기계적 판정 규칙 (예외 없음, 재량 금지)**
|
|
81
|
+
|
|
82
|
+
아래 중 **하나라도** 해당하면 무조건(MUST) 해당 Feature들을 단일 Feature로 병합한다. "기능 성격이 다르다", "CRUD와 조회는 다르다" 같은 자체 합리화는 금지(NEVER)한다.
|
|
83
|
+
|
|
84
|
+
1. **Feature 이름에 Actor(역할)가 괄호/접미사로 포함된 경우** (예: "(관리자)", "(직원)", "(고객)", "관리자용", "직원용")
|
|
85
|
+
2. **동일 도메인 엔터티(예: "도서", "대출")에 대한 기능이 서로 다른 Feature에 나뉘어 등장하는 경우**
|
|
86
|
+
3. **두 Feature의 범위에 동일하거나 유사한 기능명**(예: "도서 목록 조회", "주문 목록 조회")**이 각각 등장하는 경우** (뷰/필터/권한 차이는 병합 사유를 면제하지 않는다)
|
|
87
|
+
|
|
88
|
+
그 외 규칙:
|
|
89
|
+
|
|
90
|
+
- 같은 세부기능을 공유한다는 이유로 독립 모듈을 하나의 Feature로 묶지 않는다. (예: event-bus Feature + 모달 Feature + 토스트 Feature — 묶지 않음)
|
|
75
91
|
- 범주는 Epic, 개별 기능이 Feature (예: "알림" Epic → 토스트 알림, 모달 알림, 이메일 알림 각각이 Feature)
|
|
76
92
|
- 가능한한 의존성 순서로 정렬
|
|
93
|
+
- **테스트 작성을 별도 Feature로 분리하지 않는다(NEVER).** 각 Feature는 `sd-tdd`로 구현될 때 테스트와 프로덕션 코드를 함께 작성한다.
|
|
77
94
|
|
|
78
95
|
### Feature 작성 규칙
|
|
79
96
|
|
|
80
|
-
- **의존성**: 이 Feature의 범위(세부 기능)를 **하나씩** 검토하여,
|
|
81
|
-
-
|
|
82
|
-
-
|
|
83
|
-
|
|
97
|
+
- **의존성**: 이 Feature의 범위(세부 기능)를 **하나씩** 검토하여, 다른 Feature와의 아래 두 종류 관계를 모두 판단한다.
|
|
98
|
+
- **(1) 산출물 참조 관계 (코드 연결성)**: 이 Feature의 세부 기능이 다른 Feature가 만든 산출물(API, 컴포넌트, 데이터 구조, 서비스, 모듈 등)을 직접 사용한다면 그 Feature에 의존.
|
|
99
|
+
- **(2) 결정 파급 관계 (CRITICAL, 자주 누락됨)**: 다른 Feature에서 내려지는 결정(명명 규칙, 공통 패턴, 레시피 스타일, 분기 구조, 공유 용어 등)이 확정되지 않으면 이 Feature의 **내용이 변할 수 있다면** 그 Feature에 의존.
|
|
100
|
+
- 예시: Feature A가 "페이지/모달 분기 패턴"을 정립하고 Feature B 레시피가 그 분기를 **복붙**해서 쓴다면, A의 분기 구조가 바뀔 때 B 레시피도 변함 → B는 A에 의존
|
|
101
|
+
- 예시: Feature A가 "레시피 작성 관용 규칙"을 정립하고 Feature B가 그 규칙을 따라야 한다면 → B는 A에 의존
|
|
102
|
+
- 예시: Feature A에서 API 이름을 확정하고 Feature B가 그 이름을 문서·레시피에 인용한다면 → B는 A에 의존
|
|
103
|
+
- "코드 간 import 없음"이 의존성 없음을 의미하지 **않는다**. 결정 파급은 signal 수준보다 **문서·규칙·명명 수준**에서 더 흔히 발생한다.
|
|
104
|
+
- **판단 절차**: 세부 기능마다 "이것을 구현·기술하려면 다른 Feature가 먼저 완료되어야 하는가? 혹은 다른 Feature의 결정이 내 내용을 바꿀 수 있는가?"를 질문하고, 해당하는 Feature 번호를 명시한다.
|
|
105
|
+
- **불확실하면 의존성 있음으로 판단한다** — 의존성 누락은 병렬 수행 시 블로킹·재작업을 유발하므로, 과소 설정보다 과대 설정이 안전하다.
|
|
106
|
+
- 형식: Feature 번호만 쉼표로 나열 (예: `1.1, 2.3`) 또는 `없음`
|
|
84
107
|
- (의존성에 따라 병렬 진행할 수 있으므로 **CRITICAL**)
|
|
85
108
|
- **범위**: 해당 Feature의 세부 기능을 사용자 기능(user-facing function) 수준으로 **MUST 빠짐없이** 나열한다. (절대 누락되어선 안된다. 누락된것은 다음단계에서 제외사항으로 판단될 수 있다.)
|
|
86
109
|
- **경계**: 이 Feature가 **하지 않는 것** 중 다른 Feature에서 다루거나 다룰 수 있는 것을 명시한다. 인접 Feature와의 경계가 모호한 경우 특히 중요하다. (프로젝트 전체에서 제외되는 항목은 문서 하단의 "제외 사항"에 기재한다.)
|
|
87
110
|
- **근거**: 범위가 도출된 근거 혹은 출처를 명시한다. (요구사항, 사용자 답변, 첨부문서 등) 개발에 필요한 참조 파일/자료 경로가 있으면 확인 목적과 함께 기록한다.
|
|
88
111
|
|
|
89
|
-
각 Feature의 세부 사항을 분류하고
|
|
112
|
+
각 Feature의 세부 사항을 분류하고 `/sd-inner-clarify` 스킬을 호출하여 불명확한 부분을 명확화한다.
|
|
90
113
|
- **나쁜 예:** "예약 기능 포함이 결정됨 → 예약 세부규칙(대기열 정책, 미대출 시 자동취소 기간)도 확정" — 기능 포함 여부와 세부 수치/규칙은 별개다. 세부사항은 별도로 분류·질문한다.
|
|
91
114
|
|
|
92
|
-
###
|
|
115
|
+
### Feature-Deliverable 역추적 강제 규칙
|
|
116
|
+
|
|
117
|
+
**CRITICAL: 모든 Feature는 Impact Mapping의 특정 Deliverable에서 유래해야 한다. 근거란에 유래 Deliverable을 명시(인용)하지 못하는 Feature는 추가 금지(NEVER).**
|
|
118
|
+
|
|
119
|
+
Feature를 작성하다가 "이건 시스템 동작상 당연히 필요하다"는 판단이 드는데 Impact Mapping Deliverable로 역추적 불가한 경우(예: 사용자 계정 관리, 권한 설정, 로그, 알림 설정 등 Impact Mapping에는 없지만 실행에 필요해 보이는 기능):
|
|
120
|
+
|
|
121
|
+
1. **절대 혼자 추가하지 않는다(NEVER).** "당연히 필요하다"는 추측으로 Feature를 임의 추가하거나 제외 사항에 자체 결정을 기재하는 것은 금지.
|
|
122
|
+
2. **반드시 `/sd-inner-clarify`를 호출**하여 해당 기능을 포함할지 질문한다. 질문 형식:
|
|
123
|
+
- 결정 대상: "{기능명}"을 시스템에 포함할지
|
|
124
|
+
- 선택지: 포함 / 미포함 / 수행 안 함
|
|
125
|
+
3. **포함으로 결정되면** Step 2로 돌아가 Impact Mapping에 해당 Deliverable을 먼저 추가한 뒤, Feature를 작성한다.
|
|
126
|
+
4. **미포함으로 결정되면** "제외 사항"에 기재하고 Feature는 만들지 않는다.
|
|
127
|
+
|
|
128
|
+
**판단 체크:** Step 3을 마치기 전, 모든 Feature의 근거란을 훑어 **"Impact Mapping Deliverable: ..."** 인용이 **반드시** 1건 이상 존재하는지 확인한다. 없는 Feature가 있으면 위 1~4 절차로 처리한다.
|
|
129
|
+
|
|
130
|
+
## Step 4: 자가검증 (Self-Refine)
|
|
131
|
+
|
|
132
|
+
1차 산출된 WBS를 아래 6가지 관점으로 **MUST** 재검토하고, 필요 시 **분할·병합·순서조정·보완**을 수행하여 최종 WBS를 확정한다. 이 단계는 pass/fail 판정이 아니라 **정제(refine)**이며, 문제가 보이면 즉시 수정한다.
|
|
133
|
+
|
|
134
|
+
### 검증 관점
|
|
135
|
+
|
|
136
|
+
1. **Feature 크기** — 한 Feature가 과도하게 크거나 여러 목적을 겸하면 **분할**한다.
|
|
137
|
+
- 기준: 범위 항목이 지나치게 많거나(대략 7개 초과), 독립적으로 구현·검증 가능한 하위 단위로 자연스럽게 나뉘면 분할 후보.
|
|
138
|
+
2. **의존성에 의한 순서** — 의존 대상이 뒤 번호에 있거나 같은 단계 내에 있으면 **번호/순서를 재정렬**한다.
|
|
139
|
+
3. **Feature 중복/누락/역추적** — 요구사항(Impact Mapping의 Deliverable) 대비 **양방향** 커버리지를 점검한다.
|
|
140
|
+
- 여러 Feature가 같은 세부 기능을 중복으로 갖고 있으면 하나로 통합하거나 경계를 명확화.
|
|
141
|
+
- **정방향 (Deliverable → Feature):** 요구사항에 있는데 어떤 Feature에도 없는 항목은 추가하거나 "제외 사항"으로 사유와 함께 이동.
|
|
142
|
+
- **역방향 (Feature → Deliverable):** 모든 Feature가 Impact Mapping의 Deliverable로 역추적 가능한지 확인한다. 역추적 불가한 Feature가 있으면 Step 3의 "Feature-Deliverable 역추적 강제 규칙"에 따라 `/sd-inner-clarify`로 질문 후 처리한다. 임의 유지 금지(NEVER).
|
|
143
|
+
4. **Feature 독립성 (단일 책임)** — 한 Feature의 이름과 실제 범위가 일치하는지 확인한다. 이름에 드러나지 않는 일을 몰래 수행하면 **분리**한다.
|
|
144
|
+
5. **명명/범위 일관성** — Feature 경계가 Epic 분류 기준(사용자 관점 기능 영역)과 정합하는지 확인한다. 다음 케이스는 end-to-end 기능 단위로 **병합**한다.
|
|
145
|
+
- Feature가 아키텍처 레이어(DB/서비스/UI, 서버/클라이언트 등)로 쪼개져 있는 경우
|
|
146
|
+
- **동일 도메인 기능이 Actor(역할) 기준으로 여러 Feature에 분할되어 있는 경우** (예: "도서 관리(관리자)" + "도서 조회(직원)"는 "도서 관리" 단일 Feature로 병합하여 관리자 화면 + 직원 화면을 함께 포함). 범위에 동일 기능(예: "도서 목록 조회")이 뷰/권한만 다르게 다른 Feature에 반복 등장하면 이 케이스이다.
|
|
147
|
+
6. **범위 항목의 검증 가능성** — 각 세부 기능이 완료 판정 가능한 구체적 표현인지 확인한다. "개선한다", "최적화한다" 같은 모호한 표현은 구체 동작으로 재작성한다.
|
|
148
|
+
|
|
149
|
+
### 의존성 매트릭스
|
|
93
150
|
|
|
94
|
-
|
|
151
|
+
위 2번 검증을 위해 의존성 매트릭스를 생성하고 다음을 확인한다:
|
|
95
152
|
|
|
96
|
-
1. **누락
|
|
97
|
-
2. **순환
|
|
153
|
+
1. **누락 확인**: 각 Feature의 세부 기능이 (a) 다른 Feature의 산출물을 참조하거나 (b) 다른 Feature의 결정(명명·공통 패턴·레시피 스타일·분기 구조 등)에 의해 내용이 바뀔 수 있는데 의존성에 빠져 있지 않은지 크로스체크
|
|
154
|
+
2. **순환 확인**: A→B→A 같은 순환 의존성이 없는지 확인 (발견 시 Feature 분할로 해소)
|
|
98
155
|
3. **1단계 존재 확인**: 의존성이 없는 Feature가 최소 1개 이상 존재하는지 확인
|
|
99
156
|
|
|
100
157
|
매트릭스 형식:
|
|
101
158
|
|
|
102
159
|
```
|
|
103
|
-
| Feature | 의존 대상 |
|
|
104
|
-
|
|
105
|
-
| 1.1 | 없음 |
|
|
106
|
-
| 1.2 | 1.1 |
|
|
107
|
-
| 2.1 | 1.1 |
|
|
160
|
+
| Feature | 의존 대상 |
|
|
161
|
+
|---------|----------|
|
|
162
|
+
| 1.1 | 없음 |
|
|
163
|
+
| 1.2 | 1.1 |
|
|
164
|
+
| 2.1 | 1.1 |
|
|
165
|
+
| 2.2 | 1.1, 2.1 |
|
|
108
166
|
```
|
|
109
167
|
|
|
110
|
-
## Step
|
|
168
|
+
## Step 5: WBS 문서 생성
|
|
111
169
|
|
|
112
170
|
산출물 경로:
|
|
113
171
|
|
|
@@ -170,7 +228,7 @@ Feature는 독립적으로 설계·개발·검증할 수 있는 최소 기능
|
|
|
170
228
|
- 현재 범위에서 명시적으로 제외하는 항목과, Impact Mapping에서 Goal에 연결되지 않는 기능을 나열한다.
|
|
171
229
|
- 각 항목에 **사유**(Goal 미연결, 사용자 명시적 제외, 범위 초과 등)를 반드시 기재한다.
|
|
172
230
|
|
|
173
|
-
## Step
|
|
231
|
+
## Step 6: 정보 유실 방지 검증
|
|
174
232
|
|
|
175
233
|
문서 작성 후, 대화에서 수집한 모든 구체적 정보가 문서에 기록되었는지 검증한다.
|
|
176
234
|
|
|
@@ -180,7 +238,7 @@ Feature는 독립적으로 설계·개발·검증할 수 있는 최소 기능
|
|
|
180
238
|
|
|
181
239
|
**CRITIAL: 각 Feature는 새 세션에서 진행되므로, 절대(NEVER) wbs문서에 누락이 있어서는 안됨**
|
|
182
240
|
|
|
183
|
-
## Step
|
|
241
|
+
## Step 7: 수행 순서 안내
|
|
184
242
|
|
|
185
243
|
문서 작성이 완료되면, 의존성을 기반으로 Feature를 단계별로 그룹화하여 수행 순서를 안내한다.
|
|
186
244
|
|
|
@@ -201,7 +259,7 @@ Feature는 독립적으로 설계·개발·검증할 수 있는 최소 기능
|
|
|
201
259
|
- Feature 2.2: 출고 처리 (← 1.1)
|
|
202
260
|
```
|
|
203
261
|
|
|
204
|
-
## Step
|
|
262
|
+
## Step 8: 다음 단계 안내
|
|
205
263
|
|
|
206
264
|
WBS 완료 후, 개발을 위한 다음 단계를 안내한다.
|
|
207
265
|
|
|
@@ -12,7 +12,7 @@ claude/
|
|
|
12
12
|
├── sd-check-bash.py ← 훅 스크립트
|
|
13
13
|
├── sd-check-forbidden-files.py ← 훅 스크립트
|
|
14
14
|
├── sd-check-write.py ← 훅 스크립트
|
|
15
|
-
├── sd-
|
|
15
|
+
├── sd-subagent-start.sh ← 훅 스크립트
|
|
16
16
|
└── sd-statusline.py ← 훅 스크립트
|
|
17
17
|
```
|
|
18
18
|
|
|
@@ -57,7 +57,6 @@ claude/
|
|
|
57
57
|
---
|
|
58
58
|
name: sd-commit
|
|
59
59
|
description: 전체 변경사항에 대한 단일 커밋을 생성하는 스킬. ...
|
|
60
|
-
model: haiku
|
|
61
60
|
---
|
|
62
61
|
```
|
|
63
62
|
|
|
@@ -69,7 +68,7 @@ model: haiku
|
|
|
69
68
|
|
|
70
69
|
## `claude/rules/`
|
|
71
70
|
|
|
72
|
-
Claude Code 규칙 파일.
|
|
71
|
+
Claude Code 규칙 파일. 2개 파일.
|
|
73
72
|
|
|
74
73
|
| 파일 | Description |
|
|
75
74
|
| -------------------- | -------------------------------------------------------------------- |
|
|
@@ -2,19 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
`claude/` 디렉토리의 훅 스크립트 (총 5개). `postinstall`에 의해 `.claude/`에 설치되고, `settings.json`에 자동 등록되어 Claude Code 세션에서 실행된다.
|
|
4
4
|
|
|
5
|
-
## `sd-
|
|
5
|
+
## `sd-subagent-start.sh`
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
SubagentStart 훅. subagent 시작 시 `CLAUDE.md`가 존재하면 파일 내용을 읽어 출력하여 subagent가 프로젝트 지침을 참조하도록 한다 (subagent 컨텍스트에서 CLAUDE.md가 자동 주입되지 않으므로).
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
10
|
#!/bin/bash
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
if [ -f "CLAUDE.md" ]; then
|
|
12
|
+
echo "Project instructions from CLAUDE.md (auto-injected because subagent context omits it):"
|
|
13
|
+
echo
|
|
14
|
+
cat CLAUDE.md
|
|
15
|
+
fi
|
|
14
16
|
```
|
|
15
17
|
|
|
16
18
|
등록 위치:
|
|
17
|
-
- `hooks.SessionStart` (matcher: `startup|resume|clear|compact`)
|
|
18
19
|
- `hooks.SubagentStart` (matcher 없음)
|
|
19
20
|
|
|
20
21
|
## `sd-check-write.py`
|