@decencia/ch-cli 1.29.0 → 1.31.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 (49) hide show
  1. package/agent/2t-decencia-channel-issue-coder.md +1 -1
  2. package/agent/2t-decencia-channel-pr-merger.md +1 -1
  3. package/agent/2t-decencia-channel-terraformer.md +1 -1
  4. package/dist/commands/policies.d.ts +12 -0
  5. package/dist/commands/policies.d.ts.map +1 -0
  6. package/dist/commands/policies.js +302 -0
  7. package/dist/commands/policies.js.map +1 -0
  8. package/dist/commands/screens.d.ts.map +1 -1
  9. package/dist/commands/screens.js +103 -23
  10. package/dist/commands/screens.js.map +1 -1
  11. package/dist/commands/skills.d.ts +13 -0
  12. package/dist/commands/skills.d.ts.map +1 -1
  13. package/dist/commands/skills.js +43 -7
  14. package/dist/commands/skills.js.map +1 -1
  15. package/dist/commands/specs.d.ts +15 -0
  16. package/dist/commands/specs.d.ts.map +1 -1
  17. package/dist/commands/specs.js +117 -10
  18. package/dist/commands/specs.js.map +1 -1
  19. package/dist/commands/sprints.d.ts +16 -0
  20. package/dist/commands/sprints.d.ts.map +1 -1
  21. package/dist/commands/sprints.js +152 -4
  22. package/dist/commands/sprints.js.map +1 -1
  23. package/dist/commands/sqa.d.ts +23 -0
  24. package/dist/commands/sqa.d.ts.map +1 -1
  25. package/dist/commands/sqa.js +252 -6
  26. package/dist/commands/sqa.js.map +1 -1
  27. package/dist/commands/userflows.d.ts +11 -0
  28. package/dist/commands/userflows.d.ts.map +1 -0
  29. package/dist/commands/userflows.js +275 -0
  30. package/dist/commands/userflows.js.map +1 -0
  31. package/dist/index.js +4 -0
  32. package/dist/index.js.map +1 -1
  33. package/package.json +1 -1
  34. package/skill/2t-decencia-channel-change-manager/SKILL.md +1 -1
  35. package/skill/2t-decencia-channel-change-propagation-v2/SKILL.md +11 -7
  36. package/skill/2t-decencia-channel-cli-v2/SKILL.md +48 -20
  37. package/skill/2t-decencia-channel-db-schema-v2/SKILL.md +4 -4
  38. package/skill/2t-decencia-channel-github-issue/SKILL.md +1 -1
  39. package/skill/2t-decencia-channel-orchestrator/SKILL.md +1 -1
  40. package/skill/2t-decencia-channel-policy-v2/SKILL.md +114 -0
  41. package/skill/2t-decencia-channel-prd-v2/SKILL.md +37 -12
  42. package/skill/2t-decencia-channel-project-bootstrap/SKILL.md +22 -25
  43. package/skill/2t-decencia-channel-screen-v2/SKILL.md +135 -0
  44. package/skill/2t-decencia-channel-spec-v2/SKILL.md +288 -443
  45. package/skill/2t-decencia-channel-sprint-builder-v2/SKILL.md +11 -3
  46. package/skill/2t-decencia-channel-sprint-runner/SKILL.md +1 -1
  47. package/skill/2t-decencia-channel-sqa-v2/SKILL.md +124 -21
  48. package/skill/2t-decencia-channel-userflow-v2/SKILL.md +125 -0
  49. package/skill/2t-decencia-channel-work-status-v2/SKILL.md +3 -3
@@ -1,9 +1,58 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseScenarioRefs = parseScenarioRefs;
3
4
  exports.registerSprintsCommand = registerSprintsCommand;
4
5
  const client_1 = require("../client");
5
6
  const output_1 = require("../output");
6
7
  const utils_1 = require("../utils");
