@decencia/ch-cli 1.8.1 → 1.10.1

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.
@@ -2,13 +2,13 @@
2
2
  name: 2t-decencia-channel-cli-v2
3
3
  description: |
4
4
  [2t][v2] 소통채널 CLI(`ch`, npm @decencia/ch-cli) 가이드.
5
- Epic-Story-Task 체계와 db-tables 리소스, --work-status, --id 등 신규 플래그를 망라한다.
5
+ Epic-Story 체계(규모=Story Point)와 db-tables 리소스, --work-status, --id, --points 등 플래그를 망라한다.
6
6
  Use when:
7
7
  (1) spec/db-table을 CLI로 다룰 때,
8
- (2) Task에 description/points/completedAt을 기록할 때,
8
+ (2) spec 규모를 Story Point(`--points`)로 매길 때,
9
9
  (3) ch db-tables 명령(list/get/create/update/delete)을 사용할 때,
10
10
  (4) Spec ID를 JIRA 스타일(`LOGIN-001`)로 직접 지정할 때 (`ch specs create --id`).
11
- version: 1.8.1
11
+ version: 1.10.1
12
12
  ---
13
13
 
14
14
  <!-- ch-version-gate -->
@@ -30,12 +30,12 @@ ch check
30
30
 
31
31
  ## 0. Read-before-Write (BLOCKING)
32
32
 
33
- 문서를 `update`/`set`/`upsert`할 때는 반드시 먼저 해당 문서를 `get`으로 받아 **현재 내용을 확인**한 뒤 수정한다. CLI 플래그는 PATCH 의미라 명시한 필드만 덮어쓰지만, JSON 파일(`--tasks`, `--ui`, `--logic`)은 전체 배열/객체를 통째로 교체하므로 누락 시 데이터 손실 위험.
33
+ 문서를 `update`/`set`/`upsert`할 때는 반드시 먼저 해당 문서를 `get`으로 받아 **현재 내용을 확인**한 뒤 수정한다. CLI 플래그는 PATCH 의미라 명시한 필드만 덮어쓰지만, JSON 파일(`--ui`, `--logic`, 그리고 deprecated `--tasks`)은 전체 배열/객체를 통째로 교체하므로 누락 시 데이터 손실 위험. (`--points`는 스칼라라 그 값만 바뀐다.)
34
34
 
35
35
  ```bash
36
36
  ch specs get <specId> --json > /tmp/before.json # 1) 현재 상태 백업/확인
37
- # 2) JSON 편집 (tasks/ui/logic 등)
38
- ch specs update <specId> --tasks /tmp/tasks.json # 3) 수정 적용
37
+ # 2) JSON 편집 (ui/logic 등)
38
+ ch specs update <specId> --logic /tmp/logic.json # 3) 수정 적용
39
39
  ```
40
40
 
41
41
  ## 1. spec 명령
@@ -47,7 +47,7 @@ ch specs create \
47
47
  --device web,app --domain user --type 인증 --permission 비회원 \
48
48
  --content "이메일/비밀번호 로그인" \
49
49
  --epic 인증 \
50
- --tasks ./tasks.json \
50
+ --points 5 \
51
51
  --ui ./ui.json \
52
52
  --logic ./logic.json \
53
53
  --db-tables tbl_users,tbl_sessions \
@@ -61,13 +61,27 @@ ch specs create --id LOGIN-001 \
61
61
 
62
62
  # 수정: 지정한 플래그만 PATCH. --no-version 시 버전 기록 생략.
63
63
  ch specs update <specId> --epic 인증 --no-version
64
- ch specs update <specId> --tasks ./tasks.json
64
+ ch specs update <specId> --points 8 --no-version
65
65
  ch specs update <specId> --work-status ./status.md
