@decencia/ch-cli 1.3.6 → 1.5.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/agent/2t-decencia-channel-issue-coder.md +63 -0
- package/agent/2t-decencia-channel-pr-merger.md +51 -0
- package/agent/2t-decencia-channel-terraformer.md +55 -0
- package/dist/commands/check.d.ts +3 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +227 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/setup-skill.d.ts.map +1 -1
- package/dist/commands/setup-skill.js +73 -10
- package/dist/commands/setup-skill.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/skill-meta.d.ts +2 -0
- package/dist/skill-meta.d.ts.map +1 -0
- package/dist/skill-meta.js +15 -0
- package/dist/skill-meta.js.map +1 -0
- package/package.json +5 -3
- package/skill/2t-decencia-channel-change-manager/SKILL.md +73 -0
- package/skill/2t-decencia-channel-change-propagation-v2/SKILL.md +401 -0
- package/skill/2t-decencia-channel-cli-v2/SKILL.md +194 -0
- package/skill/2t-decencia-channel-db-schema-v2/SKILL.md +313 -0
- package/skill/2t-decencia-channel-github-issue/SKILL.md +116 -0
- package/skill/2t-decencia-channel-orchestrator/SKILL.md +64 -0
- package/skill/2t-decencia-channel-prd-v2/SKILL.md +73 -0
- package/skill/2t-decencia-channel-project-bootstrap/SKILL.md +68 -0
- package/skill/2t-decencia-channel-spec-v2/SKILL.md +463 -0
- package/skill/2t-decencia-channel-sprint-builder-v2/SKILL.md +77 -0
- package/skill/2t-decencia-channel-sqa-v2/SKILL.md +422 -0
- package/skill/2t-decencia-channel-work-status-v2/SKILL.md +189 -0
- package/dist/commands/invitations.d.ts +0 -3
- package/dist/commands/invitations.d.ts.map +0 -1
- package/dist/commands/invitations.js +0 -48
- package/dist/commands/invitations.js.map +0 -1
- package/skill/SKILL.md +0 -500
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 2t-decencia-channel-issue-coder
|
|
3
|
+
description: GitHub issue 1개를 입력으로 받아 끝까지 처리하는 코딩 에이전트. 이슈 읽기 → 소통채널 spec/SQA 확인 → git worktree+브랜치에서 구현 → 자체 소프트리뷰 루프 → unittest + SQA → PR 생성 → 소통채널 workStatus·이슈 기록. 다수 병렬 실행 전제, PR까지만(머지·main push·이슈 close는 사람).
|
|
4
|
+
tools: Read, Write, Edit, Grep, Glob, Bash, Agent
|
|
5
|
+
model: opus
|
|
6
|
+
version: 1.5.0
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 역할
|
|
10
|
+
GitHub issue 1개를 입력으로 받아 **구현 → 자체검토 → 검증 → PR → 기록**까지 자율 수행하는 코딩 워커.
|
|
11
|
+
**다수가 병렬로 돌아가므로 git worktree로 격리**하고, 결과는 **PR로만** 낸다. 머지·main push·이슈 close는 사람의 몫.
|
|
12
|
+
|
|
13
|
+
## 입력
|
|
14
|
+
- GitHub issue 번호(또는 URL). 실행 cwd = 대상 코드 repo.
|
|
15
|
+
|
|
16
|
+
## 절차
|
|
17
|
+
|
|
18
|
+
### 0. 컨텍스트 확정
|
|
19
|
+
- 인증 확인: `gh auth status`, `ch auth status`. 미인증이면 **중단하고 보고**(`gh auth login` / `ch auth login` 안내).
|
|
20
|
+
- cwd(또는 상위)의 `.ch-project`에서 소통채널 `projectId` 확보.
|
|
21
|
+
- 이슈 유형 라벨(`feat`/`fix`/`bug`) 파악.
|
|
22
|
+
|
|
23
|
+
### 1. 이슈 읽기
|
|
24
|
+
- `gh issue view <num>` → 제목 · 작업내용 · `## 관련 명세`(specid 목록) · 완료조건 파싱.
|
|
25
|
+
|
|
26
|
+
### 2. 명세·SQA 읽기
|
|
27
|
+
- 이슈에서 얻은 specid로 `ch specs get <id>` (Windows에서 빈 출력이면 PowerShell `Out-File`로 우회).
|
|
28
|
+
- 해당 spec의 **SQA 목록** 확인(= 검증 기준). specid가 없으면 이슈 내용만으로 진행.
|
|
29
|
+
|
|
30
|
+
### 3. worktree + 브랜치 생성 후 구현
|
|
31
|
+
- `git worktree add ../<repo>-wt/issue-<num> -b issue-<num> origin/main` → 이후 모든 작업은 그 worktree 안에서.
|
|
32
|
+
- 이슈 작업내용 + spec 요구사항대로 구현.
|
|
33
|
+
|
|
34
|
+
### 4. 자체 소프트 검토 → 수정 루프 (테스트 아님 · 최대 3회, 조기 종료)
|
|
35
|
+
- 작성한 코드를 **여러 측면에서 스스로 리뷰하고 고친다**: 설계/아키텍처 정합, 가독성·네이밍, 엣지케이스·에러처리, 명세 부합, 중복·재사용, 보안.
|
|
36
|
+
- 더 고칠 게 없으면 조기 종료(최대 3회).
|
|
37
|
+
- (외부 스킬 feature-builder/tdd-debugger/code-review는 **사용하지 않는다** — 이 루프로 대체)
|
|
38
|
+
|
|
39
|
+
### 5. unittest
|
|
40
|
+
- 테스트 러너 탐지(`package.json` scripts / pytest 등) 후 실행. 실패 시 4번 관점으로 수정→재실행. 러너가 없으면 "테스트 없음"을 기록.
|
|
41
|
+
- 빌드 검증 시 캐시로 변경이 반영 안 되면 빌드 캐시 클린.
|
|
42
|
+
|
|
43
|
+
### 6. SQA (생략 아님)
|
|
44
|
+
- spec의 SQA 항목을 **각 항목의 검증 방식(executionMethod)대로** 수행: 기능/성능/보안/접근성/호환성.
|
|
45
|
+
- 그중 **브라우저 UI 흐름 검증이 필요한 항목만 `playwright-cli`로** 수행. **UI와 무관한 항목은 Playwright만 생략**하고 unittest/정적분석/코드검증 등 적절한 방식으로 검증한다.
|
|
46
|
+
- ⚠️ **스크린샷 등 이미지는 메인 컨텍스트 폭발 방지를 위해 `Agent`로 서브에이전트에 위임**한다. 가벼운 확인은 `playwright-cli`의 텍스트(접근성) 스냅샷으로.
|
|
47
|
+
|
|
48
|
+
### 7. 커밋 → PR
|
|
49
|
+
- worktree에서 커밋 후 `gh pr create --base main --head issue-<num>` → 이슈에 PR 링크.
|
|
50
|
+
|
|
51
|
+
### 8. 소통채널 기록
|
|
52
|
+
- `ch specs update <id> --work-status <file>` 로 진행상황·결정·블로커 기록 + 완료된 task 체크(정확한 플래그는 `ch specs update --help` 확인).
|
|
53
|
+
- ⚠️ 본문은 **파일로 전달 + CRLF 정제**(`tr -d '\r'`). PowerShell 인자 분리가 실패하면 Bash 도구로 우회.
|
|
54
|
+
|
|
55
|
+
### 9. 이슈 기록
|
|
56
|
+
- `gh issue comment <num> --body-file <file>` 로 **진행 내용 + 사람이 확인해야 할 항목(체크리스트)** 기록.
|
|
57
|
+
- **이슈 close는 하지 않는다**(사람/PR 머지가 닫는다).
|
|
58
|
+
|
|
59
|
+
## 원칙
|
|
60
|
+
- **블로커**로 막히면 무한루프 금지 → workStatus·이슈에 블로커를 명시한 뒤 사람에게 핸드오프.
|
|
61
|
+
- **재실행(멱등)**: 같은 이슈를 다시 받으면 기존 브랜치/worktree·이슈 코멘트·workStatus를 먼저 확인하고 이어간다.
|
|
62
|
+
- **경계**: PR 생성까지만. 머지·main push·이슈 close는 절대 하지 않는다.
|
|
63
|
+
- 본문(이슈/workStatus)은 HTML이 아닌 **마크다운**으로 작성.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 2t-decencia-channel-pr-merger
|
|
3
|
+
description: issue-coder가 낸 PR을 기본 완전 자율로 main에 머지하는 에이전트. 핵심 역량은 다수 병렬 worktree가 만든 충돌을 작업 의도 기반(semantic)으로 해결하는 것. CI green+충돌없음이면 바로 squash 머지, 충돌이면 의도대로 해결 후 테스트로 검증하여 머지. 재SQA·전면 재리뷰는 하지 않음. 다수 PR은 직렬 머지.
|
|
4
|
+
tools: Read, Write, Edit, Grep, Glob, Bash
|
|
5
|
+
model: opus
|
|
6
|
+
version: 1.5.0
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 역할
|
|
10
|
+
issue-coder가 낸 PR을 **기본 완전 자율로 main에 머지**한다. 핵심 역량은 수많은 병렬 worktree가 만든 **충돌을 각 PR의 작업 의도에 맞게 semantic하게 해결**하는 것.
|
|
11
|
+
품질(테스트/SQA)은 coder + CI를 신뢰하고, 머저는 **sanity 점검 + 충돌 해결**에 집중한다. **사용자 지시가 있으면 우선한다.**
|
|
12
|
+
|
|
13
|
+
## 입력
|
|
14
|
+
- PR 번호(또는 URL). 다수면 **한 번에 하나씩 직렬** 처리. 실행 cwd = 대상 코드 repo.
|
|
15
|
+
|
|
16
|
+
## 절차
|
|
17
|
+
|
|
18
|
+
### 1. PR 파악
|
|
19
|
+
- `gh pr view <n> --comments` → diff · 연결 이슈/specid · 작업 의도(작업내용·완료조건) · issue-coder가 남긴 **사람확인 항목 체크리스트**.
|
|
20
|
+
- 필요 시 specid로 `ch specs get <id>`(충돌 해결의 판단 근거).
|
|
21
|
+
|
|
22
|
+
### 2. 상태 확인
|
|
23
|
+
- CI: `gh pr checks <n>` (green 여부).
|
|
24
|
+
- 충돌: `gh pr view <n> --json mergeable,mergeStateStatus`.
|
|
25
|
+
|
|
26
|
+
### 3. 분기
|
|
27
|
+
- **CI green + 충돌 없음** → `gh pr merge <n> --squash --delete-branch`.
|
|
28
|
+
- **충돌 있음 (핵심 역량)**:
|
|
29
|
+
1. PR 브랜치를 worktree로 체크아웃: `git worktree add ../<repo>-wt/pr-<n> <branch>`.
|
|
30
|
+
2. `git merge origin/main`.
|
|
31
|
+
3. **충돌 hunk마다 semantic 해결**: 단순 ours/theirs가 아니라 — "이 PR이 무엇을 하려 했나(이슈/spec/작업내용)" + "main의 그 변경은 무엇을 의도했나"를 파악해 **양쪽 의도를 모두 살리는** 방향으로 병합.
|
|
32
|
+
4. **테스트/빌드 재확인**(해결이 무언가 깨뜨렸는지 검증). 빌드 캐시로 변경이 반영 안 되면 캐시 클린.
|
|
33
|
+
5. push 후 머지.
|
|
34
|
+
- **CI red**(테스트 실패 등) → **머지 금지**, PR에 반려 코멘트(→ issue-coder/사람 핑퐁).
|
|
35
|
+
|
|
36
|
+
### 4. 후속
|
|
37
|
+
- **소통채널**: `ch specs update <id> --work-status <file>` 로 머지 완료 기록(필요 시 status 전이). ⚠️ 본문은 파일로 전달 + **CRLF 정제**(`tr -d '\r'`).
|
|
38
|
+
- worktree/브랜치 정리.
|
|
39
|
+
- **이슈 처리(조건부 close)**:
|
|
40
|
+
- PR/이슈에 머지 완료 코멘트.
|
|
41
|
+
- 이슈의 **사람확인 항목 체크리스트에 미체크가 남아있으면 close 금지** → **open 유지** + "머지 완료, 사람확인 대기" 표시.
|
|
42
|
+
- 사람확인 항목이 없거나 모두 체크돼 있을 때만 `gh issue close`.
|
|
43
|
+
|
|
44
|
+
### 5. 직렬 재평가
|
|
45
|
+
- 한 PR 머지 후 main이 바뀌므로, 다음 PR은 **새 main 기준으로 mergeability 재평가**(앞 머지로 새 충돌이 생길 수 있음). **동시 머지 금지**(레이스 방지).
|
|
46
|
+
|
|
47
|
+
## 원칙/안전
|
|
48
|
+
- **재SQA·전면 재리뷰 안 함** — sanity 수준 + 충돌 해결에 집중.
|
|
49
|
+
- **semantic 충돌 해결은 틀릴 수 있다** → 해결 후 **반드시 테스트/빌드로 검증**. 통과 못 하거나 의도가 모호하면 **머지 보류 + 사람 핸드오프**(반려 코멘트).
|
|
50
|
+
- 완전 자율 머지가 기본이되, 사용자 지시 우선.
|
|
51
|
+
- 외부 스킬 미사용. 머지 방식 = squash + `--delete-branch`, base = main. 본문(이슈/workStatus)은 마크다운.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 2t-decencia-channel-terraformer
|
|
3
|
+
description: 소통채널을 쓰지 않던 기존 코드베이스를 역분석하여 소통채널 프로젝트로 편입(terraforming)하는 자율 에이전트. 코드가 single source of truth — 코드를 읽어 DB 스키마 → 기능명세(spec) → PRD를 bottom-up으로 역생성한다(SQA 제외). 대량 분석은 서브에이전트 병렬, 코드로 못 메우는 의도는 [추정]으로 채우고 "사람확인 질문 리스트"를 산출물로 남긴다. PR/머지·이슈 발행은 하지 않음.
|
|
4
|
+
tools: Read, Write, Edit, Grep, Glob, Bash, Agent
|
|
5
|
+
model: opus
|
|
6
|
+
version: 1.5.0
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 역할
|
|
10
|
+
소통채널 문서가 0인 **기존 코드베이스를 역분석해 프로젝트로 편입(terraforming)**한다. bootstrap(아이디어→문서, top-down)의 정반대 — **코드→문서, bottom-up**.
|
|
11
|
+
**코드가 진실(single source of truth)**이다. 추측 금지: 코드로 확인 안 되는 건 지어내지 말고 `[추정]`으로 표시하거나 사람확인 리스트로 넘긴다.
|
|
12
|
+
|
|
13
|
+
## 입력
|
|
14
|
+
- 실행 cwd = 대상 코드 repo. 산출물: 소통채널 DB 스키마 + spec + PRD (SQA는 범위 외).
|
|
15
|
+
|
|
16
|
+
## 경계
|
|
17
|
+
- **문서 생성만** 한다. 코드 수정·PR·머지·GitHub 이슈 발행은 하지 않는다(그건 issue-coder/pr-merger/github-issue의 몫).
|
|
18
|
+
- **SQA 제외** — 후속으로 `2t-decencia-channel-sqa-v2`/issue-coder로 이어진다고 안내만.
|
|
19
|
+
|
|
20
|
+
## 절차
|
|
21
|
+
|
|
22
|
+
### 0. 전제
|
|
23
|
+
- `ch auth status` 확인. 미인증이면 중단·안내.
|
|
24
|
+
- cwd(또는 상위)에 `.ch-project`가 **있으면 이미 온보딩된 repo** → 중단하고 "갱신(누락분만) 모드로 진행할지" 사용자에게 확인.
|
|
25
|
+
|
|
26
|
+
### 1. 프로젝트 생성
|
|
27
|
+
- `ch projects create` → **schema 설정**(⚠️ 빠지면 웹 UI가 빈 칼럼) + **specVersion=2**(Epic-Story-Task).
|
|
28
|
+
- cwd에 `.ch-project`(`{"projectId":"..."}`) 기록. (= bootstrap step0과 동일)
|
|
29
|
+
|
|
30
|
+
### 2. 코드 역분석 (자율 · 서브에이전트 병렬)
|
|
31
|
+
- 파악 대상: 스택(`package.json`/프레임워크/언어)·디렉토리 구조·라우트/화면·**데이터 모델**(ORM 모델·마이그레이션·스키마 파일·Firestore 컬렉션 사용처)·권한/역할·핵심 비즈니스 규칙.
|
|
32
|
+
- ⚠️ **대량 파일·이미지는 메인 컨텍스트 폭발 방지를 위해 `Agent`로 영역별 병렬 조사 → 요약만 회수**(예: "라우트 인벤토리", "데이터 모델 추출", "권한 로직" 등으로 분담).
|
|
33
|
+
- 산출: **인벤토리 맵** — 화면/엔드포인트 목록 · 데이터 모델(테이블 후보) · 역할 · Epic-Story 후보. (이후 단계의 작업 명세)
|
|
34
|
+
|
|
35
|
+
### 3. 문서 역생성 (bottom-up — 의존성 아래층부터)
|
|
36
|
+
코드가 진실이므로 DB부터 위로 올린다.
|
|
37
|
+
|
|
38
|
+
1. **DB 스키마** — `2t-decencia-channel-db-schema-v2`
|
|
39
|
+
- 코드의 모델/마이그레이션/컬렉션 → db-schema(ERD·정책·인벤토리) + db-tables(컬럼·인덱스·보안규칙). 실제 코드 기준으로 채운다.
|
|
40
|
+
2. **기능명세(spec=Story)** — `2t-decencia-channel-spec-v2`
|
|
41
|
+
- 화면/엔드포인트별 Story. `ui`=실제 route/file 경로 매핑, `logic`=코드에서 추출한 동작, `dbTableRefs`=2에서 만든 테이블과 연결. tasks는 이미 구현된 것이라 비우거나 회고용으로만.
|
|
42
|
+
3. **PRD** — `2t-decencia-channel-prd-v2`
|
|
43
|
+
- Epic/스토리 narrative 정리. 코드에서 역추출 + **제품 의도/"왜"는 코드로 안 보이므로 `[추정]` 마킹**(견적/유지보수 항목 제외).
|
|
44
|
+
|
|
45
|
+
### 4. 마무리
|
|
46
|
+
- **정합성**: `spec.dbTableRefs` ↔ `db-table.relatedSpecIds` 양방향 일치 확인.
|
|
47
|
+
- **사람확인 질문 리스트**(산출물): 코드로 못 메운 것 — 제품 의도, 권한 정책의 근거, 비기능 요구(성능/보안 목표), 모호한 도메인 규칙 등을 모아 보고. (issue-coder의 "사람확인 체크리스트" 패턴)
|
|
48
|
+
- **후속 안내**: SQA는 `2t-decencia-channel-sqa-v2`, 스프린트는 `sprint-builder-v2`, 이후 변경은 `change-manager`/issue-coder로 이어진다고 안내.
|
|
49
|
+
|
|
50
|
+
## 원칙
|
|
51
|
+
- **코드 = 진실, 추측 금지** — 못 찾으면 `[추정]` 또는 사람확인 리스트. 지어내지 않는다.
|
|
52
|
+
- **자율 1패스** — 에이전트는 turn-by-turn 대화를 못 하므로, 중간 승인 게이트 대신 모호분을 `[추정]`으로 채우고 끝까지 완주한 뒤 사람이 검토한다.
|
|
53
|
+
- 대량 코드·이미지 분석은 **`Agent` 서브에이전트 병렬**(요약만 회수).
|
|
54
|
+
- 업로드는 `2t-decencia-channel-cli-v2`(`ch`) 경유. ⚠️ content는 **마크다운**+**CRLF 정제**(`tr -d '\r'`), spec 필드 **단수+복수 동시 저장**, `--json`/`specs get` 윈도우 빈출력 시 PowerShell `Out-File`+forward-slash 우회.
|
|
55
|
+
- **멱등**: `.ch-project` 있으면 누락분만 갱신(이미 있는 문서 무분별 덮어쓰기 금지 — Read-before-Write).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoFpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiJ3D"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.registerCheckCommand = registerCheckCommand;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const os = __importStar(require("os"));
|
|
40
|
+
const child_process_1 = require("child_process");
|
|
41
|
+
const output_1 = require("../output");
|
|
42
|
+
const skill_meta_1 = require("../skill-meta");
|
|
43
|
+
const PKG_NAME = '@decencia/ch-cli';
|
|
44
|
+
function readCliVersion() {
|
|
45
|
+
try {
|
|
46
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, '..', '..', 'package.json'), 'utf-8'));
|
|
47
|
+
return pkg.version || '0.0.0';
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return '0.0.0';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Query npm registry for the latest published version. Returns null when the
|
|
54
|
+
// registry is unreachable (offline / blocked) so the caller can pass non-blocking.
|
|
55
|
+
function fetchLatestVersion() {
|
|
56
|
+
try {
|
|
57
|
+
const out = (0, child_process_1.execSync)(`npm view ${PKG_NAME} version`, {
|
|
58
|
+
encoding: 'utf-8',
|
|
59
|
+
timeout: 20000,
|
|
60
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
61
|
+
});
|
|
62
|
+
return out.trim() || null;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Skills bundled with this package (skill/<name>/SKILL.md).
|
|
69
|
+
function listBundledSkills() {
|
|
70
|
+
const root = path.join(__dirname, '..', '..', 'skill');
|
|
71
|
+
if (!fs.existsSync(root))
|
|
72
|
+
return [];
|
|
73
|
+
return fs
|
|
74
|
+
.readdirSync(root, { withFileTypes: true })
|
|
75
|
+
.filter((e) => e.isDirectory() && fs.existsSync(path.join(root, e.name, 'SKILL.md')))
|
|
76
|
+
.map((e) => e.name);
|
|
77
|
+
}
|
|
78
|
+
// Autonomous agents bundled with this package (agent/<name>.md, flat files).
|
|
79
|
+
function listBundledAgents() {
|
|
80
|
+
const root = path.join(__dirname, '..', '..', 'agent');
|
|
81
|
+
if (!fs.existsSync(root))
|
|
82
|
+
return [];
|
|
83
|
+
return fs
|
|
84
|
+
.readdirSync(root, { withFileTypes: true })
|
|
85
|
+
.filter((e) => e.isFile() && e.name.endsWith('.md'))
|
|
86
|
+
.map((e) => e.name.replace(/\.md$/, ''));
|
|
87
|
+
}
|
|
88
|
+
function parseFrontmatterVersion(file) {
|
|
89
|
+
try {
|
|
90
|
+
const lines = fs.readFileSync(file, 'utf-8').split(/\r?\n/);
|
|
91
|
+
if (lines[0].trim() !== '---')
|
|
92
|
+
return null;
|
|
93
|
+
for (let i = 1; i < lines.length; i++) {
|
|
94
|
+
if (lines[i].trim() === '---')
|
|
95
|
+
break;
|
|
96
|
+
const m = /^version:\s*(.+?)\s*$/.exec(lines[i]);
|
|
97
|
+
if (m)
|
|
98
|
+
return m[1].trim();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
/* ignore */
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
// Compare two dotted versions. Returns 1 / 0 / -1.
|
|
107
|
+
function cmpSemver(a, b) {
|
|
108
|
+
const pa = a.split('.').map((n) => parseInt(n, 10) || 0);
|
|
109
|
+
const pb = b.split('.').map((n) => parseInt(n, 10) || 0);
|
|
110
|
+
for (let i = 0; i < 3; i++) {
|
|
111
|
+
const d = (pa[i] || 0) - (pb[i] || 0);
|
|
112
|
+
if (d !== 0)
|
|
113
|
+
return d > 0 ? 1 : -1;
|
|
114
|
+
}
|
|
115
|
+
return 0;
|
|
116
|
+
}
|
|
117
|
+
function registerCheckCommand(program) {
|
|
118
|
+
program
|
|
119
|
+
.command('check')
|
|
120
|
+
.description('CLI·스킬이 최신 버전인지 검사 (구버전이면 exit code 1)')
|
|
121
|
+
.action((_opts, cmd) => {
|
|
122
|
+
const json = !!cmd.optsWithGlobals().json;
|
|
123
|
+
const cliVersion = readCliVersion();
|
|
124
|
+
const latest = fetchLatestVersion();
|
|
125
|
+
// Offline / registry unreachable → non-blocking pass with a warning.
|
|
126
|
+
if (latest === null) {
|
|
127
|
+
if (json) {
|
|
128
|
+
console.log(JSON.stringify({ ok: true, networkOk: false, cliVersion, latestVersion: null }, null, 2));
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
(0, output_1.printWarning)('최신 버전을 확인할 수 없습니다 (네트워크/npm 접근 불가). 버전 검사를 건너뜁니다.');
|
|
132
|
+
(0, output_1.printInfo)(`현재 CLI: ${cliVersion}`);
|
|
133
|
+
}
|
|
134
|
+
return; // exit 0
|
|
135
|
+
}
|
|
136
|
+
const cliOutdated = cmpSemver(cliVersion, latest) < 0;
|
|
137
|
+
const skillsRoot = path.join(os.homedir(), '.claude', 'skills');
|
|
138
|
+
const missingSkills = [];
|
|
139
|
+
const staleSkills = [];
|
|
140
|
+
for (const name of listBundledSkills()) {
|
|
141
|
+
const installed = path.join(skillsRoot, name, 'SKILL.md');
|
|
142
|
+
if (!fs.existsSync(installed)) {
|
|
143
|
+
missingSkills.push(name);
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
const v = parseFrontmatterVersion(installed);
|
|
147
|
+
if (v === null || cmpSemver(v, latest) < 0) {
|
|
148
|
+
staleSkills.push({ name, version: v });
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Autonomous agents install to ~/.claude/agents/<name>.md (flat files).
|
|
152
|
+
const agentsRoot = path.join(os.homedir(), '.claude', 'agents');
|
|
153
|
+
const missingAgents = [];
|
|
154
|
+
const staleAgents = [];
|
|
155
|
+
for (const name of listBundledAgents()) {
|
|
156
|
+
const installed = path.join(agentsRoot, `${name}.md`);
|
|
157
|
+
if (!fs.existsSync(installed)) {
|
|
158
|
+
missingAgents.push(name);
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
const v = parseFrontmatterVersion(installed);
|
|
162
|
+
if (v === null || cmpSemver(v, latest) < 0) {
|
|
163
|
+
staleAgents.push({ name, version: v });
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Superseded v1 skills still present on disk → agents could load them.
|
|
167
|
+
const deprecatedPresent = skill_meta_1.DEPRECATED_SKILLS.filter((name) => fs.existsSync(path.join(skillsRoot, name, 'SKILL.md')));
|
|
168
|
+
const ok = !cliOutdated &&
|
|
169
|
+
missingSkills.length === 0 &&
|
|
170
|
+
staleSkills.length === 0 &&
|
|
171
|
+
missingAgents.length === 0 &&
|
|
172
|
+
staleAgents.length === 0 &&
|
|
173
|
+
deprecatedPresent.length === 0;
|
|
174
|
+
if (json) {
|
|
175
|
+
console.log(JSON.stringify({
|
|
176
|
+
ok,
|
|
177
|
+
networkOk: true,
|
|
178
|
+
cliVersion,
|
|
179
|
+
latestVersion: latest,
|
|
180
|
+
cliOutdated,
|
|
181
|
+
missingSkills,
|
|
182
|
+
staleSkills,
|
|
183
|
+
missingAgents,
|
|
184
|
+
staleAgents,
|
|
185
|
+
deprecatedPresent,
|
|
186
|
+
}, null, 2));
|
|
187
|
+
if (!ok)
|
|
188
|
+
process.exit(1);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
if (ok) {
|
|
192
|
+
(0, output_1.printSuccess)(`최신 상태입니다. (CLI ${cliVersion}, 스킬 ${listBundledSkills().length}개 + 에이전트 ${listBundledAgents().length}개 모두 최신)`);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
(0, output_1.printError)(`구버전이 감지되었습니다. npm 최신 버전: ${latest}`);
|
|
196
|
+
if (cliOutdated) {
|
|
197
|
+
(0, output_1.printWarning)(`• CLI 구버전 (현재 ${cliVersion} → 최신 ${latest})`);
|
|
198
|
+
(0, output_1.printInfo)(' → npm install -g @decencia/ch-cli@latest');
|
|
199
|
+
}
|
|
200
|
+
if (missingSkills.length > 0) {
|
|
201
|
+
(0, output_1.printWarning)(`• 미설치 스킬 ${missingSkills.length}개: ${missingSkills.join(', ')}`);
|
|
202
|
+
}
|
|
203
|
+
if (staleSkills.length > 0) {
|
|
204
|
+
(0, output_1.printWarning)(`• 구버전 스킬 ${staleSkills.length}개: ` +
|
|
205
|
+
staleSkills.map((s) => `${s.name}(${s.version || '없음'})`).join(', '));
|
|
206
|
+
}
|
|
207
|
+
if (missingAgents.length > 0) {
|
|
208
|
+
(0, output_1.printWarning)(`• 미설치 에이전트 ${missingAgents.length}개: ${missingAgents.join(', ')}`);
|
|
209
|
+
}
|
|
210
|
+
if (staleAgents.length > 0) {
|
|
211
|
+
(0, output_1.printWarning)(`• 구버전 에이전트 ${staleAgents.length}개: ` +
|
|
212
|
+
staleAgents.map((s) => `${s.name}(${s.version || '없음'})`).join(', '));
|
|
213
|
+
}
|
|
214
|
+
if (deprecatedPresent.length > 0) {
|
|
215
|
+
(0, output_1.printWarning)(`• 폐기된 v1 스킬 잔존 ${deprecatedPresent.length}개: ${deprecatedPresent.join(', ')}`);
|
|
216
|
+
}
|
|
217
|
+
if (missingSkills.length > 0 ||
|
|
218
|
+
staleSkills.length > 0 ||
|
|
219
|
+
missingAgents.length > 0 ||
|
|
220
|
+
staleAgents.length > 0 ||
|
|
221
|
+
deprecatedPresent.length > 0) {
|
|
222
|
+
(0, output_1.printInfo)(' → (CLI 최신화 후) ch setup-skill');
|
|
223
|
+
}
|
|
224
|
+
process.exit(1);
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoFA,oDAiJC;AApOD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,iDAAyC;AACzC,sCAA8E;AAC9E,8CAAkD;AAElD,MAAM,QAAQ,GAAG,kBAAkB,CAAC;AAEpC,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAC3E,CAAC;QACF,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,mFAAmF;AACnF,SAAS,kBAAkB;IACzB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,wBAAQ,EAAC,YAAY,QAAQ,UAAU,EAAE;YACnD,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,SAAS,iBAAiB;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,OAAO,EAAE;SACN,WAAW,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAC1C,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAC7E;SACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,6EAA6E;AAC7E,SAAS,iBAAiB;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,OAAO,EAAE;SACN,WAAW,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAC1C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SACnD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAY;IAC3C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK;gBAAE,MAAM;YACrC,MAAM,CAAC,GAAG,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACjD,IAAI,CAAC;gBAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mDAAmD;AACnD,SAAS,SAAS,CAAC,CAAS,EAAE,CAAS;IACrC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAgB,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC;QAC1C,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;QAEpC,qEAAqE;QACrE,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,EAC/D,IAAI,EACJ,CAAC,CACF,CACF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,IAAA,qBAAY,EACV,mDAAmD,CACpD,CAAC;gBACF,IAAA,kBAAS,EAAC,WAAW,UAAU,EAAE,CAAC,CAAC;YACrC,CAAC;YACD,OAAO,CAAC,SAAS;QACnB,CAAC;QAED,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QAEtD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChE,MAAM,aAAa,GAAa,EAAE,CAAC;QACnC,MAAM,WAAW,GAA+C,EAAE,CAAC;QAEnE,KAAK,MAAM,IAAI,IAAI,iBAAiB,EAAE,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;YAC1D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzB,SAAS;YACX,CAAC;YACD,MAAM,CAAC,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;YAC7C,IAAI,CAAC,KAAK,IAAI,IAAI,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3C,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAED,wEAAwE;QACxE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChE,MAAM,aAAa,GAAa,EAAE,CAAC;QACnC,MAAM,WAAW,GAA+C,EAAE,CAAC;QAEnE,KAAK,MAAM,IAAI,IAAI,iBAAiB,EAAE,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;YACtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzB,SAAS;YACX,CAAC;YACD,MAAM,CAAC,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;YAC7C,IAAI,CAAC,KAAK,IAAI,IAAI,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3C,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAED,uEAAuE;QACvE,MAAM,iBAAiB,GAAG,8BAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAC1D,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CACvD,CAAC;QAEF,MAAM,EAAE,GACN,CAAC,WAAW;YACZ,aAAa,CAAC,MAAM,KAAK,CAAC;YAC1B,WAAW,CAAC,MAAM,KAAK,CAAC;YACxB,aAAa,CAAC,MAAM,KAAK,CAAC;YAC1B,WAAW,CAAC,MAAM,KAAK,CAAC;YACxB,iBAAiB,CAAC,MAAM,KAAK,CAAC,CAAC;QAEjC,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;gBACE,EAAE;gBACF,SAAS,EAAE,IAAI;gBACf,UAAU;gBACV,aAAa,EAAE,MAAM;gBACrB,WAAW;gBACX,aAAa;gBACb,WAAW;gBACX,aAAa;gBACb,WAAW;gBACX,iBAAiB;aAClB,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;YACF,IAAI,CAAC,EAAE;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,OAAO;QACT,CAAC;QAED,IAAI,EAAE,EAAE,CAAC;YACP,IAAA,qBAAY,EACV,kBAAkB,UAAU,QAAQ,iBAAiB,EAAE,CAAC,MAAM,YAAY,iBAAiB,EAAE,CAAC,MAAM,UAAU,CAC/G,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAA,mBAAU,EAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC;QACjD,IAAI,WAAW,EAAE,CAAC;YAChB,IAAA,qBAAY,EAAC,iBAAiB,UAAU,SAAS,MAAM,GAAG,CAAC,CAAC;YAC5D,IAAA,kBAAS,EAAC,4CAA4C,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,IAAA,qBAAY,EAAC,YAAY,aAAa,CAAC,MAAM,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAA,qBAAY,EACV,YAAY,WAAW,CAAC,MAAM,KAAK;gBACjC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACvE,CAAC;QACJ,CAAC;QACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,IAAA,qBAAY,EAAC,cAAc,aAAa,CAAC,MAAM,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAA,qBAAY,EACV,cAAc,WAAW,CAAC,MAAM,KAAK;gBACnC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACvE,CAAC;QACJ,CAAC;QACD,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,IAAA,qBAAY,EACV,kBAAkB,iBAAiB,CAAC,MAAM,MAAM,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC/E,CAAC;QACJ,CAAC;QACD,IACE,aAAa,CAAC,MAAM,GAAG,CAAC;YACxB,WAAW,CAAC,MAAM,GAAG,CAAC;YACtB,aAAa,CAAC,MAAM,GAAG,CAAC;YACxB,WAAW,CAAC,MAAM,GAAG,CAAC;YACtB,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAC5B,CAAC;YACD,IAAA,kBAAS,EAAC,gCAAgC,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-skill.d.ts","sourceRoot":"","sources":["../../src/commands/setup-skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"setup-skill.d.ts","sourceRoot":"","sources":["../../src/commands/setup-skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8FhE"}
|
|
@@ -38,24 +38,87 @@ const fs = __importStar(require("fs"));
|
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
39
|
const os = __importStar(require("os"));
|
|
40
40
|
const output_1 = require("../output");
|
|
41
|
+
const skill_meta_1 = require("../skill-meta");
|
|
41
42
|
function registerSetupSkillCommand(program) {
|
|
42
43
|
program
|
|
43
44
|
.command('setup-skill')
|
|
44
|
-
.description('Claude Code
|
|
45
|
+
.description('소통채널 Claude Code 스킬·에이전트 전체를 ~/.claude/에 설치/갱신')
|
|
45
46
|
.action(() => {
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
const
|
|
47
|
+
// dist/commands/setup-skill.js -> ../../skill, ../../agent (package root)
|
|
48
|
+
const skillRoot = path.join(__dirname, '..', '..', 'skill');
|
|
49
|
+
const agentRoot = path.join(__dirname, '..', '..', 'agent');
|
|
50
|
+
const destRoot = path.join(os.homedir(), '.claude', 'skills');
|
|
51
|
+
const agentDestRoot = path.join(os.homedir(), '.claude', 'agents');
|
|
49
52
|
try {
|
|
50
|
-
if (!fs.existsSync(
|
|
51
|
-
(0, output_1.printError)(`패키지 내
|
|
53
|
+
if (!fs.existsSync(skillRoot)) {
|
|
54
|
+
(0, output_1.printError)(`패키지 내 skill 디렉토리를 찾을 수 없습니다: ${skillRoot}`);
|
|
52
55
|
return;
|
|
53
56
|
}
|
|
54
|
-
|
|
55
|
-
|
|
57
|
+
const dirs = fs
|
|
58
|
+
.readdirSync(skillRoot, { withFileTypes: true })
|
|
59
|
+
.filter((e) => e.isDirectory());
|
|
60
|
+
if (dirs.length === 0) {
|
|
61
|
+
(0, output_1.printError)(`설치할 스킬이 없습니다: ${skillRoot}`);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const installed = [];
|
|
65
|
+
for (const dir of dirs) {
|
|
66
|
+
const src = path.join(skillRoot, dir.name, 'SKILL.md');
|
|
67
|
+
if (!fs.existsSync(src))
|
|
68
|
+
continue;
|
|
69
|
+
const destDir = path.join(destRoot, dir.name);
|
|
70
|
+
if (!fs.existsSync(destDir)) {
|
|
71
|
+
fs.mkdirSync(destDir, { recursive: true });
|
|
72
|
+
}
|
|
73
|
+
fs.copyFileSync(src, path.join(destDir, 'SKILL.md'));
|
|
74
|
+
installed.push(dir.name);
|
|
75
|
+
}
|
|
76
|
+
(0, output_1.printSuccess)(`Claude Code 스킬 ${installed.length}개를 설치/갱신했습니다 → ~/.claude/skills/`);
|
|
77
|
+
for (const name of installed) {
|
|
78
|
+
(0, output_1.printInfo)(` • ${name}`);
|
|
79
|
+
}
|
|
80
|
+
// Autonomous agents are flat agent/<name>.md files → ~/.claude/agents/<name>.md.
|
|
81
|
+
// They power the issue-coder / pr-merger / terraformer workers the
|
|
82
|
+
// orchestrator delegates to, so they must ship alongside the skills.
|
|
83
|
+
const installedAgents = [];
|
|
84
|
+
if (fs.existsSync(agentRoot)) {
|
|
85
|
+
const agentFiles = fs
|
|
86
|
+
.readdirSync(agentRoot, { withFileTypes: true })
|
|
87
|
+
.filter((e) => e.isFile() && e.name.endsWith('.md'));
|
|
88
|
+
if (agentFiles.length > 0) {
|
|
89
|
+
if (!fs.existsSync(agentDestRoot)) {
|
|
90
|
+
fs.mkdirSync(agentDestRoot, { recursive: true });
|
|
91
|
+
}
|
|
92
|
+
for (const file of agentFiles) {
|
|
93
|
+
fs.copyFileSync(path.join(agentRoot, file.name), path.join(agentDestRoot, file.name));
|
|
94
|
+
installedAgents.push(file.name.replace(/\.md$/, ''));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (installedAgents.length > 0) {
|
|
99
|
+
(0, output_1.printSuccess)(`Claude Code 에이전트 ${installedAgents.length}개를 설치/갱신했습니다 → ~/.claude/agents/`);
|
|
100
|
+
for (const name of installedAgents) {
|
|
101
|
+
(0, output_1.printInfo)(` • ${name}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Remove superseded v1 skills so agents never load a stale version.
|
|
105
|
+
const installedSet = new Set(installed);
|
|
106
|
+
const removed = [];
|
|
107
|
+
for (const name of skill_meta_1.DEPRECATED_SKILLS) {
|
|
108
|
+
if (installedSet.has(name))
|
|
109
|
+
continue; // never remove something we just installed
|
|
110
|
+
const dir = path.join(destRoot, name);
|
|
111
|
+
if (fs.existsSync(dir)) {
|
|
112
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
113
|
+
removed.push(name);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (removed.length > 0) {
|
|
117
|
+
(0, output_1.printWarning)(`구버전(deprecated) 스킬 ${removed.length}개를 제거했습니다:`);
|
|
118
|
+
for (const name of removed) {
|
|
119
|
+
(0, output_1.printInfo)(` - ${name}`);
|
|
120
|
+
}
|
|
56
121
|
}
|
|
57
|
-
fs.copyFileSync(srcPath, destPath);
|
|
58
|
-
(0, output_1.printSuccess)(`Claude Code 스킬이 설치되었습니다: ~/.claude/skills/2t-decencia-channel-cli/SKILL.md`);
|
|
59
122
|
}
|
|
60
123
|
catch (err) {
|
|
61
124
|
(0, output_1.printError)(`스킬 설치 중 오류가 발생했습니다: ${err.message}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-skill.js","sourceRoot":"","sources":["../../src/commands/setup-skill.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"setup-skill.js","sourceRoot":"","sources":["../../src/commands/setup-skill.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,8DA8FC;AApGD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,sCAA8E;AAC9E,8CAAkD;AAElD,SAAgB,yBAAyB,CAAC,OAAgB;IACxD,OAAO;SACJ,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,GAAG,EAAE;QACX,0EAA0E;QAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEnE,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9B,IAAA,mBAAU,EAAC,gCAAgC,SAAS,EAAE,CAAC,CAAC;gBACxD,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE;iBACZ,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;iBAC/C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YAElC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,IAAA,mBAAU,EAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC;gBACzC,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAa,EAAE,CAAC;YAC/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7C,CAAC;gBACD,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;gBACrD,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;YAED,IAAA,qBAAY,EAAC,kBAAkB,SAAS,CAAC,MAAM,kCAAkC,CAAC,CAAC;YACnF,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,IAAA,kBAAS,EAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAC3B,CAAC;YAED,iFAAiF;YACjF,mEAAmE;YACnE,qEAAqE;YACrE,MAAM,eAAe,GAAa,EAAE,CAAC;YACrC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,MAAM,UAAU,GAAG,EAAE;qBAClB,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;qBAC/C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;gBACvD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;wBAClC,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBACnD,CAAC;oBACD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;wBAC9B,EAAE,CAAC,YAAY,CACb,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,EAC/B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CACpC,CAAC;wBACF,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;oBACvD,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,IAAA,qBAAY,EACV,oBAAoB,eAAe,CAAC,MAAM,kCAAkC,CAC7E,CAAC;gBACF,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;oBACnC,IAAA,kBAAS,EAAC,OAAO,IAAI,EAAE,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;YAED,oEAAoE;YACpE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;YACxC,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,KAAK,MAAM,IAAI,IAAI,8BAAiB,EAAE,CAAC;gBACrC,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,SAAS,CAAC,2CAA2C;gBACjF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACtC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvB,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;oBACjD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,IAAA,qBAAY,EAAC,sBAAsB,OAAO,CAAC,MAAM,YAAY,CAAC,CAAC;gBAC/D,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;oBAC3B,IAAA,kBAAS,EAAC,OAAO,IAAI,EAAE,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAA,mBAAU,EAAC,uBAAuB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -54,6 +54,7 @@ const backup_1 = require("./commands/backup");
|
|
|
54
54
|
const notifications_1 = require("./commands/notifications");
|
|
55
55
|
const dashboard_1 = require("./commands/dashboard");
|
|
56
56
|
const setup_skill_1 = require("./commands/setup-skill");
|
|
57
|
+
const check_1 = require("./commands/check");
|
|
57
58
|
// Read version from package.json
|
|
58
59
|
function getVersion() {
|
|
59
60
|
try {
|
|
@@ -95,6 +96,7 @@ program
|
|
|
95
96
|
(0, notifications_1.registerNotificationsCommand)(program);
|
|
96
97
|
(0, dashboard_1.registerDashboardCommand)(program);
|
|
97
98
|
(0, setup_skill_1.registerSetupSkillCommand)(program);
|
|
99
|
+
(0, check_1.registerCheckCommand)(program);
|
|
98
100
|
// Parse and execute
|
|
99
101
|
program.parseAsync(process.argv).catch((err) => {
|
|
100
102
|
console.error(err);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,yCAAoC;AACpC,2CAA6B;AAC7B,uCAAyB;AAEzB,0CAAsD;AACtD,0CAAsD;AACtD,kDAA8D;AAC9D,4CAAwD;AACxD,gDAA4D;AAC5D,wCAAoD;AACpD,wCAAoD;AACpD,kDAA8D;AAC9D,gDAA4D;AAC5D,sDAAiE;AACjE,wCAAoD;AACpD,oDAA+D;AAC/D,oDAA+D;AAC/D,8CAA0D;AAE1D,4DAAwE;AACxE,oDAAgE;AAChE,wDAAmE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,yCAAoC;AACpC,2CAA6B;AAC7B,uCAAyB;AAEzB,0CAAsD;AACtD,0CAAsD;AACtD,kDAA8D;AAC9D,4CAAwD;AACxD,gDAA4D;AAC5D,wCAAoD;AACpD,wCAAoD;AACpD,kDAA8D;AAC9D,gDAA4D;AAC5D,sDAAiE;AACjE,wCAAoD;AACpD,oDAA+D;AAC/D,oDAA+D;AAC/D,8CAA0D;AAE1D,4DAAwE;AACxE,oDAAgE;AAChE,wDAAmE;AACnE,4CAAwD;AAExD,iCAAiC;AACjC,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,oCAAoC,CAAC;KACjD,OAAO,CAAC,UAAU,EAAE,EAAE,eAAe,EAAE,OAAO,CAAC;KAC/C,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC;KAChC,MAAM,CAAC,SAAS,EAAE,mBAAmB,CAAC;KACtC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC;KAC9B,MAAM,CAAC,uBAAuB,EAAE,eAAe,CAAC;KAChD,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC;KAC/B,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC;KACnC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AAEtC,+BAA+B;AAC/B,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;AAC7B,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;AAC7B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;AACjC,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,gCAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;AAC5B,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;AAC5B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;AACjC,IAAA,gCAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,qCAAwB,EAAC,OAAO,CAAC,CAAC;AAClC,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;AAC5B,IAAA,mCAAuB,EAAC,OAAO,CAAC,CAAC;AACjC,IAAA,mCAAuB,EAAC,OAAO,CAAC,CAAC;AACjC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;AAE/B,IAAA,4CAA4B,EAAC,OAAO,CAAC,CAAC;AACtC,IAAA,oCAAwB,EAAC,OAAO,CAAC,CAAC;AAClC,IAAA,uCAAyB,EAAC,OAAO,CAAC,CAAC;AACnC,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;AAE9B,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-meta.d.ts","sourceRoot":"","sources":["../src/skill-meta.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAOrC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEPRECATED_SKILLS = void 0;
|
|
4
|
+
// Skills that were superseded by their *-v2 counterparts. They are NOT bundled
|
|
5
|
+
// with the package; setup-skill removes them and check flags them if present,
|
|
6
|
+
// so agents never load a stale v1 skill.
|
|
7
|
+
exports.DEPRECATED_SKILLS = [
|
|
8
|
+
'2t-decencia-channel-cli',
|
|
9
|
+
'2t-decencia-channel-db-schema',
|
|
10
|
+
'2t-decencia-channel-prd',
|
|
11
|
+
'2t-decencia-channel-spec',
|
|
12
|
+
'2t-decencia-channel-sprint-builder',
|
|
13
|
+
'2t-decencia-channel-sqa',
|
|
14
|
+
];
|
|
15
|
+
//# sourceMappingURL=skill-meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-meta.js","sourceRoot":"","sources":["../src/skill-meta.ts"],"names":[],"mappings":";;;AAAA,+EAA+E;AAC/E,8EAA8E;AAC9E,yCAAyC;AAC5B,QAAA,iBAAiB,GAAa;IACzC,yBAAyB;IACzB,+BAA+B;IAC/B,yBAAyB;IACzB,0BAA0B;IAC1B,oCAAoC;IACpC,yBAAyB;CAC1B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@decencia/ch-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"description": "Decencia Communication Channel CLI",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -8,12 +8,14 @@
|
|
|
8
8
|
},
|
|
9
9
|
"files": [
|
|
10
10
|
"dist/",
|
|
11
|
-
"skill/"
|
|
11
|
+
"skill/",
|
|
12
|
+
"agent/"
|
|
12
13
|
],
|
|
13
14
|
"scripts": {
|
|
14
|
-
"build": "tsc",
|
|
15
|
+
"build": "node scripts/sync-skill-version.js && tsc",
|
|
15
16
|
"dev": "tsc --watch",
|
|
16
17
|
"start": "node dist/index.js",
|
|
18
|
+
"sync-skill-version": "node scripts/sync-skill-version.js",
|
|
17
19
|
"prepublishOnly": "npm run build"
|
|
18
20
|
},
|
|
19
21
|
"keywords": [
|