@decencia/ch-cli 1.12.1 → 1.14.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.
@@ -3,7 +3,7 @@ name: 2t-decencia-channel-issue-coder
3
3
  description: GitHub issue 1개를 입력으로 받아 끝까지 처리하는 코딩 에이전트. 이슈 읽기 → 소통채널 spec/SQA 확인 → git worktree+브랜치에서 구현 → 자체 소프트리뷰 루프 → unittest + SQA → PR 생성 → 소통채널 workStatus·이슈 기록. 다수 병렬 실행 전제, PR까지만(머지·base 브랜치 직접 push·이슈 close는 사람).
4
4
  tools: Read, Write, Edit, Grep, Glob, Bash, Agent
5
5
  model: opus
6
- version: 1.12.1
6
+ version: 1.14.0
7
7
  ---
8
8
 
9
9
  ## 역할
@@ -3,7 +3,7 @@ name: 2t-decencia-channel-pr-merger
3
3
  description: issue-coder가 낸 PR을 기본 완전 자율로 base 브랜치(기본 브랜치 또는 sprint 통합 브랜치)에 머지하는 에이전트. 핵심 역량은 다수 병렬 worktree가 만든 충돌을 작업 의도 기반(semantic)으로 해결하는 것. CI green+충돌없음이면 바로 squash 머지, 충돌이면 의도대로 해결 후 테스트로 검증하여 머지. 재SQA·전면 재리뷰는 하지 않음. 다수 PR은 직렬 머지.
4
4
  tools: Read, Write, Edit, Grep, Glob, Bash
5
5
  model: opus
6
- version: 1.12.1
6
+ version: 1.14.0
7
7
  ---
8
8
 
9
9
  ## 역할
@@ -3,7 +3,7 @@ name: 2t-decencia-channel-terraformer
3
3
  description: 소통채널을 쓰지 않던 기존 코드베이스를 역분석하여 소통채널 프로젝트로 편입(terraforming)하는 자율 에이전트. 코드가 single source of truth — 코드를 읽어 DB 스키마 → 기능명세(spec) → PRD를 bottom-up으로 역생성한다(SQA 제외). 대량 분석은 서브에이전트 병렬, 코드로 못 메우는 의도는 [추정]으로 채우고 "사람확인 질문 리스트"를 산출물로 남긴다. PR/머지·이슈 발행은 하지 않음.
4
4
  tools: Read, Write, Edit, Grep, Glob, Bash, Agent
5
5
  model: opus
6
- version: 1.12.1
6
+ version: 1.14.0
7
7
  ---
8
8
 
9
9
  ## 역할