66
66
  ```
67
67
 
68
68
  > `--id`의 자세한 네이밍 규칙·예외·자동 다음 번호 산정 스크립트는 [[2t-decencia-channel-spec-v2]] §1.5 참조.
69
69
 
70
- ### Task JSON (`--tasks`)
70
+ ### Story Point (`--points`)
71
+
72
+ Story(=spec)를 Task로 쪼개지 않는다. 규모는 spec 단위 Story Point 한 값으로 매긴다.
73
+
74
+ ```bash
75
+ ch specs create --name "로그인" --device web --domain user --type 인증 --points 5
76
+ ch specs update <specId> --points 8 --no-version
77
+ ```
78
+
79
+ - `--points <n>` — 0 이상의 숫자(보통 피보나치 1/2/3/5/8/13). 진행률(%)·완료율은 없다 — 완료 여부는 `status`로.
80
+ - Sprint 용량 = Σ spec.points ([[2t-decencia-channel-sprint-builder-v2]]). 규모 산정 가이드는 [[2t-decencia-channel-spec-v2]] §3.
81
+
82
+ ### Task JSON (`--tasks`) — [deprecated]
83
+
84
+ `spec.tasks[]`(체크리스트)는 deprecated다. 신규 spec은 `--points`를 쓴다. `--tasks`는 하위호환으로 계속 통과되지만 사용 시 경고가 뜬다. 기존 spec 유지용으로만 참고.
71
85
 
72
86
  ```json
73
87
  [
@@ -75,7 +89,6 @@ ch specs update <specId> --work-status ./status.md
75
89
  "id": "",
76
90
  "title": "로그인 폼 구현",
77
91
  "done": false,
78
- "assignee": "박준하",
79
92
  "points": 5,
80
93
  "description": "## 세부\n- React Hook Form\n- Yup validation"
81
94
  },
@@ -83,17 +96,12 @@ ch specs update <specId> --work-status ./status.md
83
96
  "id": "",
84
97
  "title": "유효성 검증",
85
98
  "done": true,
86
- "points": 2,
87
99
  "completedAt": "2026-05-29T08:00:00.000Z"
88
100
  }
89
101
  ]
90
102
  ```
91
103
 
92
- 서버 자동 처리:
93
- - `id` 비어 있으면 UUID 부여
94
- - `done: true` & `completedAt` 미지정 → 현재 ISO 부여
95
- - `done: false` → `completedAt` 제거
96
- - 전체 progress(%) 자동 재계산
104
+ 서버 자동 처리(하위호환): `id` 비어 있으면 UUID 부여, `done: true` & `completedAt` 미지정 → 현재 ISO 부여, `done: false` → `completedAt` 제거.
97
105
 
98
106
  ### UI JSON (`--ui`)
99
107
 
@@ -109,21 +117,33 @@ ch specs update <specId> --work-status ./status.md
109
117
 
110
118
  ### Logic JSON (`--logic`)
111
119
 
120
+ 신구조 — `dataFlowScenarios`(시나리오 → 순서 있는 단계 → 단계별 refs):
121
+
112
122
  ```json
