@decencia/ch-cli 1.3.4 → 1.4.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.
Files changed (38) hide show
  1. package/dist/commands/backup.d.ts +6 -0
  2. package/dist/commands/backup.d.ts.map +1 -0
  3. package/dist/commands/backup.js +200 -0
  4. package/dist/commands/backup.js.map +1 -0
  5. package/dist/commands/check.d.ts +3 -0
  6. package/dist/commands/check.d.ts.map +1 -0
  7. package/dist/commands/check.js +189 -0
  8. package/dist/commands/check.js.map +1 -0
  9. package/dist/commands/setup-skill.d.ts.map +1 -1
  10. package/dist/commands/setup-skill.js +47 -10
  11. package/dist/commands/setup-skill.js.map +1 -1
  12. package/dist/commands/specs.d.ts.map +1 -1
  13. package/dist/commands/specs.js +3 -0
  14. package/dist/commands/specs.js.map +1 -1
  15. package/dist/index.js +4 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/skill-meta.d.ts +2 -0
  18. package/dist/skill-meta.d.ts.map +1 -0
  19. package/dist/skill-meta.js +15 -0
  20. package/dist/skill-meta.js.map +1 -0
  21. package/package.json +3 -2
  22. package/skill/2t-decencia-channel-change-manager/SKILL.md +73 -0
  23. package/skill/2t-decencia-channel-change-propagation-v2/SKILL.md +401 -0
  24. package/skill/2t-decencia-channel-cli-v2/SKILL.md +194 -0
  25. package/skill/2t-decencia-channel-db-schema-v2/SKILL.md +313 -0
  26. package/skill/2t-decencia-channel-github-issue/SKILL.md +116 -0
  27. package/skill/2t-decencia-channel-orchestrator/SKILL.md +64 -0
  28. package/skill/2t-decencia-channel-prd-v2/SKILL.md +73 -0
  29. package/skill/2t-decencia-channel-project-bootstrap/SKILL.md +68 -0
  30. package/skill/2t-decencia-channel-spec-v2/SKILL.md +463 -0
  31. package/skill/2t-decencia-channel-sprint-builder-v2/SKILL.md +77 -0
  32. package/skill/2t-decencia-channel-sqa-v2/SKILL.md +422 -0
  33. package/skill/2t-decencia-channel-work-status-v2/SKILL.md +189 -0
  34. package/dist/commands/invitations.d.ts +0 -3
  35. package/dist/commands/invitations.d.ts.map +0 -1
  36. package/dist/commands/invitations.js +0 -48
  37. package/dist/commands/invitations.js.map +0 -1
  38. package/skill/SKILL.md +0 -500