@@ -1 +1 @@
1
- {"version":3,"file":"screens.d.ts","sourceRoot":"","sources":["../../src/commands/screens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqEpC;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAY,GAAG,MAAM,CAOzE;AA0QD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAY7D"}
1
+ {"version":3,"file":"screens.d.ts","sourceRoot":"","sources":["../../src/commands/screens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsEpC;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAY,GAAG,MAAM,CAOzE;AA0QD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAa7D"}
@@ -5,6 +5,7 @@ exports.registerScreensCommand = registerScreensCommand;
5
5
  const client_1 = require("../client");
6
6
  const output_1 = require("../output");
7
7
  const utils_1 = require("../utils");
8
+ const screens_migrate_1 = require("./screens.migrate");
8
9
  /**
9
10
  * ch screens — 화면(Screen) 리소스 관리 명령 (SCREEN-003)
10
11
  *
@@ -327,7 +328,8 @@ function registerScreensCommand(program) {
327
328
  registerScreensCreate(screens, program);
328
329
  registerScreensUpdate(screens, program);
329
330
  registerScreensDelete(screens, program);
330
- // 확장 지점: 서브커맨드는 위와 같은 register…(screens, program) 함수를 만들어
331
- // 여기에 추가한다 (예: `migrate` — SCREEN-006).
331
+ // migrate는 CRUD가 아니라 이관 오케스트레이션(여러 리소스를 순서대로 쓴다)이라
332
+ // 별도 모듈(screens.migrate.ts)에 두고 여기서 줄로 등록한다 — SCREEN-006.
333
+ (0, screens_migrate_1.registerScreensMigrate)(screens, program);
332
334
  }
333
335
  //# sourceMappingURL=screens.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"screens.js","sourceRoot":"","sources":["../../src/commands/screens.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"screens.js","sourceRoot":"","sources":["../../src/commands/screens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * `ch screens migrate` 등록. screens.ts의 register…(screens, program) 규약을 따른다.
4
+ */
5
+ export declare function registerScreensMigrate(screens: Command, program: Command): void;
6
+ //# sourceMappingURL=screens.migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screens.migrate.d.ts","sourceRoot":"","sources":["../../src/commands/screens.migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyOpC;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GACf,IAAI,CAsEN"}
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerScreensMigrate = registerScreensMigrate;
4
+ const client_1 = require("../client");
5
+ const output_1 = require("../output");
6
+ /** 기계 모드(=stdout이 순수 JSON이어야 하는 모드)인지. */
7
+ function isMachineOutput(globalOpts) {
8
+ return !!(globalOpts.json || globalOpts.csv || globalOpts.quiet);
9
+ }
10
+ const MIGRATE_HELP = `
11
+ 하는 일 (서버가 이 순서로 수행한다, 마지막이 플래그):
12
+ 1. spec.ui.route를 씨앗으로 화면을 중복 없이 만든다 (같은 base route = 한 화면)
13
+ 2. 각 명세의 ui.screenRefs에 화면 ID를 더한다 (전용 경로 — 기존 ui 필드는 손대지 않는다)
14
+ 3. 전부 성공하면 ch_projects.screensEnabled를 true로 켠다
15
+
16
+ route 정규화:
17
+ "/projects/[projectId]/specs (PRD 탭)" → base route "/projects/[projectId]/specs"
18
+ "/projects/[projectId]/specs?tab=screens" → base route "/projects/[projectId]/specs"
19
+ 괄호 주석·탭 쿼리는 화면 비고에 "레거시 route 주석"으로 남는다 (나중에 화면 분리 판단 근거).
20
+ route가 없는 명세(배치·API·CLI)는 건너뛰고 사유를 결과에 남긴다.
21
+
22
+ 안전장치:
23
+ --dry-run 계획만 출력하고 서버가 아무것도 쓰지 않는다 (읽기만 한다)
24
+ --rollback screensEnabled를 false로 내려 레거시 모드로 되돌린다 (화면·screenRefs는 지우지 않는다)
25
+ 되돌아갈 route가 없는 명세가 있으면 서버가 거절한다 — 강행하려면 --force
26
+ 재실행해도 같은 base route의 화면을 두 번 만들지 않는다 (멱등)
27
+
28
+ 예시:
29
+ ch screens migrate --dry-run --json # 계획을 기계 모드로 확인
30
+ ch screens migrate # 적용
31
+ ch screens migrate --rollback # 화면 모드만 끄기 (되돌리기)
32
+ `;
33
+ /**
34
+ * 마지막 한 줄 — 무슨 일이 일어났는가.
35
+ *
36
+ * 표 모드에서는 표 뒤에, 기계 모드에서는 stdout(JSON) 대신 stderr에 나간다
37
+ * (printSuccess/printInfo가 기계 모드에서 stderr로 가므로 stdout은 순수 JSON 한 문서로 남는다).
38
+ */
39
+ function printMigrateOutcome(result) {
40
+ const sm = result.summary;
41
+ const flag = result.screensEnabled;
42
+ if (result.dryRun) {
43
+ (0, output_1.printInfo)('[DRY-RUN] 계획만 출력했습니다 — 화면·명세·프로젝트 문서를 하나도 쓰지 않았습니다.');
44
+ return;
45
+ }
46
+ if (result.screens.length === 0) {
47
+ (0, output_1.printInfo)('route를 가진 명세가 없습니다 — 화면을 만들지 않고 screensEnabled도 켜지 않았습니다 (변경 없음).');
48
+ return;
49
+ }
50
+ (0, output_1.printSuccess)(`마이그레이션 완료 — 화면 ${sm.screensToCreate}개 생성, ` +
51
+ `${sm.screensToReuse}개 재사용, 명세 ${sm.specsToLink}건 연결` +
52
+ (flag.changed ? ', screensEnabled=true (화면 모드 켬)' : ''));
53
+ }
54
+ function printRollbackOutcome(result) {
55
+ if (!result.screensEnabled.before) {
56
+ (0, output_1.printInfo)('이미 레거시 모드입니다 (screensEnabled=false) — 변경 없음.');
57
+ return;
58
+ }
59
+ if (result.dryRun) {
60
+ (0, output_1.printInfo)(result.blocked
61
+ ? '[DRY-RUN] 지금 롤백하면 서버가 거절합니다 — 화면 모드를 끄면 위 명세들의 UI 정보가 ' +
62
+ '화면 탭에도 route에도 보이지 않습니다. 그래도 되돌리려면 --force를 붙이세요.'
63
+ : '[DRY-RUN] screensEnabled를 false로 내립니다 (화면 문서·screenRefs는 그대로 둡니다).');
64
+ return;
65
+ }
66
+ (0, output_1.printSuccess)('화면 모드를 껐습니다 (screensEnabled=false). 화면 문서와 명세의 screenRefs는 지우지 않았습니다 — 다시 켜면 그대로 살아납니다.' +
67
+ (result.forced ? ' (--force로 안전장치를 넘겼습니다)' : ''));
68
+ }
69
+ /** 사람용 출력: 계획/결과 표 + 요약. */
70
+ function printMigrateReport(result) {
71
+ const tag = result.dryRun ? '[DRY-RUN] ' : '';
72
+ if (result.screens.length > 0) {
73
+ (0, output_1.printTable)(['route', '동작', 'screenId', '화면명', 'order', '묶인 명세', '연결'], result.screens.map((s) => [
74
+ s.baseRoute,
75
+ s.action === 'create'
76
+ ? result.dryRun
77
+ ? '생성 예정'
78
+ : '생성'
79
+ : '재사용',
80
+ s.screenId ?? '-',
81
+ s.name,
82
+ String(s.order),
83
+ String(s.specIds.length),
84
+ String(s.linkSpecIds.length),
85
+ ]));
86
+ }
87
+ if (result.skipped.length > 0) {
88
+ (0, output_1.printInfo)(`건너뛴 명세 ${result.skipped.length}건 (화면 없는 기능):`);
89
+ (0, output_1.printTable)(['spec', '사유'], result.skipped.map((s) => [s.id, s.reason]));
90
+ }
91
+ const sm = result.summary;
92
+ (0, output_1.printInfo)(`${tag}화면 생성 ${sm.screensToCreate} · 재사용 ${sm.screensToReuse} · ` +
93
+ `명세 연결 ${sm.specsToLink} · 건너뜀 ${sm.specsSkipped}`);
94
+ const flag = result.screensEnabled;
95
+ (0, output_1.printInfo)(`${tag}screensEnabled: ${flag.before} → ${flag.after}` +
96
+ (flag.changed ? '' : ' (변경 없음)'));
97
+ printMigrateOutcome(result);
98
+ }
99
+ /** 사람용 출력: 롤백. */
100
+ function printRollbackReport(result) {
101
+ if (result.blocked && result.unsafeSpecIds.length > 0) {
102
+ (0, output_1.printWarning)(`되돌아갈 route가 없는 명세 ${result.unsafeSpecIds.length}건: ${result.unsafeSpecIds.join(', ')}`);
103
+ }
104
+ printRollbackOutcome(result);
105
+ }
106
+ /**
107
+ * 4xx·5xx 안내 보강. 상태코드별 기본 메시지와 종료코드(≠0)는 client 인터셉터가 이미 처리했다 —
108
+ * 여기서는 이 커맨드에서만 의미 있는 안내를 덧붙인다.
109
+ */
110
+ function explainFailure(error) {
111
+ const status = error.response?.status;
112
+ const data = error.response?.data;
113
+ const message = String(data?.message ?? '');
114
+ // 라우트 자체가 없을 때만 "구버전 ch-api"라고 말한다. 404는 프로젝트를 못 찾았을 때도 나는데,
115
+ // 그걸 배포 문제로 오진하면 사용자를 엉뚱한 곳으로 보낸다 — 이 이슈가 고치는 버그가 바로
116
+ // 그런 오진 메시지였다. Nest는 매칭되는 라우트가 없으면 "Cannot POST /screens/migrate"를 준다.
117
+ if (status === 404 && /Cannot\s+POST/i.test(message)) {
118
+ (0, output_1.printError)('이 ch-api에는 POST /screens/migrate가 없습니다 (구버전). ch-api 배포 후 다시 실행하세요. ' +
119
+ '아무것도 변경되지 않았습니다.');
120
+ return;
121
+ }
122
+ if (status === 409 && Array.isArray(data?.unsafeSpecIds)) {
123
+ (0, output_1.printWarning)(`되돌아갈 route가 없는 명세 ${data.unsafeSpecIds.length}건: ${data.unsafeSpecIds.join(', ')}`);
124
+ (0, output_1.printError)('롤백을 거절했습니다 — 화면 모드를 끄면 이 명세들의 UI 정보가 화면 탭에도 route에도 보이지 않습니다. ' +
125
+ '아무것도 쓰지 않았습니다 (screensEnabled는 그대로 true). 그래도 되돌리려면 --force를 붙이세요.');
126
+ }
127
+ }
128
+ /**
129
+ * `ch screens migrate` 등록. screens.ts의 register…(screens, program) 규약을 따른다.
130
+ */
131
+ function registerScreensMigrate(screens, program) {
132
+ screens
133
+ .command('migrate')
134
+ .description('레거시 프로젝트를 화면 모델로 이관 — spec.ui.route를 씨앗으로 화면 생성 + screenRefs 연결 + screensEnabled 켬 (비파괴·멱등, admin)')
135
+ .option('--rollback', 'screensEnabled를 false로 내려 레거시 모드로 되돌린다 (화면 문서·screenRefs는 지우지 않는다)')
136
+ .option('--force', '롤백 안전장치를 넘긴다 — 되돌아갈 route가 없는 명세가 있어도 강행한다 (--rollback 전용)')
137
+ .addHelpText('after', MIGRATE_HELP)
138
+ .action(async (options) => {
139
+ const globalOpts = program.opts();
140
+ const dryRun = !!globalOpts.dryRun;
141
+ const rollback = !!options.rollback;
142
+ if (options.force && !rollback) {
143
+ (0, output_1.printWarning)('--force는 --rollback에서만 쓰입니다 — 무시합니다.');
144
+ }
145
+ // 안전한 기본값도 명시적으로 보낸다. boolean을 보내지 않는 이유: ch-api 글로벌 파이프의
146
+ // enableImplicitConversion이 문자열 "false"를 true로 뒤집어, 막아야 할 롤백을 통과시킨다.
147
+ // 문자열 enum은 그 함정이 없다(암묵 변환이 String(value)라 무해하고, 무효값은 400이다).
148
+ const body = {
149
+ action: rollback ? 'rollback' : 'migrate',
150
+ mode: dryRun ? 'plan' : 'apply',
151
+ ...(rollback ? { onUnsafe: options.force ? 'force' : 'block' } : {}),
152
+ };
153
+ try {
154
+ const client = (0, client_1.createClient)({ projectId: globalOpts.project });
155
+ const { data } = await client.post('/screens/migrate', body);
156
+ // 서버가 계산한 경고(중복 화면 등)는 stderr로 — stdout은 기계 모드에서 JSON 전용이다.
157
+ for (const warning of data.warnings ?? []) {
158
+ (0, output_1.printWarning)(warning);
159
+ }
160
+ if (isMachineOutput(globalOpts)) {
161
+ // stdout은 서버 응답 JSON 한 문서. 무슨 일이 있었는지 한 줄은 stderr로 남긴다
162
+ // (기계 모드에서 printSuccess/printInfo는 stderr로 간다 — 무성 성공 금지).
163
+ (0, output_1.formatOutput)(data, globalOpts);
164
+ if (data.action === 'rollback') {
165
+ printRollbackOutcome(data);
166
+ }
167
+ else {
168
+ printMigrateOutcome(data);
169
+ }
170
+ return;
171
+ }
172
+ if (data.action === 'rollback') {
173
+ printRollbackReport(data);
174
+ }
175
+ else {
176
+ printMigrateReport(data);
177
+ }
178
+ }
179
+ catch (error) {
180
+ // HTTP 오류의 기본 메시지·종료코드(≠0)는 client 인터셉터가 이미 세웠다.
181
+ if (error.isAxiosError) {
182
+ explainFailure(error);
183
+ return;
184
+ }
185
+ throw error;
186
+ }
187
+ });
188
+ }
189
+ //# sourceMappingURL=screens.migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screens.migrate.js","sourceRoot":"","sources":["../../src/commands/screens.migrate.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decencia/ch-cli",
3
- "version": "1.12.1",
3
+ "version": "1.14.0",
4
4
  "description": "Decencia Communication Channel CLI",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -2,7 +2,7 @@
2
2
  name: 2t-decencia-channel-change-manager
3
3
  description: 기존 소통채널 프로젝트의 기능 추가/수정을 사용자와 대화로 명확화 → 전파 스킬로 연관 PRD/spec/DB/SQA 일괄 갱신 → 변경으로 생긴 새 할일을 GitHub 이슈로 발행하는 오케스트레이터 스킬. (1)대화로 변경 내용 확정 → (2)[게이트] 영향 범위 확인 후 전파 적용 → (3)[게이트] 할일 목록 확인 후 이슈 발행. "이 기능 바꿀래"·"기획 수정"·"이거 추가해줘(기존 프로젝트)" 류 요청 시.
4
4
  allowed-tools: Bash(ch:*) Bash(git:*) Bash(gh:*) Read Write
5
- version: 1.12.1
5
+ version: 1.14.0
6
6
  ---
7
7
 
8
8
  <!-- ch-version-gate -->
@@ -10,7 +10,7 @@ description: |
10
10
  (3) 명세·DB·SQA가 서로 어긋나 있는 의심이 들 때 (정합성 점검),
11
11
  (4) PRD 갱신 후 하위 spec/db/SQA로 변경분을 흘려보내야 할 때,
12
12
  (5) Sprint 진행 중 도메인 규칙·스키마가 흔들렸을 때 연쇄 갱신이 필요할 때.
13
- version: 1.12.1
13
+ version: 1.14.0
14
14
  ---
15
15
 
16
16
  <!-- ch-version-gate -->
@@ -7,9 +7,9 @@ description: |
7
7
  (1) spec/db-table/화면(screen)을 CLI로 다룰 때,
8
8
  (2) spec 규모를 Story Point(`--points`)로 매길 때,
9
9
  (3) ch db-tables 명령(list/get/create/update/delete)을 사용할 때,
10
- (4) ch screens 명령(list/get/create/update/delete)으로 화면을 다룰 때,
10
+ (4) ch screens 명령(list/get/create/update/delete/migrate)으로 화면을 다루거나 레거시 프로젝트를 화면 모드로 이관할 때,
11
11
  (5) Spec ID를 JIRA 스타일(`LOGIN-001`)로 직접 지정할 때 (`ch specs create --id`).
12
- version: 1.12.1
12
+ version: 1.14.0
13
13
  ---
14
14
 
15
15
  <!-- ch-version-gate -->
@@ -236,6 +236,12 @@ ch screens update <screenId> --order 3
236
236
  ch screens update <screenId> --entry-points "" # 진입 경로 모두 해제
237
237
 
238
238
  ch screens delete <screenId> # 참조 spec의 ui.screenRefs도 서버가 자동 정리
239
+
240
+ # 레거시 프로젝트 → 화면 모드 이관 (비파괴·멱등, admin) — 서버가 수행한다(POST /screens/migrate)
241
+ ch screens migrate --dry-run # 계획만 (아무것도 쓰지 않는다)
242
+ ch screens migrate # 적용: 화면 생성 → screenRefs 연결 → screensEnabled=true
243
+ ch screens migrate --rollback # 화면 모드만 끄기 (화면·screenRefs는 남는다)
244
+ ch screens migrate --rollback --force # 되돌아갈 route가 없어도 강행 (기본은 서버가 409로 거절)
239
245
  ```
240
246
 
241
247
  - `--id`는 JIRA 스타일(`SCR-001`). 패턴 `^[A-Za-z][A-Za-z0-9_]*-[A-Za-z0-9]+$`, 중복 시 409.
@@ -261,6 +267,21 @@ ch screens delete <screenId> # 참조 spec의 ui.screenRefs
261
267
 
262
268
  `ScreenState{name, description?}`의 정의(SSOT)는 db-tables의 `screens` 테이블 문서다.
263
269
 
270
+ ### migrate (레거시 → 화면 모드)
271
+
272
+ `spec.ui.route`를 씨앗으로 화면을 만들고 명세에 연결한 뒤 `screensEnabled`를 켠다. **admin 전용.**
273
+
274
+ - **비파괴**: `spec.ui`의 기존 필드(figmaNodeId·route·file·access·interactionMap)를 하나도 지우지 않는다. 그래서 `--rollback`(플래그만 false)이면 즉시 레거시 동작으로 돌아간다.
275
+ - **route 정규화**: 괄호 주석과 탭 쿼리를 떼어 base route로 묶는다. 같은 base route = 화면 하나 (탭은 라우트가 아니라 `?tab=` 쿼리다).
276
+ - `/projects/[projectId]/specs (PRD 탭)` → `/projects/[projectId]/specs`
277
+ - `/projects/[projectId]/specs?tab=screens` → `/projects/[projectId]/specs`
278
+ - 떼어낸 원문은 화면 `note`에 `레거시 route 주석: PRD 탭 / ?tab=screens`로 남는다 (나중에 화면을 쪼갤 근거).
279
+ - **씨앗값**: 화면명 = 묶인 명세 중 ID 오름차순 첫 명세의 이름, order = base route 사전순 순번. `epic`·`access`는 묶인 명세의 값이 하나로 일치할 때만 복사하고 갈리면 비운 채 후보를 `note`에 남긴다. 전부 사람이 나중에 고치는 값이다.
280
+ - **건너뜀**: route가 없는 명세(배치·API·CLI)는 화면 없는 기능이므로 건너뛰고 사유를 결과에 남긴다.
281
+ - **멱등**: 재실행해도 같은 base route로 화면을 두 번 만들지 않고, 이미 걸린 `screenRefs`는 건드리지 않는다.
282
+ - **쓰기 순서**: 화면 생성 → 명세 연결 → `screensEnabled=true`(항상 마지막). 중간에 실패하면 플래그가 꺼진 채 남아 프로젝트는 레거시 모드 그대로다.
283
+ - `--dry-run`은 계획만 낸다(쓰기 0건). 단, 계획을 서버 데이터로 계산하므로 **읽기 요청은 나간다** — 다른 커맨드의 `--dry-run`과 다른 점이다.
284
+
264
285
  ## 4. 운영 팁
265
286
 
266
287
  - Windows 한글 출력이 비어 보일 때: `ch specs get <id> --json | Out-File spec.json` (PowerShell)
@@ -274,4 +295,6 @@ ch screens delete <screenId> # 참조 spec의 ui.screenRefs
274
295
  - `--db-tables ""`는 모두 해제. 단일 ID 유지하려면 그 ID만 명시.
275
296
  - `relatedSpecIds`를 JSON에 명시해도 서버가 무시 (자동 관리 영역).
276
297
  - `ch screens update --states`도 배열 **통째 교체**다. 상태 하나만 고치려 해도 `ch screens get <id> --json`으로 받아 배열 전체를 넘긴다.
277
- - 화면 SSOT는 `screensEnabled=true`인 프로젝트에서만 screens다. 이 플래그가 꺼진(=기존) 프로젝트는 화면 정보의 SSOT가 여전히 `spec.ui.route`다 — screens를 만들어도 그 프로젝트의 화면 정보가 자동으로 옮겨가지 않는다.
298
+ - 화면 SSOT는 `screensEnabled=true`인 프로젝트에서만 screens다. 이 플래그가 꺼진(=기존) 프로젝트는 화면 정보의 SSOT가 여전히 `spec.ui.route`다 — screens를 만들어도 그 프로젝트의 화면 정보가 자동으로 옮겨가지 않는다. 옮기려면 `ch screens migrate`.
299
+ - `ch screens migrate`의 `--dry-run`은 **요청을 한 번 보낸다**(`POST /screens/migrate {mode:'plan'}`). 계산도 쓰기도 서버가 한다. "아무 요청도 안 나간다"가 아니라 "아무 문서도 쓰지 않는다"가 보장이다.
300
+ - `--rollback`은 `screensEnabled`만 내린다. 다만 **되돌아갈 route가 없는 명세**(화면에 걸려 있는데 `ui.route`가 빈 명세 — 화면 우선으로 만든 프로젝트가 그렇다)가 하나라도 있으면 서버가 **409로 거절**한다. 화면 모드를 끄면 그 명세의 UI 정보가 화면 탭에도 route에도 없기 때문이다. 정말 내리려면 `--force`.
@@ -8,7 +8,7 @@ description: |
8
8
  (2) DB 테이블 단위로 컬럼·인덱스·보안규칙을 등록·수정할 때,
9
9
  (3) 새 테이블을 추가하면서 전체 인벤토리도 함께 업데이트할 때,
10
10
  (4) spec.dbTableRefs와 양방향 동기화가 필요한 작업 시.
11
- version: 1.12.1
11
+ version: 1.14.0
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.12.1
5
+ version: 1.14.0
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.12.1
5
+ version: 1.14.0
6
6
  ---
7
7
 
8
8
  <!-- ch-version-gate -->
@@ -7,7 +7,7 @@ description: |
7
7
  (1) PRD를 작성하거나 갱신할 때,
8
8
  (2) PRD 구성에서 Epic/스토리 구조를 후속 spec 작성에 매핑할 때,
9
9
  (3) Read-before-Write 규칙으로 PRD content를 안전하게 수정해야 할 때.
10
- version: 1.12.1
10
+ version: 1.14.0
11
11
  ---
12
12
 
13
13
  <!-- ch-version-gate -->
@@ -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.12.1
5
+ version: 1.14.0
6
6
  ---
7
7
 
8
8
  <!-- ch-version-gate -->
@@ -11,7 +11,7 @@ description: |
11
11
  (2) UI 메타데이터·비즈니스 로직·DB 참조를 함께 다룰 때,
12
12
  (3) Story 규모를 Story Point(`--points`)로 매길 때,
13
13
  (4) 신규 spec ID를 `LOGIN-001` 같은 JIRA 스타일로 부여하고 싶을 때 (`ch specs create --id`).
14
- version: 1.12.1
14
+ version: 1.14.0
15
15
  ---
16
16
 
17
17
  <!-- ch-version-gate -->
@@ -7,7 +7,7 @@ description: |
7
7
  (1) sprint를 구성할 때,
8
8
  (2) Σ spec.points 기반 sprint 용량 산정이 필요할 때,
9
9
  (3) Epic·도메인·의존성을 함께 고려해 spec을 sprint에 배분할 때.
10
- version: 1.12.1
10
+ version: 1.14.0
11
11
  ---
12
12
 
13
13
  <!-- ch-version-gate -->
@@ -2,7 +2,7 @@
2
2
  name: 2t-decencia-channel-sprint-runner
3
3
  description: 특정 Sprint를 끝까지 실행(run)하는 오케스트레이터 스킬. Sprint의 spec을 시드로 이슈 목록을 분해·발행(github-issue)하고, GitHub milestone에 묶인 이슈를 상태별로 분류해 issue-coder(병렬)·pr-merger(직렬)로 전진시킨 뒤, 사람확인이 필요한 곳에서 멈춘다. 사람이 확인·체크 후 재호출하면 멱등하게 이어간다(반복 루프). "스프린트 돌려줘"·"sprint N 실행"·"이 스프린트 개발 진행해줘" 류 요청 시.
4
4
  allowed-tools: Skill Agent Read Bash(ch:*) Bash(gh:*) Bash(git:*)
5
- version: 1.12.1
5
+ version: 1.14.0
6
6
  ---
7
7
 
8
8
  <!-- ch-version-gate -->
@@ -12,7 +12,7 @@ description: |
12
12
  (4) 명세 영역별 완성형 TC 번들(퍼블리싱/프론트/백엔드 디센시아 운영 관점 포함)을 가져다 쓸 때,
13
13
  (5) 새 명세 작업 중 반복 패턴을 발견해 영역별 번들을 보강할 때,
14
14
  (6) Sprint 종료 전 spec별 SQA 통과 여부를 점검할 때.
15
- version: 1.12.1
15
+ version: 1.14.0
16
16
  ---
17
17
 
18
18
  <!-- ch-version-gate -->
@@ -8,7 +8,7 @@ description: |
8
8
  (2) "작업 현황 적어줘", "workStatus 갱신해줘" 요청 시,
9
9
  (3) Sprint 종료 회고나 인수인계용으로 spec별 진행 상태를 정리할 때,
10
10
  (4) `ch specs update --work-status` 또는 웹 "작업 현황" 탭에서 갱신할 때.
11
- version: 1.12.1
11
+ version: 1.14.0
12
12
  ---
13
13
 
14
14
  <!-- ch-version-gate -->