selfish-pipeline 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +21 -0
- package/.claude-plugin/plugin.json +12 -0
- package/LICENSE +21 -0
- package/MIGRATION.md +100 -0
- package/README.md +195 -0
- package/bin/cli.mjs +111 -0
- package/commands/analyze.md +113 -0
- package/commands/architect.md +119 -0
- package/commands/auto.md +271 -0
- package/commands/checkpoint.md +75 -0
- package/commands/clarify.md +71 -0
- package/commands/debug.md +98 -0
- package/commands/implement.md +166 -0
- package/commands/init.md +97 -0
- package/commands/plan.md +161 -0
- package/commands/principles.md +94 -0
- package/commands/research.md +94 -0
- package/commands/resume.md +69 -0
- package/commands/review.md +120 -0
- package/commands/security.md +114 -0
- package/commands/spec.md +123 -0
- package/commands/tasks.md +111 -0
- package/hooks/hooks.json +47 -0
- package/package.json +48 -0
- package/scripts/pre-compact-checkpoint.sh +67 -0
- package/scripts/selfish-pipeline-manage.sh +84 -0
- package/scripts/selfish-stop-gate.sh +49 -0
- package/scripts/session-start-context.sh +63 -0
- package/scripts/track-selfish-changes.sh +34 -0
- package/templates/selfish.config.nextjs-fsd.md +107 -0
- package/templates/selfish.config.template.md +90 -0
package/commands/init.md
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# /selfish:init — 프로젝트 초기 설정
|
|
2
|
+
|
|
3
|
+
> 현재 프로젝트에 `.claude/selfish.config.md` 설정 파일을 생성한다.
|
|
4
|
+
> package.json, 디렉토리 구조, 설정 파일 등을 분석하여 프로젝트에 맞는 설정을 자동 추론한다.
|
|
5
|
+
|
|
6
|
+
## 인자
|
|
7
|
+
|
|
8
|
+
- `$ARGUMENTS` — (선택) 템플릿 프리셋 이름 (예: `nextjs-fsd`)
|
|
9
|
+
- 미지정 시: 프로젝트 구조를 분석하여 자동 추론
|
|
10
|
+
- 프리셋 지정 시: `${CLAUDE_PLUGIN_ROOT}/templates/selfish.config.{preset}.md` 사용
|
|
11
|
+
|
|
12
|
+
## 실행 절차
|
|
13
|
+
|
|
14
|
+
### 1. 기존 설정 확인
|
|
15
|
+
|
|
16
|
+
`.claude/selfish.config.md`가 이미 존재하면:
|
|
17
|
+
- 사용자에게 확인: "설정 파일이 이미 존재합니다. 덮어쓰시겠습니까?"
|
|
18
|
+
- 거부 시 **중단**
|
|
19
|
+
|
|
20
|
+
### 2. 프리셋 분기
|
|
21
|
+
|
|
22
|
+
#### A. 프리셋 지정 (`$ARGUMENTS`가 있는 경우)
|
|
23
|
+
|
|
24
|
+
1. `${CLAUDE_PLUGIN_ROOT}/templates/selfish.config.{$ARGUMENTS}.md` 존재 확인
|
|
25
|
+
2. 있으면: 해당 파일을 `.claude/selfish.config.md`로 복사
|
|
26
|
+
3. 없으면: "프리셋 `{$ARGUMENTS}`을 찾을 수 없습니다. 사용 가능: {목록}" 출력 후 **중단**
|
|
27
|
+
|
|
28
|
+
#### B. 자동 추론 (`$ARGUMENTS` 없는 경우)
|
|
29
|
+
|
|
30
|
+
프로젝트 구조를 분석하여 설정을 자동 추론:
|
|
31
|
+
|
|
32
|
+
**Step 1. 패키지 매니저 / 스크립트 감지**
|
|
33
|
+
- `package.json` 읽기 → `scripts` 필드에서 CI 관련 커맨드 추출
|
|
34
|
+
- lockfile로 패키지 매니저 판별 (yarn.lock / pnpm-lock.yaml / package-lock.json)
|
|
35
|
+
- 감지된 스크립트를 `CI Commands` 섹션에 반영
|
|
36
|
+
|
|
37
|
+
**Step 2. 프레임워크 감지**
|
|
38
|
+
- `package.json`의 dependencies/devDependencies에서 판별:
|
|
39
|
+
- `next` → Next.js (App Router/Pages Router는 `app/` 디렉토리 존재 여부로 판별)
|
|
40
|
+
- `nuxt` → Nuxt
|
|
41
|
+
- `@sveltejs/kit` → SvelteKit
|
|
42
|
+
- `vite` → Vite
|
|
43
|
+
- 등
|
|
44
|
+
- `tsconfig.json` 유무 → TypeScript 여부
|
|
45
|
+
|
|
46
|
+
**Step 3. 아키텍처 감지**
|
|
47
|
+
- 디렉토리 구조 분석:
|
|
48
|
+
- `src/app/`, `src/features/`, `src/entities/`, `src/shared/` → FSD
|
|
49
|
+
- `src/domain/`, `src/application/`, `src/infrastructure/` → Clean Architecture
|
|
50
|
+
- `src/modules/` → Modular
|
|
51
|
+
- 기타 → Layered
|
|
52
|
+
- `tsconfig.json`의 `paths` → path_alias 추출
|
|
53
|
+
|
|
54
|
+
**Step 4. 상태 관리 감지**
|
|
55
|
+
- dependencies에서:
|
|
56
|
+
- `zustand` → Zustand
|
|
57
|
+
- `@reduxjs/toolkit` → Redux Toolkit
|
|
58
|
+
- `@tanstack/react-query` → React Query
|
|
59
|
+
- `swr` → SWR
|
|
60
|
+
- `pinia` → Pinia
|
|
61
|
+
|
|
62
|
+
**Step 5. 스타일링 / 테스팅 감지**
|
|
63
|
+
- `tailwindcss` → Tailwind CSS
|
|
64
|
+
- `styled-components` → styled-components
|
|
65
|
+
- `jest` / `vitest` / `playwright` → 각각 매핑
|
|
66
|
+
|
|
67
|
+
**Step 6. 코드 스타일 감지**
|
|
68
|
+
- `.eslintrc*` / `eslint.config.*` 확인 → 린트 규칙 파악
|
|
69
|
+
- `tsconfig.json`의 `strict` → strict_mode
|
|
70
|
+
- 기존 코드 샘플 2-3개 읽어 네이밍 패턴 확인
|
|
71
|
+
|
|
72
|
+
### 3. 설정 파일 생성
|
|
73
|
+
|
|
74
|
+
1. `${CLAUDE_PLUGIN_ROOT}/templates/selfish.config.template.md`를 기반으로 설정 생성
|
|
75
|
+
2. 자동 추론된 값으로 빈칸 채우기
|
|
76
|
+
3. 추론 불가 항목은 템플릿 기본값 유지 + 주석으로 `# TODO: 프로젝트에 맞게 수정` 표시
|
|
77
|
+
4. `.claude/selfish.config.md`에 저장
|
|
78
|
+
|
|
79
|
+
### 4. 최종 출력
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
⚙️ 프로젝트 설정 완료
|
|
83
|
+
├─ 파일: .claude/selfish.config.md
|
|
84
|
+
├─ 프레임워크: {감지된 프레임워크}
|
|
85
|
+
├─ 아키텍처: {감지된 스타일}
|
|
86
|
+
├─ 패키지 매니저: {감지된 매니저}
|
|
87
|
+
├─ 자동 추론: {추론된 항목 수}개
|
|
88
|
+
├─ TODO: {수동 확인 필요 항목 수}개
|
|
89
|
+
└─ 다음 단계: 설정 파일 확인 후 /selfish:spec 또는 /selfish:auto
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## 주의사항
|
|
93
|
+
|
|
94
|
+
- **덮어쓰기 주의**: 기존 설정 파일이 있으면 반드시 사용자 확인.
|
|
95
|
+
- **추론 한계**: 자동 추론은 최선의 추정. 사용자가 검토 후 수정해야 할 수 있음.
|
|
96
|
+
- **프리셋 경로**: 프리셋은 플러그인 내 `templates/` 디렉토리에서 로드.
|
|
97
|
+
- **`.claude/` 디렉토리**: 없으면 자동 생성.
|
package/commands/plan.md
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# /selfish:plan — 구현 설계
|
|
2
|
+
|
|
3
|
+
> 기능 명세(spec.md)를 기반으로 구현 계획(plan.md)을 생성한다.
|
|
4
|
+
> Critic Loop 3회로 품질을 보장하고, 필요 시 리서치를 병렬 수행한다.
|
|
5
|
+
|
|
6
|
+
## 인자
|
|
7
|
+
|
|
8
|
+
- `$ARGUMENTS` — (선택) 추가 컨텍스트 또는 제약 조건
|
|
9
|
+
|
|
10
|
+
## 설정 로드
|
|
11
|
+
|
|
12
|
+
**반드시** `.claude/selfish.config.md`를 먼저 읽는다. 설정 파일이 없으면 중단.
|
|
13
|
+
|
|
14
|
+
## 실행 절차
|
|
15
|
+
|
|
16
|
+
### 1. 컨텍스트 로드
|
|
17
|
+
|
|
18
|
+
1. **현재 브랜치** 확인 → `BRANCH_NAME`
|
|
19
|
+
2. **specs/{feature}/spec.md** 탐색:
|
|
20
|
+
- `specs/` 하위에서 현재 브랜치명 또는 `$ARGUMENTS`와 매칭되는 디렉토리 찾기
|
|
21
|
+
- 없으면: "spec.md가 없습니다. `/selfish:spec`을 먼저 실행하세요." 출력 후 **중단**
|
|
22
|
+
3. **spec.md** 전체 읽기
|
|
23
|
+
4. **memory/principles.md** 읽기 (있으면)
|
|
24
|
+
5. **CLAUDE.md** 프로젝트 컨텍스트 읽기
|
|
25
|
+
|
|
26
|
+
### 2. 명확화 확인
|
|
27
|
+
|
|
28
|
+
- spec.md에 `[NEEDS CLARIFICATION]` 태그가 있으면:
|
|
29
|
+
- 사용자에게 경고: "미해결 명확화 항목이 있습니다. 계속하시겠습니까?"
|
|
30
|
+
- 사용자가 중단 선택 시 → `/selfish:clarify` 안내 후 **중단**
|
|
31
|
+
|
|
32
|
+
### 3. Phase 0 — 리서치 (필요 시)
|
|
33
|
+
|
|
34
|
+
spec.md에서 기술적 불확실성을 추출한다:
|
|
35
|
+
|
|
36
|
+
1. 사용하지 않은 라이브러리/API가 있는가?
|
|
37
|
+
2. 성능 요구사항이 검증되지 않았는가?
|
|
38
|
+
3. 기존 코드베이스와의 통합 방식이 불확실한가?
|
|
39
|
+
|
|
40
|
+
불확실 항목이 **있으면**:
|
|
41
|
+
- 각 항목을 WebSearch/코드베이스 탐색으로 해결
|
|
42
|
+
- 결과를 `specs/{feature}/research.md`에 기록:
|
|
43
|
+
```markdown
|
|
44
|
+
## {주제}
|
|
45
|
+
**결정**: {선택한 방식}
|
|
46
|
+
**근거**: {이유}
|
|
47
|
+
**대안**: {검토한 다른 방식}
|
|
48
|
+
**출처**: {URL 또는 파일 경로}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
불확실 항목이 **없으면**: Phase 0 스킵.
|
|
52
|
+
|
|
53
|
+
### 4. Phase 1 — 설계 작성
|
|
54
|
+
|
|
55
|
+
`specs/{feature}/plan.md`를 생성한다. 아래 구조를 **반드시** 따른다:
|
|
56
|
+
|
|
57
|
+
```markdown
|
|
58
|
+
# Implementation Plan: {기능명}
|
|
59
|
+
|
|
60
|
+
## Summary
|
|
61
|
+
{spec의 핵심 요구사항 + 기술적 접근 요약, 3-5문장}
|
|
62
|
+
|
|
63
|
+
## Technical Context
|
|
64
|
+
{selfish.config.md에서 로드한 프로젝트 설정 요약}
|
|
65
|
+
- **Language**: {config.code_style.language}
|
|
66
|
+
- **Framework**: {config.framework.name}
|
|
67
|
+
- **State**: {config.state_management 요약}
|
|
68
|
+
- **Architecture**: {config.architecture.style}
|
|
69
|
+
- **Styling**: {config.styling.framework}
|
|
70
|
+
- **Testing**: {config.testing.framework}
|
|
71
|
+
- **Constraints**: {spec에서 추출한 제약사항}
|
|
72
|
+
|
|
73
|
+
## Principles Check
|
|
74
|
+
{memory/principles.md가 있으면 MUST 원칙 대비 검증 결과}
|
|
75
|
+
{위반 가능성 있으면 명시 + 정당화}
|
|
76
|
+
|
|
77
|
+
## Architecture Decision
|
|
78
|
+
### 접근 방식
|
|
79
|
+
{선택한 설계의 핵심 아이디어}
|
|
80
|
+
|
|
81
|
+
### 아키텍처 배치
|
|
82
|
+
| 계층 | 경로 | 역할 |
|
|
83
|
+
|------|------|------|
|
|
84
|
+
| {entities/features/widgets/shared} | {경로} | {설명} |
|
|
85
|
+
|
|
86
|
+
### 상태 관리 전략
|
|
87
|
+
{Zustand store / React Query / Context 등 어떤 조합을 어디에 쓸지}
|
|
88
|
+
|
|
89
|
+
### API 설계
|
|
90
|
+
{새로운 API 엔드포인트 또는 기존 API 사용 계획}
|
|
91
|
+
|
|
92
|
+
## File Change Map
|
|
93
|
+
{변경/생성할 파일 목록. 각 파일에 대해:}
|
|
94
|
+
| 파일 | 작업 | 설명 |
|
|
95
|
+
|------|------|------|
|
|
96
|
+
| {경로} | 생성/수정/삭제 | {변경 내용 요약} |
|
|
97
|
+
|
|
98
|
+
## Risk & Mitigation
|
|
99
|
+
| 리스크 | 영향 | 완화 방안 |
|
|
100
|
+
|--------|------|-----------|
|
|
101
|
+
| {리스크} | {H/M/L} | {방안} |
|
|
102
|
+
|
|
103
|
+
## Phase 구분
|
|
104
|
+
### Phase 1: Setup
|
|
105
|
+
{프로젝트 구조, 타입 정의, 설정}
|
|
106
|
+
|
|
107
|
+
### Phase 2: Core Implementation
|
|
108
|
+
{핵심 비즈니스 로직, 상태 관리}
|
|
109
|
+
|
|
110
|
+
### Phase 3: UI & Integration
|
|
111
|
+
{UI 컴포넌트, API 연동}
|
|
112
|
+
|
|
113
|
+
### Phase 4: Polish
|
|
114
|
+
{에러 처리, 성능 최적화, 테스트}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 5. Critic Loop (3회)
|
|
118
|
+
|
|
119
|
+
plan.md 초안 작성 후, **최대 3회** 자가 비판을 수행한다.
|
|
120
|
+
|
|
121
|
+
각 회차마다 아래 5가지 기준을 검증:
|
|
122
|
+
|
|
123
|
+
| 기준 | 검증 내용 |
|
|
124
|
+
|------|-----------|
|
|
125
|
+
| **COMPLETENESS** | spec.md의 모든 요구사항(FR-*)이 plan에 반영되었는가? |
|
|
126
|
+
| **FEASIBILITY** | 기존 코드베이스와 호환 가능한가? 의존성이 사용 가능한가? |
|
|
127
|
+
| **ARCHITECTURE** | {config.architecture} 규칙을 준수하는가? |
|
|
128
|
+
| **RISK** | 식별되지 않은 리스크가 있는가? |
|
|
129
|
+
| **PRINCIPLES** | principles.md의 MUST 원칙을 위반하지 않는가? |
|
|
130
|
+
|
|
131
|
+
**사용자 출력 규칙**:
|
|
132
|
+
- **FAIL 항목이 있으면**: `⚠ {기준}: {문제 요약}. 수정 중...` 표시 → plan.md 수정 → 다음 회차
|
|
133
|
+
- **FAIL 항목이 없으면**: `✓ Critic {N}/3 통과` 한 줄
|
|
134
|
+
- **최종**: `Critic Loop 완료 ({N}회). 주요 수정: {변경 요약}` 또는 `Critic Loop 완료 (1회). 수정 없음.`
|
|
135
|
+
|
|
136
|
+
### 6. Agent Teams (필요 시)
|
|
137
|
+
|
|
138
|
+
리서치 항목이 3개 이상이면, Task 도구로 병렬 리서치 에이전트를 위임:
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
TaskCreate("Research: {주제1}", subagent_type: Explore)
|
|
142
|
+
TaskCreate("Research: {주제2}", subagent_type: Explore)
|
|
143
|
+
→ 결과 수집 → research.md에 통합
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### 7. 최종 출력
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
📋 Plan 생성 완료
|
|
150
|
+
├─ specs/{feature}/plan.md
|
|
151
|
+
├─ specs/{feature}/research.md (리서치 있었으면)
|
|
152
|
+
├─ Critic: {N}회, 주요 수정: {요약}
|
|
153
|
+
└─ 다음 단계: /selfish:tasks
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## 주의사항
|
|
157
|
+
|
|
158
|
+
- plan.md는 **실행 가능한 수준**으로 작성. 모호한 "적절히 처리" 같은 표현 금지.
|
|
159
|
+
- File Change Map의 파일 경로는 **실제 프로젝트 구조**에 기반해야 함 (추측 금지).
|
|
160
|
+
- {config.architecture} 규칙에 따라 배치하며, 기존 코드베이스 패턴을 확인하고 따름.
|
|
161
|
+
- CLAUDE.md의 프로젝트 설정과 충돌하면 CLAUDE.md가 우선.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# /selfish:principles — 프로젝트 원칙 관리
|
|
2
|
+
|
|
3
|
+
> 프로젝트의 핵심 원칙(constitution)을 생성하고 관리한다.
|
|
4
|
+
> memory/principles.md에 저장되어 모든 세션에서 참조된다.
|
|
5
|
+
|
|
6
|
+
## 인자
|
|
7
|
+
|
|
8
|
+
- `$ARGUMENTS` — (선택) 동작 지시:
|
|
9
|
+
- 미지정: 현재 원칙 조회
|
|
10
|
+
- `add {원칙}`: 새 원칙 추가
|
|
11
|
+
- `remove {번호}`: 원칙 제거
|
|
12
|
+
- `init`: 대화형 초기 설정
|
|
13
|
+
|
|
14
|
+
## 설정 로드
|
|
15
|
+
|
|
16
|
+
**반드시** `.claude/selfish.config.md`를 먼저 읽는다. 설정 파일이 없으면 중단.
|
|
17
|
+
|
|
18
|
+
## 실행 절차
|
|
19
|
+
|
|
20
|
+
### 1. 현재 상태 확인
|
|
21
|
+
|
|
22
|
+
`memory/principles.md` 읽기:
|
|
23
|
+
- 있으면: 기존 원칙 로드
|
|
24
|
+
- 없으면: 빈 상태 (init 안내)
|
|
25
|
+
|
|
26
|
+
### 2. 동작 분기
|
|
27
|
+
|
|
28
|
+
#### A. 조회 (인자 없음)
|
|
29
|
+
현재 원칙 목록을 표시:
|
|
30
|
+
```
|
|
31
|
+
📜 프로젝트 원칙
|
|
32
|
+
├─ MUST-001: {원칙}
|
|
33
|
+
├─ MUST-002: {원칙}
|
|
34
|
+
├─ SHOULD-001: {원칙}
|
|
35
|
+
└─ 마지막 수정: {날짜}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
#### B. 초기 설정 (`init`)
|
|
39
|
+
|
|
40
|
+
대화형으로 원칙 수집:
|
|
41
|
+
|
|
42
|
+
1. **프로젝트 컨텍스트** 분석 (CLAUDE.md, package.json, 코드 구조)
|
|
43
|
+
2. 자동 추출 가능한 원칙 제안:
|
|
44
|
+
- {config.architecture} 규칙 준수
|
|
45
|
+
- {config.code_style} 준수
|
|
46
|
+
- 린트 경고 0 ({config.lint} 기준)
|
|
47
|
+
- 등
|
|
48
|
+
3. 사용자에게 추가 원칙 질문 (AskUserQuestion)
|
|
49
|
+
4. 수집된 원칙을 구조화
|
|
50
|
+
|
|
51
|
+
#### C. 추가 (`add`)
|
|
52
|
+
1. 새 원칙의 강도 결정 (MUST / SHOULD / MAY)
|
|
53
|
+
2. principles.md에 추가
|
|
54
|
+
3. 버전 업데이트
|
|
55
|
+
|
|
56
|
+
#### D. 제거 (`remove`)
|
|
57
|
+
1. 해당 원칙 확인
|
|
58
|
+
2. 사용자 확인 후 제거
|
|
59
|
+
3. 버전 업데이트 (MAJOR)
|
|
60
|
+
|
|
61
|
+
### 3. 저장 형식
|
|
62
|
+
|
|
63
|
+
```markdown
|
|
64
|
+
# Project Principles
|
|
65
|
+
|
|
66
|
+
> Version: {MAJOR.MINOR.PATCH}
|
|
67
|
+
> Last Updated: {YYYY-MM-DD}
|
|
68
|
+
|
|
69
|
+
## MUST (위반 불가)
|
|
70
|
+
- **MUST-001**: {원칙} — {근거}
|
|
71
|
+
- **MUST-002**: {원칙} — {근거}
|
|
72
|
+
|
|
73
|
+
## SHOULD (강력 권장)
|
|
74
|
+
- **SHOULD-001**: {원칙} — {근거}
|
|
75
|
+
|
|
76
|
+
## MAY (선택적)
|
|
77
|
+
- **MAY-001**: {원칙} — {근거}
|
|
78
|
+
|
|
79
|
+
## Changelog
|
|
80
|
+
- {날짜}: {변경 내용}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### 4. 버전 규칙
|
|
84
|
+
|
|
85
|
+
- **MAJOR**: MUST 원칙 추가/제거/재정의
|
|
86
|
+
- **MINOR**: SHOULD/MAY 원칙 추가, MUST 명확화
|
|
87
|
+
- **PATCH**: 오타 수정, 근거 보완
|
|
88
|
+
|
|
89
|
+
## 주의사항
|
|
90
|
+
|
|
91
|
+
- **영속 저장**: memory/principles.md에 저장되어 세션 간 유지.
|
|
92
|
+
- **자동 참조**: /selfish:plan, /selfish:architect에서 자동으로 로드하여 검증.
|
|
93
|
+
- **간결하게**: 원칙은 10개 이내로 유지. 너무 많으면 실효성 저하.
|
|
94
|
+
- **CLAUDE.md와 중복 방지**: CLAUDE.md에 이미 있는 규칙은 원칙으로 중복 등록하지 않음.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# /selfish:research — 기술 리서치
|
|
2
|
+
|
|
3
|
+
> 기술적 질문을 조사하고 결론을 정리한다.
|
|
4
|
+
> 결과를 memory/research/{topic}.md에 영속 저장한다.
|
|
5
|
+
|
|
6
|
+
## 인자
|
|
7
|
+
|
|
8
|
+
- `$ARGUMENTS` — (필수) 리서치 주제 (예: "Zustand v5 마이그레이션", "WebCodecs API 비교")
|
|
9
|
+
|
|
10
|
+
## 실행 절차
|
|
11
|
+
|
|
12
|
+
### 1. 주제 분석
|
|
13
|
+
|
|
14
|
+
`$ARGUMENTS`에서 추출:
|
|
15
|
+
- **핵심 질문**: 무엇을 알아야 하는가?
|
|
16
|
+
- **컨텍스트**: 왜 필요한가? (현재 프로젝트와의 관련성)
|
|
17
|
+
- **범위**: 깊이 vs 넓이 (특정 라이브러리 비교? 전반적 기술 동향?)
|
|
18
|
+
|
|
19
|
+
### 2. 기존 리서치 확인
|
|
20
|
+
|
|
21
|
+
`memory/research/` 디렉토리에서 관련 기존 리서치 확인:
|
|
22
|
+
- 있으면: 기존 내용 로드 후 업데이트 필요 여부 판단
|
|
23
|
+
- 없으면: 신규 리서치 진행
|
|
24
|
+
|
|
25
|
+
### 3. 정보 수집
|
|
26
|
+
|
|
27
|
+
Agent Teams 활용 — 독립적 조사를 병렬 수행:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
Task("WebSearch: {주제} 공식 문서", subagent_type: general-purpose)
|
|
31
|
+
Task("코드베이스: 현재 사용 패턴 분석", subagent_type: Explore)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
정보원 우선순위:
|
|
35
|
+
1. **공식 문서** (WebSearch/WebFetch)
|
|
36
|
+
2. **코드베이스** (현재 프로젝트의 기존 패턴)
|
|
37
|
+
3. **커뮤니티** (GitHub Issues, 블로그)
|
|
38
|
+
|
|
39
|
+
### 4. 결론 정리
|
|
40
|
+
|
|
41
|
+
```markdown
|
|
42
|
+
# Research: {주제}
|
|
43
|
+
|
|
44
|
+
> 날짜: {YYYY-MM-DD}
|
|
45
|
+
> 관련 기능: {관련 feature 또는 "일반"}
|
|
46
|
+
|
|
47
|
+
## 핵심 질문
|
|
48
|
+
{무엇을 알아야 했는가}
|
|
49
|
+
|
|
50
|
+
## 발견사항
|
|
51
|
+
|
|
52
|
+
### {소주제 1}
|
|
53
|
+
{내용}
|
|
54
|
+
**출처**: {URL} ({날짜} 확인)
|
|
55
|
+
|
|
56
|
+
### {소주제 2}
|
|
57
|
+
{내용}
|
|
58
|
+
|
|
59
|
+
## 옵션 비교 (해당 시)
|
|
60
|
+
| 기준 | {옵션A} | {옵션B} | {옵션C} |
|
|
61
|
+
|------|---------|---------|---------|
|
|
62
|
+
| {기준1} | {평가} | {평가} | {평가} |
|
|
63
|
+
| {기준2} | {평가} | {평가} | {평가} |
|
|
64
|
+
|
|
65
|
+
## 결론
|
|
66
|
+
**추천**: {선택 또는 결론}
|
|
67
|
+
**근거**: {핵심 이유}
|
|
68
|
+
**주의사항**: {함정 또는 제약}
|
|
69
|
+
|
|
70
|
+
## 프로젝트 적용
|
|
71
|
+
{이 프로젝트에서 어떻게 적용할 수 있는지}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 5. 저장
|
|
75
|
+
|
|
76
|
+
- `memory/research/{topic-kebab-case}.md`에 저장
|
|
77
|
+
- 기존 파일이면 업데이트 (날짜 갱신)
|
|
78
|
+
|
|
79
|
+
### 6. 최종 출력
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
🔬 리서치 완료
|
|
83
|
+
├─ 주제: {주제}
|
|
84
|
+
├─ 저장: memory/research/{filename}.md
|
|
85
|
+
├─ 결론: {한 줄 요약}
|
|
86
|
+
└─ 출처: {주요 출처 수}개
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## 주의사항
|
|
90
|
+
|
|
91
|
+
- **현재 날짜 기준**: Knowledge cutoff에 의존하지 않고 WebSearch로 최신 정보 확인.
|
|
92
|
+
- **출처 필수**: 모든 기술적 주장에 출처 명시.
|
|
93
|
+
- **프로젝트 맥락**: 일반적 리서치가 아닌, 이 프로젝트에 적용 가능한 결론 도출.
|
|
94
|
+
- **영속 저장**: memory/research/에 저장하여 다른 세션에서 재활용 가능.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# /selfish:resume — 세션 복원
|
|
2
|
+
|
|
3
|
+
> memory/checkpoint.md에서 이전 세션 상태를 복원하고 작업을 재개한다.
|
|
4
|
+
|
|
5
|
+
## 인자
|
|
6
|
+
|
|
7
|
+
- `$ARGUMENTS` — (선택) 없음
|
|
8
|
+
|
|
9
|
+
## 실행 절차
|
|
10
|
+
|
|
11
|
+
### 1. 체크포인트 로드
|
|
12
|
+
|
|
13
|
+
`memory/checkpoint.md` 읽기:
|
|
14
|
+
- 없으면: "저장된 체크포인트가 없습니다." 출력 후 **중단**
|
|
15
|
+
- 있으면: 전체 내용 파싱
|
|
16
|
+
|
|
17
|
+
### 2. 환경 검증
|
|
18
|
+
|
|
19
|
+
체크포인트의 상태와 현재 환경을 비교:
|
|
20
|
+
|
|
21
|
+
1. **브랜치 확인**: 체크포인트의 브랜치와 현재 브랜치가 같은가?
|
|
22
|
+
- 다르면: 경고 + 전환 제안
|
|
23
|
+
2. **파일 상태**: 체크포인트 이후 변경된 파일이 있는가?
|
|
24
|
+
- `git log {체크포인트 해시}..HEAD --oneline` 으로 새 커밋 확인
|
|
25
|
+
3. **Feature 디렉토리**: specs/{feature}/ 가 여전히 존재하는가?
|
|
26
|
+
|
|
27
|
+
### 3. 상태 보고
|
|
28
|
+
|
|
29
|
+
```markdown
|
|
30
|
+
## 세션 복원
|
|
31
|
+
|
|
32
|
+
### 이전 체크포인트
|
|
33
|
+
- **저장 시간**: {시간}
|
|
34
|
+
- **메시지**: {체크포인트 메시지}
|
|
35
|
+
- **브랜치**: {브랜치} {(현재와 동일 ✓ / 다름 ⚠)}
|
|
36
|
+
|
|
37
|
+
### 활성 Feature
|
|
38
|
+
| Feature | 상태 | 진행률 |
|
|
39
|
+
|---------|------|--------|
|
|
40
|
+
| {이름} | {상태} | {진행률} |
|
|
41
|
+
|
|
42
|
+
### 체크포인트 이후 변경
|
|
43
|
+
{새 커밋이 있으면 목록, 없으면 "변경 없음"}
|
|
44
|
+
|
|
45
|
+
### 미완료 작업
|
|
46
|
+
{checkpoint.md의 미완료 작업 목록}
|
|
47
|
+
|
|
48
|
+
### 추천 다음 단계
|
|
49
|
+
{상태에 따른 추천 커맨드}
|
|
50
|
+
- tasks 진행 중 → `/selfish:implement` 재개
|
|
51
|
+
- plan 완료 → `/selfish:tasks`
|
|
52
|
+
- spec만 → `/selfish:plan`
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 4. 최종 출력
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
🔄 세션 복원 완료
|
|
59
|
+
├─ 체크포인트: {시간}
|
|
60
|
+
├─ Feature: {이름} ({상태})
|
|
61
|
+
├─ 진행률: {완료}/{전체}
|
|
62
|
+
└─ 추천: {다음 커맨드}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## 주의사항
|
|
66
|
+
|
|
67
|
+
- **읽기 전용**: 환경을 변경하지 않음 (브랜치 전환도 제안만, 실행은 사용자 확인 후).
|
|
68
|
+
- **불일치 경고**: 체크포인트와 현재 환경이 다르면 명확히 경고.
|
|
69
|
+
- **컨텍스트 복원**: 체크포인트의 "컨텍스트 노트"를 반드시 표시하여 기억 보조.
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# /selfish:review — 코드 리뷰
|
|
2
|
+
|
|
3
|
+
> 변경된 코드를 종합적으로 리뷰한다 (품질, 보안, 성능, 아키텍처 준수).
|
|
4
|
+
> Critic Loop 1회로 리뷰 자체의 완전성을 검증한다.
|
|
5
|
+
|
|
6
|
+
## 인자
|
|
7
|
+
|
|
8
|
+
- `$ARGUMENTS` — (선택) 리뷰 범위 지정 (파일 경로, PR 번호, 또는 "staged")
|
|
9
|
+
- 미지정 시: 현재 브랜치의 `git diff` (unstaged + staged) 전체
|
|
10
|
+
|
|
11
|
+
## 설정 로드
|
|
12
|
+
|
|
13
|
+
**반드시** `.claude/selfish.config.md`를 먼저 읽는다. 설정 파일이 없으면 중단.
|
|
14
|
+
|
|
15
|
+
## 실행 절차
|
|
16
|
+
|
|
17
|
+
### 1. 리뷰 대상 수집
|
|
18
|
+
|
|
19
|
+
1. **범위 결정**:
|
|
20
|
+
- `$ARGUMENTS` = 파일 경로 → 해당 파일만
|
|
21
|
+
- `$ARGUMENTS` = PR 번호 → `gh pr diff {번호}` 실행
|
|
22
|
+
- `$ARGUMENTS` = "staged" → `git diff --cached`
|
|
23
|
+
- 미지정 → `git diff HEAD` (커밋되지 않은 모든 변경)
|
|
24
|
+
2. **변경 파일 목록** 추출
|
|
25
|
+
3. 각 변경 파일의 **전체 내용** 읽기 (diff만이 아닌 전체 컨텍스트)
|
|
26
|
+
|
|
27
|
+
### 2. Agent Teams (파일 5개 초과 시)
|
|
28
|
+
|
|
29
|
+
변경 파일이 5개 초과면 병렬 리뷰 에이전트 분배:
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
Task("Review: {file1, file2}", subagent_type: general-purpose)
|
|
33
|
+
Task("Review: {file3, file4}", subagent_type: general-purpose)
|
|
34
|
+
→ 결과 수집 → 통합 리뷰 작성
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 3. 리뷰 수행
|
|
38
|
+
|
|
39
|
+
각 변경 파일에 대해 아래 관점으로 검토:
|
|
40
|
+
|
|
41
|
+
#### A. 코드 품질
|
|
42
|
+
- {config.code_style} 준수 (any 사용, 타입 누락)
|
|
43
|
+
- 네이밍 컨벤션 (handleX, isX, UPPER_SNAKE)
|
|
44
|
+
- 중복 코드
|
|
45
|
+
- 불필요한 복잡성
|
|
46
|
+
|
|
47
|
+
#### B. {config.architecture}
|
|
48
|
+
- 계층 의존성 방향 위반 (하위→상위 import)
|
|
49
|
+
- 세그먼트 규칙 (api/, model/, ui/, lib/)
|
|
50
|
+
- 적절한 계층 배치
|
|
51
|
+
|
|
52
|
+
#### C. 보안
|
|
53
|
+
- XSS 취약점 (dangerouslySetInnerHTML, 미검증 사용자 입력)
|
|
54
|
+
- 민감 정보 노출
|
|
55
|
+
- SQL/Command Injection
|
|
56
|
+
|
|
57
|
+
#### D. 성능
|
|
58
|
+
- 불필요한 리렌더링 (useCallback/useMemo 누락)
|
|
59
|
+
- 무한 루프 가능성 (useEffect 의존성)
|
|
60
|
+
- 대용량 데이터 처리
|
|
61
|
+
|
|
62
|
+
#### E. 프로젝트 패턴 준수
|
|
63
|
+
- {config.state_management} 사용 패턴
|
|
64
|
+
- 서버/클라이언트 상태 관리 패턴 ({config.state_management} 참조)
|
|
65
|
+
- 컴포넌트 구조 (Props 타입 위치, hook 순서)
|
|
66
|
+
|
|
67
|
+
### 4. 리뷰 출력
|
|
68
|
+
|
|
69
|
+
```markdown
|
|
70
|
+
## 코드 리뷰 결과
|
|
71
|
+
|
|
72
|
+
### 요약
|
|
73
|
+
| 심각도 | 개수 | 항목 |
|
|
74
|
+
|--------|------|------|
|
|
75
|
+
| 🔴 Critical | {N} | {요약} |
|
|
76
|
+
| 🟡 Warning | {N} | {요약} |
|
|
77
|
+
| 🔵 Info | {N} | {요약} |
|
|
78
|
+
|
|
79
|
+
### 상세 발견사항
|
|
80
|
+
|
|
81
|
+
#### 🔴 C-{N}: {제목}
|
|
82
|
+
- **파일**: {경로}:{라인}
|
|
83
|
+
- **문제**: {설명}
|
|
84
|
+
- **수정 제안**: {코드 예시}
|
|
85
|
+
|
|
86
|
+
#### 🟡 W-{N}: {제목}
|
|
87
|
+
{같은 형식}
|
|
88
|
+
|
|
89
|
+
#### 🔵 I-{N}: {제목}
|
|
90
|
+
{같은 형식}
|
|
91
|
+
|
|
92
|
+
### 긍정적 부분
|
|
93
|
+
- {잘된 점 1-2개}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### 5. Critic Loop (1회)
|
|
97
|
+
|
|
98
|
+
| 기준 | 검증 내용 |
|
|
99
|
+
|------|-----------|
|
|
100
|
+
| **COMPLETENESS** | 모든 변경 파일을 리뷰했는가? 누락된 관점이 있는가? |
|
|
101
|
+
| **PRECISION** | 발견사항이 오탐(false positive)이 아닌가? 실제 문제인가? |
|
|
102
|
+
|
|
103
|
+
FAIL 시: 리뷰 수정 후 최종 출력 갱신.
|
|
104
|
+
|
|
105
|
+
### 6. 최종 출력
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
🔍 리뷰 완료
|
|
109
|
+
├─ 파일: {변경 파일 수}개
|
|
110
|
+
├─ 발견: 🔴 {N} / 🟡 {N} / 🔵 {N}
|
|
111
|
+
├─ Critic: 1회 완료
|
|
112
|
+
└─ 결론: {한 줄 요약}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## 주의사항
|
|
116
|
+
|
|
117
|
+
- **읽기 전용**: 코드를 수정하지 않음. 발견사항만 보고.
|
|
118
|
+
- **전체 컨텍스트**: diff 줄만이 아닌 파일 전체를 읽고 맥락 파악 후 리뷰.
|
|
119
|
+
- **오탐 주의**: 확실하지 않은 문제는 🔵 Info로 분류.
|
|
120
|
+
- **패턴 존중**: 기존 코드베이스 패턴과 다르다고 무조건 지적하지 않음. CLAUDE.md 및 selfish.config.md 기준.
|