@elyun/bylane 1.4.0 → 1.6.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.md CHANGED
@@ -10,34 +10,43 @@ byLane — Claude Code용 프론트엔드 개발 자동화 하네스.
10
10
  ## 커맨드
11
11
 
12
12
  ```bash
13
- # 의존성 설치
14
- npm install
15
-
16
- # 전체 테스트 실행
17
- npm test
18
-
19
- # 모니터 대시보드 실행
20
- npm run monitor
13
+ npm install # 의존성 설치 + pre-commit 훅 자동 등록 (prepare 스크립트)
14
+ npm test # 테스트 실행 (19개)
15
+ npm run monitor # 모니터 대시보드
16
+ npm version minor # 마이너 버전 올리기 (커밋 + 태그 자동 생성)
17
+ npm run release # npm 배포 (커밋/푸시 완료 후 실행)
21
18
 
22
19
  # 테스트용 더미 상태 생성
23
20
  node -e "import('./src/state.js').then(({writeState})=>writeState('code-agent',{status:'in_progress',progress:50,retries:0,startedAt:new Date().toISOString(),log:[]}))"
21
+
22
+ # 에이전트별 모델 확인
23
+ node -e "import('./src/config.js').then(({loadConfig,getAgentModel})=>{const c=loadConfig();['orchestrator','code-agent','review-agent'].forEach(a=>console.log(a,getAgentModel(c,a)))})"
24
24
  ```
25
25
 
26
26
  ## 아키텍처
27
27
 
28
28
  - `src/state.js` — `.bylane/state/*.json` 읽기/쓰기 유틸 (writeState, readState, clearState, listStates, appendLog)
29
- - `src/config.js` — `.bylane/bylane.json` 로드/저장/검증 (loadConfig, saveConfig, validateConfig, DEFAULT_CONFIG)
29
+ - `src/config.js` — `.bylane/bylane.json` 로드/저장/검증 (loadConfig, saveConfig, validateConfig, getAgentModel, DEFAULT_CONFIG)
30
30
  - `src/branch.js` — 브랜치명 패턴 엔진 (buildBranchName, buildBranchNameFromConfig)
31
- - `src/monitor/`blessed 기반 TUI 대시보드 (2열 그리드, 1초 폴링)
31
+ - `src/cli.js`npx 설치 CLI (install, --symlink 옵션, 기존 파일 .bak 백업)
32
+ - `src/review-loop.js` — 5분 주기 review 요청 PR 폴러 → `.bylane/state/review-queue.json`
33
+ - `src/respond-loop.js` — 5분 주기 내 PR 리뷰/코멘트 폴러 → `.bylane/state/respond-queue.json`
34
+ - `src/monitor/` — blessed 기반 TUI 대시보드 (2열 그리드, 1초 폴링, fullUnicode)
32
35
  - `skills/` — Claude Code 에이전트 skill 파일들
33
36
  - `hooks/` — 외부 이벤트 자동 감지 훅
34
37
  - `commands/` — `/bylane` 슬래시 커맨드 정의
38
+ - `templates/review-template.md` — 리뷰 코멘트 기본 템플릿
39
+ - `scripts/release.sh` — npm 배포 스크립트 (dirty 체크 + 테스트 + publish)
40
+ - `.githooks/pre-commit` — 보안 검사 훅 (시크릿/민감파일/console.log)
35
41
 
36
42
  ## 에이전트 파이프라인
37
43
 
38
44
  ```
39
45
  orchestrator → issue-agent → code-agent → test-agent → commit-agent
40
46
  → pr-agent → review-agent → respond-agent → notify-agent
47
+
48
+ review-loop (독립: 5분 주기 review 요청 감지)
49
+ respond-loop (독립: 5분 주기 리뷰 코멘트 감지)
41
50
  ```
42
51
 
43
52
  각 에이전트는 `.bylane/state/{name}.json`에 상태 기록. 모니터가 1초마다 폴링.
@@ -55,13 +64,20 @@ orchestrator → issue-agent → code-agent → test-agent → commit-agent
55
64
  }
