@decencia/ch-cli 1.31.12 → 1.32.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.
- package/agent/2t-decencia-channel-issue-coder.md +1 -1
- package/agent/2t-decencia-channel-pr-merger.md +1 -1
- package/agent/2t-decencia-channel-terraformer.md +1 -1
- package/dist/commands/ia.d.ts +6 -3
- package/dist/commands/ia.d.ts.map +1 -1
- package/dist/commands/ia.js +44 -42
- package/dist/commands/ia.js.map +1 -1
- package/package.json +1 -1
- package/skill/2t-decencia-channel-change-manager/SKILL.md +1 -1
- package/skill/2t-decencia-channel-change-propagation-v2/SKILL.md +1 -1
- package/skill/2t-decencia-channel-cli-v2/SKILL.md +11 -5
- package/skill/2t-decencia-channel-db-schema-v2/SKILL.md +1 -1
- package/skill/2t-decencia-channel-github-issue/SKILL.md +1 -1
- package/skill/2t-decencia-channel-ia-v2/SKILL.md +100 -111
- package/skill/2t-decencia-channel-orchestrator/SKILL.md +1 -1
- package/skill/2t-decencia-channel-policy-v2/SKILL.md +1 -1
- package/skill/2t-decencia-channel-prd-v2/SKILL.md +1 -1
- package/skill/2t-decencia-channel-project-bootstrap/SKILL.md +14 -7
- package/skill/2t-decencia-channel-screen-v2/SKILL.md +23 -18
- package/skill/2t-decencia-channel-spec-v2/SKILL.md +1 -1
- package/skill/2t-decencia-channel-sprint-builder-v2/SKILL.md +1 -1
- package/skill/2t-decencia-channel-sprint-runner/SKILL.md +1 -1
- package/skill/2t-decencia-channel-sqa-v2/SKILL.md +1 -1
- package/skill/2t-decencia-channel-userflow-v2/SKILL.md +1 -1
- package/skill/2t-decencia-channel-work-status-v2/SKILL.md +1 -1
|
@@ -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.
|
|
6
|
+
version: 1.32.1
|
|
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.
|
|
6
|
+
version: 1.32.1
|
|
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.
|
|
6
|
+
version: 1.32.1
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
## 역할
|
package/dist/commands/ia.d.ts
CHANGED
|
@@ -2,9 +2,12 @@ import { Command } from 'commander';
|
|
|
2
2
|
/**
|
|
3
3
|
* `ch ia` — IA(정보구조) 문서. 프로젝트당 1건.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* 분류 노드와 화면 노드로 세운 트리를 담는다. 계층은 **사람이 기능의 포함 관계로** 정하는 것이지
|
|
6
|
+
* route에서 유도하지 않는다 — route의 SSOT는 `ch screens --route`이고, 화면 목록의 경로 구조는
|
|
7
|
+
* 별개의 그림이다.
|
|
8
|
+
*
|
|
9
|
+
* 트리는 통째 교체다. IA는 사람이 승인한 그림을 그대로 저장하는 문서라, 부분 수정 경로를 두면
|
|
10
|
+
* 승인한 트리와 저장된 트리가 갈라진다.
|
|
8
11
|
*/
|
|
9
12
|
export declare function registerIaCommand(program: Command): void;
|
|
10
13
|
//# sourceMappingURL=ia.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ia.d.ts","sourceRoot":"","sources":["../../src/commands/ia.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ia.d.ts","sourceRoot":"","sources":["../../src/commands/ia.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BpC;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkGxD"}
|
package/dist/commands/ia.js
CHANGED
|
@@ -4,12 +4,28 @@ exports.registerIaCommand = registerIaCommand;
|
|
|
4
4
|
const client_1 = require("../client");
|
|
5
5
|
const output_1 = require("../output");
|
|
6
6
|
const utils_1 = require("../utils");
|
|
7
|
+
/** 사람이 읽을 트리 한 장. 저장 형식이 중첩이라 표로는 계층이 안 보인다. */
|
|
8
|
+
function printTree(nodes, prefix = '') {
|
|
9
|
+
nodes.forEach((node, i) => {
|
|
10
|
+
const last = i === nodes.length - 1;
|
|
11
|
+
const label = node.type === 'group'
|
|
12
|
+
? `${node.name ?? '(이름 없음)'}${node.note ? ` — ${node.note}` : ''}`
|
|
13
|
+
: `[${node.screenId ?? '(screenId 없음)'}]`;
|
|
14
|
+
(0, output_1.printInfo)(`${prefix}${last ? '└─ ' : '├─ '}${label}`);
|
|
15
|
+
if (node.children?.length) {
|
|
16
|
+
printTree(node.children, `${prefix}${last ? ' ' : '│ '}`);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
7
20
|
/**
|
|
8
21
|
* `ch ia` — IA(정보구조) 문서. 프로젝트당 1건.
|
|
9
22
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
23
|
+
* 분류 노드와 화면 노드로 세운 트리를 담는다. 계층은 **사람이 기능의 포함 관계로** 정하는 것이지
|
|
24
|
+
* route에서 유도하지 않는다 — route의 SSOT는 `ch screens --route`이고, 화면 목록의 경로 구조는
|
|
25
|
+
* 별개의 그림이다.
|
|
26
|
+
*
|
|
27
|
+
* 트리는 통째 교체다. IA는 사람이 승인한 그림을 그대로 저장하는 문서라, 부분 수정 경로를 두면
|
|
28
|
+
* 승인한 트리와 저장된 트리가 갈라진다.
|
|
13
29
|
*/
|
|
14
30
|
function registerIaCommand(program) {
|
|
15
31
|
const ia = program.command('ia').description('IA(정보구조) 관리');
|
|
@@ -29,61 +45,46 @@ function registerIaCommand(program) {
|
|
|
29
45
|
return;
|
|
30
46
|
}
|
|
31
47
|
(0, output_1.printInfo)(`${data.title} (v${data.currentVersion})`);
|
|
32
|
-
const
|
|
33
|
-
if (
|
|
34
|
-
(0, output_1.
|
|
35
|
-
|
|
36
|
-
(n.items ?? []).map((i) => i.label).join(' · '),
|
|
37
|
-
n.primaryCta ? `${n.primaryCta.label}` : '',
|
|
38
|
-
]));
|
|
39
|
-
}
|
|
40
|
-
const hubs = data.hubs ?? [];
|
|
41
|
-
if (hubs.length) {
|
|
42
|
-
(0, output_1.printTable)(['허브', '화면', '메뉴'], hubs.map((h) => [
|
|
43
|
-
h.name ?? '',
|
|
44
|
-
h.screenId ?? '',
|
|
45
|
-
(h.items ?? []).map((i) => i.label).join(' · '),
|
|
46
|
-
]));
|
|
47
|
-
}
|
|
48
|
-
const rules = data.entryRules ?? [];
|
|
49
|
-
if (rules.length) {
|
|
50
|
-
(0, output_1.printInfo)('진입 규칙:');
|
|
51
|
-
rules.forEach((r, i) => (0, output_1.printInfo)(` ${i + 1}. ${r}`));
|
|
48
|
+
const tree = data.tree ?? [];
|
|
49
|
+
if (tree.length === 0) {
|
|
50
|
+
(0, output_1.printInfo)('트리가 비어 있습니다.');
|
|
51
|
+
return;
|
|
52
52
|
}
|
|
53
|
+
printTree(tree);
|
|
53
54
|
}
|
|
54
55
|
catch {
|
|
55
56
|
// Error already handled
|
|
56
57
|
}
|
|
57
58
|
});
|
|
58
59
|
ia.command('set')
|
|
59
|
-
.description('IA 생성/수정 (
|
|
60
|
+
.description('IA 생성/수정 (트리는 통째 교체)')
|
|
60
61
|
.requiredOption('--title <title>', 'IA 문서 제목')
|
|
61
|
-
.option('--file <
|
|
62
|
-
.option('--
|
|
63
|
-
.option('--
|
|
64
|
-
.option('--entry-rules <jsonFile>', '진입 규칙 JSON 파일 (string[]) — 통째 교체')
|
|
62
|
+
.option('--file <jsonFile>', '트리 JSON 파일 (IaNode[]) — 통째 교체')
|
|
63
|
+
.option('--content <path>', '배치 근거 마크다운 파일 — 내용이 저장된다')
|
|
64
|
+
.option('--expected-version <n>', '내가 읽은 시점의 currentVersion. 그 사이 남이 저장했으면 409로 막는다')
|
|
65
65
|
.option('--no-version', '버전 기록 없이 수정 (기본: 항상 새 버전 기록)')
|
|
66
66
|
.action(async (options) => {
|
|
67
67
|
const globalOpts = program.opts();
|
|
68
68
|
try {
|
|
69
69
|
const body = { title: options.title };
|
|
70
|
-
if (options.
|
|
71
|
-
body.content = (0, utils_1.readContentFile)(options.
|
|
70
|
+
if (options.content !== undefined) {
|
|
71
|
+
body.content = (0, utils_1.readContentFile)(options.content, '--content');
|
|
72
72
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
['hubs', options.hubs, '--hubs'],
|
|
76
|
-
['entryRules', options.entryRules, '--entry-rules'],
|
|
77
|
-
];
|
|
78
|
-
for (const [key, path, flag] of arrays) {
|
|
79
|
-
if (path === undefined)
|
|
80
|
-
continue;
|
|
81
|
-
const parsed = (0, utils_1.readJsonFile)(path, flag);
|
|
73
|
+
if (options.file !== undefined) {
|
|
74
|
+
const parsed = (0, utils_1.readJsonFile)(options.file, '--file');
|
|
82
75
|
if (!Array.isArray(parsed)) {
|
|
83
|
-
(0, output_1.
|
|
76
|
+
(0, output_1.failInput)('--file: 트리는 JSON 배열이어야 합니다.');
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
body.tree = parsed;
|
|
80
|
+
}
|
|
81
|
+
if (options.expectedVersion !== undefined) {
|
|
82
|
+
const n = Number(options.expectedVersion);
|
|
83
|
+
if (!Number.isInteger(n) || n < 1) {
|
|
84
|
+
(0, output_1.failInput)('--expected-version: 1 이상의 정수여야 합니다.');
|
|
84
85
|
return;
|
|
85
86
|
}
|
|
86
|
-
body
|
|
87
|
+
body.expectedVersion = n;
|
|
87
88
|
}
|
|
88
89
|
if (globalOpts.dryRun) {
|
|
89
90
|
(0, output_1.printInfo)(`[DRY-RUN] IA "${options.title}" 생성/수정 요청`);
|
|
@@ -98,9 +99,10 @@ function registerIaCommand(program) {
|
|
|
98
99
|
(0, output_1.printSuccess)(data.message || 'IA가 저장되었습니다.');
|
|
99
100
|
}
|
|
100
101
|
catch (e) {
|
|
102
|
+
// HTTP 오류는 client 인터셉터가 이미 찍고 종료코드를 세웠다(400 검증 실패·409 충돌 포함).
|
|
101
103
|
if (e?.__handled)
|
|
102
104
|
return;
|
|
103
|
-
(0, output_1.
|
|
105
|
+
(0, output_1.failInput)(e?.message ?? String(e));
|
|
104
106
|
}
|
|
105
107
|
});
|
|
106
108
|
ia.command('versions')
|
package/dist/commands/ia.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ia.js","sourceRoot":"","sources":["../../src/commands/ia.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"ia.js","sourceRoot":"","sources":["../../src/commands/ia.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -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.
|
|
5
|
+
version: 1.32.1
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
<!-- ch-version-gate -->
|
|
@@ -10,7 +10,7 @@ description: |
|
|
|
10
10
|
(4) ch screens 명령(list/get/create/update/delete/migrate)으로 화면을 다루거나 레거시 프로젝트를 화면 모드로 이관할 때,
|
|
11
11
|
(5) spec의 화면 연결을 CLI로 걸거나 풀 때 (`ch specs screen-refs`),
|
|
12
12
|
(6) Spec ID를 JIRA 스타일(`LOGIN-001`)로 직접 지정할 때 (`ch specs create --id`).
|
|
13
|
-
version: 1.
|
|
13
|
+
version: 1.32.1
|
|
14
14
|
---
|
|
15
15
|
|
|
16
16
|
<!-- ch-version-gate -->
|
|
@@ -206,13 +206,19 @@ ch specs update <specId> --db-tables "" # 모두 해제
|
|
|
206
206
|
|
|
207
207
|
```bash
|
|
208
208
|
ch ia get [--json]
|
|
209
|
-
ch ia set --title "<제목>" --file ./ia.
|
|
209
|
+
ch ia set --title "<제목>" --file ./ia-tree.json --content ./ia.md [--expected-version <n>]
|
|
210
210
|
ch ia versions
|
|
211
211
|
```
|
|
212
212
|
|
|
213
|
-
- `--
|
|
214
|
-
|
|
215
|
-
|
|
213
|
+
- `--file`은 **트리 JSON**이다(`IaNode[]`). 노드는 두 종류다 — 분류 `{"type":"group","name":"…","children":[…]}`,
|
|
214
|
+
화면 `{"type":"screen","screenId":"SCR-…"}`. **배열 순서가 곧 표시 순서**이고 **통째 교체**다.
|
|
215
|
+
수정 전 `ch ia get --json`으로 받아 편집한다(Read-before-Write).
|
|
216
|
+
- `--content`는 **고른 축과 배치 근거** 마크다운이다. 트리 자체는 `--file`이 갖는다.
|
|
217
|
+
- `screenId`는 실존 화면이어야 하고(없으면 400), 같은 화면을 두 번 배치해도 400이다.
|
|
218
|
+
- `--expected-version`을 주면 그 사이 남이 저장했을 때 409로 막는다. 트리가 통째 교체라 이게 없으면
|
|
219
|
+
나중에 저장한 쪽이 앞사람 작업을 통째로 덮는다.
|
|
220
|
+
- **route는 여기 넣지 않는다** — route의 SSOT는 `ch screens --route`다. IA 계층에서 route를 유도하지도
|
|
221
|
+
않는다(둘은 별개 그림이다).
|
|
216
222
|
|
|
217
223
|
### 화면 연결 (`ch specs screen-refs`)
|
|
218
224
|
|
|
@@ -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.
|
|
5
|
+
version: 1.32.1
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
<!-- ch-version-gate -->
|
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
name: 2t-decencia-channel-ia-v2
|
|
3
3
|
description: |
|
|
4
4
|
[2t][v2] 소통채널 화면 IA(정보구조) 설계 가이드.
|
|
5
|
-
화면을 만들기 전에
|
|
6
|
-
|
|
5
|
+
화면을 만들기 전에 화면들을 어떻게 묶어 보여줄지 정한다 — 분류 노드와 화면 노드로 트리를 세운다.
|
|
6
|
+
뼈대(개인 허브·운영)를 놓고 본편의 축을 판정 순서로 정하며, 배치는 "사용자가 어디를 먼저
|
|
7
|
+
클릭하는가"로 판단한다. Epic·개발 모듈·URL은 기준이 아니다.
|
|
7
8
|
Use when:
|
|
8
|
-
(1) 화면설계서를 쓰기 전에 화면들의
|
|
9
|
+
(1) 화면설계서를 쓰기 전에 화면들의 배치를 정할 때,
|
|
9
10
|
(2) 기존 프로젝트의 IA가 어색해 재배치를 검토할 때,
|
|
10
11
|
(3) "이 화면이 왜 여기 있지" 같은 구조 문제를 점검할 때.
|
|
11
|
-
version: 1.
|
|
12
|
+
version: 1.32.1
|
|
12
13
|
---
|
|
13
14
|
|
|
14
15
|
<!-- ch-version-gate -->
|
|
@@ -28,139 +29,127 @@ ch check
|
|
|
28
29
|
|
|
29
30
|
# 화면 IA(정보구조) 설계
|
|
30
31
|
|
|
31
|
-
|
|
32
|
+
화면을 만들기 전에, 화면들을 어떻게 묶어 보여줄지 정한다. 산출물은 **트리 하나**다.
|
|
33
|
+
분류 노드(사람이 이름 붙인 묶음)와 화면 노드로 세우고, `ch ia set`으로 저장한다(§5).
|
|
32
34
|
|
|
33
|
-
>
|
|
34
|
-
>
|
|
35
|
+
> 작성 순서는 ④다. ①기능명세 → ②유저플로우 → ③정책정의서 → DB 스키마 → **④IA** → ⑤화면설계서.
|
|
36
|
+
> 유저플로우가 먼저다. 여정을 알아야 배치할 수 있다.
|
|
35
37
|
|
|
36
|
-
##
|
|
38
|
+
## 1. 판단 기준은 하나다
|
|
37
39
|
|
|
38
|
-
|
|
39
|
-
IA가 설계물이 아니라 **부산물**이 되는 것이다. 그러면 각 화면은 그 순간 손에 잡히는 분류를 근거로
|
|
40
|
-
삼는데, 보통 그게 Epic이다.
|
|
40
|
+
**"사용자가 이 화면을 찾을 때 어디를 먼저 클릭하는가."**
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
갈랐다. 똑같은 "내 데이터"인데 왜 문의는 마이페이지이고 견적은 아닌지 설명할 근거가 없었다.
|
|
44
|
-
기준 없이 두 방식을 섞은 것이다.
|
|
42
|
+
§3의 규칙들은 이 질문의 결과일 뿐이다. 규칙과 답이 어긋나면 **답을 따른다.**
|
|
45
43
|
|
|
46
|
-
|
|
44
|
+
- 🚫 **Epic·개발 모듈로 묶지 마라.** 사용자는 모듈 이름을 모른다.
|
|
45
|
+
- 🚫 **URL로 계층을 만들지 마라.** 슬래시 개수는 계층이 아니다.
|
|
46
|
+
- 계층은 기능의 포함 관계다. 목록 다음에 상세가 온다고 상세가 목록의 하위 분류는 아니다.
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
모든 배치 판단은 이 질문 하나로 한다.
|
|
48
|
+
## 2. 뼈대를 놓고, 본편의 축을 정한다
|
|
50
49
|
|
|
51
|
-
|
|
52
|
-
찾아가는 축과 다르다. 우연히 겹칠 수는 있지만, 겹치는지 확인하지 않고 복사하면 안 된다.
|
|
53
|
-
- 🚫 **기능 소속으로 route를 정하지 마라.** "견적 작성은 공급자 기능이니 `/supplier`"는 개발자의 분류다.
|
|
54
|
-
공급회원이 "내가 낸 견적"을 찾을 때 실제로 어디를 누르는지와는 별개다.
|
|
50
|
+
### 뼈대 — 선택이 아니다
|
|
55
51
|
|
|
56
|
-
|
|
52
|
+
- 개인 데이터가 있으면 → **개인 허브** 하나 (마이페이지류)
|
|
53
|
+
- 운영자가 있으면 → **운영 구역** 하나
|
|
54
|
+
- 나머지가 **본편**이다
|
|
57
55
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
2. **역할 차이는 부모를 나누는 축이 아니다.** 같은 위치에서 내용이 갈리게 한다.
|
|
61
|
-
구매회원이 `/my/deals`를 열면 구매 거래가, 공급회원이 열면 공급 거래가 보인다.
|
|
62
|
-
3. **자식이 있는 경로에는 화면이 있어야 한다.** `/buyer` 아래 화면이 5개인데 `/buyer` 자체에 화면이
|
|
63
|
-
없으면 그 묶음은 입구가 없는 셈이다.
|
|
64
|
-
4. **최상위는 GNB에 담기는 수만큼.** 보통 5~7개다. 넘으면 묶고, 3단계보다 깊어지면 평평하게 편다.
|
|
56
|
+
로그인 경계는 뼈대가 처리한다. "로그인 전후로 갈리나"는 거의 모든 서비스가 "예"라서 축이 되지
|
|
57
|
+
못한다. 없는 조각은 놓지 않는다 — 사내 툴은 개인 허브 없이 바로 본편으로 간다.
|
|
65
58
|
|
|
66
|
-
|
|
59
|
+
### 본편의 축 — 여기서부터가 판정이다
|
|
67
60
|
|
|
68
|
-
|
|
61
|
+
트리의 한 층은 **한 가지 기준**으로만 가른다. **위에서부터 물어 처음 "예"에서 멈춘다.**
|
|
69
62
|
|
|
70
|
-
1.
|
|
71
|
-
2.
|
|
72
|
-
3.
|
|
73
|
-
자리가 틀린 것이다.
|
|
74
|
-
4. **route를 부여한다.** 트리의 경로가 곧 route다. 화면 ID 슬러그도 같은 계층을 반영한다.
|
|
75
|
-
5. **트리를 그려 사용자 승인을 받는다**(§4).
|
|
76
|
-
6. §5 구조 검증을 통과할 때까지 3~5를 되풀이한다.
|
|
63
|
+
1. 둘러보고 소비하는 것이 중심인가? → **주제**로 가른다 (분야별 / 종류별)
|
|
64
|
+
2. 목적을 갖고 와서 일하는 것이 중심인가? → **하려는 일**로 가른다 (만들기 / 관리 / 분석)
|
|
65
|
+
3. 이용자 군이 겹치지 않고 각자 다른 일을 하나? → **사용자 유형**으로 가른다
|
|
77
66
|
|
|
78
|
-
|
|
67
|
+
층을 내려갈 때마다 다시 묻되, 위에서 답한 질문은 건너뛴다. 갈리면 "어느 쪽이 그 층을 5~7개로
|
|
68
|
+
고르게 가르나"로 정한다.
|
|
79
69
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
├─ /rfqs 공개 공고 SCR-RFQ-LIST 누구나
|
|
84
|
-
│ └─ /rfqs/[id] 공고 상세 SCR-RFQ-DETAIL 누구나
|
|
85
|
-
├─ /my 마이페이지 (역할별 허브) SCR-MY 회원
|
|
86
|
-
│ ├─ /my/rfqs 내 구매공고 SCR-MY-RFQS 구매회원
|
|
87
|
-
│ ├─ /my/bids 내 견적 SCR-MY-BIDS 공급회원
|
|
88
|
-
│ ├─ /my/deals 내 거래 SCR-MY-DEALS 회원 (역할별 내용)
|
|
89
|
-
│ └─ /my/account 계정·회사 관리 SCR-MY-ACCOUNT 회원
|
|
90
|
-
└─ /admin 관리자 콘솔 SCR-ADMIN-DASH 관리자
|
|
91
|
-
```
|
|
70
|
+
- **시작 전에 `ch ia get`으로 기존 IA를 읽는다.** 축이 이미 있으면 따른다. 바꾸려면 사용자
|
|
71
|
+
합의를 받는다.
|
|
72
|
+
- **정한 축과 이유를 `--content`에 적는다.**
|
|
92
73
|
|
|
93
|
-
|
|
94
|
-
그대로 통과한다. 사람은 트리를 봐야 "견적이 왜 마이페이지 밖에 있지"를 즉시 알아챈다.
|
|
74
|
+
## 3. 배치 규칙
|
|
95
75
|
|
|
96
|
-
|
|
76
|
+
1. **같은 성격은 한 부모 아래 모은다.** 하나만 밖에 있다면 이유를 한 줄로 답할 수 있어야 한다.
|
|
97
77
|
|
|
98
|
-
|
|
99
|
-
**IA 리소스**(프로젝트당 1건)에 올린다 — 웹 "IA" 탭에서도 같은 문서를 본다.
|
|
78
|
+
2. **소속은 진입점으로 가른다. 화면 이름으로 가르지 마라.**
|
|
100
79
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
80
|
+
| 어디서 들어오나 | 자리 |
|
|
81
|
+
|---|---|
|
|
82
|
+
| 내 목록 → 그 항목 (상세·수정·딸린 후속 작업) | 개인 허브 **안** |
|
|
83
|
+
| 공용 화면의 버튼·GNB (새로 만들기, 남의 항목에 응답) | 개인 허브 **밖** |
|
|
84
|
+
|
|
85
|
+
3. **역할은 축이 아니다.** 권한이 다른 두 사람이 같은 화면을 열면 각자의 것이 보이게 한다.
|
|
86
|
+
(운영 구역은 예외가 아니라 뼈대다 — §2.)
|
|
87
|
+
|
|
88
|
+
4. **분류 노드는 화면이 없어도 된다. 이름은 필수다.** 한 층의 형제는 5~7개, 깊이는 3~4단까지.
|
|
89
|
+
|
|
90
|
+
## 4. 절차
|
|
91
|
+
|
|
92
|
+
1. `ch ia get` — 기존 IA가 있으면 축을 따른다(§2).
|
|
93
|
+
2. 유저플로우에서 여정 시작점을 모은다.
|
|
94
|
+
3. 뼈대를 놓고 본편의 축을 정한다(§2).
|
|
95
|
+
4. 화면을 배치한다. 화면마다 §1 질문에 답한다. 답이 막히면 자리가 틀린 것이다.
|
|
96
|
+
5. route는 여기서 정하지 않는다. 화면을 만들 때 따로 정한다.
|
|
97
|
+
6. 트리를 그려 사용자 승인을 받는다. **표로 보여주지 마라** — 구조가 안 보인다.
|
|
98
|
+
7. 저장한다(§5). §6 검증을 통과할 때까지 4~7을 되풀이한다.
|
|
99
|
+
|
|
100
|
+
기존 프로젝트에서 트리만 고치는 건 싸다(`ch ia set` 한 번). route·화면 ID까지 바꾸면 spec 연결과
|
|
101
|
+
와이어프레임 링크가 같이 깨진다 — 비용을 먼저 알리고 사용자 판단을 받는다.
|
|
102
|
+
|
|
103
|
+
## 5. 산출물과 저장
|
|
104
|
+
|
|
105
|
+
승인받은 트리를 그대로 저장한다. 웹 "IA" 페이지가 이 트리를 그대로 그린다.
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
둘러보기 (본편 — 주제 축)
|
|
109
|
+
├─ 분야 A (분류)
|
|
110
|
+
│ └─ 항목 목록 SCR-ITEMS-A
|
|
111
|
+
└─ 분야 B (분류)
|
|
112
|
+
└─ 항목 목록 SCR-ITEMS-B
|
|
113
|
+
마이페이지 (뼈대 — 개인 허브)
|
|
114
|
+
├─ 내 항목 SCR-MY-ITEMS
|
|
115
|
+
└─ 계정 관리 SCR-ACCOUNT
|
|
116
|
+
운영 (뼈대 — 운영 구역)
|
|
117
|
+
└─ 운영 대시보드 SCR-ADMIN
|
|
108
118
|
```
|
|
109
119
|
|
|
110
|
-
|
|
120
|
+
> **한 사례**다. 본편의 축이 다르면 트리가 완전히 달라진다. 베끼지 마라.
|
|
111
121
|
|
|
112
|
-
```
|
|
113
|
-
[
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
{ "label": "공고", "screenId": "SCR-RFQS" } ],
|
|
117
|
-
"primaryCta": { "label": "회원가입", "screenId": "SCR-SIGNUP" } },
|
|
118
|
-
{ "role": "구매회원",
|
|
119
|
-
"items": [ { "label": "제품 검색", "screenId": "SCR-PRODUCTS" } ],
|
|
120
|
-
"primaryCta": { "label": "공고 등록", "screenId": "SCR-MY-RFQ-NEW" } }
|
|
121
|
-
]
|
|
122
|
+
```bash
|
|
123
|
+
ch ia get [--json] # Read-before-Write
|
|
124
|
+
ch ia set --title "정보구조" --file ./ia-tree.json --content ./ia.md
|
|
125
|
+
ch ia versions
|
|
122
126
|
```
|
|
123
127
|
|
|
124
|
-
`
|
|
128
|
+
`ia-tree.json` (통째 교체):
|
|
125
129
|
|
|
126
130
|
```json
|
|
127
131
|
[
|
|
128
|
-
{ "name": "
|
|
129
|
-
|
|
130
|
-
|
|
132
|
+
{ "type": "group", "name": "둘러보기", "note": "본편 — 주제 축", "children": [
|
|
133
|
+
{ "type": "group", "name": "분야 A", "children": [
|
|
134
|
+
{ "type": "screen", "screenId": "SCR-ITEMS-A" } ] } ] }
|
|
131
135
|
]
|
|
132
136
|
```
|
|
133
137
|
|
|
134
|
-
- `
|
|
135
|
-
-
|
|
136
|
-
|
|
137
|
-
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
- [ ]
|
|
144
|
-
- [ ]
|
|
145
|
-
|
|
146
|
-
- [ ]
|
|
147
|
-
|
|
148
|
-
- [ ]
|
|
149
|
-
- [ ]
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
## 6. 기존 프로젝트의 IA를 고칠 때
|
|
153
|
-
|
|
154
|
-
route는 수정할 수 있지만 **화면 ID는 불변**이다. 재배치하면 ID와 경로가 어긋나 보인다
|
|
155
|
-
(`SCR-SUPPLIER-BID-LIST`가 `/my/bids`에 놓이는 식). 감수하거나 삭제 후 재생성해야 하는데,
|
|
156
|
-
후자는 spec 연결(`screenRefs`)이 끊긴다. 와이어프레임의 GNB·서브내비와 `data-screen-link`도
|
|
157
|
-
함께 고쳐야 한다. **비용을 먼저 알리고 사용자 판단을 받는다.**
|
|
158
|
-
|
|
159
|
-
## 7. 흔한 함정
|
|
160
|
-
|
|
161
|
-
- **Epic을 그대로 그룹으로 쓰기** — 이 단계가 생긴 이유다 (§1).
|
|
162
|
-
- **역할로 최상위를 가르기** — `/buyer`·`/supplier`로 시작하면 "내 것"이 두 곳으로 찢어진다 (§2-2).
|
|
163
|
-
- **배치표로 승인받기** — 구조가 안 보인다 (§4).
|
|
164
|
-
- **화면을 다 만든 뒤에 IA를 보기** — 그때는 되돌리는 비용이 크다 (§6).
|
|
165
|
-
- **IA를 대화에만 남기기** — 승인받은 트리를 `ch ia set`으로 저장하지 않으면, 나중에 GNB가 바뀌어도
|
|
166
|
-
무엇이 진실인지 판별할 수 없다. 배치 근거는 특히 잃기 쉽다 (§4).
|
|
138
|
+
- `group`은 `name` 필수. 화면이 없어도 노드가 된다.
|
|
139
|
+
- `screen`은 `screenId`만 적는다. 이름·route는 화면에서 가져와 라벨로 쓴다.
|
|
140
|
+
- 배열 순서가 곧 표시 순서다.
|
|
141
|
+
- `screenId`는 실존 화면만, 중복 배치 불가(서버가 400으로 막는다).
|
|
142
|
+
- 동시 편집은 `--expected-version <n>`으로 막는다(통째 교체라 나중 저장이 앞을 덮는다).
|
|
143
|
+
- `--content`에는 축 선택 이유와 배치 근거를 적는다.
|
|
144
|
+
|
|
145
|
+
## 6. 검증 (승인 전 필수)
|
|
146
|
+
|
|
147
|
+
- [ ] 축과 그 이유가 `--content`에 적혀 있다
|
|
148
|
+
- [ ] 한 층 = 한 기준
|
|
149
|
+
- [ ] 같은 성격의 화면이 다른 부모에 흩어져 있지 않다
|
|
150
|
+
- [ ] IA 미배치 0건 (IA 페이지가 모아서 보여준다)
|
|
151
|
+
- [ ] 이름 없는 분류가 없다
|
|
152
|
+
- [ ] 화면마다 "어디부터 클릭해서 오나"에 한 줄로 답할 수 있다 — **작성·수정 화면도 빠짐없이**
|
|
153
|
+
- [ ] 한 층의 형제 5~7개, 깊이 3~4단
|
|
154
|
+
- [ ] 유저플로우의 화면들이 트리 위에서 이어진다
|
|
155
|
+
(화면 누락 전수 대조는 [[2t-decencia-channel-screen-v2]] §5-1에서 따로 한다)
|
|
@@ -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.
|
|
5
|
+
version: 1.32.1
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
<!-- 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) 내용 확정 → (3)spec 업로드 → (4)유저플로우 → (5)정책정의서 → (6)DB 스키마·spec 연결 → (7)화면설계서(화면 생성·연결) → (8)검증기준서(SQA). 각 단계 사용자 승인 게이트, 작성 디테일은 기존 2t-decencia-channel-*-v2 스킬을 적극 재사용. "새 기획 만들어줘"·"프로젝트 처음부터 세팅" 류 요청 시.
|
|
4
4
|
allowed-tools: Bash(ch:*) Bash(git:*) Read Write
|
|
5
|
-
version: 1.
|
|
5
|
+
version: 1.32.1
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
<!-- ch-version-gate -->
|
|
@@ -146,14 +146,21 @@ ch specs create --id PROJ-001 --name "프로젝트 목록" \
|
|
|
146
146
|
**절차**
|
|
147
147
|
1. 기능을 **사용자 맥락**으로 묶어 화면 목록을 만든다. 같은 사용자가 한 자리에서 연달아 하는 일이면 한 화면이다.
|
|
148
148
|
(묶는 원칙과 이름 규칙은 아래 "🚫 1 spec = 1 화면으로 뽑지 마라"·"🔴 화면 이름" 참조)
|
|
149
|
-
2.
|
|
149
|
+
2. **뼈대를 놓고 본편의 축을 정한다** — [[2t-decencia-channel-ia-v2]] §2.
|
|
150
|
+
개인 허브·운영 구역은 뼈대로 놓고(있을 때만), 나머지 본편을 주제·하려는 일·사용자 유형 중
|
|
151
|
+
하나로 가른다. 이유를 한 줄로 남긴다. 축 없이 화면부터 놓으면 형제끼리 기준이 달라진다.
|
|
152
|
+
3. 화면들을 **정보구조 트리에 배치**한다 — [[2t-decencia-channel-ia-v2]] §1·§3·§4.
|
|
150
153
|
배치 기준은 "사용자가 이 화면을 찾을 때 어디를 먼저 클릭하는가"다. **Epic을 그대로 그룹으로 쓰지 않는다.**
|
|
151
|
-
|
|
152
|
-
|
|
154
|
+
⚠️ **route는 여기서 부여하지 않는다** — 트리의 경로를 route로 옮기지 않는다(§4-4). route는 화면을
|
|
155
|
+
만들 때 개발·SEO 제약을 함께 보고 따로 정한다.
|
|
156
|
+
4. [[2t-decencia-channel-ia-v2]] §6 **구조 검증**을 돌린다(축 명시·한 층 한 기준·형제 일관성·
|
|
157
|
+
IA 미배치 0건·탐색 역질문·깊이/폭).
|
|
158
|
+
5. → **[게이트] 사람이 승인한다.** **배치표가 아니라 트리로** 보여준다 — 표에서는 구조가 보이지 않아
|
|
153
159
|
잘못된 배치가 그대로 통과한다. 승인 전에는 아무것도 만들지 않는다.
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
대화에만 남기면 나중에 무엇이 진실인지 판별할 수 없다.
|
|
160
|
+
6. 승인받은 결과를 **저장한다** — `ch ia set --title "정보구조" --file ./ia-tree.json --content ./ia.md`
|
|
161
|
+
([[2t-decencia-channel-ia-v2]] §5). `--file`은 분류 노드·화면 노드로 세운 **트리 JSON**이고,
|
|
162
|
+
`--content`에는 고른 축과 배치 근거를 적는다. 대화에만 남기면 나중에 무엇이 진실인지 판별할 수 없다.
|
|
163
|
+
웹 "IA" 탭에서 같은 트리를 본다.
|
|
157
164
|
- → OK면 8단계.
|
|
158
165
|
|
|
159
166
|
## 8. 화면설계서 — 화면 생성·연결
|
|
@@ -4,12 +4,12 @@ description: |
|
|
|
4
4
|
[2t][v2] 소통채널 화면설계서 작성 가이드.
|
|
5
5
|
화면당 필수 기재항목 6종(ID·화면명·접근권한 / 컴포넌트별 설명 / 액션별 동작·이동 /
|
|
6
6
|
입력 검증 규칙 / 예외상태 4종 / 연결 기획 ID)과 디스크립션 작성규칙(출처까지·결과까지·검증까지·정책은 참조만).
|
|
7
|
-
|
|
7
|
+
화면 구조 뷰(경로 계층)·와이어프레임+디스크립션 좌우 분할 뷰 기준. 정보구조(IA)는 별도 스킬 소관.
|
|
8
8
|
Use when:
|
|
9
9
|
(1) 화면(screens) 문서를 작성·수정할 때,
|
|
10
10
|
(2) 화면의 표시 데이터·액션·입력 검증·예외상태를 기재할 때,
|
|
11
|
-
(3) 웹 "화면" 탭의
|
|
12
|
-
version: 1.
|
|
11
|
+
(3) 웹 "화면" 탭의 화면 구조 뷰·화면 상세에 올릴 내용을 쓸 때.
|
|
12
|
+
version: 1.32.1
|
|
13
13
|
---
|
|
14
14
|
|
|
15
15
|
<!-- ch-version-gate -->
|
|
@@ -29,15 +29,17 @@ ch check
|
|
|
29
29
|
|
|
30
30
|
# 화면설계서 — 작성 표준
|
|
31
31
|
|
|
32
|
-
화면설계서는 화면(screen) 하나가 **무엇을 보여주고, 눌리면 어떻게 되고, 어떤 입력을 어떻게 검증하는지**를 적는 문서다. 웹 "화면" 탭의
|
|
32
|
+
화면설계서는 화면(screen) 하나가 **무엇을 보여주고, 눌리면 어떻게 되고, 어떤 입력을 어떻게 검증하는지**를 적는 문서다. 웹 "화면" 탭의 화면 구조 뷰에서 노드를 클릭하면 보인다.
|
|
33
33
|
|
|
34
34
|
역할 분담: 흐름(시나리오)은 spec([[2t-decencia-channel-spec-v2]] §7), 여정 갈림길은 유저플로우([[2t-decencia-channel-userflow-v2]]), 횡단 정책은 정책정의서([[2t-decencia-channel-policy-v2]]). 화면설계서는 **그 화면 안에서 보이는 것·눌리는 것**만 적는다.
|
|
35
35
|
|
|
36
36
|
> **작성 순서상 ⑤다** — ①기능명세 → ②유저플로우 → ③정책정의서 → DB 스키마 → **④IA 설계**가 끝난 뒤에 화면을 만든다. **spec보다 화면을 먼저 만들지 않는다.** 화면을 만들면서 `ch specs screen-refs <specId> --screens <ids>`로 기존 spec들과 연결하고, 그다음 ⑥검증기준서로 넘어간다.
|
|
37
37
|
>
|
|
38
|
-
> ⚠️
|
|
39
|
-
>
|
|
40
|
-
>
|
|
38
|
+
> ⚠️ **배치는 여기서 정하지 않는다.** 화면이 IA 트리의 어디에 놓이는지는 ④에서 이미 결정돼 있어야
|
|
39
|
+
> 한다 — [[2t-decencia-channel-ia-v2]]. 화면을 만들면서 배치를 즉석에서 정하면 IA가 설계물이 아니라
|
|
40
|
+
> 부산물이 되고, 그 순간 손에 잡히는 분류(Epic)를 근거로 삼게 된다.
|
|
41
|
+
>
|
|
42
|
+
> route는 화면이 갖는 값이라 여기서 적지만, **IA 계층에서 유도하지 않는다.** 둘은 별개다.
|
|
41
43
|
|
|
42
44
|
## 1. 필수 기재항목
|
|
43
45
|
|
|
@@ -74,12 +76,15 @@ ch check
|
|
|
74
76
|
| 에러 | 실패 안내 + 재시도 수단 |
|
|
75
77
|
| 권한 없음 | 차단 화면인지 리다이렉트인지, 안내 문구 |
|
|
76
78
|
|
|
77
|
-
## 4.
|
|
79
|
+
## 4. 화면 구조 뷰 — IA가 아니다
|
|
78
80
|
|
|
79
|
-
- 웹 "화면" 탭은 화면들을
|
|
81
|
+
- 웹 "화면" 탭은 화면들을 **경로 구조**(route 계층)로 보여준다. 목록 줄(트리)과 표, 두 가지다.
|
|
80
82
|
- 노드를 클릭하면 화면 상세가 열린다: **좌측 와이어프레임 뷰 · 우측 디스크립션**(§1 항목들).
|
|
81
83
|
- 트리가 읽히려면 route를 계층적으로 짓는다 (`/store/orders` → `/store/orders/[id]`). 화면 ID 슬러그도 계층을 반영한다.
|
|
82
|
-
-
|
|
84
|
+
- 🚫 **이건 IA가 아니다.** 화면 목록을 경로로 정렬해 훑는 개발자용 그림이다. 정보구조는 **IA 페이지**에 따로 있고,
|
|
85
|
+
거기 트리는 사람이 이름 붙인 분류 노드로 세운다([[2t-decencia-channel-ia-v2]]).
|
|
86
|
+
슬래시 개수는 계층이 아니므로, 이 화면의 깊이를 IA 깊이로 읽지 않는다.
|
|
87
|
+
- 배치가 어색해 보이면 화면을 고치지 말고 ④ IA 설계로 되돌아간다.
|
|
83
88
|
|
|
84
89
|
## 4-1. 와이어프레임 — HTML로 실제 렌더
|
|
85
90
|
|
|
@@ -197,17 +202,17 @@ ch screens update SCR-ORDER-DETAIL \
|
|
|
197
202
|
|
|
198
203
|
전부 ✅가 될 때까지 4를 반복한다. 완성된 대조표가 곧 사람 확인용 증빙이다.
|
|
199
204
|
|
|
200
|
-
###
|
|
205
|
+
### IA 대조도 함께 한다
|
|
201
206
|
|
|
202
|
-
위 대조는 **화면 누락**만 잡는다.
|
|
203
|
-
IA는 낡아 있던 적이 있다. `ch ia get`으로 IA
|
|
207
|
+
위 대조는 **화면 누락**만 잡는다. IA가 낡은 것은 못 잡는다 — 실제로 대조표가 전부 ✅인데
|
|
208
|
+
IA는 낡아 있던 적이 있다. `ch ia get`으로 IA 트리를 받아 두 가지를 더 본다.
|
|
204
209
|
|
|
205
|
-
- [ ]
|
|
206
|
-
|
|
207
|
-
- [ ]
|
|
208
|
-
|
|
210
|
+
- [ ] **IA 미배치 0건** — 트리에 안 들어간 화면이 남아 있는가. 새로 만든 화면이 여기 쌓인다.
|
|
211
|
+
IA 페이지가 따로 모아 보여주므로 눈으로도 확인된다.
|
|
212
|
+
- [ ] **죽은 참조** — 트리의 `screenId`가 전부 실존 화면인가. (서버가 저장 시 막지만, 화면을
|
|
213
|
+
지운 뒤에는 트리에 그대로 남는다)
|
|
209
214
|
|
|
210
|
-
어긋나면 화면이 아니라 **IA를 고친다**([[2t-decencia-channel-ia-v2]] §
|
|
215
|
+
어긋나면 화면이 아니라 **IA를 고친다**([[2t-decencia-channel-ia-v2]] §5의 `ch ia set`).
|
|
211
216
|
|
|
212
217
|
## 6. 흔한 함정
|
|
213
218
|
|
|
@@ -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.
|
|
5
|
+
version: 1.32.1
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
<!-- ch-version-gate -->
|