8
+ /** 기계 모드(=stdout이 순수 JSON이어야 하는 모드)인지. */
9
+ function isMachineOutput(globalOpts) {
10
+ return !!(globalOpts.json || globalOpts.csv || globalOpts.quiet);
11
+ }
12
+ /**
13
+ * `<sheetId>:<scenarioId>[,...]` 인자를 좌표 배열로 바꾼다
14
+ * (스킬 2t-decencia-channel-sqa-v2 §4.6.5).
15
+ *
16
+ * 콜론이 정확히 하나가 아니면 거절한다. 시트 ID(Firestore 자동 ID)에도 시나리오
17
+ * ID(SCN-001)에도 콜론이 없으니 콜론이 둘이면 오타이고, 앞뒤 아무 쪽으로 갈라
18
+ * 넘겨봐야 엉뚱한 시나리오를 가리킨다.
19
+ *
20
+ * 입력 오류는 throw한다 — 호출부가 failInput으로 받아 종료코드를 세운다.
21
+ */
22
+ function parseScenarioRefs(raw) {
23
+ const FORMAT = '"<sheetId>:<scenarioId>" 형식(쉼표로 여러 개)';
24
+ const tokens = String(raw)
25
+ .split(',')
26
+ .map((s) => s.trim())
27
+ .filter((s) => s.length > 0);
28
+ if (tokens.length === 0) {
29
+ throw new Error(`시나리오를 ${FORMAT}으로 지정하세요.`);
30
+ }
31
+ return tokens.map((token) => {
32
+ const parts = token.split(':');
33
+ const [sheetId, scenarioId] = parts.map((p) => p.trim());
34
+ if (parts.length !== 2 || !sheetId || !scenarioId) {
35
+ throw new Error(`시나리오는 ${FORMAT}이어야 합니다. 받은 값: "${token}"`);
36
+ }
37
+ return { sheetId, scenarioId };
38
+ });
39
+ }
40
+ /**
41
+ * 진행률 응답의 시나리오 현황을 사람용 한 줄로. 시나리오는 Sprint 완료조건이라
42
+ * 진행률 percentage에 섞이지 않는다 — 따로 보여야 "TC는 다 됐는데 시나리오가 남았다"가 보인다.
43
+ * 시나리오를 쓰지 않는(서버가 키를 안 주는) 프로젝트에는 아무 줄도 내지 않는다.
44
+ */
45
+ function printScenarioProgress(progress) {
46
+ const s = progress?.scenarios;
47
+ if (!s || typeof s !== 'object')
48
+ return;
49
+ const total = Number(s.total ?? 0);
50
+ if (total === 0) {
51
+ (0, output_1.printInfo)('시나리오(Sprint 완료조건): 배정된 시나리오 없음');
52
+ return;
53
+ }
54
+ (0, output_1.printInfo)(`시나리오(Sprint 완료조건): ${Number(s.passed ?? 0)}/${total} 통과`);
55
+ }
7
56
  function registerSprintsCommand(program) {
8
57
  const sprints = program
9
58
  .command('sprints')
@@ -38,13 +87,27 @@ function registerSprintsCommand(program) {
38
87
  // ch sprints get
39
88
  sprints
40
89
  .command('get <sprintId>')
41
- .description('스프린트 상세 조회')
90
+ .description('스프린트 상세 조회 (배정 시나리오·통과 현황 포함)')
42
91
  .action(async (sprintId) => {
43
92
  const globalOpts = program.opts();
44
93
  try {
45
94
  const client = (0, client_1.createClient)({ projectId: globalOpts.project });
46
95
  const { data } = await client.get(`/sprints/${sprintId}`);
47
- (0, output_1.formatOutput)(data, globalOpts);
96
+ const refs = Array.isArray(data?.relatedScenarios)
97
+ ? data.relatedScenarios
98
+ : [];
99
+ if (isMachineOutput(globalOpts) || refs.length === 0) {
100
+ (0, output_1.formatOutput)(data, globalOpts);
101
+ return;
102
+ }
103
+ // 사람용: 배정 시나리오는 key-value 표에 원문 JSON으로 쏟지 않고 표로 낸다.
104
+ const { relatedScenarios: _refs, ...rest } = data;
105
+ (0, output_1.formatOutput)(rest, globalOpts);
106
+ printScenarioProgress(data?.progress);
107
+ (0, output_1.printTable)(['sheetId', 'scenarioId'], refs.map((r) => [
108
+ String(r?.sheetId ?? ''),
109
+ String(r?.scenarioId ?? ''),
110
+ ]));
48
111
  }
49
112
  catch (error) {
50
113
  // Error already handled
@@ -273,6 +336,84 @@ function registerSprintsCommand(program) {
273
336
  // Error already handled
274
337
  }
275
338
  });
339
+ // ch sprints add-scenarios (add-specs 와 대칭 — E20 검증 시나리오)
340
+ const SCENARIO_REF_HELP = `
341
+ 시나리오 좌표는 "<sheetId>:<scenarioId>" 이며 쉼표로 여러 개를 넘긴다:
342
+ ch sprints add-scenarios <sprintId> sheet-abc:SCN-001,sheet-abc:SCN-002
343
+
344
+ 시나리오 id는 시트 안에서만 유일해서 시트 ID와 짝이어야 한다.
345
+ ID는 'ch sqa get <sheetId> --json'의 scenarios[].id에서 확인한다.
346
+ 실존하지 않는 좌표가 하나라도 있으면 서버가 400으로 거절한다(끊긴 링크 방지).
347
+
348
+ Sprint 완료조건: Story(spec) 완료는 TC 통과지만, Sprint 완료는 배정된 시나리오가
349
+ 전부 통과하는 것이다 (스킬 sqa-v2 §4.6.3). 현황은 'ch sprints progress'로 본다.
350
+ `;
351
+ sprints
352
+ .command('add-scenarios <sprintId> <scenarioRefs>')
353
+ .description('스프린트에 검증 시나리오 배정 (<sheetId>:<scenarioId> 쉼표 구분 — Sprint 완료조건)')
354
+ .addHelpText('after', SCENARIO_REF_HELP)
355
+ .action(async (sprintId, scenarioRefs) => {
356
+ const globalOpts = program.opts();
357
+ try {
358
+ let scenarios;
359
+ try {
360
+ scenarios = parseScenarioRefs(scenarioRefs);
361
+ }
362
+ catch (e) {
363
+ (0, output_1.failInput)(e?.message ?? String(e));
364
+ return;
365
+ }
366
+ if (globalOpts.dryRun) {
367
+ (0, output_1.printInfo)(`[DRY-RUN] 스프린트 "${sprintId}"에 시나리오 ${scenarios.length}건 배정 요청`);
368
+ return;
369
+ }
370
+ const client = (0, client_1.createClient)({ projectId: globalOpts.project });
371
+ const { data } = await client.post(`/sprints/${sprintId}/scenarios`, {
372
+ scenarios,
373
+ });
374
+ // 기계 모드에서는 서버 응답을 stdout에 순수 JSON으로 남겨 JSON.parse가 되게 한다.
375
+ if (isMachineOutput(globalOpts)) {
376
+ (0, output_1.formatOutput)(data, globalOpts);
377
+ }
378
+ (0, output_1.printSuccess)('검증 시나리오가 스프린트에 배정되었습니다.');
379
+ }
380
+ catch (error) {
381
+ // Error already handled
382
+ }
383
+ });
384
+ // ch sprints remove-scenarios (remove-specs 와 대칭)
385
+ sprints
386
+ .command('remove-scenarios <sprintId> <scenarioRefs>')
387
+ .description('스프린트에서 검증 시나리오 배정 해제 (<sheetId>:<scenarioId> 쉼표 구분)')
388
+ .addHelpText('after', SCENARIO_REF_HELP)
389
+ .action(async (sprintId, scenarioRefs) => {
390
+ const globalOpts = program.opts();
391
+ try {
392
+ let scenarios;
393
+ try {
394
+ scenarios = parseScenarioRefs(scenarioRefs);
395
+ }
396
+ catch (e) {
397
+ (0, output_1.failInput)(e?.message ?? String(e));
398
+ return;
399
+ }
400
+ if (globalOpts.dryRun) {
401
+ (0, output_1.printInfo)(`[DRY-RUN] 스프린트 "${sprintId}" 시나리오 ${scenarios.length}건 해제 요청`);
402
+ return;
403
+ }
404
+ const client = (0, client_1.createClient)({ projectId: globalOpts.project });
405
+ const { data } = await client.delete(`/sprints/${sprintId}/scenarios`, {
406
+ data: { scenarios },
407
+ });
408
+ if (isMachineOutput(globalOpts)) {
409
+ (0, output_1.formatOutput)(data, globalOpts);
410
+ }
411
+ (0, output_1.printSuccess)('검증 시나리오 배정이 해제되었습니다.');
412
+ }
413
+ catch (error) {
414
+ // Error already handled
415
+ }
416
+ });
276
417
  // ch sprints delete
277
418
  sprints
278
419
  .command('delete <sprintId>')
@@ -295,13 +436,20 @@ function registerSprintsCommand(program) {
295
436
  // ch sprints progress
296
437
  sprints
297
438
  .command('progress <sprintId>')
298
- .description('스프린트 진행률 조회')
439
+ .description('스프린트 진행률 + 시나리오 통과 현황(완료조건) 조회')
299
440
  .action(async (sprintId) => {
300
441
  const globalOpts = program.opts();
301
442
  try {
302
443
  const client = (0, client_1.createClient)({ projectId: globalOpts.project });
303
444
  const { data } = await client.get(`/sprints/${sprintId}/progress`);
304
- (0, output_1.formatOutput)(data, globalOpts);
445
+ if (isMachineOutput(globalOpts) || !data?.scenarios) {
446
+ (0, output_1.formatOutput)(data, globalOpts);
447
+ return;
448
+ }
449
+ // 사람용: {"passed":2,"total":5} 대신 읽히는 한 줄로.
450
+ const { scenarios: _scenarios, ...rest } = data;
451
+ (0, output_1.formatOutput)(rest, globalOpts);
452
+ printScenarioProgress(data);
305
453
  }
306
454
  catch (error) {
307
455
  // Error already handled
@@ -1 +1 @@
1
- {"version":3,"file":"sprints.js","sourceRoot":"","sources":["../../src/commands/sprints.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sprints.js","sourceRoot":"","sources":["../../src/commands/sprints.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,26 @@
1
1
  import { Command } from 'commander';
2
+ /** 시나리오가 판정을 기록하는 TC id 전부 (steps[].tcRefs + closingTcRef). */
3
+ export declare function collectScenarioTcRefs(scenario: any): string[];
4
+ export interface ScenarioRunStatus {
5
+ id: string;
6
+ name: string;
7
+ /** 매핑 TC 중 Pass 개수 */
8
+ passedTcs: number;
9
+ /** 매핑 TC 총 개수 */
10
+ totalTcs: number;
11
+ passed: boolean;
12
+ }
13
+ /**
14
+ * Run 스냅샷의 시나리오별 통과 현황을 계산한다.
15
+ *
16
+ * 시나리오 자체는 결과를 갖지 않는다 — "판정·기록은 TC 단위"라서, 통과 = 매핑된 TC가
17
+ * 전부 Pass(result='yes')다. 매핑 TC가 하나도 없거나 Run 항목에 없는 id를 가리키면
18
+ * 미통과로 센다. 통과로 세면 검증 없이 Sprint가 닫힌다.
19
+ *
20
+ * 판정 규칙은 ch-api `SqaService.getScenarioPassStatus`와 같아야 한다. 여기서 다시
21
+ * 계산하는 이유는 `/sqa/runs/:runId/summary`가 시나리오를 싣지 않기 때문이다
22
+ * (Sprint 쪽 현황은 서버가 계산한 값을 그대로 쓴다 — `ch sprints progress`).
23
+ */
24
+ export declare function computeScenarioRunStatus(scenarios: any[], runItems: any[]): ScenarioRunStatus[];
2
25
  export declare function registerSqaCommand(program: Command): void;
3
26
  //# sourceMappingURL=sqa.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sqa.d.ts","sourceRoot":"","sources":["../../src/commands/sqa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAslBzD"}
1
+ {"version":3,"file":"sqa.d.ts","sourceRoot":"","sources":["../../src/commands/sqa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6CpC,+DAA+D;AAC/D,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,GAAG,GAAG,MAAM,EAAE,CAU7D;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,GAAG,EAAE,EAChB,QAAQ,EAAE,GAAG,EAAE,GACd,iBAAiB,EAAE,CAmBrB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmzBzD"}
@@ -36,12 +36,80 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.collectScenarioTcRefs = collectScenarioTcRefs;
40
+ exports.computeScenarioRunStatus = computeScenarioRunStatus;
39
41
  exports.registerSqaCommand = registerSqaCommand;
40
42
  const fs = __importStar(require("fs"));
41
43
  const path = __importStar(require("path"));
42
44
  const form_data_1 = __importDefault(require("form-data"));
43
45
  const client_1 = require("../client");
44
46
  const output_1 = require("../output");
47
+ const utils_1 = require("../utils");
48
+ // ══════════════════════════════════════════════════
49
+ // 시나리오 검증 (E20) 헬퍼
50
+ // 계약 SSOT: 스킬 2t-decencia-channel-sqa-v2 §4.6 / ch-api /sqa/:id/scenarios
51
+ // ══════════════════════════════════════════════════
52
+ /** 기계 모드(=stdout이 순수 JSON이어야 하는 모드)인지. */
53
+ function isMachineOutput(globalOpts) {
54
+ return !!(globalOpts.json || globalOpts.csv || globalOpts.quiet);
55
+ }
56
+ /**
57
+ * scenario.json을 읽어 요청 바디로 만든다 (BOM·CRLF 정제는 readJsonFile이 수행).
58
+ *
59
+ * 필드 검증은 서버 DTO(CreateSqaScenarioDto)가 한다 — 여기서 한 벌 더 검사하면
60
+ * 규칙이 두 곳에 살게 되어 어긋난다. CLI가 거르는 것은 "요청을 보낼 수조차 없는"
61
+ * 입력(파일 없음·JSON 깨짐·객체가 아님)뿐이다.
62
+ *
63
+ * 입력 오류는 throw한다 — 호출부가 failInput으로 받아 종료코드를 세운다.
64
+ */
65
+ function readScenarioFile(filePath) {
66
+ const parsed = (0, utils_1.readJsonFile)(filePath, '--file');
67
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
68
+ throw new Error('--file: 시나리오 객체 하나의 JSON이어야 합니다 (스킬 sqa-v2 §4.6.5 양식: id·name·precondition·steps[]·closing).');
69
+ }
70
+ return parsed;
71
+ }
72
+ /** 시나리오가 판정을 기록하는 TC id 전부 (steps[].tcRefs + closingTcRef). */
73
+ function collectScenarioTcRefs(scenario) {
74
+ const steps = Array.isArray(scenario?.steps) ? scenario.steps : [];
75
+ const refs = [];
76
+ for (const step of steps) {
77
+ if (Array.isArray(step?.tcRefs)) {
78
+ refs.push(...step.tcRefs.map((id) => String(id)));
79
+ }
80
+ }
81
+ if (scenario?.closingTcRef)
82
+ refs.push(String(scenario.closingTcRef));
83
+ return refs;
84
+ }
85
+ /**
86
+ * Run 스냅샷의 시나리오별 통과 현황을 계산한다.
87
+ *
88
+ * 시나리오 자체는 결과를 갖지 않는다 — "판정·기록은 TC 단위"라서, 통과 = 매핑된 TC가
89
+ * 전부 Pass(result='yes')다. 매핑 TC가 하나도 없거나 Run 항목에 없는 id를 가리키면
90
+ * 미통과로 센다. 통과로 세면 검증 없이 Sprint가 닫힌다.
91
+ *
92
+ * 판정 규칙은 ch-api `SqaService.getScenarioPassStatus`와 같아야 한다. 여기서 다시
93
+ * 계산하는 이유는 `/sqa/runs/:runId/summary`가 시나리오를 싣지 않기 때문이다
94
+ * (Sprint 쪽 현황은 서버가 계산한 값을 그대로 쓴다 — `ch sprints progress`).
95
+ */
96
+ function computeScenarioRunStatus(scenarios, runItems) {
97
+ const resultById = new Map((Array.isArray(runItems) ? runItems : []).map((item) => [
98
+ String(item?.id),
99
+ item?.result,
100
+ ]));
101
+ return scenarios.map((scenario) => {
102
+ const tcIds = collectScenarioTcRefs(scenario);
103
+ const passedTcs = tcIds.filter((id) => resultById.get(id) === 'yes').length;
104
+ return {
105
+ id: String(scenario?.id ?? ''),
106
+ name: String(scenario?.name ?? ''),
107
+ passedTcs,
108
+ totalTcs: tcIds.length,
109
+ passed: tcIds.length > 0 && passedTcs === tcIds.length,
110
+ };
111
+ });
112
+ }
45
113
  function registerSqaCommand(program) {
46
114
  const sqa = program
47
115
  .command('sqa')
@@ -76,13 +144,33 @@ function registerSqaCommand(program) {
76
144
  // ch sqa get <sheetId> — 시트 상세
77
145
  sqa
78
146
  .command('get <sheetId>')
79
- .description('SQA 시트 상세 조회')
147
+ .description('SQA 시트 상세 조회 (항목 + 검증 시나리오)')
80
148
  .action(async (sheetId) => {
81
149
  const globalOpts = program.opts();
82
150
  try {
83
151
  const client = (0, client_1.createClient)({ projectId: globalOpts.project });
84
152
  const { data } = await client.get(`/sqa/${sheetId}`);
85
- (0, output_1.formatOutput)(data, globalOpts);
153
+ const scenarios = Array.isArray(data?.scenarios)
154
+ ? data.scenarios
155
+ : [];
156
+ // 기계 모드는 서버 응답을 그대로 넘긴다 — Read-before-Write가 이 JSON의
157
+ // scenarios[]를 편집해 update-scenario에 다시 넣는다.
158
+ if (isMachineOutput(globalOpts) || scenarios.length === 0) {
159
+ (0, output_1.formatOutput)(data, globalOpts);
160
+ return;
161
+ }
162
+ // 사람용: 시나리오는 key-value 표에 원문 JSON으로 쏟지 않고 한 눈에 보이는
163
+ // 표로 따로 낸다. 전제·스텝 본문까지 필요하면 --json으로 본다.
164
+ const { scenarios: _scenarios, ...rest } = data;
165
+ (0, output_1.formatOutput)(rest, globalOpts);
166
+ (0, output_1.printInfo)(`검증 시나리오 ${scenarios.length}건 (Sprint 완료조건) — 전제·스텝·종료 본문은 --json으로 확인`);
167
+ (0, output_1.printTable)(['id', 'name', 'steps', 'TCs', 'userflow'], scenarios.map((s) => [
168
+ String(s?.id ?? ''),
169
+ String(s?.name ?? ''),
170
+ String(Array.isArray(s?.steps) ? s.steps.length : 0),
171
+ String(collectScenarioTcRefs(s).length),
172
+ String(s?.userflowRef ?? ''),
173
+ ]));
86
174
  }
87
175
  catch (error) {
88
176
  // Error already handled
@@ -345,6 +433,135 @@ function registerSqaCommand(program) {
345
433
  }
346
434
  });
347
435
  // ══════════════════════════════════════════════════
436
+ // Scenario (검증 시나리오) commands — 스킬 sqa-v2 §4.6
437
+ // ══════════════════════════════════════════════════
438
+ const SCENARIO_FILE_HELP = `
439
+ --file <경로> — 시나리오 한 건의 JSON (스킬 2t-decencia-channel-sqa-v2 §4.6.5):
440
+ {
441
+ "id": "SCN-001",
442
+ "name": "주문 → 결제 → 취소 환불",
443
+ "userflowRef": "<userflowId>", // 선택
444
+ "precondition": "일반 회원, 포인트 5,000, 재고 3",
445
+ "steps": [
446
+ { "action": "...", "checkpoint": "...", "tcRefs": ["item-..."] }
447
+ ],
448
+ "closing": "ORDERS canceled, 포인트 5,000, 재고 3",
449
+ "closingTcRef": "item-..." // 선택
450
+ }
451
+
452
+ BOM·CRLF는 자동 정제된다 (PowerShell Out-File 호환).
453
+ tcRefs·closingTcRef는 **같은 시트의 항목 id**여야 하고 userflowRef는 실존
454
+ 유저플로우여야 한다 — 아니면 서버가 400으로 거절한다(끊긴 링크 방지).
455
+ 항목 id는 'ch sqa get <sheetId> --json'의 items[].id에서 확인한다.
456
+ `;
457
+ // ch sqa add-scenario <sheetId> — 시트에 검증 시나리오 추가
458
+ sqa
459
+ .command('add-scenario <sheetId>')
460
+ .description('SQA 시트에 검증 시나리오 추가 (Sprint 완료조건)')
461
+ .requiredOption('--file <filePath>', '시나리오 JSON 파일 경로')
462
+ .addHelpText('after', SCENARIO_FILE_HELP)
463
+ .action(async (sheetId, options) => {
464
+ const globalOpts = program.opts();
465
+ try {
466
+ let body;
467
+ try {
468
+ body = readScenarioFile(options.file);
469
+ }
470
+ catch (e) {
471
+ (0, output_1.failInput)(e?.message ?? String(e));
472
+ return;
473
+ }
474
+ // 파일을 먼저 읽고 dry-run을 판정한다 — 깨진 파일이 --dry-run에서 통과하면
475
+ // 정작 실행할 때 실패한다.
476
+ if (globalOpts.dryRun) {
477
+ (0, output_1.printInfo)(`[DRY-RUN] SQA 시트 "${sheetId}"에 시나리오 "${body.id ?? ''}" 추가 요청`);
478
+ return;
479
+ }
480
+ const client = (0, client_1.createClient)({ projectId: globalOpts.project });
481
+ const { data } = await client.post(`/sqa/${sheetId}/scenarios`, body);
482
+ (0, output_1.formatOutput)(data, globalOpts);
483
+ (0, output_1.printSuccess)('검증 시나리오가 추가되었습니다.');
484
+ }
485
+ catch (error) {
486
+ // Error already handled
487
+ }
488
+ });
489
+ // ch sqa update-scenario <sheetId> <scenarioId> — 시나리오 수정
490
+ sqa
491
+ .command('update-scenario <sheetId> <scenarioId>')
492
+ .description('SQA 검증 시나리오 수정 (보낸 필드만 변경, steps는 통째 교체)')
493
+ .requiredOption('--file <filePath>', '시나리오 JSON 파일 경로')
494
+ .addHelpText('after', `${SCENARIO_FILE_HELP}
495
+ 수정은 Read-before-Write:
496
+ steps는 부분 병합이 아니라 통째 교체다. 먼저 'ch sqa get <sheetId> --json'으로
497
+ 현재 scenarios[]를 받아 편집한 뒤 그 객체 전체를 넘긴다.
498
+
499
+ 시나리오 ID는 불변이다 — Sprint의 배정이 (sheetId, scenarioId)로 붙잡고 있어서
500
+ 바꾸면 그 연결이 조용히 끊긴다. 파일의 "id"는 전송하지 않으며, 인자와 다르면
501
+ 경고만 남긴다. 다른 ID가 필요하면 지우고 다시 만든다.
502
+ `)
503
+ .action(async (sheetId, scenarioId, options) => {
504
+ const globalOpts = program.opts();
505
+ try {
506
+ let body;
507
+ try {
508
+ body = readScenarioFile(options.file);
509
+ }
510
+ catch (e) {
511
+ (0, output_1.failInput)(e?.message ?? String(e));
512
+ return;
513
+ }
514
+ // id는 서버 DTO(UpdateSqaScenarioDto)에 없는 필드다. Read-before-Write로 받은
515
+ // 객체에는 id가 들어 있으니 여기서 떼어낸다. 인자와 다르면 개명 의도일 텐데
516
+ // 그건 이 명령이 하지 못하는 일이라 조용히 넘기지 않고 알린다.
517
+ if ('id' in body) {
518
+ if (String(body.id) !== scenarioId) {
519
+ (0, output_1.printWarning)(`파일의 id("${body.id}")가 인자("${scenarioId}")와 다릅니다 — 시나리오 ID는 변경되지 않습니다. 개명하려면 delete-scenario 후 add-scenario 하세요.`);
520
+ }
521
+ delete body.id;
522
+ }
523
+ if (Object.keys(body).length === 0) {
524
+ (0, output_1.failInput)('수정할 필드가 없습니다 (파일에 id 외의 필드를 담으세요).');
525
+ return;
526
+ }
527
+ if (globalOpts.dryRun) {
528
+ (0, output_1.printInfo)(`[DRY-RUN] SQA 시트 "${sheetId}" 시나리오 "${scenarioId}" 수정 요청`);
529
+ return;
530
+ }
531
+ const client = (0, client_1.createClient)({ projectId: globalOpts.project });
532
+ const { data } = await client.patch(`/sqa/${sheetId}/scenarios/${scenarioId}`, body);
533
+ (0, output_1.formatOutput)(data, globalOpts);
534
+ (0, output_1.printSuccess)('검증 시나리오가 수정되었습니다.');
535
+ }
536
+ catch (error) {
537
+ // Error already handled
538
+ }
539
+ });
540
+ // ch sqa delete-scenario <sheetId> <scenarioId> — 시나리오 삭제
541
+ sqa
542
+ .command('delete-scenario <sheetId> <scenarioId>')
543
+ .description('SQA 검증 시나리오 삭제')
544
+ .action(async (sheetId, scenarioId) => {
545
+ const globalOpts = program.opts();
546
+ try {
547
+ if (globalOpts.dryRun) {
548
+ (0, output_1.printInfo)(`[DRY-RUN] SQA 시트 "${sheetId}" 시나리오 "${scenarioId}" 삭제 요청`);
549
+ return;
550
+ }
551
+ const client = (0, client_1.createClient)({ projectId: globalOpts.project });
552
+ const { data } = await client.delete(`/sqa/${sheetId}/scenarios/${scenarioId}`);
553
+ // 기계 모드에서는 서버 응답을 stdout에 순수 JSON으로 남겨 JSON.parse가 되게 한다.
554
+ // 사람용(표) 모드에서는 성공 한 줄이면 충분하다.
555
+ if (isMachineOutput(globalOpts)) {
556
+ (0, output_1.formatOutput)(data, globalOpts);
557
+ }
558
+ (0, output_1.printSuccess)('검증 시나리오가 삭제되었습니다.');
559
+ }
560
+ catch (error) {
561
+ // Error already handled
562
+ }
563
+ });
564
+ // ══════════════════════════════════════════════════
348
565
  // Run (수행) commands
349
566
  // ══════════════════════════════════════════════════
350
567
  // ch sqa start-run <sheetId> — 시트 기반 수행 시작
@@ -491,16 +708,45 @@ function registerSqaCommand(program) {
491
708
  // Error already handled
492
709
  }
493
710
  });
494
- // ch sqa summary <runId> — 수행 집계
711
+ // ch sqa summary <runId> — 수행 집계 (+ 시나리오 통과 현황)
495
712
  sqa
496
713
  .command('summary <runId>')
497
- .description('SQA 수행 Pass/Fail 집계 조회')
714
+ .description('SQA 수행 Pass/Fail 집계 + 시나리오 통과 현황 조회')
498
715
  .action(async (runId) => {
499
716
  const globalOpts = program.opts();
500
717
  try {
501
718
  const client = (0, client_1.createClient)({ projectId: globalOpts.project });
502
- const { data } = await client.get(`/sqa/runs/${runId}/summary`);
503
- (0, output_1.formatOutput)(data, globalOpts);
719
+ // 집계 엔드포인트는 TC만 센다. 시나리오 통과 현황은 Run 상세의 스냅샷
720
+ // (run.scenarios) 항목 결과로 여기서 계산한다. 두 요청을 병렬로 묶지
721
+ // 않는 것은 없는 runId일 때 같은 404를 두 번 찍지 않으려는 것이다.
722
+ const { data: summary } = await client.get(`/sqa/runs/${runId}/summary`);
723
+ const { data: run } = await client.get(`/sqa/runs/${runId}`);
724
+ const scenarios = Array.isArray(run?.scenarios)
725
+ ? run.scenarios
726
+ : [];
727
+ // 시나리오가 없는 Run의 출력은 종전 그대로다 — 안 쓰는 프로젝트에 없던 키를
728
+ // 들이밀지 않는다.
729
+ if (scenarios.length === 0) {
730
+ (0, output_1.formatOutput)(summary, globalOpts);
731
+ return;
732
+ }
733
+ const statuses = computeScenarioRunStatus(scenarios, run?.items ?? []);
734
+ const passed = statuses.filter((s) => s.passed).length;
735
+ if (isMachineOutput(globalOpts)) {
736
+ (0, output_1.formatOutput)({
737
+ ...summary,
738
+ scenarios: { passed, total: statuses.length, items: statuses },
739
+ }, globalOpts);
740
+ return;
741
+ }
742
+ (0, output_1.formatOutput)(summary, globalOpts);
743
+ (0, output_1.printInfo)(`시나리오 통과 ${passed}/${statuses.length} — 시나리오 통과 = 매핑 TC 전부 Pass (Sprint 완료조건)`);
744
+ (0, output_1.printTable)(['id', 'name', 'TC(Pass/전체)', '통과'], statuses.map((s) => [
745
+ s.id,
746
+ s.name,
747
+ `${s.passedTcs}/${s.totalTcs}`,
748
+ s.passed ? 'Y' : 'N',
749
+ ]));
504
750
  }
505
751
  catch (error) {
506
752
  // Error already handled