113
123
  {
114
- "dataFlow": "이메일/비밀번호 → Firebase Auth → ID Token",
115
- "dataFlowRefs": [
116
- { "tableId": "tbl_users", "field": "lastLoginAt", "direction": "WRITE", "note": "로그인 시 갱신" }
124
+ "dataFlowScenarios": [
125
+ {
126
+ "name": "로그인 성공",
127
+ "description": "회원이 이메일과 비밀번호로 로그인에 성공하면 인증 토큰을 발급하고 마지막 로그인 시각을 갱신한다.",
128
+ "steps": [
129
+ { "description": "클라이언트가 입력한 이메일과 비밀번호를 인증 서버로 전송한다." },
130
+ {
131
+ "description": "인증에 성공하면 사용자 문서의 마지막 로그인 시각을 갱신한다.",
132
+ "refs": [
133
+ { "tableId": "tbl_users", "field": "lastLoginAt", "direction": "WRITE", "note": "로그인 성공 시 갱신" }
134
+ ]
135
+ }
136
+ ]
137
+ }
117
138
  ],
118
139
  "stateTransitions": "| 현재 | 입력 | 다음 |\n|---|---|---|\n| idle | submit | loading |",
119
- "businessRules": "- 5회 실패 시 1시간 잠금",
120
- "businessRuleRefs": [
121
- { "tableId": "tbl_users", "field": "lockedUntil" }
122
- ]
140
+ "businessRules": "- 5회 실패 시 1시간 잠금"
123
141
  }
124
142
  ```
125
143
 
126
- `dataFlowRefs` / `businessRuleRefs`는 **db-tables의 tableId(+선택 field)를 가리키는 구조적 참조**다(SSOT — 스키마 정의는 db-tables에만). 서버가 실존 검증: 없는 tableId/컬럼이면 400. `direction`은 `READ|WRITE|READWRITE`. SQA 항목도 동일 취지로 `--db-tables`(쉼표 구분)를 가진다 — [[2t-decencia-channel-sqa-v2]].
144
+ - `dataFlowScenarios[]`=시나리오, 각 시나리오의 `steps[]`=순서 있는 단계, 각 단계의 `refs[]`=**db-tables의 tableId(+선택 field)를 가리키는 구조적 참조**(SSOT — 스키마 정의는 db-tables에만). 서버가 실존 검증: 없는 tableId/컬럼이면 400. `direction`은 `READ|WRITE|READWRITE`.
145
+ - 단계 `description`은 필드명 나열이 아니라 **완결 문장**으로 — [[2t-decencia-channel-spec-v2]] §5.
146
+ - 하위호환: 레거시 `dataFlow`(문자열)/`dataFlowRefs[]`/`businessRuleRefs[]`도 그대로 수용된다(점진 마이그레이션). SQA 항목도 동일 취지로 `--db-tables`(쉼표 구분)를 가진다 — [[2t-decencia-channel-sqa-v2]].
127
147
 
128
148
  ### dbTableRefs (`--db-tables`)
129
149
 
@@ -197,6 +217,7 @@ ch db-tables delete <tableId> # 참조 spec의 dbTableRefs도
197
217
 
198
218
  ## 4. 흔한 함정
199
219
 
200
- - `--tasks` JSON 통째 교체이므로 일부만 수정해도 **전체 배열 전달 필수**. 반드시 `ch specs get`으로 받아 편집.
220
+ - `--ui`/`--logic`(및 deprecated `--tasks`) JSON 통째 교체이므로 일부만 수정해도 **전체 전달 필수**. 반드시 `ch specs get`으로 받아 편집. (`--points`는 스칼라라 안전.)
221
+ - Story를 Task로 쪼개지 않는다 — 규모는 `--points`로 매긴다. `--tasks`는 deprecated(하위호환).
201
222
  - `--db-tables ""`는 모두 해제. 단일 ID 유지하려면 그 ID만 명시.
202
223
  - `relatedSpecIds`를 JSON에 명시해도 서버가 무시 (자동 관리 영역).
@@ -8,7 +8,7 @@ description: |
8
8
  (2) DB 테이블 단위로 컬럼·인덱스·보안규칙을 등록·수정할 때,
9
9
  (3) 새 테이블을 추가하면서 전체 인벤토리도 함께 업데이트할 때,
10
10
  (4) spec.dbTableRefs와 양방향 동기화가 필요한 작업 시.
11
- version: 1.8.1
11
+ version: 1.10.1
12
12
  ---
13
13
 
14
14
  <!-- ch-version-gate -->
@@ -2,7 +2,7 @@
2
2
  name: 2t-decencia-channel-github-issue
3
3
  description: gh CLI로 현재 repo에 GitHub 이슈를 작성한다. 이슈 1개=유형 1개(feat/fix/bug), 표준 본문 양식(작업내용·관련 명세 백링크·완료조건)으로 발행. "이슈 만들어줘"/"깃헙 이슈로 등록해줘" 요청 시, 또는 소통채널 기획·명세 작업 후 처리할 일들을 GitHub 이슈로 옮길 때 사용. 멱등성/중복방지·확인단계는 다루지 않음(요청대로 바로 생성).
4
4
  allowed-tools: Bash(gh:*) Bash(git:*) Read Write
5
- version: 1.8.1
5
+ version: 1.10.1
6
6
  ---
7
7
 
8
8
  <!-- ch-version-gate -->
@@ -2,7 +2,7 @@
2
2
  name: 2t-decencia-channel-orchestrator
3
3
  description: 소통채널 작업의 단일 진입점(디스패처). 사용자 요청을 듣고 7종(bootstrap·terraformer·change-manager·github-issue·issue-coder·pr-merger·sprint-runner) 중 적절한 곳으로 라우팅하고, 필요하면 여러 단계를 순차 오케스트레이션한다. 대화형 스킬은 메인 세션에서 Skill로, 자율 에이전트는 Agent로 위임. "소통채널 작업 해줘"·"이거 어떻게 처리하지?"처럼 무엇부터 할지 모를 때, 또는 신규기획/코드편입/기획변경/이슈/구현/머지/스프린트실행 어디로든 시작할 때.
4
4
  allowed-tools: Skill Agent Read Bash(ch:*) Bash(gh:*) Bash(git:*)
5
- version: 1.8.1
5
+ version: 1.10.1
6
6
  ---
7
7
 
8
8
  <!-- ch-version-gate -->
@@ -2,12 +2,12 @@
2
2
  name: 2t-decencia-channel-prd-v2
3
3
  description: |
4
4
  [2t][v2] 소통채널 PRD 작성/수정 가이드.
5
- Epic-Story-Task 체계와의 연결성에 초점 (PRD의 Epic 절 → spec의 --epic).
5
+ Epic-Story 체계와의 연결성에 초점 (PRD의 Epic 절 → spec의 --epic).
6
6
  Use when:
7
7
  (1) PRD를 작성하거나 갱신할 때,
8
- (2) PRD 구성에서 Epic/스토리/태스크 구조를 후속 spec 작성에 매핑할 때,
8
+ (2) PRD 구성에서 Epic/스토리 구조를 후속 spec 작성에 매핑할 때,
9
9
  (3) Read-before-Write 규칙으로 PRD content를 안전하게 수정해야 할 때.
10
- version: 1.8.1
10
+ version: 1.10.1
11
11
  ---
12
12
 
13
13
  <!-- ch-version-gate -->
@@ -25,15 +25,19 @@ ch check
25
25
  구버전 스킬·CLI 사용을 막기 위한 게이트다. 건너뛰지 말 것.
26
26
 
27
27
 
28
- # PRD — Epic-Story-Task 매핑 가이드
28
+ # PRD — Epic-Story 매핑 가이드
29
29
 
30
- ## 🔒 PRD의 범위 — 기능 관점만 (스키마/구현 금지)
30
+ ## 🔒 PRD의 범위 — 개요만 (상세 설명·스키마·구현 금지)
31
31
 
32
- PRD는 **무엇을 왜 만드는가(기능·가치·범위)**만 다룬다. **데이터 모델·테이블 목록·컬럼·스키마는 PRD 두지 않는다.**
32
+ PRD는 **무엇을 왜 만드는가(기능·가치·범위) 개요**만 다룬다. 상세한 동작 설명·데이터 흐름·예외 처리는 PRD 아니라 **spec**에 둔다.
33
33
 
34
- - DB 스키마의 SSOT는 `db-schema`/`db-tables`다 [[2t-decencia-channel-db-schema-v2]]. PRD 베껴 넣으면 변경 양쪽이 어긋난다.
34
+ - **PRD = 개요, spec = 상세.** PRD에는 Epic/Story가 무엇을 위한 것인지 짧게 적는다. "어떻게 동작하는가"의 구체 서술은 spec(`logic.dataFlowScenarios`·`businessRules`)에 둔다.
35
+ - **데이터 모델·테이블 목록·컬럼·스키마는 PRD에 두지 않는다.** DB 스키마의 SSOT는 `db-schema`/`db-tables`다 — [[2t-decencia-channel-db-schema-v2]]. PRD에 베껴 넣으면 변경 시 양쪽이 어긋난다.
35
36
  - 구현 방식(테이블 구조, 인덱스, 저장 위치 등)을 **암시조차 하지 않는다**. 데이터 요구사항은 "어떤 정보가 필요하다" 수준의 *기능 서술*로만 적고, 정형 모델은 db-schema/spec이 책임진다.
36
- - 독자가 데이터 모델을 보고 싶으면 DB 스키마 문서(웹 "DB 스키마" 탭)로 간다 PRD가 그 사본을 들고 있지 않는다.
37
+ - 같은 설명을 PRD와 spec 양쪽에 적으면 변경 어긋난다. **상세 설명은 spec 곳에만** 둔다.
38
+ - 독자가 동작 상세를 보고 싶으면 spec으로, 데이터 모델을 보고 싶으면 DB 스키마 문서(웹 "DB 스키마" 탭)로 간다 — PRD가 그 사본을 들고 있지 않는다.
39
+
40
+ > spec의 상세 설명은 **완결 문장**으로 쓴다(필드명·단어 나열 금지) — [[2t-decencia-channel-spec-v2]] §5. PRD는 그 상세를 옮겨 적지 않고 한 줄 개요로만 가리킨다.
37
41
 
38
42
  ## 0. Read-before-Write
39
43
 
@@ -45,7 +49,7 @@ ch prd get --json > /tmp/prd.json # 1) 현재 본문 추출
45
49
  ch prd set --content /tmp/prd-edited.md # 2) 통째 교체 (버전 기록됨)
46
50
  ```
47
51
 
48
- ## 1. 권장 목차 (Epic-Story-Task 추적성)
52
+ ## 1. 권장 목차 (Epic-Story 추적성)
49
53
 
50
54
  ```markdown
51
55
  # 프로젝트명 PRD
@@ -2,7 +2,7 @@
2
2
  name: 2t-decencia-channel-project-bootstrap
3
3
  description: 신규 기획을 사용자와 대화하며 step-by-step으로 소통채널 프로젝트로 만드는 오케스트레이터 스킬. (1)대화로 PRD 완성 → 승인 → (2)페이지명세(spec)+DB스키마 → 승인 → (3)SQA 시트. 각 단계 사용자 승인 게이트, 작성 디테일은 기존 2t-decencia-channel-*-v2 스킬을 적극 재사용. "새 기획 만들어줘"·"프로젝트 처음부터 세팅" 류 요청 시.
4
4
  allowed-tools: Bash(ch:*) Bash(git:*) Read Write
5
- version: 1.8.1
5
+ version: 1.10.1
6
6
  ---
7
7
 
8
8
  <!-- ch-version-gate -->
@@ -38,7 +38,7 @@ ch check
38
38
  - **이미 프로젝트가 있으면 생략**: cwd의 `.ch-project`가 있거나 사용자가 기존 프로젝트를 지정하면 그걸 사용.
39
39
  - 없으면 새로 생성:
40
40
  - `ch projects create` 로 생성.
41
- - **schema 설정**(⚠️ 빠지면 웹 UI가 빈 칼럼으로 보임) + **specVersion=2**(Epic-Story-Task).
41
+ - **schema 설정**(⚠️ 빠지면 웹 UI가 빈 칼럼으로 보임) + **specVersion=2**(Epic-Story·Story Point).
42
42
  - cwd에 `.ch-project`(`{"projectId":"..."}`) 기록 → 이후 issue-coder/머저가 사용.
43
43
 
44
44
  ## 1. PRD (대화형)
@@ -48,7 +48,7 @@ ch check
48
48
 
49
49
  ## 2. 페이지명세(spec) + DB 스키마
50
50
  *(PRD 승인 후에만)*
51
- - **페이지명세 = spec**(ui 메타 포함): `2t-decencia-channel-spec-v2`로 PRD의 Epic/Story → spec 작성(ui: route/file/figmaNodeId·logic·dbTableRefs·tasks).
51
+ - **페이지명세 = spec**(ui 메타 포함): `2t-decencia-channel-spec-v2`로 PRD의 Epic/Story → spec 작성(ui: route/file/figmaNodeId·logic·dbTableRefs·points).
52
52
  - **DB 스키마**: `2t-decencia-channel-db-schema-v2`로 db-schema(ERD/정책) + db-tables(컬럼·인덱스·보안규칙). `spec.dbTableRefs` ↔ `dbTable.relatedSpecIds` 양방향.
53
53
  - → **[게이트] 사용자 확인.** OK면 3단계.
54
54