56
65
  ```
57
66
 
67
+ ## GitHub 접근 방법
68
+
69
+ `github.method`: `"auto"` (기본, MCP→CLI→API 순) | `"mcp"` | `"cli"` | `"api"`
70
+
71
+ ## 에이전트 모델 설정
72
+
73
+ `config.models` 객체에서 에이전트별 모델 지정. `getAgentModel(config, agentName)`으로 조회.
74
+ 기본값: orchestrator/issue-agent/respond-agent → opus-4-6, code-agent/review-agent → sonnet-4-6, 나머지 → haiku-4-5.
75
+
58
76
  ## 브랜치 네이밍 토큰
59
77
 
60
78
  `{tracker}`, `{type}`, `{issue-number}`, `{custom-id}`, `{title-slug}`, `{date}`, `{username}`
61
79
 
62
- 빈 토큰은 자동으로 제외됨:
63
- - `{tracker}-{issue-number}-{custom-id}` + custom-id 없음 → `issues-32`
64
- - `{tracker}-{issue-number}-{custom-id}` + custom-id=C-12 → `issues-32-C-12`
80
+ 빈 토큰은 자동 제외: `{type}/{issue-number}` + type 없음 → `32-add-dark-mode`
65
81
 
66
82
  ## 테스트 구조
67
83
 
@@ -69,5 +85,12 @@ orchestrator → issue-agent → code-agent → test-agent → commit-agent
69
85
  tests/
70
86
  ├── state.test.js — writeState, readState, clearState, listStates, appendLog
71
87
  ├── config.test.js — loadConfig, saveConfig, validateConfig, DEFAULT_CONFIG
72
- └── branch.test.js — buildBranchName (5개 패턴 케이스)
88
+ └── branch.test.js — buildBranchName (6개 패턴 케이스, 슬래시 엣지케이스 포함)
73
89
  ```
90
+
91
+ ## 주의사항
92
+
93
+ - `.bylane/state/`는 .gitignore로 제외됨 (런타임 상태)
94
+ - `.bylane/bylane.json`은 추적됨 (프로젝트 설정)
95
+ - `docs/`는 .gitignore로 제외됨 (내부 설계 문서)
96
+ - pre-commit 훅: `npm install` 시 자동 등록 (`prepare` 스크립트)
package/README.md CHANGED
@@ -9,15 +9,21 @@ GitHub Issues에서 시작해 코드 구현, 테스트, 커밋, PR 생성, 리
9
9
  - **전체 워크플로우 자동화** — `/bylane 다크모드 토글 추가해줘` 한 줄로 이슈 생성부터 PR까지
10
10
  - **개별 실행 가능** — 각 에이전트를 단독으로 실행 가능
11
11
  - **실시간 모니터링** — 2열 그리드 터미널 TUI 대시보드
12
+ - **자동 리뷰 루프** — 5분 주기로 review 요청 PR 자동 리뷰
13
+ - **자동 대응 루프** — 5분 주기로 내 PR 리뷰/코멘트 자동 대응 (accept/rebut)
12
14
  - **피드백 루프** — 테스트 실패 시 자동 재시도 (설정 가능)
15
+ - **GitHub 접근 방법** — MCP / CLI(`gh`) / REST API 자동 감지
16
+ - **리뷰 템플릿** — 코드 예시, 모델 명시, 커스텀 푸터 설정 가능
17
+ - **에이전트별 모델 설정** — 에이전트마다 다른 AI 모델 지정 가능
13
18
  - **Figma MCP 연동** — 이슈의 Figma 링크에서 스펙 자동 추출 (선택적)
14
19
  - **Slack / Telegram 알림** — 완료 또는 개입 필요 시 알림
20
+ - **pre-commit 보안 훅** — 시크릿/민감 파일/console.log 자동 검사
15
21
 
16
22
  ## 요구사항
17
23
 
