@elyun/bylane 1.2.0 → 1.3.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elyun/bylane",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Frontend development harness for Claude Code",
5
5
  "type": "module",
6
6
  "bin": {
@@ -10,7 +10,8 @@
10
10
  "scripts": {
11
11
  "monitor": "node src/monitor/index.js",
12
12
  "test": "vitest run",
13
- "test:watch": "vitest"
13
+ "test:watch": "vitest",
14
+ "release": "bash scripts/release.sh"
14
15
  },
15
16
  "dependencies": {
16
17
  "blessed": "^0.1.81",
@@ -0,0 +1,62 @@
1
+ #!/bin/bash
2
+ set -e
3
+
4
+ FORCE_RELEASE=false
5
+ for arg in "$@"; do
6
+ [ "$arg" = "--force-release" ] && FORCE_RELEASE=true
7
+ done
8
+ # npm run release --force-release 방식 지원 (npm_config_* 환경변수)
9
+ [ -n "$npm_config_force_release" ] && FORCE_RELEASE=true
10
+
11
+ echo "byLane 릴리즈 시작..."
12
+
13
+ # 작업 디렉토리 클린 확인 (--force-release 시 건너뜀)
14
+ if [ "$FORCE_RELEASE" = false ] && [ -n "$(git status --short)" ]; then
15
+ echo "오류: 커밋되지 않은 변경사항이 있습니다. 먼저 커밋하거나 --force-release 를 사용하세요."
16
+ git status --short
17
+ exit 1
18
+ fi
19
+
20
+ # 테스트 실행
21
+ echo "테스트 실행 중..."
22
+ npm test
23
+
24
+ if [ "$FORCE_RELEASE" = true ]; then
25
+ # 현재 package.json 버전 그대로 사용
26
+ NEW_VERSION="v$(node -p "require('./package.json').version")"
27
+ echo "현재 버전으로 배포: $NEW_VERSION"
28
+
29
+ # 태그가 없으면 생성
30
+ if ! git tag | grep -q "^$NEW_VERSION$"; then
31
+ git tag "$NEW_VERSION"
32
+ git push origin "$NEW_VERSION"
33
+ echo "태그 생성: $NEW_VERSION"
34
+ else
35
+ echo "태그 이미 존재: $NEW_VERSION"
36
+ fi
37
+ else
38
+ # 마이너 버전 올리기
39
+ echo "버전 올리는 중..."
40
+ NEW_VERSION=$(npm version minor --no-git-tag-version)
41
+ echo "새 버전: $NEW_VERSION"
42
+
43
+ # package-lock.json 업데이트
44
+ npm install --package-lock-only 2>/dev/null || true
45
+
46
+ # 커밋 + 태그
47
+ git add package.json package-lock.json
48
+ git commit -m "chore: release $NEW_VERSION"
49
+ git tag "$NEW_VERSION"
50
+
51
+ # GitHub 푸시
52
+ echo "GitHub 푸시 중..."
53
+ git push origin main --tags
54
+ fi
55
+
56
+ # npm 배포 (2FA 필요 시 프롬프트)
57
+ echo "npm 배포 중... (2FA 코드가 필요할 수 있습니다)"
58
+ npm publish --access public
59
+
60
+ echo ""
61
+ echo "릴리즈 완료: $NEW_VERSION"
62
+ echo "https://www.npmjs.com/package/@elyun/bylane"
@@ -5,6 +5,17 @@ description: GitHub Issue 생성 및 분석. Figma 링크 감지 시 스펙 추
5
5
 
6
6
  # Issue Agent
7
7
 
8
+ ## GitHub 접근 방법
9
+
10
+ `.bylane/bylane.json`의 `github.method` 확인:
11
+
12
+ | 값 | 동작 |
13
+ |----|------|
14
+ | `"mcp"` | GitHub MCP 도구 사용 |
15
+ | `"cli"` | `gh` CLI 사용 |
16
+ | `"api"` | REST API + `$GITHUB_TOKEN` |
17
+ | `"auto"` (기본) | MCP → CLI → API 순서로 시도 |
18
+
8
19
  ## 입력
9
20
 
10
21
  - 자유 텍스트 (새 이슈 생성용) OR GitHub Issue 번호 (#N)
@@ -13,44 +24,65 @@ description: GitHub Issue 생성 및 분석. Figma 링크 감지 시 스펙 추
13
24
 
14
25
  ### 새 이슈 생성 모드 (텍스트 입력)
15
26
 
16
- 1. 입력 텍스트에서 다음을 추출:
17
- - 제목 (50자 이내)
18
- - 상세 설명
19
- - 구현 체크리스트 (예상 가능한 경우)
20
- - Figma URL (있는 경우)
27
+ 1. 입력 텍스트에서 추출:
28
+ - 제목 (50자 이내), 상세 설명, 구현 체크리스트, Figma URL
29
+
30
+ 2. 이슈 생성:
31
+
32
+ **MCP:**
33
+ → GitHub MCP `create_issue` 도구 사용
34
+
35
+ **CLI:**
36
+ ```bash
37
+ gh issue create \
38
+ --title "TITLE" \
39
+ --body "BODY" \
40
+ --label "bylane-auto"
41
+ ```
21
42
 
22
- 2. GitHub MCP로 이슈 생성:
23
- - `title`: 추출된 제목
24
- - `body`: Markdown 형식 설명 + 체크리스트
25
- - `labels`: `bylane-auto` 라벨 추가 (라벨이 없으면 생성)
43
+ **API:**
44
+ ```bash
45
+ curl -s -X POST \
46
+ -H "Authorization: Bearer $GITHUB_TOKEN" \
47
+ -H "Content-Type: application/json" \
48
+ https://api.github.com/repos/OWNER/REPO/issues \
49
+ -d '{"title":"TITLE","body":"BODY","labels":["bylane-auto"]}'
50
+ ```
26
51
 
27
- 3. Figma MCP 활성화 여부 확인 (`.bylane/bylane.json` → `extensions.figma.enabled`):
28
- - `true`이고 Figma URL 있으면 → **Figma 분석** 단계 실행
29
- - `false`이면 → 텍스트 기반 스펙만 생성
52
+ 3. Figma MCP 활성화 여부 확인 (`extensions.figma.enabled`):
53
+ - `true`이고 Figma URL 있으면 → Figma 분석 단계 실행
54
+ - `false` → 텍스트 기반 스펙만 생성
30
55
 
31
56
  ### 기존 이슈 분석 모드 (Issue 번호 입력)
32
57
 
33
- 1. GitHub MCP로 이슈 내용 로드
34
- 2. 본문에서 Figma URL 추출 시도
35
- 3. 스펙 생성 (아래 참조)
58
+ 1. 이슈 내용 로드:
36
59
 
37
- ### Figma 분석 (활성화된 경우)
60
+ **MCP:**
61
+ → GitHub MCP `get_issue` 도구 사용
62
+
63
+ **CLI:**
64
+ ```bash
65
+ gh issue view NUMBER --json title,body,labels
66
+ ```
67
+
68
+ **API:**
69
+ ```bash
70
+ curl -s \
71
+ -H "Authorization: Bearer $GITHUB_TOKEN" \
72
+ https://api.github.com/repos/OWNER/REPO/issues/NUMBER
73
+ ```
38
74
 
39
- Figma MCP `get_file` 또는 `get_node` 도구로 해당 프레임/컴포넌트 분석:
40
- - 컴포넌트 계층 구조
41
- - 색상 토큰
42
- - 타이포그래피
43
- - 스페이싱 값
75
+ 2. 본문에서 Figma URL 추출 시도 스펙 생성
76
+
77
+ ### Figma 분석 (활성화된 경우)
44
78
 
45
- 추출 결과를 스펙에 포함.
79
+ Figma MCP `get_file` 또는 `get_node` 도구로 프레임/컴포넌트 분석.
46
80
 
47
- **Figma 분석 실패 시 fallback:**
48
- - MCP 미설치 또는 URL 유효하지 않은 경우: 경고 로그 기록 후 텍스트 기반 스펙만 사용
49
- - `figmaSpec.enabled = false`로 출력
81
+ **실패 시 fallback:** 경고 로그 후 텍스트 기반 스펙 사용
50
82
 
51
- ## 출력: 구현 스펙
83
+ ## 출력
52
84
 
53
- `.bylane/state/issue-agent.json`에 저장:
85
+ `.bylane/state/issue-agent.json`:
54
86
 
55
87
  ```json
56
88
  {
@@ -63,27 +95,14 @@ Figma MCP `get_file` 또는 `get_node` 도구로 해당 프레임/컴포넌트
63
95
  "title": "다크모드 토글 버튼 추가",
64
96
  "description": "...",
65
97
  "checklist": ["ThemeToggle 컴포넌트 생성", "useTheme hook 구현"],
66
- "figmaSpec": {
67
- "enabled": false,
68
- "components": [],
69
- "colorTokens": {}
70
- }
98
+ "figmaSpec": { "enabled": false, "components": [], "colorTokens": {} }
71
99
  }
72
100
  }
73
101
  ```
74
102
 
75
103
  상태 기록:
76
104
  ```bash
77
- node -e "
78
- import('./src/state.js').then(({writeState, appendLog}) => {
79
- writeState('issue-agent', {
80
- status: 'in_progress',
81
- startedAt: new Date().toISOString(),
82
- progress: 0,
83
- retries: 0
84
- })
85
- })
86
- "
105
+ node -e "import('./src/state.js').then(({writeState})=>writeState('issue-agent',{status:'in_progress',startedAt:new Date().toISOString(),progress:0,retries:0}))"
87
106
  ```
88
107
 
89
108
  ## 수동 실행
@@ -5,6 +5,17 @@ description: 현재 브랜치의 커밋들로 GitHub Pull Request를 생성한
5
5
 
6
6
  # PR Agent
7
7
 
8
+ ## GitHub 접근 방법
9
+
10
+ `.bylane/bylane.json`의 `github.method` 확인:
11
+
12
+ | 값 | 동작 |
13
+ |----|------|
14
+ | `"mcp"` | GitHub MCP 도구 사용 |
15
+ | `"cli"` | `gh` CLI 사용 |
16
+ | `"api"` | REST API + `$GITHUB_TOKEN` |
17
+ | `"auto"` (기본) | MCP → CLI → API 순서로 시도 |
18
+
8
19
  ## 입력
9
20
 
10
21
  - `.bylane/state/commit-agent.json`의 `branchName`, `commitSha`
@@ -23,36 +34,44 @@ node -e "import('./src/state.js').then(({writeState})=>writeState('pr-agent',{st
23
34
  git push -u origin BRANCH_NAME
24
35
  ```
25
36
 
26
- 2. PR 제목/본문 생성:
27
- - 제목: 스펙 제목 (70자 이내)
28
- - 본문:
29
- ```
30
- ## Summary
31
- - [변경 요약]
37
+ 2. PR 본문 생성:
38
+ ```
39
+ ## Summary
40
+ - [변경 요약]
41
+
42
+ ## Test Plan
43
+ - [ ] 변경된 기능 동작 확인
44
+ - [ ] 기존 테스트 통과 확인
45
+
46
+ Closes #ISSUE_NUMBER
47
+ ```
48
+
49
+ 3. PR 생성:
32
50
 
33
- ## Test Plan
34
- - [ ] 변경된 기능 동작 확인
35
- - [ ] 기존 테스트 통과 확인
51
+ **MCP:**
52
+ GitHub MCP `create_pull_request` 도구 사용
36
53
 
37
- Closes #ISSUE_NUMBER
38
- ```
54
+ **CLI:**
55
+ ```bash
56
+ gh pr create \
57
+ --title "TITLE" \
58
+ --body "BODY" \
59
+ --head BRANCH_NAME \
60
+ --base main
61
+ ```
39
62
 
40
- 3. GitHub MCP로 PR 생성:
41
- - `title`: 생성된 제목
42
- - `body`: 생성된 본문
43
- - `head`: 현재 브랜치명
44
- - `base`: main
63
+ **API:**
64
+ ```bash
65
+ curl -s -X POST \
66
+ -H "Authorization: Bearer $GITHUB_TOKEN" \
67
+ -H "Content-Type: application/json" \
68
+ https://api.github.com/repos/OWNER/REPO/pulls \
69
+ -d '{"title":"TITLE","body":"BODY","head":"BRANCH_NAME","base":"main"}'
70
+ ```
45
71
 
46
72
  4. 상태 업데이트:
47
73
  ```bash
48
- node -e "
49
- import('./src/state.js').then(({writeState})=>writeState('pr-agent',{
50
- status:'completed',
51
- progress:100,
52
- prNumber:'PR_NUMBER',
53
- prUrl:'PR_URL'
54
- }))
55
- "
74
+ node -e "import('./src/state.js').then(({writeState})=>writeState('pr-agent',{status:'completed',progress:100,prNumber:PR_NUMBER,prUrl:'PR_URL'}))"
56
75
  ```
57
76
 
58
77
  ## 출력
@@ -5,6 +5,17 @@ description: PR 리뷰 코멘트에 반박하거나 코드를 수정하여 반
5
5
 
6
6
  # Respond Agent
7
7
 
8
+ ## GitHub 접근 방법
9
+
10
+ `.bylane/bylane.json`의 `github.method` 확인:
11
+
12
+ | 값 | 동작 |
13
+ |----|------|
14
+ | `"mcp"` | GitHub MCP 도구 사용 |
15
+ | `"cli"` | `gh` CLI 사용 |
16
+ | `"api"` | REST API + `$GITHUB_TOKEN` |
17
+ | `"auto"` (기본) | MCP → CLI → API 순서로 시도 |
18
+
8
19
  ## 입력
9
20
 
10
21
  - PR 번호
@@ -18,23 +29,55 @@ node -e "import('./src/state.js').then(({writeState})=>writeState('respond-agent
18
29
 
19
30
  ## 실행 흐름
20
31
 
32
+ ### 리뷰 코멘트 로드
33
+
34
+ **MCP:**
35
+ → GitHub MCP `list_review_comments` 도구 사용
36
+
37
+ **CLI:**
38
+ ```bash
39
+ gh pr view PR_NUMBER --json reviews,comments
40
+ ```
41
+
42
+ **API:**
43
+ ```bash
44
+ curl -s \
45
+ -H "Authorization: Bearer $GITHUB_TOKEN" \
46
+ https://api.github.com/repos/OWNER/REPO/pulls/PR_NUMBER/comments
47
+ ```
48
+
21
49
  ### accept 모드
22
50
 
23
- 1. GitHub MCP로 미해결 리뷰 코멘트 로드
24
- 2. 코멘트별 수정 사항 결정
25
- 3. 코드 수정 (code-agent 서브 실행)
26
- 4. test-agent로 검증
27
- 5. commit-agent로 수정 커밋 (`fix: address review comments`)
28
- 6. GitHub MCP로 각 코멘트에 "반영 완료" 답글 작성
51
+ 1. 코멘트별 수정 사항 결정
52
+ 2. 코드 수정 (code-agent 서브 실행)
53
+ 3. test-agent 검증
54
+ 4. commit-agent로 수정 커밋 (`fix: address review comments`)
55
+ 5. 코멘트에 "반영 완료" 답글 게시:
56
+
57
+ **MCP:**
58
+ → GitHub MCP `create_review_comment_reply` 도구 사용
59
+
60
+ **CLI:**
61
+ ```bash
62
+ gh pr comment PR_NUMBER --body "REPLY_BODY"
63
+ ```
64
+
65
+ **API:**
66
+ ```bash
67
+ curl -s -X POST \
68
+ -H "Authorization: Bearer $GITHUB_TOKEN" \
69
+ -H "Content-Type: application/json" \
70
+ https://api.github.com/repos/OWNER/REPO/issues/PR_NUMBER/comments \
71
+ -d '{"body":"REPLY_BODY"}'
72
+ ```
29
73
 
30
74
  ### rebut 모드
31
75
 
32
- 1. GitHub MCP로 미해결 리뷰 코멘트 로드
33
- 2. 코멘트에 대해 근거를 기술한 반박 답글 작성:
34
- - 의도적 설계 결정인 경우: 배경 설명
35
- - 성능 트레이드오프: 구체적 수치 근거 제시
76
+ 1. 코멘트에 근거를 기술한 반박 답글 작성:
77
+ - 의도적 설계 결정: 배경 설명
78
+ - 성능 트레이드오프: 구체적 수치 근거
36
79
  - 스펙 요구사항과 일치하는 경우: 이슈 링크 첨부
37
- 3. GitHub MCP로 반박 답글 게시
80
+ 2. 위와 동일한 방법으로 답글 게시
38
81
 
39
82
  ## 출력
40
83
 
@@ -5,6 +5,17 @@ description: PR의 diff를 분석하여 코드 리뷰 코멘트를 작성한다.
5
5
 
6
6
  # Review Agent
7
7
 
8
+ ## GitHub 접근 방법
9
+
10
+ `.bylane/bylane.json`의 `github.method` 확인:
11
+
12
+ | 값 | 동작 |
13
+ |----|------|
14
+ | `"mcp"` | GitHub MCP 도구 사용 |
15
+ | `"cli"` | `gh` CLI 사용 |
16
+ | `"api"` | REST API + `$GITHUB_TOKEN` |
17
+ | `"auto"` (기본) | MCP → CLI → API 순서로 시도 |
18
+
8
19
  ## 입력
9
20
 
10
21
  PR 번호 (`.bylane/state/pr-agent.json`에서 자동 로드, 또는 수동 전달)
@@ -17,7 +28,25 @@ node -e "import('./src/state.js').then(({writeState})=>writeState('review-agent'
17
28
 
18
29
  ## 실행 흐름
19
30
 
20
- 1. GitHub MCP로 PR diff 로드
31
+ 1. PR diff 로드:
32
+
33
+ **MCP:**
34
+ → GitHub MCP `get_pull_request_files` 도구 사용
35
+
36
+ **CLI:**
37
+ ```bash
38
+ gh pr diff PR_NUMBER
39
+ # 파일 목록
40
+ gh pr view PR_NUMBER --json files
41
+ ```
42
+
43
+ **API:**
44
+ ```bash
45
+ curl -s \
46
+ -H "Authorization: Bearer $GITHUB_TOKEN" \
47
+ https://api.github.com/repos/OWNER/REPO/pulls/PR_NUMBER/files
48
+ ```
49
+
21
50
  2. 변경된 파일별 분석:
22
51
  - 버그 가능성 (null check, 경계값 등)
23
52
  - 타입 오류 (TypeScript)
@@ -31,20 +60,33 @@ node -e "import('./src/state.js').then(({writeState})=>writeState('review-agent'
31
60
  - **MEDIUM**: 개선 권장
32
61
  - **LOW**: 선택적 개선
33
62
 
34
- 4. GitHub MCP로 리뷰 제출:
35
- - CRITICAL/HIGH 없으면 → `approve`
36
- - CRITICAL/HIGH 있으면 → `request_changes`
63
+ 4. 리뷰 제출:
64
+
65
+ **MCP:**
66
+ → GitHub MCP `create_review` 도구 사용 (event: `APPROVE` 또는 `REQUEST_CHANGES`)
67
+
68
+ **CLI:**
69
+ ```bash
70
+ # 승인
71
+ gh pr review PR_NUMBER --approve --body "REVIEW_BODY"
72
+ # 변경 요청
73
+ gh pr review PR_NUMBER --request-changes --body "REVIEW_BODY"
74
+ # 개별 라인 코멘트
75
+ gh pr comment PR_NUMBER --body "COMMENT"
76
+ ```
77
+
78
+ **API:**
79
+ ```bash
80
+ curl -s -X POST \
81
+ -H "Authorization: Bearer $GITHUB_TOKEN" \
82
+ -H "Content-Type: application/json" \
83
+ https://api.github.com/repos/OWNER/REPO/pulls/PR_NUMBER/reviews \
84
+ -d '{"body":"REVIEW_BODY","event":"APPROVE","comments":[]}'
85
+ ```
37
86
 
38
87
  5. 상태 업데이트:
39
88
  ```bash
40
- node -e "
41
- import('./src/state.js').then(({writeState})=>writeState('review-agent',{
42
- status:'completed',
43
- progress:100,
44
- approved:APPROVED_BOOL,
45
- commentCount:COMMENT_COUNT
46
- }))
47
- "
89
+ node -e "import('./src/state.js').then(({writeState})=>writeState('review-agent',{status:'completed',progress:100,approved:APPROVED_BOOL,commentCount:COMMENT_COUNT}))"
48
90
  ```
49
91
 
50
92
  ## 출력
package/skills/setup.md CHANGED
@@ -17,6 +17,28 @@ ALWAYS complete all 6 steps before saving. NEVER skip steps.
17
17
 
18
18
  2. 기존 bylane.json 있으면 현재 설정을 로드해 기본값으로 사용.
19
19
 
20
+ ## Step 0/6 — GitHub 접근 방법
21
+
22
+ 사용 가능한 방법을 자동 감지한 뒤 사용자에게 확인한다:
23
+
24
+ ```bash
25
+ # MCP 확인: Claude Code 세션에서 GitHub MCP 도구 응답 여부
26
+ # CLI 확인
27
+ gh auth status 2>/dev/null && echo "cli_ok"
28
+ # API 확인
29
+ echo ${GITHUB_TOKEN:+api_ok}
30
+ ```
31
+
32
+ > GitHub 접근 방법을 선택하세요:
33
+ > 1. auto — MCP → CLI → API 순서로 자동 시도 (권장)
34
+ > 2. mcp — GitHub MCP 도구만 사용
35
+ > 3. cli — gh CLI만 사용
36
+ > 4. api — REST API + GITHUB_TOKEN만 사용
37
+
38
+ `github.method`에 저장. `cli` 또는 `api` 선택 시 추가 입력:
39
+ - `cli`: `gh repo view`로 owner/repo 자동 감지, 실패 시 직접 입력
40
+ - `api`: `GITHUB_TOKEN` 환경변수명 확인, owner/repo 입력
41
+
20
42
  ## Step 1/6 — 이슈 트래커
21
43
 
22
44
  사용자에게 묻는다:
package/src/config.js CHANGED
@@ -34,6 +34,11 @@ export const DEFAULT_CONFIG = {
34
34
  },
35
35
  extensions: {
36
36
  figma: { enabled: false, useAt: 'issue-analysis' }
37
+ },
38
+ github: {
39
+ method: 'auto',
40
+ owner: '',
41
+ repo: ''
37
42
  }
38
43
  }
39
44