@@ -0,0 +1,189 @@
1
+ ---
2
+ name: 2t-decencia-channel-work-status-v2
3
+ description: |
4
+ [2t][v2] 소통채널 spec.workStatus(작업 현황) 작성/갱신 가이드.
5
+ spec 작성 시점이 아니라 **개발 진행 중에 누적 갱신**되는 작업 일지 전용.
6
+ Use when:
7
+ (1) spec 개발 진행 중 일지·블로커·의사결정을 기록할 때,
8
+ (2) "작업 현황 적어줘", "workStatus 갱신해줘" 요청 시,
9
+ (3) Sprint 종료 회고나 인수인계용으로 spec별 진행 상태를 정리할 때,
10
+ (4) `ch specs update --work-status` 또는 웹 "작업 현황" 탭에서 갱신할 때.
11
+ version: 1.4.0
12
+ ---
13
+
14
+ <!-- ch-version-gate -->
15
+ ## ⚠️ 시작 전 필수 — 버전 게이트 (생략 금지)
16
+
17
+ 이 스킬로 **어떤 작업이든 수행하기 전에 가장 먼저** 아래를 실행한다:
18
+
19
+ ```bash
20
+ ch check
21
+ ```
22
+
23
+ - exit code 0(통과)이 **아니면 즉시 중단**한다. 출력에 안내된 업데이트 명령(`npm install -g @decencia/ch-cli@latest` 또는 `ch setup-skill`)을 사용자에게 전달하고, 갱신이 끝나기 전까지 **이 스킬의 어떤 단계도 진행하지 않는다.**
24
+ - `ch`가 미설치/미인증이어도 먼저 `ch check`를 시도한다. (네트워크 불가 시 ch check는 통과시키되 경고를 남긴다.)
25
+
26
+ 구버전 스킬·CLI 사용을 막기 위한 게이트다. 건너뛰지 말 것.
27
+
28
+
29
+ # spec.workStatus — 작업 일지
30
+
31
+ `spec.workStatus`는 spec 자체를 작성하는 시점이 아니라, **그 spec을 실제로 개발하면서 누적되는 일지**다. 그래서 spec 작성 스킬과는 라이프사이클이 분리되어 있다.
32
+
33
+ ---
34
+
35
+ ## 0. Read-before-Write (BLOCKING)
36
+
37
+ 기존 일지를 통째로 날리지 않도록 항상 기존 본문을 먼저 받아서 그 위에 append/edit 한다.
38
+
39
+ ```bash
40
+ ch specs get <specId> --json | jq -r '.workStatus // ""' > /tmp/status.md
41
+ # /tmp/status.md를 열어 새 엔트리 추가 (윗부분 또는 아랫부분)
42
+ ch specs update <specId> --work-status /tmp/status.md --no-version
43
+ ```
44
+
45
+ `--work-status`는 **본문 통째 교체**. 기존 내용이 있는 상태에서 짧은 새 파일만 보내면 옛 일지가 날아간다.
46
+
47
+ ---
48
+
49
+ ## 1. 언제 갱신하는가
50
+
51
+ | 시점 | 내용 예시 |
52
+ |---|---|
53
+ | **개발 착수일** | `D-0: 설계 완료, Firebase Auth v9 채택` |
54
+ | **하루 작업 종료 시** | `D-3: 로그인 폼 구현 완료. 다음: 잠금 로직` |
55
+ | **블로커 발생 시** | `[BLOCK] Figma 노드 12345:67890 미확정 — 디자이너 대기` |
56
+ | **의사결정 시** | `[DECISION] RC4 호환성 문제로 SDK v8 유지` |
57
+ | **외부 의존이 풀린 시점** | `[UNBLOCK] D-5 Figma 확정, 진행 재개` |
58
+ | **Sprint 회고 시** | `[RETRO] 잠금 로직은 별도 spec으로 분리 결정` |
59
+
60
+ spec 작성 시점에는 비어 있는 게 정상. workStatus는 "방금 만든 명세"가 아니라 "진행 중인 작업"에 붙는다.
61
+
62
+ ---
63
+
64
+ ## 2. 권장 포맷 — D-N 일지 + 태그
65
+
66
+ ```markdown
67
+ ## 2026-06-01 ~ 2026-06-14 (Sprint 1)
68
+
69
+ ### D-0 (06-01)
70
+ - 설계 완료, Firebase Auth v9 채택
71
+ - 의존: spec [회원가입] 의 users 테이블 스키마 확정 필요
72
+
73
+ ### D-2 (06-03)
74
+ - 로그인 폼 UI 구현 완료 (Task: 491be2f9)
75
+ - React Hook Form + Yup
76
+ - [DECISION] 비밀번호 표시 토글은 input 우측 아이콘으로
77
+
78
+ ### D-3 (06-04)
79
+ - [BLOCK] Firebase Auth rate limit 응답이 spec에 없음 — Sprint 계획 시 누락
80
+ - 임시: 클라이언트 throttle로 우회. 영구 해결은 별도 spec [인증 rate limit] 분리
81
+
82
+ ### D-5 (06-06)
83
+ - [UNBLOCK] PM이 [인증 rate limit] spec 추가, 다음 sprint 배정
84
+ - 잠금 로직(5회 실패 → 1시간) 구현 진행
85
+
86
+ ## 참고 링크
87
+ - PR: github.com/.../pull/123
88
+ - Figma: figma.com/file/.../?node-id=12345:67890
89
+ - 관련 spec: [인증 rate limit] (id: xxx)
90
+ ```
91
+
92
+ 권장 태그:
93
+ - `[DECISION]` 의사결정 로그
94
+ - `[BLOCK]` 외부 의존으로 멈춤
95
+ - `[UNBLOCK]` 의존 해소
96
+ - `[RETRO]` Sprint 회고 메모
97
+ - `[NOTE]` 일반 메모
98
+
99
+ ---
100
+
101
+ ## 3. 무엇을 적고, 무엇을 적지 않는가
102
+
103
+ ### 적어야 할 것
104
+ - 개발 진척 일자별 메모
105
+ - 블로커와 그 우회/해소 기록
106
+ - 설계 변경 이유 (왜 v9가 아니라 v8을 썼는지)
107
+ - 외부 의존 (디자이너 컨펌, 다른 spec, 인프라 상태)
108
+ - 참고 링크 (PR, 이슈, Figma, 회의록)
109
+
110
+ ### 적지 말 것
111
+ | 잘못된 위치 | 진짜 위치 |
112
+ |---|---|
113
+ | AC/완료 보고 ("로그인 통과 확인") | SQA 항목 |
114
+ | 작업 정의 ("Firebase Auth 연결할 것") | tasks[].description |
115
+ | 영구 도메인 규칙 ("5회 실패 시 잠금") | logic.businessRules |
116
+ | 화면 인터랙션 ("입력 → 검증") | ui.interactionMap |
117
+ | 컬럼 스펙 | db-tables 문서 |
118
+
119
+ → workStatus는 **시간축 기록**. 시점이 의미를 가지는 것만 적는다. 항구적 규칙은 다른 필드로.
120
+
121
+ ---
122
+
123
+ ## 4. CLI 갱신 절차
124
+
125
+ ### 4-1. 새 엔트리 추가 (가장 흔함)
126
+
127
+ ```bash
128
+ # 1) 기존 본문 가져오기
129
+ ch specs get <specId> --json | jq -r '.workStatus // ""' > /tmp/status.md
130
+
131
+ # 2) /tmp/status.md를 열어 위쪽에 새 D-N 엔트리 append (최신이 위)
132
+ # 또는 사용자 정책에 맞게 아래쪽 append
133
+
134
+ # 3) 갱신
135
+ ch specs update <specId> --work-status /tmp/status.md --no-version
136
+
137
+ # 4) 검증
138
+ ch specs get <specId> --json | jq -r '.workStatus' | head
139
+ ```
140
+
141
+ ### 4-2. 초기화 (잘못 들어간 경우)
142
+
143
+ ```bash
144
+ echo "" > /tmp/empty.md
145
+ ch specs update <specId> --work-status /tmp/empty.md --no-version
146
+ ```
147
+
148
+ 빈 문자열 저장 시 서버가 필드 자체를 제거하고, 웹 UI에는 "(클릭해서 작업 현황 작성)" placeholder로 표시된다.
149
+
150
+ ### 4-3. 여러 spec 일괄 갱신은 권장하지 않음
151
+
152
+ workStatus는 spec마다 컨텍스트가 다르므로 한 줄짜리 일괄 갱신보다 spec별 수동 갱신을 권장.
153
+
154
+ ---
155
+
156
+ ## 5. 웹 UI 갱신 절차
157
+
158
+ 1. 해당 spec 상세 진입
159
+ 2. 하단 탭 → **작업 현황** 클릭
160
+ 3. 본문 영역 클릭 → 마크다운 textarea 열림
161
+ 4. 새 D-N 엔트리 추가 (CLI와 동일 포맷)
162
+ 5. **저장** 버튼 (또는 Esc 취소)
163
+
164
+ 웹 UI에서도 통째 교체이므로 기존 내용을 지운 채로 짧은 새 글만 쓰지 않도록 주의.
165
+
166
+ ---
167
+
168
+ ## 6. 다른 필드와의 분담
169
+
170
+ | 필드 | 라이프사이클 | 작성자 |
171
+ |---|---|---|
172
+ | `tasks[]` | spec 작성 시 정의, 개발 중 토글 | 작성자(설계) + 개발자(체크박스/모달) |
173
+ | `tasks[].description` | spec 작성 시 정의 | 작성자 |
174
+ | `ui` / `logic` / `dbTableRefs` | spec 작성 시 정의 | 작성자 |
175
+ | **`workStatus`** | **개발 진행 중 누적** | **개발자(자기 자신)** |
176
+ | SQA 항목 | 개발 완료 시점 검증 | QA |
177
+ | `status` | SQA 통과 후 변경 | 작성자/리더 |
178
+
179
+ → workStatus는 **개발자가 자기 자신을 위한 메모**로 시작해, sprint 회고/인수인계용 자산이 된다.
180
+
181
+ ---
182
+
183
+ ## 7. 흔한 함정
184
+
185
+ - `--work-status` 통째 교체 — 기존 본문 보존 안 하면 데이터 손실.
186
+ - workStatus에 SQA 결과를 복붙 → 추적 분산. SQA 결과는 SQA 항목에.
187
+ - workStatus에 영구 규칙(domain rule) 적기 → 다음 사람이 못 찾음. `logic.businessRules`로.
188
+ - spec 작성하면서 미리 workStatus를 채우려고 하지 말 것. 개발 시작 후부터 적는다.
189
+ - 사용자 본인 외 다른 사람이 spec.workStatus를 함부로 덮어쓰지 말 것. 일지의 작성자는 1명이 원칙.
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function registerInvitationsCommand(program: Command): void;
3
- //# sourceMappingURL=invitations.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"invitations.d.ts","sourceRoot":"","sources":["../../src/commands/invitations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyCjE"}
@@ -1,48 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.registerInvitationsCommand = registerInvitationsCommand;
4
- const client_1 = require("../client");
5
- const output_1 = require("../output");
6
- function registerInvitationsCommand(program) {
7
- const invitations = program
8
- .command('invitations')
9
- .description('초대 수락/조회');
10
- // ch invitations info
11
- invitations
12
- .command('info')
13
- .description('초대 토큰 정보 조회')
14
- .requiredOption('--token <token>', '초대 토큰')
15
- .action(async (options) => {
16
- const globalOpts = program.opts();
17
- try {
18
- const client = (0, client_1.createUnauthClient)();
19
- const { data } = await client.get(`/invitations/${options.token}`);
20
- (0, output_1.formatOutput)(data, globalOpts);
21
- }
22
- catch (error) {
23
- // Error already handled
24
- }
25
- });
26
- // ch invitations accept
27
- invitations
28
- .command('accept')
29
- .description('초대 수락')
30
- .requiredOption('--token <token>', '초대 토큰')
31
- .action(async (options) => {
32
- const globalOpts = program.opts();
33
- try {
34
- if (globalOpts.dryRun) {
35
- (0, output_1.printInfo)(`[DRY-RUN] 초대 수락 요청 (토큰: ${options.token.substring(0, 8)}...)`);
36
- return;
37
- }
38
- const client = (0, client_1.createUnauthClient)();
39
- const { data } = await client.post(`/invitations/${options.token}/accept`);
40
- (0, output_1.formatOutput)(data, globalOpts);
41
- (0, output_1.printSuccess)('초대가 수락되었습니다.');
42
- }
43
- catch (error) {
44
- // Error already handled
45
- }
46
- });
47
- }
48
- //# sourceMappingURL=invitations.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"invitations.js","sourceRoot":"","sources":["../../src/commands/invitations.ts"],"names":[],"mappings":";;AAIA,gEAyCC;AA5CD,sCAA+C;AAC/C,sCAAkE;AAElE,SAAgB,0BAA0B,CAAC,OAAgB;IACzD,MAAM,WAAW,GAAG,OAAO;SACxB,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,UAAU,CAAC,CAAC;IAE3B,sBAAsB;IACtB,WAAW;SACR,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,aAAa,CAAC;SAC1B,cAAc,CAAC,iBAAiB,EAAE,OAAO,CAAC;SAC1C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,2BAAkB,GAAE,CAAC;YACpC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YACnE,IAAA,qBAAY,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,wBAAwB;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,wBAAwB;IACxB,WAAW;SACR,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,OAAO,CAAC;SACpB,cAAc,CAAC,iBAAiB,EAAE,OAAO,CAAC;SAC1C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBACtB,IAAA,kBAAS,EAAC,2BAA2B,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;gBAC1E,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,IAAA,2BAAkB,GAAE,CAAC;YACpC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC;YAC3E,IAAA,qBAAY,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC/B,IAAA,qBAAY,EAAC,cAAc,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,wBAAwB;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}