18
24
  - [Claude Code](https://claude.ai/code) CLI
19
25
  - Node.js 20+
20
- - GitHub MCP (Claude Code 기본 제공)
26
+ - GitHub MCP (Claude Code 기본 제공), `gh` CLI, 또는 `GITHUB_TOKEN` 중 하나
21
27
  - Slack MCP / Telegram (알림 사용 시)
22
28
  - Figma MCP (디자인 연동 사용 시)
23
29
 
@@ -26,15 +32,16 @@ GitHub Issues에서 시작해 코드 구현, 테스트, 커밋, PR 생성, 리
26
32
  ### npx로 설치 (권장)
27
33
 
28
34
  ```bash
29
- npx bylane
35
+ npx @elyun/bylane
30
36
  ```
31
37
 
32
38
  Skills, Commands, Hooks 파일을 `~/.claude/` 하위 디렉토리에 자동으로 복사합니다.
39
+ 기존 파일이 있으면 `.bak`으로 백업 후 교체합니다.
33
40
 
34
41
  심볼릭 링크로 설치하면 레포 업데이트 시 자동으로 반영됩니다:
35
42
 
36
43
  ```bash
37
- npx bylane --symlink
44
+ npx @elyun/bylane --symlink
38
45
  ```
39
46
 
40
47
  ### 수동 설치
@@ -42,7 +49,7 @@ npx bylane --symlink
42
49
  ```bash
43
50
  git clone https://github.com/el-yun/byLane.git
44
51
  cd byLane
45
- npm install
52
+ npm install # pre-commit 보안 훅 자동 등록
46
53
  node src/cli.js install
47
54
  ```
48
55
 
@@ -54,13 +61,15 @@ Claude Code를 열고 프로젝트 디렉토리에서:
54
61
  /bylane setup
55
62
  ```
56
63
 
57
- 6단계 인터랙티브 설정:
58
- 1. 이슈 트래커 (GitHub Issues / Linear / 둘 다)
59
- 2. 알림 채널 (Slack / Telegram / 둘 다)
60
- 3. 모드 설정
61
- 4. 권한 범위 (read-only / write / full)
62
- 5. 고급 설정 (재시도 횟수, 타임아웃, Figma MCP)
63
- 6. 브랜치 네이밍 패턴
64
+ 7단계 인터랙티브 설정:
65
+ 1. GitHub 접근 방법 (MCP / CLI / API / auto)
66
+ 2. 이슈 트래커 (GitHub Issues / Linear / 둘 다)
67
+ 3. 알림 채널 (Slack / Telegram / 둘 다)
68
+ 4. 모드 설정
69
+ 5. 권한 범위 (read-only / write / full)
70
+ 6. 고급 설정 (재시도 횟수, 타임아웃, Figma MCP)
71
+ 7. 브랜치 네이밍 패턴
72
+ 8. 에이전트별 AI 모델
64
73
 
65
74
  ## 사용법
66
75
 
@@ -84,11 +93,22 @@ Claude Code를 열고 프로젝트 디렉토리에서:
84
93
  /bylane commit 커밋 생성
85
94
  /bylane pr PR 생성
86
95
  /bylane review [PR번호] PR 리뷰
96
+ /bylane review-loop 5분 주기 자동 리뷰 루프
87
97
  /bylane respond [PR번호] 리뷰 반박/반영
98
+ /bylane respond-loop 5분 주기 자동 대응 루프
88
99
  /bylane notify 알림 발송
89
100
  /bylane status 현재 상태 요약
90
101
  ```
91
102
 
103
+ ### 자동 루프
104
+
105
+ 두 루프를 동시에 실행하면 review 요청과 리뷰 대응을 모두 자동화합니다:
106
+
107
+ ```bash
108
+ node src/review-loop.js & # 내게 요청된 PR 자동 리뷰
109
+ node src/respond-loop.js & # 내 PR 리뷰 자동 대응
110
+ ```
111
+
92
112
  ### 모니터 대시보드
93
113
 
94
114
  ```bash
@@ -98,27 +118,22 @@ npm run monitor
98
118
  ```
99
119
 
100
120
  ```
101
- ╔══════════════════════════════════════════════════════════════════╗
102
- byLane Monitor Issue #123: "Add dark mode" 4m 31s 17:32 ║
103
- ╠═══════════════════════════╦══════════════════════════════════════╣
104
- AGENT PIPELINE ║ AGENT LOG [LIVE]
105
- ║ ║ ║
106
- issue-agent [] 완료 17:32:38 code-agent
107
- code-agent [▶] 67% ║ → ThemeToggle.tsx 생성 ║
108
- ║ test-agent [○] 대기 ║ 17:30:09 issue-agent ║
109
- ... ║ → ✓ spec.json 저장됨 ║
110
- ╠═══════════════════════════╬══════════════════════════════════════╣
111
- QUEUE ║ SYSTEM STATUS ║
112
- ║ 1 Issue #124 대기중 ║ GitHub ✓ 연결됨 ║
113
- ║ 2 PR #45 review ║ Slack ✓ #dev-alerts ║
114
- ╚═══════════════════════════╩══════════════════════════════════════╝
115
- [q]종료 [p]일시정지 [↑↓]로그스크롤
121
+ +---------------------------+--------------------------------------+
122
+ | AGENT PIPELINE | AGENT LOG [LIVE] |
123
+ | | |
124
+ | issue-agent [v] 완료 | 17:32:38 code-agent |
125
+ | code-agent [>] 67% | > ThemeToggle.tsx 생성 |
126
+ | test-agent [ ] 대기 | 17:30:09 issue-agent |
127
+ | ... | > spec.json 저장됨 |
128
+ +---------------------------+--------------------------------------+
129
+ | QUEUE | SYSTEM STATUS |
130
+ | 1 Issue #124 대기중 | GitHub OK 연결됨 |
131
+ | 2 PR #45 review | Slack OK #dev-alerts |
132
+ +---------------------------+--------------------------------------+
116
133
  ```
117
134
 
118
135
  ## 브랜치 네이밍 패턴
119
136
 
120
- 셋업 시 패턴을 정의하거나 `.bylane/bylane.json`에서 직접 설정:
121
-
122
137
  | 패턴 | 예시 |
123
138
  |---|---|
124
139
  | `{tracker}-{issue-number}` | `issues-32` |
@@ -134,6 +149,11 @@ npm run monitor
134
149
  ```json
135
150
  {
136
151
  "version": "1.0",
152
+ "github": {
153
+ "method": "auto",
154
+ "owner": "",
155
+ "repo": ""
156
+ },
137
157
  "trackers": {
138
158
  "primary": "github",
139
159
  "linear": { "enabled": false, "apiKey": "" }
@@ -152,6 +172,26 @@ npm run monitor
152
172
  "tokens": { "tracker": "issues", "type": "feature", "custom-id": "" },
153
173
  "caseStyle": "kebab-case"
154
174
  },
175
+ "models": {
176
+ "default": "claude-sonnet-4-6",
177
+ "orchestrator": "claude-opus-4-6",
178
+ "issue-agent": "claude-opus-4-6",
179
+ "code-agent": "claude-sonnet-4-6",
180
+ "review-agent": "claude-sonnet-4-6",
181
+ "respond-agent": "claude-opus-4-6",
182
+ "test-agent": "claude-haiku-4-5-20251001",
183
+ "commit-agent": "claude-haiku-4-5-20251001",
184
+ "pr-agent": "claude-haiku-4-5-20251001",
185
+ "notify-agent": "claude-haiku-4-5-20251001"
186
+ },
187
+ "review": {
188
+ "model": "claude-sonnet-4-6",
189
+ "language": "ko",
190
+ "includeModel": true,
191
+ "includeCodeExample": true,
192
+ "templateFile": "",
193
+ "footer": "Reviewed by byLane · model: {model}"
194
+ },
155
195
  "extensions": {
156
196
  "figma": { "enabled": false, "useAt": "issue-analysis" }
157
197
  }
@@ -170,15 +210,50 @@ orchestrator
170
210
  → review-agent (자동 리뷰)
171
211
  → respond-agent (리뷰 반박 또는 반영)
172
212
  → notify-agent (Slack/Telegram 알림)
213
+
214
+ review-loop (독립 실행: 5분 주기 리뷰 요청 감지)
215
+ respond-loop (독립 실행: 5분 주기 리뷰 코멘트 감지)
173
216
  ```
174
217
 
175
- 에이전트는 수동 단독 실행 가능하며, 타인의 PR/리뷰에도 대응합니다.
218
+ ## GitHub 접근 방법
219
+
220
+ `github.method` 설정으로 제어:
221
+
222
+ | 값 | 동작 |
223
+ |----|------|
224
+ | `"auto"` (기본) | MCP → CLI → API 순서로 자동 시도 |
225
+ | `"mcp"` | GitHub MCP 도구만 사용 |
226
+ | `"cli"` | `gh` CLI만 사용 |
227
+ | `"api"` | REST API + `$GITHUB_TOKEN`만 사용 |
228
+
229
+ ## 리뷰 템플릿
230
+
231
+ `templates/review-template.md`를 복사해 커스터마이즈한 뒤 `review.templateFile`에 경로를 지정합니다.
232
+
233
+ 기본 구성: 심각도 레이블 (CRITICAL/HIGH/MEDIUM/LOW), Before/After 코드 예시, 사용 모델 명시, 커스텀 푸터.
234
+
235
+ ## 보안
236
+
237
+ `npm install` 시 pre-commit 훅이 자동 등록됩니다. 커밋마다 아래를 검사합니다:
238
+
239
+ | 항목 | 심각도 |
240
+ |------|--------|
241
+ | AWS/OpenAI/GitHub/Slack/Google 키 패턴 | CRITICAL (차단) |
242
+ | `.env`, `.pem`, `credentials` 등 민감 파일 | CRITICAL (차단) |
243
+ | 하드코딩된 password/api_key | CRITICAL (차단) |
244
+ | `node_modules` 실수 커밋 | CRITICAL (차단) |
245
+ | `console.log` | WARN (경고만) |
246
+
247
+ 우회: `git commit --no-verify`
176
248
 
177
249
  ## 개발
178
250
 
179
251
  ```bash
180
- npm test # 테스트 실행 (19개)
181
- npm run monitor # 모니터 대시보드
252
+ npm install # 의존성 설치 + pre-commit 훅 등록
253
+ npm test # 테스트 실행 (19개)
254
+ npm run monitor # 모니터 대시보드
255
+ npm version minor # 버전 올리기
256
+ npm run release # npm 배포 (커밋/푸시 후 실행)
182
257
  ```
183
258
 
184
259
  ## 라이선스
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elyun/bylane",
3
- "version": "1.4.0",
3
+ "version": "1.6.0",
4
4
  "description": "Frontend development harness for Claude Code",
5
5
  "type": "module",
6
6
  "bin": {
@@ -14,6 +14,25 @@ description: byLane 메인 오케스트레이터. 자연어 의도를 파싱해
14
14
  1. `.bylane/bylane.json` 로드. 없으면 즉시 `bylane-setup` 스킬 실행.
15
15
  2. `.bylane/state/` 디렉토리 확인. 없으면 생성.
16
16
 
17
+ ## 에이전트별 모델 결정
18
+
19
+ 각 에이전트 실행 전 사용할 모델을 config에서 읽는다:
20
+
21
+ ```bash
22
+ node -e "
23
+ import('./src/config.js').then(({loadConfig, getAgentModel}) => {
24
+ const config = loadConfig()
25
+ const agents = [
26
+ 'orchestrator','issue-agent','code-agent','test-agent',
27
+ 'commit-agent','pr-agent','review-agent','respond-agent','notify-agent'
28
+ ]
29
+ agents.forEach(a => console.log(a + ': ' + getAgentModel(config, a)))
30
+ })
31
+ "
32
+ ```
33
+
34
+ 에이전트 호출 시 해당 모델을 `model` 파라미터로 전달한다.
35
+
17
36
  ## 의도 파싱 규칙
18
37
 
19
38
  입력을 분석하여 아래 중 하나로 분류:
@@ -32,6 +51,7 @@ description: byLane 메인 오케스트레이터. 자연어 의도를 파싱해
32
51
  ## 에이전트 실행 방법
33
52
 
34
53
  각 에이전트를 순서대로 Agent 도구로 호출한다. 이전 에이전트의 출력을 다음 에이전트의 입력으로 전달한다.
54
+ **config에서 읽은 모델을 `model` 파라미터로 반드시 전달한다.**
35
55
 
36
56
  상태 기록 (각 에이전트 시작 전):
37
57
  ```bash
package/skills/setup.md CHANGED
@@ -107,6 +107,32 @@ Linear API Key는 환경변수명(`LINEAR_API_KEY`)으로 저장. 실제 키값
107
107
  직접 입력 시 사용 가능한 토큰 목록 안내:
108
108
  `{tracker}`, `{type}`, `{issue-number}`, `{custom-id}`, `{title-slug}`, `{date}`, `{username}`
109
109
 
110
+ ## Step 7/7 — 에이전트 모델 설정
111
+
112
+ > 각 에이전트에 사용할 AI 모델을 설정하시겠습니까? (Enter = 기본값 사용)
113
+
114
+ 기본값을 보여주고 변경할 항목만 입력받는다:
115
+
116
+ | 에이전트 | 기본 모델 | 권장 용도 |
117
+ |----------|-----------|-----------|
118
+ | default | claude-sonnet-4-6 | 미지정 에이전트 fallback |
119
+ | orchestrator | claude-opus-4-6 | 의도 파싱, 파이프라인 조율 |
120
+ | issue-agent | claude-opus-4-6 | 이슈 생성/분석 |
121
+ | code-agent | claude-sonnet-4-6 | 코드 구현 (핵심) |
122
+ | test-agent | claude-haiku-4-5-20251001 | 테스트 실행 판단 (경량) |
123
+ | commit-agent | claude-haiku-4-5-20251001 | 커밋 메시지 생성 (경량) |
124
+ | pr-agent | claude-haiku-4-5-20251001 | PR 본문 생성 (경량) |
125
+ | review-agent | claude-sonnet-4-6 | 코드 리뷰 (정밀도 중요) |
126
+ | respond-agent | claude-opus-4-6 | 리뷰 대응 (판단력 중요) |
127
+ | notify-agent | claude-haiku-4-5-20251001 | 알림 발송 (경량) |
128
+
129
+ 사용 가능한 모델:
130
+ - `claude-opus-4-6` — 최고 성능, 높은 비용
131
+ - `claude-sonnet-4-6` — 균형 (권장)
132
+ - `claude-haiku-4-5-20251001` — 빠르고 저렴
133
+
134
+ `models.default`만 바꾸면 미지정 에이전트 전체에 적용됨을 안내한다.
135
+
110
136
  ## 저장
111
137
 
112
138
  모든 설정 수집 후:
package/src/config.js CHANGED
@@ -40,6 +40,18 @@ export const DEFAULT_CONFIG = {
40
40
  owner: '',
41
41
  repo: ''
42
42
  },
43
+ models: {
44
+ default: 'claude-sonnet-4-6',
45
+ orchestrator: 'claude-opus-4-6',
46
+ 'issue-agent': 'claude-opus-4-6',
47
+ 'code-agent': 'claude-sonnet-4-6',
48
+ 'test-agent': 'claude-haiku-4-5-20251001',
49
+ 'commit-agent': 'claude-haiku-4-5-20251001',
50
+ 'pr-agent': 'claude-haiku-4-5-20251001',
51
+ 'review-agent': 'claude-sonnet-4-6',
52
+ 'respond-agent': 'claude-opus-4-6',
53
+ 'notify-agent': 'claude-haiku-4-5-20251001'
54
+ },
43
55
  review: {
44
56
  model: 'claude-sonnet-4-6',
45
57
  language: 'ko',
@@ -85,6 +97,10 @@ function deepMerge(target, source) {
85
97
  return result
86
98
  }
87
99
 
100
+ export function getAgentModel(config, agentName) {
101
+ return config.models?.[agentName] ?? config.models?.default ?? DEFAULT_CONFIG.models.default
102
+ }
103
+
88
104
  export function saveConfig(config, dir = '.bylane') {
89
105
  const path = join(dir, 'bylane.json')
90
106
  writeFileSync(path, JSON.stringify(config, null, 2))