harness-for-yall 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/README.ko.md +182 -0
- package/README.md +149 -0
- package/bin/install.mjs +174 -0
- package/package.json +26 -0
- package/plugins/be-experts/.claude-plugin/plugin.json +7 -0
- package/plugins/be-experts/agents/be-architect.md +138 -0
- package/plugins/be-experts/agents/be-implementer.md +210 -0
- package/plugins/be-experts/agents/be-provider.md +343 -0
- package/plugins/be-experts/agents/be-resilience.md +270 -0
- package/plugins/be-experts/agents/be-tester.md +321 -0
- package/plugins/be-experts/agents/be-validator.md +208 -0
- package/plugins/be-experts/be.md +62 -0
- package/plugins/be-experts/skills/be-api/SKILL.md +62 -0
- package/plugins/be-experts/skills/be-llm-integration/SKILL.md +87 -0
- package/plugins/be-experts/skills/be-mcp-server/SKILL.md +94 -0
- package/plugins/be-experts/skills/be-observability/SKILL.md +143 -0
- package/plugins/be-experts/skills/be-pipeline/SKILL.md +123 -0
- package/plugins/dev-pipeline/.claude-plugin/plugin.json +7 -0
- package/plugins/dev-pipeline/agents/dev-backend.md +50 -0
- package/plugins/dev-pipeline/agents/dev-frontend.md +48 -0
- package/plugins/dev-pipeline/agents/dev-planner.md +64 -0
- package/plugins/dev-pipeline/agents/dev-qa.md +75 -0
- package/plugins/dev-pipeline/agents/dev-reviewer.md +71 -0
- package/plugins/dev-pipeline/skills/dev-feature/SKILL.md +78 -0
- package/plugins/explore-team/.claude-plugin/plugin.json +7 -0
- package/plugins/explore-team/agents/explore-evidence.md +83 -0
- package/plugins/explore-team/agents/explore-hypothesizer.md +74 -0
- package/plugins/explore-team/agents/explore-scout.md +76 -0
- package/plugins/explore-team/agents/explore-synthesizer.md +99 -0
- package/plugins/explore-team/explore.md +45 -0
- package/plugins/explore-team/skills/explore-hypothesis/SKILL.md +41 -0
- package/plugins/explore-team/skills/explore-investigate/SKILL.md +53 -0
- package/plugins/explore-team/skills/explore-quick/SKILL.md +45 -0
- package/plugins/fe-experts/.claude-plugin/plugin.json +7 -0
- package/plugins/fe-experts/agents/fe-architect.md +110 -0
- package/plugins/fe-experts/agents/fe-implementer.md +144 -0
- package/plugins/fe-experts/agents/fe-perf.md +167 -0
- package/plugins/fe-experts/agents/fe-styler.md +157 -0
- package/plugins/fe-experts/agents/fe-tester.md +246 -0
- package/plugins/fe-experts/skills/fe-component/SKILL.md +59 -0
- package/plugins/fe-experts/skills/fe-page/SKILL.md +57 -0
- package/plugins/fe-experts/skills/fe-refactor/SKILL.md +44 -0
- package/plugins/fe-experts/skills/fe-review/SKILL.md +36 -0
- package/plugins/fe-experts/skills/fe-test/SKILL.md +37 -0
- package/plugins/review-pipeline/.claude-plugin/plugin.json +7 -0
- package/plugins/review-pipeline/agents/review-judge.md +87 -0
- package/plugins/review-pipeline/agents/review-moderator.md +72 -0
- package/plugins/review-pipeline/agents/review-screener-1.md +63 -0
- package/plugins/review-pipeline/agents/review-screener-2.md +67 -0
- package/plugins/review-pipeline/agents/review-screener-3.md +76 -0
- package/plugins/review-pipeline/skills/review-code/SKILL.md +83 -0
package/README.ko.md
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# harness-for-yall
|
|
2
|
+
|
|
3
|
+
[Claude Code](https://docs.anthropic.com/en/docs/claude-code)용 멀티에이전트 하네스: 에이전트 25개, 스킬 15개, 5개 팀.
|
|
4
|
+
|
|
5
|
+
> **[English](./README.md)**
|
|
6
|
+
|
|
7
|
+
## 이게 뭔데?
|
|
8
|
+
|
|
9
|
+
Claude Code 에이전트를 5개 전문 팀으로 조직한 사전 설정 패키지. 각 팀은 목적에 맞는 멀티에이전트 오케스트레이션 패턴을 사용한다.
|
|
10
|
+
|
|
11
|
+
## 팀 구성
|
|
12
|
+
|
|
13
|
+
| 플러그인 | 패턴 | 에이전트 | 스킬 | 하는 일 |
|
|
14
|
+
|---------|------|:-------:|:----:|--------|
|
|
15
|
+
| `dev-pipeline` | Pipeline | 5 | 1 | 기능 개발 전체: 기획 → FE+BE 병렬 → 리뷰 게이트 → QA |
|
|
16
|
+
| `review-pipeline` | Fan-out / Fan-in | 5 | 1 | 코드 리뷰: 3개 스크리너 병렬 → 모더레이터 → 판정 (SARIF 출력) |
|
|
17
|
+
| `fe-experts` | Expert Pool | 5 | 5 | 프론트엔드: 아키텍트 → 구현/스타일 → 성능 + 테스트 |
|
|
18
|
+
| `be-experts` | Pipeline + Expert Pool | 6 | 5 | 백엔드: 아키텍트 → 구현+검증 → 회복성/프로바이더 → 테스트 |
|
|
19
|
+
| `explore-team` | Hierarchical Delegation | 4 | 3 | 코드베이스 탐색: 스카우트(opus) → 가설 → 증거 → 종합 |
|
|
20
|
+
|
|
21
|
+
## 설치
|
|
22
|
+
|
|
23
|
+
### 방법 1 — npx
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# 전체 설치
|
|
27
|
+
npx @justn-hyeok/claude-code-harness
|
|
28
|
+
|
|
29
|
+
# 원하는 팀만 골라서
|
|
30
|
+
npx @justn-hyeok/claude-code-harness fe-experts be-experts
|
|
31
|
+
|
|
32
|
+
# 미리보기
|
|
33
|
+
npx @justn-hyeok/claude-code-harness --dry-run
|
|
34
|
+
|
|
35
|
+
# 기존 파일 덮어쓰기
|
|
36
|
+
npx @justn-hyeok/claude-code-harness --force
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
`~/.claude/`에 에이전트/스킬 파일을 복사한다. 의존성 없음.
|
|
40
|
+
|
|
41
|
+
### 방법 2 — Plugin Marketplace
|
|
42
|
+
|
|
43
|
+
Claude Code 안에서:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
/plugin marketplace add bssm-oss/harness-for-yall
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
필요한 팀 설치:
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
/plugin install dev-pipeline@justn-harness
|
|
53
|
+
/plugin install review-pipeline@justn-harness
|
|
54
|
+
/plugin install fe-experts@justn-harness
|
|
55
|
+
/plugin install be-experts@justn-harness
|
|
56
|
+
/plugin install explore-team@justn-harness
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 방법 3 — 쉘 스크립트
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
git clone https://github.com/bssm-oss/harness-for-yall.git
|
|
63
|
+
cd harness-for-yall
|
|
64
|
+
chmod +x install.sh && ./install.sh
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## 아키텍처
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
┌─────────────┐
|
|
71
|
+
│ 사용자 요청 │
|
|
72
|
+
└──────┬──────┘
|
|
73
|
+
│
|
|
74
|
+
┌────────────┼────────────┐
|
|
75
|
+
▼ ▼ ▼
|
|
76
|
+
┌──────────┐ ┌──────────┐ ┌──────────┐
|
|
77
|
+
│ 특화 팀 │ │ 범용 팀 │ │ 분석 팀 │
|
|
78
|
+
│ fe / be │ │ dev │ │ explore │
|
|
79
|
+
└────┬─────┘ └────┬─────┘ └────┬─────┘
|
|
80
|
+
│ │ │
|
|
81
|
+
▼ ▼ ▼
|
|
82
|
+
┌──────────────────────────────────────┐
|
|
83
|
+
│ review-pipeline │
|
|
84
|
+
│ 스크리너×3 → 모더레이터 → 판정관 │
|
|
85
|
+
└──────────────────────────────────────┘
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 라우팅 규칙
|
|
89
|
+
|
|
90
|
+
1. **구체성 우선** — 프론트/백엔드 특화 작업이면 `dev-*` 말고 `fe-*` / `be-*` 선택
|
|
91
|
+
2. **체이닝 가능** — `explore → dev → review`로 복잡한 워크플로우 연결
|
|
92
|
+
3. **과잉이면 생략** — 한 줄 수정이나 단순 질문에 하네스는 불필요
|
|
93
|
+
|
|
94
|
+
### 모델 전략
|
|
95
|
+
|
|
96
|
+
| 에이전트 | 모델 | 이유 |
|
|
97
|
+
|---------|------|------|
|
|
98
|
+
| `explore-scout` | opus | 아키텍처 분석 오케스트레이션에는 판단력이 중요 |
|
|
99
|
+
| 나머지 전부 | sonnet | 비용 효율 — 구현 작업은 sonnet으로 충분 |
|
|
100
|
+
|
|
101
|
+
## 팀별 상세
|
|
102
|
+
|
|
103
|
+
### dev-pipeline (기능 개발)
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
사용자 요청 → dev-planner (기획)
|
|
107
|
+
↓
|
|
108
|
+
dev-frontend + dev-backend (병렬 구현)
|
|
109
|
+
↓
|
|
110
|
+
dev-reviewer (리뷰 게이트)
|
|
111
|
+
↓
|
|
112
|
+
dev-qa (테스트)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**스킬:** `/dev-feature` — 기능 개발 전체 파이프라인 실행
|
|
116
|
+
|
|
117
|
+
### review-pipeline (코드 리뷰)
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
코드/PR → review-screener-1 (정확성) ──┐
|
|
121
|
+
→ review-screener-2 (보안) ──┼→ review-moderator → review-judge
|
|
122
|
+
→ review-screener-3 (성능/스타일) ─┘ (통합) (판정)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**스킬:** `/review-code` — SARIF v2.1.0 호환 리포트 출력
|
|
126
|
+
|
|
127
|
+
### fe-experts (프론트엔드)
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
요청 → fe-architect (설계)
|
|
131
|
+
├→ fe-implementer (구현)
|
|
132
|
+
├→ fe-styler (스타일/접근성)
|
|
133
|
+
├→ fe-perf (성능 리뷰)
|
|
134
|
+
└→ fe-tester (테스트)
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**스킬:** `/fe-component`, `/fe-page`, `/fe-refactor`, `/fe-review`, `/fe-test`
|
|
138
|
+
|
|
139
|
+
### be-experts (백엔드)
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
요청 → be-architect (API 설계)
|
|
143
|
+
├→ be-implementer + be-validator (병렬)
|
|
144
|
+
├→ be-resilience (회로 차단기/재시도)
|
|
145
|
+
├→ be-provider (LLM 멀티프로바이더)
|
|
146
|
+
└→ be-tester (계약 테스트)
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**스킬:** `/be-api`, `/be-mcp-server`, `/be-pipeline`, `/be-llm-integration`, `/be-observability`
|
|
150
|
+
|
|
151
|
+
### explore-team (코드베이스 탐색)
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
질문 → explore-scout (opus, 정찰 + 오케스트레이션)
|
|
155
|
+
├→ explore-hypothesizer (경쟁 가설 생성)
|
|
156
|
+
├→ explore-evidence (증거 수집)
|
|
157
|
+
└→ explore-synthesizer (아키텍처 리포트)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**스킬:** `/explore-investigate`, `/explore-quick`, `/explore-hypothesis`
|
|
161
|
+
|
|
162
|
+
## 커스터마이징
|
|
163
|
+
|
|
164
|
+
각 에이전트는 YAML frontmatter가 있는 독립 `.md` 파일. 자유롭게 수정 가능:
|
|
165
|
+
|
|
166
|
+
```yaml
|
|
167
|
+
---
|
|
168
|
+
name: fe-architect
|
|
169
|
+
description: "React/Next.js component architecture"
|
|
170
|
+
model: sonnet # opus로 바꾸면 업그레이드
|
|
171
|
+
tools:
|
|
172
|
+
- Read
|
|
173
|
+
- Glob
|
|
174
|
+
- Grep
|
|
175
|
+
---
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
스킬은 `plugins/<팀>/skills/<이름>/SKILL.md` 형태. 새 스킬을 추가하려면 같은 구조로 폴더 만들면 된다.
|
|
179
|
+
|
|
180
|
+
## 라이선스
|
|
181
|
+
|
|
182
|
+
MIT
|
package/README.md
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# harness-for-yall
|
|
2
|
+
|
|
3
|
+
Multi-agent harness for [Claude Code](https://docs.anthropic.com/en/docs/claude-code): 25 agents, 15 skills, 5 teams.
|
|
4
|
+
|
|
5
|
+
> **[한국어 문서](./README.ko.md)**
|
|
6
|
+
|
|
7
|
+
## What is this?
|
|
8
|
+
|
|
9
|
+
A pre-configured set of Claude Code agents organized into 5 specialized teams. Each team uses a different multi-agent orchestration pattern optimized for its purpose.
|
|
10
|
+
|
|
11
|
+
## Teams
|
|
12
|
+
|
|
13
|
+
| Plugin | Pattern | Agents | Skills | What it does |
|
|
14
|
+
|--------|---------|:------:|:------:|-------------|
|
|
15
|
+
| `dev-pipeline` | Pipeline | 5 | 1 | Full feature dev: planner → FE+BE parallel → reviewer gate → QA |
|
|
16
|
+
| `review-pipeline` | Fan-out / Fan-in | 5 | 1 | Code review: 3 parallel screeners → moderator → judge (SARIF output) |
|
|
17
|
+
| `fe-experts` | Expert Pool | 5 | 5 | Frontend: architect → implementer / styler → perf + tester |
|
|
18
|
+
| `be-experts` | Pipeline + Expert Pool | 6 | 5 | Backend: architect → impl + validator → resilience / provider → tester |
|
|
19
|
+
| `explore-team` | Hierarchical Delegation | 4 | 3 | Codebase exploration: scout(opus) → hypothesizer → evidence → synthesizer |
|
|
20
|
+
|
|
21
|
+
## Install
|
|
22
|
+
|
|
23
|
+
### Option 1 — npx
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# All plugins
|
|
27
|
+
npx @justn-hyeok/claude-code-harness
|
|
28
|
+
|
|
29
|
+
# Pick specific teams
|
|
30
|
+
npx @justn-hyeok/claude-code-harness fe-experts be-experts
|
|
31
|
+
|
|
32
|
+
# Preview first
|
|
33
|
+
npx @justn-hyeok/claude-code-harness --dry-run
|
|
34
|
+
|
|
35
|
+
# Overwrite existing
|
|
36
|
+
npx @justn-hyeok/claude-code-harness --force
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Copies agents/skills to `~/.claude/`. Zero dependencies.
|
|
40
|
+
|
|
41
|
+
### Option 2 — Plugin Marketplace
|
|
42
|
+
|
|
43
|
+
Inside Claude Code:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
/plugin marketplace add bssm-oss/harness-for-yall
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Then install what you need:
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
/plugin install dev-pipeline@justn-harness
|
|
53
|
+
/plugin install review-pipeline@justn-harness
|
|
54
|
+
/plugin install fe-experts@justn-harness
|
|
55
|
+
/plugin install be-experts@justn-harness
|
|
56
|
+
/plugin install explore-team@justn-harness
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Option 3 — Shell script
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
git clone https://github.com/bssm-oss/harness-for-yall.git
|
|
63
|
+
cd harness-for-yall
|
|
64
|
+
chmod +x install.sh && ./install.sh
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Architecture
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
┌─────────────┐
|
|
71
|
+
│ User Task │
|
|
72
|
+
└──────┬──────┘
|
|
73
|
+
│
|
|
74
|
+
┌────────────┼────────────┐
|
|
75
|
+
▼ ▼ ▼
|
|
76
|
+
┌──────────┐ ┌──────────┐ ┌──────────┐
|
|
77
|
+
│ Specific │ │ Generic │ │ Analysis │
|
|
78
|
+
│ fe / be │ │ dev │ │ explore │
|
|
79
|
+
└────┬─────┘ └────┬─────┘ └────┬─────┘
|
|
80
|
+
│ │ │
|
|
81
|
+
▼ ▼ ▼
|
|
82
|
+
┌──────────────────────────────────────┐
|
|
83
|
+
│ review-pipeline │
|
|
84
|
+
│ screener×3 → moderator → judge │
|
|
85
|
+
└──────────────────────────────────────┘
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Routing Rules
|
|
89
|
+
|
|
90
|
+
1. **Specificity first** — `fe-*` / `be-*` over `dev-*` when the task is clearly frontend or backend
|
|
91
|
+
2. **Chainable** — `explore → dev → review` for complex workflows
|
|
92
|
+
3. **Skip when overkill** — One-line fixes and simple questions don't need a harness
|
|
93
|
+
|
|
94
|
+
### Model Strategy
|
|
95
|
+
|
|
96
|
+
| Agent | Model | Why |
|
|
97
|
+
|-------|-------|-----|
|
|
98
|
+
| `explore-scout` | opus | Orchestration quality matters for architecture analysis |
|
|
99
|
+
| Everything else | sonnet | Cost efficiency — sonnet handles implementation well |
|
|
100
|
+
|
|
101
|
+
## Structure
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
.claude-plugin/
|
|
105
|
+
marketplace.json # Plugin Marketplace catalog
|
|
106
|
+
plugins/
|
|
107
|
+
dev-pipeline/ # 5 agents, 1 skill
|
|
108
|
+
.claude-plugin/plugin.json
|
|
109
|
+
agents/ # dev-planner, dev-frontend, dev-backend, dev-reviewer, dev-qa
|
|
110
|
+
skills/dev-feature/
|
|
111
|
+
review-pipeline/ # 5 agents, 1 skill
|
|
112
|
+
agents/ # review-screener-{1,2,3}, review-moderator, review-judge
|
|
113
|
+
skills/review-code/
|
|
114
|
+
fe-experts/ # 5 agents, 5 skills
|
|
115
|
+
agents/ # fe-architect, fe-implementer, fe-styler, fe-perf, fe-tester
|
|
116
|
+
skills/ # fe-component, fe-page, fe-refactor, fe-review, fe-test
|
|
117
|
+
be-experts/ # 6 agents, 5 skills
|
|
118
|
+
agents/ # be-architect, be-implementer, be-validator, be-resilience, be-provider, be-tester
|
|
119
|
+
skills/ # be-api, be-mcp-server, be-pipeline, be-llm-integration, be-observability
|
|
120
|
+
explore-team/ # 4 agents, 3 skills
|
|
121
|
+
agents/ # explore-scout, explore-hypothesizer, explore-evidence, explore-synthesizer
|
|
122
|
+
skills/ # explore-investigate, explore-quick, explore-hypothesis
|
|
123
|
+
bin/install.mjs # npx CLI
|
|
124
|
+
package.json # npm config
|
|
125
|
+
install.sh # Shell installer
|
|
126
|
+
uninstall.sh # Shell uninstaller
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Customization
|
|
130
|
+
|
|
131
|
+
Each agent is a standalone `.md` file with YAML frontmatter. Edit freely:
|
|
132
|
+
|
|
133
|
+
```yaml
|
|
134
|
+
---
|
|
135
|
+
name: fe-architect
|
|
136
|
+
description: "React/Next.js component architecture"
|
|
137
|
+
model: sonnet # change to opus if you want
|
|
138
|
+
tools:
|
|
139
|
+
- Read
|
|
140
|
+
- Glob
|
|
141
|
+
- Grep
|
|
142
|
+
---
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Skills are in `SKILL.md` format inside named folders. Add your own by creating `plugins/<team>/skills/<name>/SKILL.md`.
|
|
146
|
+
|
|
147
|
+
## License
|
|
148
|
+
|
|
149
|
+
MIT
|
package/bin/install.mjs
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { existsSync, mkdirSync, cpSync, readdirSync, statSync } from 'node:fs';
|
|
4
|
+
import { join, dirname, basename } from 'node:path';
|
|
5
|
+
import { homedir } from 'node:os';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
import { createInterface } from 'node:readline';
|
|
8
|
+
|
|
9
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
10
|
+
const PLUGINS_DIR = join(__dirname, '..', 'plugins');
|
|
11
|
+
const CLAUDE_HOME = join(homedir(), '.claude');
|
|
12
|
+
|
|
13
|
+
function ask(question) {
|
|
14
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
15
|
+
return new Promise((resolve) => {
|
|
16
|
+
rl.question(question, (answer) => {
|
|
17
|
+
rl.close();
|
|
18
|
+
resolve(answer.trim().toLowerCase());
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function collectFiles(src, dest, list = []) {
|
|
24
|
+
if (!existsSync(src)) return list;
|
|
25
|
+
const entries = readdirSync(src, { withFileTypes: true });
|
|
26
|
+
for (const entry of entries) {
|
|
27
|
+
const srcPath = join(src, entry.name);
|
|
28
|
+
const destPath = join(dest, entry.name);
|
|
29
|
+
if (entry.isDirectory()) {
|
|
30
|
+
collectFiles(srcPath, destPath, list);
|
|
31
|
+
} else {
|
|
32
|
+
list.push({ src: srcPath, dest: destPath });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return list;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function printHelp() {
|
|
39
|
+
console.log(`
|
|
40
|
+
claude-code-harness — install multi-agent harness to ~/.claude/
|
|
41
|
+
|
|
42
|
+
Usage:
|
|
43
|
+
npx claude-code-harness [options] [plugins...]
|
|
44
|
+
|
|
45
|
+
Options:
|
|
46
|
+
--force, -f Overwrite existing files
|
|
47
|
+
--dry-run Preview without copying
|
|
48
|
+
--help, -h Show this help
|
|
49
|
+
|
|
50
|
+
Plugins:
|
|
51
|
+
dev-pipeline Feature development pipeline (5 agents, 1 skill)
|
|
52
|
+
review-pipeline Code review fan-out/fan-in (5 agents, 1 skill)
|
|
53
|
+
fe-experts Frontend expert pool (5 agents, 5 skills)
|
|
54
|
+
be-experts Backend expert pool (6 agents, 5 skills)
|
|
55
|
+
explore-team Codebase exploration (4 agents, 3 skills)
|
|
56
|
+
|
|
57
|
+
Examples:
|
|
58
|
+
npx claude-code-harness # Install all plugins
|
|
59
|
+
npx claude-code-harness fe-experts # Install only frontend
|
|
60
|
+
npx claude-code-harness fe-experts be-experts # Install FE + BE
|
|
61
|
+
npx claude-code-harness --dry-run # Preview all
|
|
62
|
+
`);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async function main() {
|
|
66
|
+
const args = process.argv.slice(2);
|
|
67
|
+
const force = args.includes('--force') || args.includes('-f');
|
|
68
|
+
const dryRun = args.includes('--dry-run');
|
|
69
|
+
const help = args.includes('--help') || args.includes('-h');
|
|
70
|
+
|
|
71
|
+
if (help) {
|
|
72
|
+
printHelp();
|
|
73
|
+
process.exit(0);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const flags = ['--force', '-f', '--dry-run', '--help', '-h'];
|
|
77
|
+
const requestedPlugins = args.filter((a) => !flags.includes(a));
|
|
78
|
+
|
|
79
|
+
const allPlugins = readdirSync(PLUGINS_DIR, { withFileTypes: true })
|
|
80
|
+
.filter((d) => d.isDirectory())
|
|
81
|
+
.map((d) => d.name);
|
|
82
|
+
|
|
83
|
+
const plugins =
|
|
84
|
+
requestedPlugins.length > 0
|
|
85
|
+
? requestedPlugins.filter((p) => {
|
|
86
|
+
if (!allPlugins.includes(p)) {
|
|
87
|
+
console.log(` unknown plugin: ${p} (available: ${allPlugins.join(', ')})`);
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
return true;
|
|
91
|
+
})
|
|
92
|
+
: allPlugins;
|
|
93
|
+
|
|
94
|
+
if (plugins.length === 0) {
|
|
95
|
+
console.log(' no plugins to install.');
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
console.log('\n Claude Code Harness Installer\n');
|
|
100
|
+
console.log(` Target: ${CLAUDE_HOME}`);
|
|
101
|
+
console.log(` Plugins: ${plugins.join(', ')}`);
|
|
102
|
+
console.log(` Mode: ${dryRun ? 'dry-run' : force ? 'force' : 'safe (skip existing)'}\n`);
|
|
103
|
+
|
|
104
|
+
// Collect all file operations
|
|
105
|
+
const operations = [];
|
|
106
|
+
|
|
107
|
+
for (const plugin of plugins) {
|
|
108
|
+
const pluginDir = join(PLUGINS_DIR, plugin);
|
|
109
|
+
|
|
110
|
+
// agents/ -> ~/.claude/agents/
|
|
111
|
+
const agentsDir = join(pluginDir, 'agents');
|
|
112
|
+
if (existsSync(agentsDir)) {
|
|
113
|
+
operations.push(...collectFiles(agentsDir, join(CLAUDE_HOME, 'agents')));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// skills/<name>/SKILL.md -> ~/.claude/skills/<name>.md (flatten)
|
|
117
|
+
const skillsDir = join(pluginDir, 'skills');
|
|
118
|
+
if (existsSync(skillsDir)) {
|
|
119
|
+
const skillFolders = readdirSync(skillsDir, { withFileTypes: true }).filter((d) =>
|
|
120
|
+
d.isDirectory()
|
|
121
|
+
);
|
|
122
|
+
for (const folder of skillFolders) {
|
|
123
|
+
const skillFile = join(skillsDir, folder.name, 'SKILL.md');
|
|
124
|
+
if (existsSync(skillFile)) {
|
|
125
|
+
operations.push({
|
|
126
|
+
src: skillFile,
|
|
127
|
+
dest: join(CLAUDE_HOME, 'skills', `${folder.name}.md`),
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// harness docs (*.md at plugin root, excluding .claude-plugin/)
|
|
134
|
+
const rootMds = readdirSync(pluginDir)
|
|
135
|
+
.filter((f) => f.endsWith('.md') && statSync(join(pluginDir, f)).isFile());
|
|
136
|
+
for (const md of rootMds) {
|
|
137
|
+
operations.push({
|
|
138
|
+
src: join(pluginDir, md),
|
|
139
|
+
dest: join(CLAUDE_HOME, 'harnesses', md),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Execute
|
|
145
|
+
let copied = 0;
|
|
146
|
+
let skipped = 0;
|
|
147
|
+
|
|
148
|
+
for (const op of operations) {
|
|
149
|
+
const rel = op.dest.replace(CLAUDE_HOME + '/', '');
|
|
150
|
+
if (dryRun) {
|
|
151
|
+
console.log(` [dry-run] ${rel}`);
|
|
152
|
+
copied++;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
mkdirSync(dirname(op.dest), { recursive: true });
|
|
157
|
+
|
|
158
|
+
if (existsSync(op.dest) && !force) {
|
|
159
|
+
console.log(` skip: ${rel}`);
|
|
160
|
+
skipped++;
|
|
161
|
+
} else {
|
|
162
|
+
cpSync(op.src, op.dest);
|
|
163
|
+
console.log(` copy: ${rel}`);
|
|
164
|
+
copied++;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
console.log(`\n Done! ${dryRun ? 'Would copy' : 'Copied'}: ${copied}, Skipped: ${skipped}\n`);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
main().catch((err) => {
|
|
172
|
+
console.error(`Error: ${err.message}`);
|
|
173
|
+
process.exit(1);
|
|
174
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "harness-for-yall",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Multi-agent harness for Claude Code: dev pipeline, code review, frontend/backend experts, codebase exploration",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"claude-code-harness": "bin/install.mjs"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"bin/",
|
|
11
|
+
"plugins/"
|
|
12
|
+
],
|
|
13
|
+
"keywords": [
|
|
14
|
+
"claude-code",
|
|
15
|
+
"harness",
|
|
16
|
+
"agents",
|
|
17
|
+
"multi-agent",
|
|
18
|
+
"code-review",
|
|
19
|
+
"pipeline"
|
|
20
|
+
],
|
|
21
|
+
"author": "justn-hyeok",
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": ">=18"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: be-architect
|
|
3
|
+
description: "API design, resource modeling, route structure, middleware layering, and error strategy for Hono/Express backends"
|
|
4
|
+
model: sonnet
|
|
5
|
+
tools:
|
|
6
|
+
- Read
|
|
7
|
+
- Glob
|
|
8
|
+
- Grep
|
|
9
|
+
- mcp__sequential-thinking__sequentialthinking
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Backend Architect Agent
|
|
13
|
+
|
|
14
|
+
You are an expert backend architect specializing in Node.js API design with Hono and Express, TypeScript strict mode, and multi-agent LLM orchestration systems.
|
|
15
|
+
|
|
16
|
+
## Core Responsibilities
|
|
17
|
+
|
|
18
|
+
1. **API Design**: RESTful resource modeling, RPC endpoint design, URL structure, HTTP method semantics
|
|
19
|
+
2. **Route Structure**: Hono app hierarchy, route groups, base paths, versioning (e.g., `/api/v1/`)
|
|
20
|
+
3. **Middleware Layering**: Auth → validation → rate limiting → error handling → logging
|
|
21
|
+
4. **Error Strategy**: RFC 9457 Problem Details for all error responses
|
|
22
|
+
5. **Task Delegation**: Route implementation tasks to specialist agents
|
|
23
|
+
|
|
24
|
+
## Architecture Principles
|
|
25
|
+
|
|
26
|
+
- **Hono First**: Default to Hono for new projects (edge-ready, type-safe). Express only for legacy constraints
|
|
27
|
+
- **Zod Everywhere**: All request/response validation through Zod schemas
|
|
28
|
+
- **Dependency Injection**: Constructor injection or factory patterns — no global singletons
|
|
29
|
+
- **Layered Architecture**: Route → Handler → Service → Repository/Adapter
|
|
30
|
+
- **OpenAPI Auto-gen**: Every endpoint must produce OpenAPI spec (Hono's built-in or zod-openapi)
|
|
31
|
+
|
|
32
|
+
## Project Structure Convention
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
src/
|
|
36
|
+
index.ts # App entry point
|
|
37
|
+
app.ts # Hono/Express app factory
|
|
38
|
+
routes/
|
|
39
|
+
v1/ # API version group
|
|
40
|
+
users.ts # Resource routes
|
|
41
|
+
health.ts # Health check endpoints
|
|
42
|
+
handlers/ # Request handlers (thin — delegate to services)
|
|
43
|
+
services/ # Business logic
|
|
44
|
+
adapters/ # External API adapters (LLM providers, etc.)
|
|
45
|
+
middleware/
|
|
46
|
+
auth.ts # Authentication
|
|
47
|
+
validator.ts # Zod validation middleware
|
|
48
|
+
error-handler.ts # RFC 9457 error formatting
|
|
49
|
+
circuit-breaker.ts # Circuit breaker wrapper
|
|
50
|
+
logger.ts # pino request logging
|
|
51
|
+
schemas/ # Zod schemas (shared between validation & OpenAPI)
|
|
52
|
+
types/ # TypeScript types/interfaces
|
|
53
|
+
lib/ # Utilities, constants, config
|
|
54
|
+
__tests__/ # Integration tests
|
|
55
|
+
fixtures/ # Test fixtures
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## RFC 9457 Problem Details Standard
|
|
59
|
+
|
|
60
|
+
All error responses MUST follow this format:
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
interface ProblemDetail {
|
|
64
|
+
type: string; // URI identifying the problem type
|
|
65
|
+
title: string; // Short human-readable summary
|
|
66
|
+
status: number; // HTTP status code
|
|
67
|
+
detail?: string; // Explanation specific to this occurrence
|
|
68
|
+
instance?: string; // URI identifying the specific occurrence
|
|
69
|
+
[key: string]: unknown; // Extension fields
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Middleware Layer Order
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
1. Request ID (x-request-id generation)
|
|
77
|
+
2. Logger (pino request/response logging)
|
|
78
|
+
3. CORS
|
|
79
|
+
4. Auth (JWT/API key validation)
|
|
80
|
+
5. Rate Limiting
|
|
81
|
+
6. Input Validation (Zod)
|
|
82
|
+
7. → Route Handler →
|
|
83
|
+
8. Error Handler (RFC 9457 formatting)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Expert Pool Pattern — Delegation Rules
|
|
87
|
+
|
|
88
|
+
You are the **router** in the Expert Pool pattern. When receiving a task:
|
|
89
|
+
|
|
90
|
+
1. **Analyze** the requirements
|
|
91
|
+
2. **Design** the API (routes, schemas, middleware, data flow)
|
|
92
|
+
3. **Write spec** to `.claude/specs/be-{slug}.md`
|
|
93
|
+
4. **Delegate** to specialists:
|
|
94
|
+
|
|
95
|
+
| Task Type | Delegate To | What to Include |
|
|
96
|
+
|-----------|-------------|-----------------|
|
|
97
|
+
| Route/handler implementation | `be-implementer` | Route spec, handler signatures, middleware chain |
|
|
98
|
+
| Schema/validation | `be-validator` | Schema definitions, OpenAPI requirements, error formats |
|
|
99
|
+
| Both impl + validation | `be-implementer` + `be-validator` in parallel | Full spec |
|
|
100
|
+
| External API calls | `be-resilience` | Which services, timeout/retry requirements |
|
|
101
|
+
| LLM provider integration | `be-provider` | Provider list, streaming needs, fallback strategy |
|
|
102
|
+
|
|
103
|
+
5. After implementation, **mandatory gate**: send to `be-tester` for contract tests.
|
|
104
|
+
|
|
105
|
+
## Delegation Template
|
|
106
|
+
|
|
107
|
+
```markdown
|
|
108
|
+
## Task: [Endpoint/Feature Name]
|
|
109
|
+
|
|
110
|
+
### Architecture Decision
|
|
111
|
+
- Framework: Hono | Express
|
|
112
|
+
- Pattern: REST | RPC
|
|
113
|
+
- Auth: JWT | API Key | None
|
|
114
|
+
- External dependencies: [list]
|
|
115
|
+
|
|
116
|
+
### Route Spec
|
|
117
|
+
- Method: GET | POST | PUT | DELETE
|
|
118
|
+
- Path: /api/v1/...
|
|
119
|
+
- Request schema: [Zod schema name]
|
|
120
|
+
- Response schema: [Zod schema name]
|
|
121
|
+
- Error cases: [list with RFC 9457 types]
|
|
122
|
+
|
|
123
|
+
### Middleware Chain
|
|
124
|
+
[ordered list]
|
|
125
|
+
|
|
126
|
+
### Files to Create/Modify
|
|
127
|
+
- [file path]: [description]
|
|
128
|
+
|
|
129
|
+
### Constraints
|
|
130
|
+
- [specific requirements]
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## When to Escalate
|
|
134
|
+
|
|
135
|
+
- If the task requires database schema changes — confirm with user
|
|
136
|
+
- If auth strategy is ambiguous — ask user for clarification
|
|
137
|
+
- If the endpoint has no clear resource model — suggest alternatives and confirm
|
|
138
|
+
- If circuit breaker thresholds need tuning — propose defaults and confirm
|