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
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "selfish-pipeline",
|
|
3
|
+
"owner": {
|
|
4
|
+
"name": "jhlee0409",
|
|
5
|
+
"email": "relee6203@gmail.com"
|
|
6
|
+
},
|
|
7
|
+
"metadata": {
|
|
8
|
+
"description": "Claude Code 전용 자동화 파이프라인 — spec → plan → tasks → implement → review → clean",
|
|
9
|
+
"version": "1.0.0"
|
|
10
|
+
},
|
|
11
|
+
"plugins": [
|
|
12
|
+
{
|
|
13
|
+
"name": "selfish",
|
|
14
|
+
"source": "./",
|
|
15
|
+
"description": "Claude Code 전용 자동화 파이프라인. spec → plan → tasks → implement → review → clean 전체 개발 사이클을 자동화합니다.",
|
|
16
|
+
"version": "1.0.0",
|
|
17
|
+
"category": "automation",
|
|
18
|
+
"tags": ["pipeline", "automation", "spec", "plan", "implement", "review", "critic-loop"]
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "selfish",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Claude Code 전용 자동화 파이프라인. spec → plan → tasks → implement → review → clean 전체 개발 사이클을 자동화합니다.",
|
|
5
|
+
"author": { "name": "jhlee0409", "email": "relee6203@gmail.com" },
|
|
6
|
+
"homepage": "https://github.com/jhlee0409/selfish-pipeline",
|
|
7
|
+
"repository": "https://github.com/jhlee0409/selfish-pipeline",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"keywords": ["pipeline", "automation", "spec", "plan", "implement", "review", "critic-loop"],
|
|
10
|
+
"commands": "./commands/",
|
|
11
|
+
"hooks": "./hooks/hooks.json"
|
|
12
|
+
}
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 jhlee0409
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/MIGRATION.md
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Migration Guide: install.sh → Plugin
|
|
2
|
+
|
|
3
|
+
> 기존 `git clone` + `install.sh` 방식에서 Claude Code 플러그인 방식으로 마이그레이션하는 가이드입니다.
|
|
4
|
+
|
|
5
|
+
## 변경 요약
|
|
6
|
+
|
|
7
|
+
| 항목 | 이전 | 이후 |
|
|
8
|
+
|------|------|------|
|
|
9
|
+
| 설치 | `git clone` + `./install.sh` | `/plugin install <url>` |
|
|
10
|
+
| 커맨드 구분자 | `.` (`/selfish.spec`) | `:` (`/selfish:spec`) |
|
|
11
|
+
| 커맨드 위치 | `~/.claude/commands/selfish.*.md` | 플러그인 내 `commands/*.md` |
|
|
12
|
+
| Hook 스크립트 | `<project>/.claude/hooks/*.sh` | 플러그인 내 `scripts/*.sh` |
|
|
13
|
+
| Hook 설정 | `<project>/.claude/settings.json` | 플러그인 내 `hooks/hooks.json` |
|
|
14
|
+
| 설정 파일 | `.claude/selfish.config.md` (변경 없음) | `.claude/selfish.config.md` (변경 없음) |
|
|
15
|
+
|
|
16
|
+
## 마이그레이션 절차
|
|
17
|
+
|
|
18
|
+
### 1. 기존 파일 정리
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# 기존 커맨드 파일 삭제 (유저 레벨)
|
|
22
|
+
rm -f ~/.claude/commands/selfish.*.md
|
|
23
|
+
|
|
24
|
+
# 기존 hook 스크립트 삭제 (프로젝트 레벨)
|
|
25
|
+
rm -f .claude/hooks/session-start-context.sh
|
|
26
|
+
rm -f .claude/hooks/pre-compact-checkpoint.sh
|
|
27
|
+
rm -f .claude/hooks/track-selfish-changes.sh
|
|
28
|
+
rm -f .claude/hooks/selfish-stop-gate.sh
|
|
29
|
+
rm -f .claude/hooks/selfish-pipeline-manage.sh
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 2. settings.json에서 selfish hook 제거
|
|
33
|
+
|
|
34
|
+
`.claude/settings.json`에서 selfish 관련 hook 항목을 제거합니다.
|
|
35
|
+
플러그인이 자체 `hooks.json`으로 hook을 등록하므로 settings.json에서의 수동 설정이 불필요합니다.
|
|
36
|
+
|
|
37
|
+
제거 대상 (settings.json 내):
|
|
38
|
+
- `SessionStart` → `session-start-context.sh`
|
|
39
|
+
- `PreCompact` → `pre-compact-checkpoint.sh`
|
|
40
|
+
- `PostToolUse` → `track-selfish-changes.sh`
|
|
41
|
+
- `Stop` → `selfish-stop-gate.sh`
|
|
42
|
+
|
|
43
|
+
> 다른 프로젝트 고유 hook이 settings.json에 있다면 그것은 유지하세요.
|
|
44
|
+
|
|
45
|
+
### 3. 플러그인 설치
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
npx selfish-pipeline
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
또는 수동으로:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
claude plugin marketplace add jhlee0409/selfish-pipeline
|
|
55
|
+
claude plugin install selfish@selfish-pipeline --scope user
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
기존 `install.sh`의 `--commands-only`에 해당하는 것은 **User** 스코프, 팀 공유는 **Project** 스코프입니다.
|
|
59
|
+
|
|
60
|
+
### 4. 커맨드명 변경
|
|
61
|
+
|
|
62
|
+
모든 커맨드의 구분자가 `.`에서 `:`로 변경되었습니다:
|
|
63
|
+
|
|
64
|
+
```text
|
|
65
|
+
# 이전
|
|
66
|
+
/selfish.auto "기능 설명"
|
|
67
|
+
/selfish.spec "기능 설명"
|
|
68
|
+
/selfish.plan
|
|
69
|
+
|
|
70
|
+
# 이후
|
|
71
|
+
/selfish:auto "기능 설명"
|
|
72
|
+
/selfish:spec "기능 설명"
|
|
73
|
+
/selfish:plan
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 5. 설정 파일 확인
|
|
77
|
+
|
|
78
|
+
`.claude/selfish.config.md`는 **변경 없이 그대로 사용 가능**합니다.
|
|
79
|
+
|
|
80
|
+
신규 프로젝트라면 `/selfish:init`으로 자동 생성할 수 있습니다.
|
|
81
|
+
|
|
82
|
+
## 변경되지 않는 것
|
|
83
|
+
|
|
84
|
+
- `.claude/selfish.config.md` 파일 형식 및 경로
|
|
85
|
+
- `specs/{feature}/` 아티팩트 경로
|
|
86
|
+
- `memory/` 참조 (checkpoint, principles, research, decisions)
|
|
87
|
+
- `.selfish-*` 상태 파일 경로
|
|
88
|
+
- `git tag selfish/pre-*` 안전 태그
|
|
89
|
+
- hook 스크립트 내부 로직
|
|
90
|
+
|
|
91
|
+
## FAQ
|
|
92
|
+
|
|
93
|
+
**Q: 기존 프로젝트의 `.claude/selfish.config.md`를 다시 만들어야 하나요?**
|
|
94
|
+
A: 아니요. 설정 파일 형식은 동일합니다. 그대로 사용하세요.
|
|
95
|
+
|
|
96
|
+
**Q: 여러 프로젝트에서 사용 중인데, 각 프로젝트마다 마이그레이션해야 하나요?**
|
|
97
|
+
A: 플러그인은 한 번만 설치하면 됩니다. 각 프로젝트에서는 기존 `.claude/hooks/*.sh`와 settings.json의 selfish hook 항목만 정리하면 됩니다.
|
|
98
|
+
|
|
99
|
+
**Q: 이전 버전과 플러그인을 동시에 사용할 수 있나요?**
|
|
100
|
+
A: 권장하지 않습니다. 커맨드명이 다르므로 (`/selfish.spec` vs `/selfish:spec`) 충돌은 없지만, hook이 중복 등록될 수 있습니다.
|
package/README.md
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# Selfish
|
|
2
|
+
|
|
3
|
+
> Claude Code 전용 자동화 파이프라인 시스템
|
|
4
|
+
|
|
5
|
+
기능 설명 하나로 **spec → plan → tasks → implement → review → clean** 전체 개발 파이프라인을 자동 실행합니다.
|
|
6
|
+
|
|
7
|
+
## 특징
|
|
8
|
+
|
|
9
|
+
- **외부 의존성 제로**: 순수 마크다운 프롬프트 + bash hook
|
|
10
|
+
- **프로젝트 독립적**: `selfish.config.md`로 어떤 프로젝트에도 적용 가능
|
|
11
|
+
- **물리적 CI 게이트**: Stop hook으로 CI 미통과 시 응답 종료 자체를 차단
|
|
12
|
+
- **Critic Loop**: 각 단계에서 자기비판을 통한 산출물 품질 보장
|
|
13
|
+
- **Agent Teams**: 독립 태스크를 병렬 서브에이전트로 동시 실행
|
|
14
|
+
- **세션 연속성**: 컨텍스트 압축/세션 중단 시에도 체크포인트로 복원
|
|
15
|
+
|
|
16
|
+
## 요구사항
|
|
17
|
+
|
|
18
|
+
- [Claude Code](https://claude.ai/code) CLI (플러그인 시스템 지원 버전)
|
|
19
|
+
- Git
|
|
20
|
+
- `jq` (PostToolUse hook에서 사용)
|
|
21
|
+
|
|
22
|
+
## 설치
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npx selfish-pipeline
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
마켓플레이스 등록 + 플러그인 설치를 자동 수행하며, 설치 범위(user / project / local)를 인터랙티브하게 선택합니다.
|
|
29
|
+
|
|
30
|
+
### 수동 설치
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# 1. 마켓플레이스 등록
|
|
34
|
+
claude plugin marketplace add jhlee0409/selfish-pipeline
|
|
35
|
+
|
|
36
|
+
# 2. 플러그인 설치 (스코프 선택)
|
|
37
|
+
claude plugin install selfish@selfish-pipeline --scope user # 개인 전체
|
|
38
|
+
claude plugin install selfish@selfish-pipeline --scope project # 팀 공유
|
|
39
|
+
claude plugin install selfish@selfish-pipeline --scope local # 이 프로젝트만
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 설치 후 프로젝트 초기 설정
|
|
43
|
+
|
|
44
|
+
```text
|
|
45
|
+
/selfish:init # 프로젝트 구조 자동 분석
|
|
46
|
+
/selfish:init nextjs-fsd # Next.js + FSD 프리셋 사용
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
> 기존 `git clone` + `install.sh` 방식에서 마이그레이션하는 경우 [MIGRATION.md](./MIGRATION.md)를 참고하세요.
|
|
50
|
+
|
|
51
|
+
## 설정
|
|
52
|
+
|
|
53
|
+
`/selfish:init` 실행 후 `.claude/selfish.config.md`를 프로젝트에 맞게 수정합니다:
|
|
54
|
+
|
|
55
|
+
```yaml
|
|
56
|
+
# CI 명령어
|
|
57
|
+
ci: "yarn ci"
|
|
58
|
+
gate: "yarn typecheck && yarn lint"
|
|
59
|
+
|
|
60
|
+
# 아키텍처
|
|
61
|
+
style: "FSD"
|
|
62
|
+
layers: [app, views, widgets, features, entities, shared, core]
|
|
63
|
+
import_rule: "상위 계층은 하위 계층만 import 가능"
|
|
64
|
+
|
|
65
|
+
# 프레임워크
|
|
66
|
+
name: "Next.js 14"
|
|
67
|
+
client_directive: "'use client'"
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## 커맨드
|
|
71
|
+
|
|
72
|
+
### Full Auto (권장)
|
|
73
|
+
|
|
74
|
+
```text
|
|
75
|
+
/selfish:auto "사용자 인증 기능 추가"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
spec → plan → tasks → implement → review → clean 전체를 자동 실행합니다.
|
|
79
|
+
|
|
80
|
+
### 개별 실행
|
|
81
|
+
|
|
82
|
+
| 커맨드 | 역할 | Critic |
|
|
83
|
+
|--------|------|--------|
|
|
84
|
+
| `/selfish:spec` | 기능 명세서 생성 | 1회 |
|
|
85
|
+
| `/selfish:clarify` | 명세 모호성 해소 | - |
|
|
86
|
+
| `/selfish:plan` | 구현 설계 | 3회 |
|
|
87
|
+
| `/selfish:tasks` | 태스크 분해 | 1회 |
|
|
88
|
+
| `/selfish:analyze` | 아티팩트 정합성 검증 | - |
|
|
89
|
+
| `/selfish:implement` | 코드 구현 실행 | - |
|
|
90
|
+
| `/selfish:review` | 코드 리뷰 | 1회 |
|
|
91
|
+
| `/selfish:debug` | 버그 진단/수정 | 2회 |
|
|
92
|
+
| `/selfish:architect` | 아키텍처 분석 | 3회 |
|
|
93
|
+
| `/selfish:security` | 보안 스캔 | - |
|
|
94
|
+
| `/selfish:research` | 기술 리서치 | - |
|
|
95
|
+
| `/selfish:principles` | 프로젝트 원칙 관리 | - |
|
|
96
|
+
| `/selfish:checkpoint` | 세션 상태 저장 | - |
|
|
97
|
+
| `/selfish:resume` | 세션 복원 | - |
|
|
98
|
+
| `/selfish:init` | 프로젝트 초기 설정 | - |
|
|
99
|
+
|
|
100
|
+
### 파이프라인 흐름
|
|
101
|
+
|
|
102
|
+
```text
|
|
103
|
+
/selfish:spec "기능 설명" → specs/{feature}/spec.md
|
|
104
|
+
↓
|
|
105
|
+
/selfish:clarify (선택) → spec.md 인라인 업데이트
|
|
106
|
+
↓
|
|
107
|
+
/selfish:plan → plan.md + research.md
|
|
108
|
+
↓
|
|
109
|
+
/selfish:tasks → tasks.md
|
|
110
|
+
↓
|
|
111
|
+
/selfish:analyze (선택) → 정합성 보고서
|
|
112
|
+
↓
|
|
113
|
+
/selfish:implement → 코드 구현 (Phase별 CI 게이트)
|
|
114
|
+
↓
|
|
115
|
+
/selfish:review (선택) → 리뷰 보고서
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## 핵심 메커니즘
|
|
119
|
+
|
|
120
|
+
### Critic Loop
|
|
121
|
+
|
|
122
|
+
각 단계에서 산출물을 자기비판합니다. 형식적 "PASS"를 방지하는 4가지 필수 원칙:
|
|
123
|
+
|
|
124
|
+
1. **최소 발견 수**: 기준당 최소 1개의 우려/검증 근거
|
|
125
|
+
2. **체크리스트 응답**: "PASS" 한 단어 금지, 구체적 답변 필수
|
|
126
|
+
3. **Adversarial Pass**: 매 회차 "실패 시나리오 1가지" 필수
|
|
127
|
+
4. **정량적 근거**: "N개 중 M개 확인" 형태의 데이터 제시
|
|
128
|
+
|
|
129
|
+
### 3단계 Phase 게이트
|
|
130
|
+
|
|
131
|
+
Implement 중 각 Phase 완료 시:
|
|
132
|
+
|
|
133
|
+
1. **CI 게이트**: `{config.gate}` 실행 (3회 실패 → 중단)
|
|
134
|
+
2. **Mini-Review**: 변경 파일별 정량적 품질 점검
|
|
135
|
+
3. **Auto-Checkpoint**: 세션 상태 저장 (중단 시 복원용)
|
|
136
|
+
|
|
137
|
+
### Stop Gate Hook
|
|
138
|
+
|
|
139
|
+
파이프라인 활성 중 CI 미통과 시 `exit 2`로 Claude의 응답 종료를 물리적으로 차단합니다.
|
|
140
|
+
|
|
141
|
+
## Hook 설명
|
|
142
|
+
|
|
143
|
+
| Hook | 이벤트 | 역할 |
|
|
144
|
+
|------|--------|------|
|
|
145
|
+
| `session-start-context.sh` | SessionStart | 파이프라인 상태 복원 |
|
|
146
|
+
| `pre-compact-checkpoint.sh` | PreCompact | 컨텍스트 압축 전 체크포인트 |
|
|
147
|
+
| `track-selfish-changes.sh` | PostToolUse | 파일 변경 추적, CI 무효화 |
|
|
148
|
+
| `selfish-stop-gate.sh` | Stop | CI 게이트 강제 |
|
|
149
|
+
| `selfish-pipeline-manage.sh` | (내부 호출) | 파이프라인 상태 플래그 관리 |
|
|
150
|
+
|
|
151
|
+
## 디렉토리 구조
|
|
152
|
+
|
|
153
|
+
```text
|
|
154
|
+
selfish-pipeline/
|
|
155
|
+
├── .claude-plugin/
|
|
156
|
+
│ └── plugin.json # 플러그인 매니페스트
|
|
157
|
+
├── bin/
|
|
158
|
+
│ └── cli.mjs # npx 인터랙티브 인스톨러
|
|
159
|
+
├── commands/ # 16개 커맨드
|
|
160
|
+
│ ├── auto.md # Full Auto 파이프라인
|
|
161
|
+
│ ├── spec.md # 기능 명세서
|
|
162
|
+
│ ├── plan.md # 구현 설계
|
|
163
|
+
│ ├── tasks.md # 태스크 분해
|
|
164
|
+
│ ├── implement.md # 코드 구현
|
|
165
|
+
│ ├── review.md # 코드 리뷰
|
|
166
|
+
│ ├── debug.md # 버그 진단
|
|
167
|
+
│ ├── architect.md # 아키텍처 분석
|
|
168
|
+
│ ├── security.md # 보안 스캔
|
|
169
|
+
│ ├── analyze.md # 정합성 검증
|
|
170
|
+
│ ├── clarify.md # 명세 모호성 해소
|
|
171
|
+
│ ├── research.md # 기술 리서치
|
|
172
|
+
│ ├── principles.md # 원칙 관리
|
|
173
|
+
│ ├── checkpoint.md # 세션 저장
|
|
174
|
+
│ ├── resume.md # 세션 복원
|
|
175
|
+
│ └── init.md # 프로젝트 초기 설정
|
|
176
|
+
├── hooks/
|
|
177
|
+
│ └── hooks.json # hook 이벤트 등록
|
|
178
|
+
├── scripts/ # 5개 bash hook 스크립트
|
|
179
|
+
│ ├── session-start-context.sh
|
|
180
|
+
│ ├── pre-compact-checkpoint.sh
|
|
181
|
+
│ ├── track-selfish-changes.sh
|
|
182
|
+
│ ├── selfish-stop-gate.sh
|
|
183
|
+
│ └── selfish-pipeline-manage.sh
|
|
184
|
+
├── templates/
|
|
185
|
+
│ ├── selfish.config.template.md # 프로젝트 설정 템플릿
|
|
186
|
+
│ └── selfish.config.nextjs-fsd.md # Next.js + FSD 예시
|
|
187
|
+
├── package.json # npx 실행용
|
|
188
|
+
├── README.md
|
|
189
|
+
├── MIGRATION.md # 기존 사용자 마이그레이션 가이드
|
|
190
|
+
└── LICENSE
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## 라이선스
|
|
194
|
+
|
|
195
|
+
MIT
|
package/bin/cli.mjs
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { createInterface } from "node:readline/promises";
|
|
4
|
+
import { execSync } from "node:child_process";
|
|
5
|
+
import { stdin, stdout, exit } from "node:process";
|
|
6
|
+
|
|
7
|
+
const GITHUB_REPO = "jhlee0409/selfish-pipeline";
|
|
8
|
+
const MARKETPLACE_NAME = "selfish-pipeline";
|
|
9
|
+
const PLUGIN_NAME = "selfish";
|
|
10
|
+
|
|
11
|
+
const SCOPES = [
|
|
12
|
+
{
|
|
13
|
+
key: "1",
|
|
14
|
+
name: "user",
|
|
15
|
+
label: "User (개인 전체 프로젝트)",
|
|
16
|
+
desc: "~/.claude/settings.json",
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
key: "2",
|
|
20
|
+
name: "project",
|
|
21
|
+
label: "Project (팀 공유, git 커밋 가능)",
|
|
22
|
+
desc: ".claude/settings.json",
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
key: "3",
|
|
26
|
+
name: "local",
|
|
27
|
+
label: "Local (이 프로젝트만, gitignore)",
|
|
28
|
+
desc: ".claude/settings.local.json",
|
|
29
|
+
},
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
function run(cmd) {
|
|
33
|
+
try {
|
|
34
|
+
execSync(cmd, { stdio: "inherit" });
|
|
35
|
+
return true;
|
|
36
|
+
} catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async function main() {
|
|
42
|
+
console.log();
|
|
43
|
+
console.log(" Selfish Pipeline — Claude Code Plugin Installer");
|
|
44
|
+
console.log(" ================================================");
|
|
45
|
+
console.log();
|
|
46
|
+
|
|
47
|
+
// claude CLI 존재 확인
|
|
48
|
+
try {
|
|
49
|
+
execSync("claude --version", { stdio: "pipe" });
|
|
50
|
+
} catch {
|
|
51
|
+
console.error(" ✗ Claude Code CLI가 설치되어 있지 않습니다.");
|
|
52
|
+
console.error(" https://claude.ai/code 에서 설치하세요.");
|
|
53
|
+
exit(1);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
57
|
+
|
|
58
|
+
try {
|
|
59
|
+
console.log(" 설치 범위를 선택하세요:\n");
|
|
60
|
+
for (const s of SCOPES) {
|
|
61
|
+
console.log(` ${s.key}) ${s.label}`);
|
|
62
|
+
console.log(` → ${s.desc}`);
|
|
63
|
+
}
|
|
64
|
+
console.log();
|
|
65
|
+
|
|
66
|
+
const answer = await rl.question(" 선택 [1/2/3] (기본: 1): ");
|
|
67
|
+
const choice = answer.trim() || "1";
|
|
68
|
+
const scope = SCOPES.find((s) => s.key === choice);
|
|
69
|
+
|
|
70
|
+
if (!scope) {
|
|
71
|
+
console.error("\n ✗ 잘못된 선택입니다.");
|
|
72
|
+
exit(1);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
console.log(`\n → ${scope.label} 스코프로 설치합니다...\n`);
|
|
76
|
+
|
|
77
|
+
// Step 1: 마켓플레이스 등록
|
|
78
|
+
console.log(" [1/2] 마켓플레이스 등록...");
|
|
79
|
+
run(`claude plugin marketplace add ${GITHUB_REPO}`);
|
|
80
|
+
|
|
81
|
+
// Step 2: 플러그인 설치
|
|
82
|
+
console.log(` [2/2] 플러그인 설치 (--scope ${scope.name})...`);
|
|
83
|
+
const installed = run(
|
|
84
|
+
`claude plugin install ${PLUGIN_NAME}@${MARKETPLACE_NAME} --scope ${scope.name}`
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
if (!installed) {
|
|
88
|
+
console.error("\n ✗ 설치에 실패했습니다. 수동으로 시도하세요:");
|
|
89
|
+
console.error(` claude plugin marketplace add ${GITHUB_REPO}`);
|
|
90
|
+
console.error(
|
|
91
|
+
` claude plugin install ${PLUGIN_NAME}@${MARKETPLACE_NAME} --scope ${scope.name}`
|
|
92
|
+
);
|
|
93
|
+
exit(1);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
console.log();
|
|
97
|
+
console.log(" ✓ 설치 완료!");
|
|
98
|
+
console.log();
|
|
99
|
+
console.log(" 다음 단계:");
|
|
100
|
+
console.log(" /selfish:init 프로젝트 설정 생성");
|
|
101
|
+
console.log(' /selfish:auto "기능 설명" 파이프라인 실행');
|
|
102
|
+
console.log();
|
|
103
|
+
} finally {
|
|
104
|
+
rl.close();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
main().catch((err) => {
|
|
109
|
+
console.error(`\n ✗ 설치 실패: ${err.message}`);
|
|
110
|
+
exit(1);
|
|
111
|
+
});
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# /selfish:analyze — 아티팩트 정합성 검증
|
|
2
|
+
|
|
3
|
+
> spec.md, plan.md, tasks.md 간의 일관성과 품질을 검증한다.
|
|
4
|
+
> **읽기 전용** — 파일을 수정하지 않는다.
|
|
5
|
+
|
|
6
|
+
## 인자
|
|
7
|
+
|
|
8
|
+
- `$ARGUMENTS` — (선택) 검증 범위 한정 (예: "spec-plan", "tasks-only")
|
|
9
|
+
|
|
10
|
+
## 설정 로드
|
|
11
|
+
|
|
12
|
+
프로젝트 루트의 `CLAUDE.md` 또는 `.claude/CLAUDE.md`에서 다음 설정을 읽어 `config` 변수에 할당:
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
config.architecture = 프로젝트에서 사용하는 아키텍처 패턴
|
|
16
|
+
(예: "FSD", "Clean Architecture", "Layered", "Modular Monolith")
|
|
17
|
+
→ CLAUDE.md에 명시된 아키텍처 기준. 없으면 "레이어드 아키텍처"로 가정.
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## 실행 절차
|
|
21
|
+
|
|
22
|
+
### 1. 아티팩트 로드
|
|
23
|
+
|
|
24
|
+
`specs/{feature}/`에서:
|
|
25
|
+
- **spec.md** (필수)
|
|
26
|
+
- **plan.md** (필수)
|
|
27
|
+
- **tasks.md** (있으면)
|
|
28
|
+
- **research.md** (있으면)
|
|
29
|
+
|
|
30
|
+
누락 파일이 있으면 경고하되 있는 것으로 진행.
|
|
31
|
+
|
|
32
|
+
### 2. 검증 수행
|
|
33
|
+
|
|
34
|
+
6가지 카테고리를 검증:
|
|
35
|
+
|
|
36
|
+
#### A. 중복 감지 (DUPLICATION)
|
|
37
|
+
- spec.md 내 유사한 요구사항
|
|
38
|
+
- tasks.md 내 겹치는 태스크
|
|
39
|
+
|
|
40
|
+
#### B. 모호성 감지 (AMBIGUITY)
|
|
41
|
+
- 측정 불가능한 형용사 ("적절한", "빠른", "좋은")
|
|
42
|
+
- TODO/TBD/FIXME 잔류
|
|
43
|
+
- 불완전한 문장
|
|
44
|
+
|
|
45
|
+
#### C. 커버리지 갭 (COVERAGE)
|
|
46
|
+
- spec → plan: 모든 FR-*/NFR-*가 plan에 반영되었는가?
|
|
47
|
+
- plan → tasks: plan의 File Change Map 모든 항목이 tasks에 있는가?
|
|
48
|
+
- spec → tasks: 모든 요구사항이 태스크에 매핑되는가?
|
|
49
|
+
|
|
50
|
+
#### D. 불일치 (INCONSISTENCY)
|
|
51
|
+
- 용어 드리프트 (같은 개념에 다른 이름)
|
|
52
|
+
- 충돌하는 요구사항
|
|
53
|
+
- plan의 기술 결정과 tasks의 실행이 불일치
|
|
54
|
+
|
|
55
|
+
#### E. 원칙 준수 (PRINCIPLES)
|
|
56
|
+
- memory/principles.md가 있으면 MUST 원칙 대비 검증
|
|
57
|
+
- {config.architecture} 규칙 위반 가능성
|
|
58
|
+
|
|
59
|
+
#### F. 리스크 미식별 (RISK)
|
|
60
|
+
- plan.md에 식별되지 않은 리스크가 있는가?
|
|
61
|
+
- 외부 의존성 리스크
|
|
62
|
+
- 성능 병목 가능성
|
|
63
|
+
|
|
64
|
+
### 3. 심각도 분류
|
|
65
|
+
|
|
66
|
+
| 심각도 | 기준 |
|
|
67
|
+
|--------|------|
|
|
68
|
+
| **CRITICAL** | 원칙 위반, 핵심 기능 차단, 보안 문제 |
|
|
69
|
+
| **HIGH** | 중복/충돌, 테스트 불가능, 커버리지 갭 |
|
|
70
|
+
| **MEDIUM** | 용어 드리프트, 모호한 요구사항 |
|
|
71
|
+
| **LOW** | 스타일 개선, 사소한 중복 |
|
|
72
|
+
|
|
73
|
+
### 4. 결과 출력 (콘솔)
|
|
74
|
+
|
|
75
|
+
```markdown
|
|
76
|
+
## 정합성 분석 결과: {기능명}
|
|
77
|
+
|
|
78
|
+
### 발견사항
|
|
79
|
+
| ID | 카테고리 | 심각도 | 위치 | 요약 | 권장 조치 |
|
|
80
|
+
|----|----------|--------|------|------|-----------|
|
|
81
|
+
| A-001 | COVERAGE | HIGH | spec FR-003 | tasks에 매핑 없음 | 태스크 추가 |
|
|
82
|
+
| A-002 | AMBIGUITY | MEDIUM | spec NFR-001 | "빠르게" 측정 불가 | 수치 기준 추가 |
|
|
83
|
+
|
|
84
|
+
### 커버리지 요약
|
|
85
|
+
| 매핑 | 비율 |
|
|
86
|
+
|------|------|
|
|
87
|
+
| spec → plan | {N}% |
|
|
88
|
+
| plan → tasks | {N}% |
|
|
89
|
+
| spec → tasks | {N}% |
|
|
90
|
+
|
|
91
|
+
### 메트릭스
|
|
92
|
+
- 총 요구사항: {N}개
|
|
93
|
+
- 총 태스크: {N}개
|
|
94
|
+
- 이슈: CRITICAL {N} / HIGH {N} / MEDIUM {N} / LOW {N}
|
|
95
|
+
|
|
96
|
+
### 다음 단계
|
|
97
|
+
{CRITICAL/HIGH 이슈에 대한 구체적 조치 제안}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### 5. 최종 출력
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
🔎 분석 완료
|
|
104
|
+
├─ 발견: CRITICAL {N} / HIGH {N} / MEDIUM {N} / LOW {N}
|
|
105
|
+
├─ 커버리지: spec→plan {N}%, plan→tasks {N}%, spec→tasks {N}%
|
|
106
|
+
└─ 권장: {다음 액션}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## 주의사항
|
|
110
|
+
|
|
111
|
+
- **읽기 전용**: 어떤 파일도 수정하지 않는다. 보고만 한다.
|
|
112
|
+
- **오탐 주의**: 모호성 감지가 과도하지 않도록. 컨텍스트를 고려.
|
|
113
|
+
- **선택적**: 파이프라인에서 필수가 아님. plan → tasks → implement 직행 가능.
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# /selfish:architect — 아키텍처 분석 및 설계 조언
|
|
2
|
+
|
|
3
|
+
> 코드베이스의 아키텍처를 분석하고 설계 결정을 기록한다.
|
|
4
|
+
> Critic Loop 3회로 설계 품질을 보장한다. **읽기 전용** — 코드를 수정하지 않는다.
|
|
5
|
+
|
|
6
|
+
## 인자
|
|
7
|
+
|
|
8
|
+
- `$ARGUMENTS` — (필수) 분석 대상 또는 설계 질문 (예: "상태 관리 전략 리뷰", "새 entity 추가 위치")
|
|
9
|
+
|
|
10
|
+
## 설정 로드
|
|
11
|
+
|
|
12
|
+
프로젝트 루트의 `CLAUDE.md` 또는 `.claude/CLAUDE.md`에서 다음 설정을 읽어 `config` 변수에 할당:
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
config.architecture = 프로젝트에서 사용하는 아키텍처 패턴
|
|
16
|
+
(예: "FSD", "Clean Architecture", "Layered", "Modular Monolith")
|
|
17
|
+
→ CLAUDE.md에 명시된 아키텍처 기준. 없으면 "레이어드 아키텍처"로 가정.
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## 실행 절차
|
|
21
|
+
|
|
22
|
+
### 1. 범위 결정
|
|
23
|
+
|
|
24
|
+
`$ARGUMENTS`를 분석하여 작업 유형 판별:
|
|
25
|
+
|
|
26
|
+
| 유형 | 예시 | 출력 |
|
|
27
|
+
|------|------|------|
|
|
28
|
+
| **구조 분석** | "타임라인 모듈 구조" | 의존성 맵 + 개선 제안 |
|
|
29
|
+
| **설계 질문** | "새 feature 어디에?" | 배치 제안 + 근거 |
|
|
30
|
+
| **ADR 기록** | "Redis vs In-memory 결정" | Architecture Decision Record |
|
|
31
|
+
| **리팩토링 평가** | "store 분리 필요성" | 현재 문제 + 리팩토링 계획 |
|
|
32
|
+
|
|
33
|
+
### 2. 코드베이스 탐색
|
|
34
|
+
|
|
35
|
+
1. 관련 디렉토리/파일 탐색 (Glob, Grep, Read)
|
|
36
|
+
2. 의존성 흐름 추적 (import 관계)
|
|
37
|
+
3. {config.architecture} 구조 확인
|
|
38
|
+
4. 기존 패턴 식별
|
|
39
|
+
|
|
40
|
+
Agent Teams 활용: 분석 범위가 넓으면 (3개+ 모듈) 병렬 탐색:
|
|
41
|
+
```
|
|
42
|
+
Task("features/timeline 분석", subagent_type: Explore)
|
|
43
|
+
Task("widgets/timeline 분석", subagent_type: Explore)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 3. 분석 작성
|
|
47
|
+
|
|
48
|
+
분석 결과를 구조화하여 **콘솔에 출력**:
|
|
49
|
+
|
|
50
|
+
```markdown
|
|
51
|
+
## 아키텍처 분석: {주제}
|
|
52
|
+
|
|
53
|
+
### 현재 구조
|
|
54
|
+
{의존성 맵, 모듈 관계, 데이터 흐름}
|
|
55
|
+
|
|
56
|
+
### 발견사항
|
|
57
|
+
| # | 영역 | 현재 | 제안 | 영향도 |
|
|
58
|
+
|---|------|------|------|--------|
|
|
59
|
+
| 1 | {영역} | {현재 방식} | {제안} | H/M/L |
|
|
60
|
+
|
|
61
|
+
### 설계 결정 (ADR)
|
|
62
|
+
**결정**: {선택한 방식}
|
|
63
|
+
**상태**: Proposed / Accepted / Deprecated
|
|
64
|
+
**컨텍스트**: {배경}
|
|
65
|
+
**선택지**:
|
|
66
|
+
1. {옵션1} — 장점: / 단점:
|
|
67
|
+
2. {옵션2} — 장점: / 단점:
|
|
68
|
+
**근거**: {왜 이 선택인지}
|
|
69
|
+
**결과**: {예상되는 영향}
|
|
70
|
+
|
|
71
|
+
### 아키텍처 정합성
|
|
72
|
+
{config.architecture} 규칙 위반 여부, import 방향 검증}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 4. Critic Loop (3회)
|
|
76
|
+
|
|
77
|
+
| 기준 | 검증 내용 |
|
|
78
|
+
|------|-----------|
|
|
79
|
+
| **FEASIBILITY** | 제안이 현재 코드베이스에서 실현 가능한가? |
|
|
80
|
+
| **INCREMENTALITY** | 점진적 적용이 가능한가? (빅뱅 리팩토링 지양) |
|
|
81
|
+
| **COMPATIBILITY** | 기존 코드와 호환되는가? Breaking change가 있는가? |
|
|
82
|
+
| **ARCHITECTURE** | {config.architecture} 규칙을 준수하는가? |
|
|
83
|
+
|
|
84
|
+
출력 규칙:
|
|
85
|
+
- FAIL 시: `⚠ {기준}: {문제}. 수정 중...`
|
|
86
|
+
- PASS 시: `✓ Critic {N}/3 통과`
|
|
87
|
+
- 최종: `Critic Loop 완료 ({N}회). 주요 수정: {요약}`
|
|
88
|
+
|
|
89
|
+
### 5. ADR 저장 (설계 결정인 경우)
|
|
90
|
+
|
|
91
|
+
ADR 유형이면 `memory/decisions/{YYYY-MM-DD}-{topic}.md`에 저장:
|
|
92
|
+
|
|
93
|
+
```markdown
|
|
94
|
+
# ADR: {제목}
|
|
95
|
+
- **날짜**: {YYYY-MM-DD}
|
|
96
|
+
- **상태**: Proposed
|
|
97
|
+
- **컨텍스트**: {배경}
|
|
98
|
+
- **결정**: {선택}
|
|
99
|
+
- **근거**: {이유}
|
|
100
|
+
- **결과**: {영향}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### 6. 최종 출력
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
🏗 아키텍처 분석 완료
|
|
107
|
+
├─ 유형: {구조 분석 | 설계 질문 | ADR | 리팩토링 평가}
|
|
108
|
+
├─ 발견사항: {개수}개
|
|
109
|
+
├─ Critic: {N}회 완료
|
|
110
|
+
├─ ADR: {저장됨 | 해당없음}
|
|
111
|
+
└─ 제안: {핵심 제안 한 줄}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## 주의사항
|
|
115
|
+
|
|
116
|
+
- **읽기 전용**: 코드를 수정하지 않음. 분석과 제안만 수행.
|
|
117
|
+
- **실제 코드 기반**: 추측이 아닌 실제 코드베이스를 탐색하여 분석.
|
|
118
|
+
- **아키텍처 우선**: 모든 제안은 {config.architecture} 규칙을 존중.
|
|
119
|
+
- **점진적 변경**: 빅뱅 리팩토링보다 점진적 개선을 선호.
|