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,63 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Session Start Hook: 세션 시작 시 파이프라인 상태 복원
|
|
3
|
+
# resume/compact 후에도 진행 상태를 잃지 않도록 컨텍스트 주입
|
|
4
|
+
#
|
|
5
|
+
# Gap 해결: OMC의 세션 연속성 → 물리적 스크립트로 강제
|
|
6
|
+
|
|
7
|
+
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$(pwd)}"
|
|
8
|
+
# Auto-memory 디렉토리를 프로젝트 경로에서 동적 파생
|
|
9
|
+
PROJECT_PATH=$(cd "$PROJECT_DIR" 2>/dev/null && pwd || echo "$PROJECT_DIR")
|
|
10
|
+
ENCODED_PATH=$(echo "$PROJECT_PATH" | sed 's|/|-|g')
|
|
11
|
+
MEMORY_DIR="$HOME/.claude/projects/$ENCODED_PATH/memory"
|
|
12
|
+
CHECKPOINT="$MEMORY_DIR/checkpoint.md"
|
|
13
|
+
PIPELINE_FLAG="$PROJECT_DIR/.claude/.selfish-active"
|
|
14
|
+
|
|
15
|
+
OUTPUT=""
|
|
16
|
+
|
|
17
|
+
# 1. 활성 파이프라인 확인
|
|
18
|
+
if [ -f "$PIPELINE_FLAG" ]; then
|
|
19
|
+
FEATURE=$(cat "$PIPELINE_FLAG")
|
|
20
|
+
OUTPUT="[SELFISH PIPELINE ACTIVE] Feature: $FEATURE"
|
|
21
|
+
|
|
22
|
+
# tasks.md 진행 상태
|
|
23
|
+
TASKS_FILE="$PROJECT_DIR/specs/$FEATURE/tasks.md"
|
|
24
|
+
if [ -f "$TASKS_FILE" ]; then
|
|
25
|
+
DONE=$(grep -cE '\[x\]' "$TASKS_FILE" 2>/dev/null || echo 0)
|
|
26
|
+
TOTAL=$(grep -cE '\[(x| )\]' "$TASKS_FILE" 2>/dev/null || echo 0)
|
|
27
|
+
OUTPUT="$OUTPUT | Tasks: $DONE/$TOTAL"
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
# CI 통과 여부
|
|
31
|
+
CI_FLAG="$PROJECT_DIR/.claude/.selfish-ci-passed"
|
|
32
|
+
if [ -f "$CI_FLAG" ]; then
|
|
33
|
+
OUTPUT="$OUTPUT | Last CI: PASSED ($(cat "$CI_FLAG"))"
|
|
34
|
+
fi
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
# 2. 체크포인트 존재 확인
|
|
38
|
+
if [ -f "$CHECKPOINT" ]; then
|
|
39
|
+
CHECKPOINT_DATE=$(grep '자동 생성:' "$CHECKPOINT" 2>/dev/null | head -1 | sed 's/.*자동 생성: //')
|
|
40
|
+
if [ -n "$CHECKPOINT_DATE" ]; then
|
|
41
|
+
if [ -n "$OUTPUT" ]; then
|
|
42
|
+
OUTPUT="$OUTPUT | Checkpoint: $CHECKPOINT_DATE"
|
|
43
|
+
else
|
|
44
|
+
OUTPUT="[CHECKPOINT EXISTS] Date: $CHECKPOINT_DATE — Run /selfish.resume to restore"
|
|
45
|
+
fi
|
|
46
|
+
fi
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
# 3. Safety tag 확인
|
|
50
|
+
BRANCH=$(cd "$PROJECT_DIR" 2>/dev/null && git branch --show-current 2>/dev/null)
|
|
51
|
+
HAS_SAFETY_TAG=$(cd "$PROJECT_DIR" 2>/dev/null && git tag -l 'selfish/pre-*' 2>/dev/null | head -1)
|
|
52
|
+
if [ -n "$HAS_SAFETY_TAG" ]; then
|
|
53
|
+
if [ -n "$OUTPUT" ]; then
|
|
54
|
+
OUTPUT="$OUTPUT | Safety tag: $HAS_SAFETY_TAG"
|
|
55
|
+
fi
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
# 출력 (stdout → Claude 컨텍스트에 주입됨)
|
|
59
|
+
if [ -n "$OUTPUT" ]; then
|
|
60
|
+
echo "$OUTPUT"
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
exit 0
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# PostToolUse Hook: 파일 변경 추적
|
|
3
|
+
# Edit/Write 도구 사용 후 변경된 파일을 기록
|
|
4
|
+
# CI 게이트에서 어떤 파일이 변경되었는지 추적
|
|
5
|
+
|
|
6
|
+
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$(pwd)}"
|
|
7
|
+
PIPELINE_FLAG="$PROJECT_DIR/.claude/.selfish-active"
|
|
8
|
+
|
|
9
|
+
# jq 필수 의존성 확인
|
|
10
|
+
if ! command -v jq &> /dev/null; then
|
|
11
|
+
exit 0
|
|
12
|
+
fi
|
|
13
|
+
CHANGES_LOG="$PROJECT_DIR/.claude/.selfish-changes.log"
|
|
14
|
+
CI_FLAG="$PROJECT_DIR/.claude/.selfish-ci-passed"
|
|
15
|
+
|
|
16
|
+
# 파이프라인 비활성이면 → 스킵
|
|
17
|
+
if [ ! -f "$PIPELINE_FLAG" ]; then
|
|
18
|
+
exit 0
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
# stdin에서 tool input 파싱
|
|
22
|
+
INPUT=$(cat)
|
|
23
|
+
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty' 2>/dev/null)
|
|
24
|
+
|
|
25
|
+
if [ -n "$FILE_PATH" ]; then
|
|
26
|
+
# 변경 로그에 추가 (중복 제거)
|
|
27
|
+
echo "$FILE_PATH" >> "$CHANGES_LOG"
|
|
28
|
+
sort -u -o "$CHANGES_LOG" "$CHANGES_LOG"
|
|
29
|
+
|
|
30
|
+
# 파일이 변경되었으므로 CI 결과 무효화
|
|
31
|
+
rm -f "$CI_FLAG"
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
exit 0
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Selfish Configuration
|
|
2
|
+
|
|
3
|
+
> 이 파일은 selfish 커맨드 시스템의 프로젝트별 설정을 정의한다.
|
|
4
|
+
> 모든 selfish 커맨드는 이 파일을 참조하여 프로젝트별 동작을 결정한다.
|
|
5
|
+
|
|
6
|
+
## CI Commands
|
|
7
|
+
|
|
8
|
+
```yaml
|
|
9
|
+
ci: "yarn ci" # 전체 CI (lint + typecheck + build)
|
|
10
|
+
typecheck: "yarn typecheck" # 타입 체크만
|
|
11
|
+
lint: "yarn lint" # 린트만
|
|
12
|
+
lint_fix: "yarn lint:fix" # 린트 자동 수정
|
|
13
|
+
gate: "yarn typecheck && yarn lint" # Phase 게이트 (implement 중 반복 실행)
|
|
14
|
+
test: "yarn test" # 테스트
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Architecture
|
|
18
|
+
|
|
19
|
+
```yaml
|
|
20
|
+
style: "FSD" # Feature-Sliced Design
|
|
21
|
+
layers: # 상위 → 하위 순서
|
|
22
|
+
- app
|
|
23
|
+
- views
|
|
24
|
+
- widgets
|
|
25
|
+
- features
|
|
26
|
+
- entities
|
|
27
|
+
- shared
|
|
28
|
+
- core
|
|
29
|
+
import_rule: "상위 계층은 하위 계층만 import 가능 (역방향 불가)"
|
|
30
|
+
segments:
|
|
31
|
+
- api # API 관련 로직 (React Query hooks)
|
|
32
|
+
- model # 상태 관리 및 타입 정의
|
|
33
|
+
- ui # UI 컴포넌트
|
|
34
|
+
- lib # 유틸리티 함수
|
|
35
|
+
- config # 설정 및 상수
|
|
36
|
+
- hooks # 커스텀 훅
|
|
37
|
+
path_alias: "@/* → ./src/*"
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Framework
|
|
41
|
+
|
|
42
|
+
```yaml
|
|
43
|
+
name: "Next.js 14"
|
|
44
|
+
runtime: "App Router"
|
|
45
|
+
client_directive: "'use client'"
|
|
46
|
+
client_directive_rule: >
|
|
47
|
+
useState/useEffect/useRef 등 클라이언트 훅을 사용하는 파일은
|
|
48
|
+
반드시 'use client' 선언 필요. barrel export(index.ts)를 통해
|
|
49
|
+
서버 컴포넌트에서 간접 import 되는 경우 특히 주의.
|
|
50
|
+
server_client_boundary: true # 서버/클라이언트 경계가 존재
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Code Style
|
|
54
|
+
|
|
55
|
+
```yaml
|
|
56
|
+
language: "TypeScript"
|
|
57
|
+
strict_mode: true
|
|
58
|
+
type_keyword: "type" # interface 대신 type 사용
|
|
59
|
+
import_type: true # import type { ... } 사용
|
|
60
|
+
component_style: "PascalCase"
|
|
61
|
+
props_position: "above component" # Props 타입은 컴포넌트 위에 정의
|
|
62
|
+
handler_naming: "handle[Event]"
|
|
63
|
+
boolean_naming: "is/has/can[State]"
|
|
64
|
+
constant_naming: "UPPER_SNAKE_CASE"
|
|
65
|
+
any_policy: "최소화 (strict mode 준수)"
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## State Management
|
|
69
|
+
|
|
70
|
+
```yaml
|
|
71
|
+
global_state: "Zustand"
|
|
72
|
+
server_state: "React Query v5"
|
|
73
|
+
local_state: "Context API (use-context-selector)"
|
|
74
|
+
store_location: "model/ 세그먼트"
|
|
75
|
+
query_location: "api/ 세그먼트"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Styling
|
|
79
|
+
|
|
80
|
+
```yaml
|
|
81
|
+
framework: "Tailwind CSS v3"
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Testing
|
|
85
|
+
|
|
86
|
+
```yaml
|
|
87
|
+
framework: "Jest + React Testing Library"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Project-Specific Risks
|
|
91
|
+
|
|
92
|
+
> Plan의 RISK Critic에서 반드시 점검할 프로젝트 고유 위험 패턴
|
|
93
|
+
|
|
94
|
+
1. barrel export 체인에서 `'use client'` 누락 → build 실패
|
|
95
|
+
2. import 순서 위반 (ESLint FSD import order)
|
|
96
|
+
3. 순환 참조 (shared/ui 내부에서 barrel import 사용 시)
|
|
97
|
+
4. FSD 계층 역방향 import
|
|
98
|
+
5. `as any` 잔류 → typecheck 우회
|
|
99
|
+
|
|
100
|
+
## Mini-Review Checklist
|
|
101
|
+
|
|
102
|
+
> Implement Phase 게이트의 Mini-Review에서 각 파일에 대해 점검할 항목
|
|
103
|
+
|
|
104
|
+
1. `'use client'` 필요 여부 (클라이언트 훅 사용 시 필수)
|
|
105
|
+
2. FSD 계층 위반 (import 경로 N개 중 위반 M개)
|
|
106
|
+
3. 프로젝트 패턴 (`type` vs `interface`, naming, import order)
|
|
107
|
+
4. 미사용 코드 (미사용 import, 빈 export, dead code)
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Selfish Configuration
|
|
2
|
+
|
|
3
|
+
> 이 파일은 selfish 커맨드 시스템의 프로젝트별 설정을 정의한다.
|
|
4
|
+
> 모든 selfish 커맨드는 이 파일을 참조하여 프로젝트별 동작을 결정한다.
|
|
5
|
+
> 각 섹션을 프로젝트에 맞게 수정하세요.
|
|
6
|
+
|
|
7
|
+
## CI Commands
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
ci: "npm run ci" # 전체 CI (lint + typecheck + build)
|
|
11
|
+
typecheck: "npm run typecheck" # 타입 체크만
|
|
12
|
+
lint: "npm run lint" # 린트만
|
|
13
|
+
lint_fix: "npm run lint:fix" # 린트 자동 수정
|
|
14
|
+
gate: "npm run typecheck && npm run lint" # Phase 게이트 (implement 중 반복 실행)
|
|
15
|
+
test: "npm test" # 테스트
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Architecture
|
|
19
|
+
|
|
20
|
+
```yaml
|
|
21
|
+
style: "Layered" # 예: FSD, Clean Architecture, Modular Monolith, Layered
|
|
22
|
+
layers: [] # 상위 → 하위 순서로 나열
|
|
23
|
+
import_rule: "" # import 방향 규칙 (예: "상위→하위만 허용")
|
|
24
|
+
segments: [] # 각 계층의 하위 세그먼트
|
|
25
|
+
path_alias: "" # 예: "@/* → ./src/*"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Framework
|
|
29
|
+
|
|
30
|
+
```yaml
|
|
31
|
+
name: "" # 예: Next.js 14, Vite, CRA
|
|
32
|
+
runtime: "" # 예: App Router, Pages Router
|
|
33
|
+
client_directive: "" # 예: 'use client' (없으면 비워두기)
|
|
34
|
+
client_directive_rule: "" # 클라이언트 디렉티브 적용 규칙
|
|
35
|
+
server_client_boundary: false # 서버/클라이언트 경계 존재 여부
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Code Style
|
|
39
|
+
|
|
40
|
+
```yaml
|
|
41
|
+
language: "TypeScript"
|
|
42
|
+
strict_mode: true
|
|
43
|
+
type_keyword: "type" # type vs interface
|
|
44
|
+
import_type: true # import type 사용 여부
|
|
45
|
+
component_style: "PascalCase"
|
|
46
|
+
props_position: "above component"
|
|
47
|
+
handler_naming: "handle[Event]"
|
|
48
|
+
boolean_naming: "is/has/can[State]"
|
|
49
|
+
constant_naming: "UPPER_SNAKE_CASE"
|
|
50
|
+
any_policy: "최소화"
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## State Management
|
|
54
|
+
|
|
55
|
+
```yaml
|
|
56
|
+
global_state: "" # 예: Zustand, Redux, Pinia
|
|
57
|
+
server_state: "" # 예: React Query, SWR, Apollo
|
|
58
|
+
local_state: "" # 예: Context API, useState
|
|
59
|
+
store_location: "" # store 파일 위치 패턴
|
|
60
|
+
query_location: "" # query 파일 위치 패턴
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Styling
|
|
64
|
+
|
|
65
|
+
```yaml
|
|
66
|
+
framework: "" # 예: Tailwind CSS, styled-components, CSS Modules
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Testing
|
|
70
|
+
|
|
71
|
+
```yaml
|
|
72
|
+
framework: "" # 예: Jest, Vitest, Playwright
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Project-Specific Risks
|
|
76
|
+
|
|
77
|
+
> Plan의 RISK Critic에서 반드시 점검할 프로젝트 고유 위험 패턴
|
|
78
|
+
> 프로젝트에 맞게 수정하세요.
|
|
79
|
+
|
|
80
|
+
1. (예시) import 순서 위반
|
|
81
|
+
2. (예시) 순환 참조
|
|
82
|
+
3. (예시) 타입 안전성 우회 (as any)
|
|
83
|
+
|
|
84
|
+
## Mini-Review Checklist
|
|
85
|
+
|
|
86
|
+
> Implement Phase 게이트의 Mini-Review에서 각 파일에 대해 점검할 항목
|
|
87
|
+
|
|
88
|
+
1. 아키텍처 규칙 위반 여부
|
|
89
|
+
2. 코드 스타일 패턴 준수
|
|
90
|
+
3. 미사용 코드 (미사용 import, 빈 export, dead code)
|