@decencia/ch-cli 1.3.6 → 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 (31) hide show
  1. package/dist/commands/check.d.ts +3 -0
  2. package/dist/commands/check.d.ts.map +1 -0
  3. package/dist/commands/check.js +189 -0
  4. package/dist/commands/check.js.map +1 -0
  5. package/dist/commands/setup-skill.d.ts.map +1 -1
  6. package/dist/commands/setup-skill.js +47 -10
  7. package/dist/commands/setup-skill.js.map +1 -1
  8. package/dist/index.js +2 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/skill-meta.d.ts +2 -0
  11. package/dist/skill-meta.d.ts.map +1 -0
  12. package/dist/skill-meta.js +15 -0
  13. package/dist/skill-meta.js.map +1 -0
  14. package/package.json +3 -2
  15. package/skill/2t-decencia-channel-change-manager/SKILL.md +73 -0
  16. package/skill/2t-decencia-channel-change-propagation-v2/SKILL.md +401 -0
  17. package/skill/2t-decencia-channel-cli-v2/SKILL.md +194 -0
  18. package/skill/2t-decencia-channel-db-schema-v2/SKILL.md +313 -0
  19. package/skill/2t-decencia-channel-github-issue/SKILL.md +116 -0
  20. package/skill/2t-decencia-channel-orchestrator/SKILL.md +64 -0
  21. package/skill/2t-decencia-channel-prd-v2/SKILL.md +73 -0
  22. package/skill/2t-decencia-channel-project-bootstrap/SKILL.md +68 -0
  23. package/skill/2t-decencia-channel-spec-v2/SKILL.md +463 -0
  24. package/skill/2t-decencia-channel-sprint-builder-v2/SKILL.md +77 -0
  25. package/skill/2t-decencia-channel-sqa-v2/SKILL.md +422 -0
  26. package/skill/2t-decencia-channel-work-status-v2/SKILL.md +189 -0
  27. package/dist/commands/invitations.d.ts +0 -3
  28. package/dist/commands/invitations.d.ts.map +0 -1
  29. package/dist/commands/invitations.js +0 -48
  30. package/dist/commands/invitations.js.map +0 -1
  31. package/skill/SKILL.md +0 -500
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerCheckCommand(program: Command): void;
3
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0EpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiH3D"}
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.registerCheckCommand = registerCheckCommand;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ const child_process_1 = require("child_process");
41
+ const output_1 = require("../output");
42
+ const skill_meta_1 = require("../skill-meta");
43
+ const PKG_NAME = '@decencia/ch-cli';
44
+ function readCliVersion() {
45
+ try {
46
+ const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, '..', '..', 'package.json'), 'utf-8'));
47
+ return pkg.version || '0.0.0';
48
+ }
49
+ catch {
50
+ return '0.0.0';
51
+ }
52
+ }
53
+ // Query npm registry for the latest published version. Returns null when the
54
+ // registry is unreachable (offline / blocked) so the caller can pass non-blocking.
55
+ function fetchLatestVersion() {
56
+ try {
57
+ const out = (0, child_process_1.execSync)(`npm view ${PKG_NAME} version`, {
58
+ encoding: 'utf-8',
59
+ timeout: 20000,
60
+ stdio: ['ignore', 'pipe', 'ignore'],
61
+ });
62
+ return out.trim() || null;
63
+ }
64
+ catch {
65
+ return null;
66
+ }
67
+ }
68
+ // Skills bundled with this package (skill/<name>/SKILL.md).
69
+ function listBundledSkills() {
70
+ const root = path.join(__dirname, '..', '..', 'skill');
71
+ if (!fs.existsSync(root))
72
+ return [];
73
+ return fs
74
+ .readdirSync(root, { withFileTypes: true })
75
+ .filter((e) => e.isDirectory() && fs.existsSync(path.join(root, e.name, 'SKILL.md')))
76
+ .map((e) => e.name);
77
+ }
78
+ function parseFrontmatterVersion(file) {
79
+ try {
80
+ const lines = fs.readFileSync(file, 'utf-8').split(/\r?\n/);
81
+ if (lines[0].trim() !== '---')
82
+ return null;
83
+ for (let i = 1; i < lines.length; i++) {
84
+ if (lines[i].trim() === '---')
85
+ break;
86
+ const m = /^version:\s*(.+?)\s*$/.exec(lines[i]);
87
+ if (m)
88
+ return m[1].trim();
89
+ }
90
+ }
91
+ catch {
92
+ /* ignore */
93
+ }
94
+ return null;
95
+ }
96
+ // Compare two dotted versions. Returns 1 / 0 / -1.
97
+ function cmpSemver(a, b) {
98
+ const pa = a.split('.').map((n) => parseInt(n, 10) || 0);
99
+ const pb = b.split('.').map((n) => parseInt(n, 10) || 0);
100
+ for (let i = 0; i < 3; i++) {
101
+ const d = (pa[i] || 0) - (pb[i] || 0);
102
+ if (d !== 0)
103
+ return d > 0 ? 1 : -1;
104
+ }
105
+ return 0;
106
+ }
107
+ function registerCheckCommand(program) {
108
+ program
109
+ .command('check')
110
+ .description('CLI·스킬이 최신 버전인지 검사 (구버전이면 exit code 1)')
111
+ .action((_opts, cmd) => {
112
+ const json = !!cmd.optsWithGlobals().json;
113
+ const cliVersion = readCliVersion();
114
+ const latest = fetchLatestVersion();
115
+ // Offline / registry unreachable → non-blocking pass with a warning.
116
+ if (latest === null) {
117
+ if (json) {
118
+ console.log(JSON.stringify({ ok: true, networkOk: false, cliVersion, latestVersion: null }, null, 2));
119
+ }
120
+ else {
121
+ (0, output_1.printWarning)('최신 버전을 확인할 수 없습니다 (네트워크/npm 접근 불가). 버전 검사를 건너뜁니다.');
122
+ (0, output_1.printInfo)(`현재 CLI: ${cliVersion}`);
123
+ }
124
+ return; // exit 0
125
+ }
126
+ const cliOutdated = cmpSemver(cliVersion, latest) < 0;
127
+ const skillsRoot = path.join(os.homedir(), '.claude', 'skills');
128
+ const missingSkills = [];
129
+ const staleSkills = [];
130
+ for (const name of listBundledSkills()) {
131
+ const installed = path.join(skillsRoot, name, 'SKILL.md');
132
+ if (!fs.existsSync(installed)) {
133
+ missingSkills.push(name);
134
+ continue;
135
+ }
136
+ const v = parseFrontmatterVersion(installed);
137
+ if (v === null || cmpSemver(v, latest) < 0) {
138
+ staleSkills.push({ name, version: v });
139
+ }
140
+ }
141
+ // Superseded v1 skills still present on disk → agents could load them.
142
+ const deprecatedPresent = skill_meta_1.DEPRECATED_SKILLS.filter((name) => fs.existsSync(path.join(skillsRoot, name, 'SKILL.md')));
143
+ const ok = !cliOutdated &&
144
+ missingSkills.length === 0 &&
145
+ staleSkills.length === 0 &&
146
+ deprecatedPresent.length === 0;
147
+ if (json) {
148
+ console.log(JSON.stringify({
149
+ ok,
150
+ networkOk: true,
151
+ cliVersion,
152
+ latestVersion: latest,
153
+ cliOutdated,
154
+ missingSkills,
155
+ staleSkills,
156
+ deprecatedPresent,
157
+ }, null, 2));
158
+ if (!ok)
159
+ process.exit(1);
160
+ return;
161
+ }
162
+ if (ok) {
163
+ (0, output_1.printSuccess)(`최신 상태입니다. (CLI ${cliVersion}, 스킬 ${listBundledSkills().length}개 모두 최신)`);
164
+ return;
165
+ }
166
+ (0, output_1.printError)(`구버전이 감지되었습니다. npm 최신 버전: ${latest}`);
167
+ if (cliOutdated) {
168
+ (0, output_1.printWarning)(`• CLI 구버전 (현재 ${cliVersion} → 최신 ${latest})`);
169
+ (0, output_1.printInfo)(' → npm install -g @decencia/ch-cli@latest');
170
+ }
171
+ if (missingSkills.length > 0) {
172
+ (0, output_1.printWarning)(`• 미설치 스킬 ${missingSkills.length}개: ${missingSkills.join(', ')}`);
173
+ }
174
+ if (staleSkills.length > 0) {
175
+ (0, output_1.printWarning)(`• 구버전 스킬 ${staleSkills.length}개: ` +
176
+ staleSkills.map((s) => `${s.name}(${s.version || '없음'})`).join(', '));
177
+ }
178
+ if (deprecatedPresent.length > 0) {
179
+ (0, output_1.printWarning)(`• 폐기된 v1 스킬 잔존 ${deprecatedPresent.length}개: ${deprecatedPresent.join(', ')}`);
180
+ }
181
+ if (missingSkills.length > 0 ||
182
+ staleSkills.length > 0 ||
183
+ deprecatedPresent.length > 0) {
184
+ (0, output_1.printInfo)(' → (CLI 최신화 후) ch setup-skill');
185
+ }
186
+ process.exit(1);
187
+ });
188
+ }
189
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"setup-skill.d.ts","sourceRoot":"","sources":["../../src/commands/setup-skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyBhE"}
1
+ {"version":3,"file":"setup-skill.d.ts","sourceRoot":"","sources":["../../src/commands/setup-skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8DhE"}
@@ -38,24 +38,61 @@ const fs = __importStar(require("fs"));
38
38
  const path = __importStar(require("path"));
39
39
  const os = __importStar(require("os"));
40
40
  const output_1 = require("../output");
41
+ const skill_meta_1 = require("../skill-meta");
41
42
  function registerSetupSkillCommand(program) {
42
43
  program
43
44
  .command('setup-skill')
44
- .description('Claude Code 스킬을 ~/.claude/skills/에 설치')
45
+ .description('소통채널 Claude Code 스킬 전체를 ~/.claude/skills/에 설치/갱신')
45
46
  .action(() => {
46
- const srcPath = path.join(__dirname, '..', '..', 'skill', 'SKILL.md');
47
- const destDir = path.join(os.homedir(), '.claude', 'skills', '2t-decencia-channel-cli');
48
- const destPath = path.join(destDir, 'SKILL.md');
47
+ // dist/commands/setup-skill.js -> ../../skill (package root)
48
+ const skillRoot = path.join(__dirname, '..', '..', 'skill');
49
+ const destRoot = path.join(os.homedir(), '.claude', 'skills');
49
50
  try {
50
- if (!fs.existsSync(srcPath)) {
51
- (0, output_1.printError)(`패키지 내 SKILL.md를 찾을 수 없습니다: ${srcPath}`);
51
+ if (!fs.existsSync(skillRoot)) {
52
+ (0, output_1.printError)(`패키지 내 skill 디렉토리를 찾을 수 없습니다: ${skillRoot}`);
52
53
  return;
53
54
  }
54
- if (!fs.existsSync(destDir)) {
55
- fs.mkdirSync(destDir, { recursive: true });
55
+ const dirs = fs
56
+ .readdirSync(skillRoot, { withFileTypes: true })
57
+ .filter((e) => e.isDirectory());
58
+ if (dirs.length === 0) {
59
+ (0, output_1.printError)(`설치할 스킬이 없습니다: ${skillRoot}`);
60
+ return;
61
+ }
62
+ const installed = [];
63
+ for (const dir of dirs) {
64
+ const src = path.join(skillRoot, dir.name, 'SKILL.md');
65
+ if (!fs.existsSync(src))
66
+ continue;
67
+ const destDir = path.join(destRoot, dir.name);
68
+ if (!fs.existsSync(destDir)) {
69
+ fs.mkdirSync(destDir, { recursive: true });
70
+ }
71
+ fs.copyFileSync(src, path.join(destDir, 'SKILL.md'));
72
+ installed.push(dir.name);
73
+ }
74
+ (0, output_1.printSuccess)(`Claude Code 스킬 ${installed.length}개를 설치/갱신했습니다 → ~/.claude/skills/`);
75
+ for (const name of installed) {
76
+ (0, output_1.printInfo)(` • ${name}`);
77
+ }
78
+ // Remove superseded v1 skills so agents never load a stale version.
79
+ const installedSet = new Set(installed);
80
+ const removed = [];
81
+ for (const name of skill_meta_1.DEPRECATED_SKILLS) {
82
+ if (installedSet.has(name))
83
+ continue; // never remove something we just installed
84
+ const dir = path.join(destRoot, name);
85
+ if (fs.existsSync(dir)) {
86
+ fs.rmSync(dir, { recursive: true, force: true });
87
+ removed.push(name);
88
+ }
89
+ }
90
+ if (removed.length > 0) {
91
+ (0, output_1.printWarning)(`구버전(deprecated) 스킬 ${removed.length}개를 제거했습니다:`);
92
+ for (const name of removed) {
93
+ (0, output_1.printInfo)(` - ${name}`);
94
+ }
56
95
  }
57
- fs.copyFileSync(srcPath, destPath);
58
- (0, output_1.printSuccess)(`Claude Code 스킬이 설치되었습니다: ~/.claude/skills/2t-decencia-channel-cli/SKILL.md`);
59
96
  }
60
97
  catch (err) {
61
98
  (0, output_1.printError)(`스킬 설치 중 오류가 발생했습니다: ${err.message}`);
@@ -1 +1 @@
1
- {"version":3,"file":"setup-skill.js","sourceRoot":"","sources":["../../src/commands/setup-skill.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,8DAyBC;AA9BD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,sCAAqD;AAErD,SAAgB,yBAAyB,CAAC,OAAgB;IACxD,OAAO;SACJ,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,yBAAyB,CAAC,CAAC;QACxF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEhD,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,IAAA,mBAAU,EAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;gBACpD,OAAO;YACT,CAAC;YAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;YAED,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACnC,IAAA,qBAAY,EAAC,4EAA4E,CAAC,CAAC;QAC7F,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAA,mBAAU,EAAC,uBAAuB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"setup-skill.js","sourceRoot":"","sources":["../../src/commands/setup-skill.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -54,6 +54,7 @@ const backup_1 = require("./commands/backup");
54
54
  const notifications_1 = require("./commands/notifications");
55
55
  const dashboard_1 = require("./commands/dashboard");
56
56
  const setup_skill_1 = require("./commands/setup-skill");
57
+ const check_1 = require("./commands/check");
57
58
  // Read version from package.json
58
59
  function getVersion() {
59
60
  try {
@@ -95,6 +96,7 @@ program
95
96
  (0, notifications_1.registerNotificationsCommand)(program);
96
97
  (0, dashboard_1.registerDashboardCommand)(program);
97
98
  (0, setup_skill_1.registerSetupSkillCommand)(program);
99
+ (0, check_1.registerCheckCommand)(program);
98
100
  // Parse and execute
99
101
  program.parseAsync(process.argv).catch((err) => {
100
102
  console.error(err);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,yCAAoC;AACpC,2CAA6B;AAC7B,uCAAyB;AAEzB,0CAAsD;AACtD,0CAAsD;AACtD,kDAA8D;AAC9D,4CAAwD;AACxD,gDAA4D;AAC5D,wCAAoD;AACpD,wCAAoD;AACpD,kDAA8D;AAC9D,gDAA4D;AAC5D,sDAAiE;AACjE,wCAAoD;AACpD,oDAA+D;AAC/D,oDAA+D;AAC/D,8CAA0D;AAE1D,4DAAwE;AACxE,oDAAgE;AAChE,wDAAmE;AAEnE,iCAAiC;AACjC,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,oCAAoC,CAAC;KACjD,OAAO,CAAC,UAAU,EAAE,EAAE,eAAe,EAAE,OAAO,CAAC;KAC/C,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC;KAChC,MAAM,CAAC,SAAS,EAAE,mBAAmB,CAAC;KACtC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC;KAC9B,MAAM,CAAC,uBAAuB,EAAE,eAAe,CAAC;KAChD,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC;KAC/B,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC;KACnC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AAEtC,+BAA+B;AAC/B,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;AAC7B,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;AAC7B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;AACjC,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,gCAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;AAC5B,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;AAC5B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;AACjC,IAAA,gCAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,qCAAwB,EAAC,OAAO,CAAC,CAAC;AAClC,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;AAC5B,IAAA,mCAAuB,EAAC,OAAO,CAAC,CAAC;AACjC,IAAA,mCAAuB,EAAC,OAAO,CAAC,CAAC;AACjC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;AAE/B,IAAA,4CAA4B,EAAC,OAAO,CAAC,CAAC;AACtC,IAAA,oCAAwB,EAAC,OAAO,CAAC,CAAC;AAClC,IAAA,uCAAyB,EAAC,OAAO,CAAC,CAAC;AAEnC,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,yCAAoC;AACpC,2CAA6B;AAC7B,uCAAyB;AAEzB,0CAAsD;AACtD,0CAAsD;AACtD,kDAA8D;AAC9D,4CAAwD;AACxD,gDAA4D;AAC5D,wCAAoD;AACpD,wCAAoD;AACpD,kDAA8D;AAC9D,gDAA4D;AAC5D,sDAAiE;AACjE,wCAAoD;AACpD,oDAA+D;AAC/D,oDAA+D;AAC/D,8CAA0D;AAE1D,4DAAwE;AACxE,oDAAgE;AAChE,wDAAmE;AACnE,4CAAwD;AAExD,iCAAiC;AACjC,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,oCAAoC,CAAC;KACjD,OAAO,CAAC,UAAU,EAAE,EAAE,eAAe,EAAE,OAAO,CAAC;KAC/C,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC;KAChC,MAAM,CAAC,SAAS,EAAE,mBAAmB,CAAC;KACtC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC;KAC9B,MAAM,CAAC,uBAAuB,EAAE,eAAe,CAAC;KAChD,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC;KAC/B,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC;KACnC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AAEtC,+BAA+B;AAC/B,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;AAC7B,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;AAC7B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;AACjC,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,gCAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;AAC5B,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;AAC5B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;AACjC,IAAA,gCAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,qCAAwB,EAAC,OAAO,CAAC,CAAC;AAClC,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;AAC5B,IAAA,mCAAuB,EAAC,OAAO,CAAC,CAAC;AACjC,IAAA,mCAAuB,EAAC,OAAO,CAAC,CAAC;AACjC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;AAE/B,IAAA,4CAA4B,EAAC,OAAO,CAAC,CAAC;AACtC,IAAA,oCAAwB,EAAC,OAAO,CAAC,CAAC;AAClC,IAAA,uCAAyB,EAAC,OAAO,CAAC,CAAC;AACnC,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;AAE9B,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const DEPRECATED_SKILLS: string[];
2
+ //# sourceMappingURL=skill-meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-meta.d.ts","sourceRoot":"","sources":["../src/skill-meta.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAOrC,CAAC"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEPRECATED_SKILLS = void 0;
4
+ // Skills that were superseded by their *-v2 counterparts. They are NOT bundled
5
+ // with the package; setup-skill removes them and check flags them if present,
6
+ // so agents never load a stale v1 skill.
7
+ exports.DEPRECATED_SKILLS = [
8
+ '2t-decencia-channel-cli',
9
+ '2t-decencia-channel-db-schema',
10
+ '2t-decencia-channel-prd',
11
+ '2t-decencia-channel-spec',
12
+ '2t-decencia-channel-sprint-builder',
13
+ '2t-decencia-channel-sqa',
14
+ ];
15
+ //# sourceMappingURL=skill-meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-meta.js","sourceRoot":"","sources":["../src/skill-meta.ts"],"names":[],"mappings":";;;AAAA,+EAA+E;AAC/E,8EAA8E;AAC9E,yCAAyC;AAC5B,QAAA,iBAAiB,GAAa;IACzC,yBAAyB;IACzB,+BAA+B;IAC/B,yBAAyB;IACzB,0BAA0B;IAC1B,oCAAoC;IACpC,yBAAyB;CAC1B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decencia/ch-cli",
3
- "version": "1.3.6",
3
+ "version": "1.4.0",
4
4
  "description": "Decencia Communication Channel CLI",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -11,9 +11,10 @@
11
11
  "skill/"
12
12
  ],
13
13
  "scripts": {
14
- "build": "tsc",
14
+ "build": "node scripts/sync-skill-version.js && tsc",
15
15
  "dev": "tsc --watch",
16
16
  "start": "node dist/index.js",
17
+ "sync-skill-version": "node scripts/sync-skill-version.js",
17
18
  "prepublishOnly": "npm run build"
18
19
  },
19
20
  "keywords": [
@@ -0,0 +1,73 @@
1
+ ---
2
+ name: 2t-decencia-channel-change-manager
3
+ description: 기존 소통채널 프로젝트의 기능 추가/수정을 사용자와 대화로 명확화 → 전파 스킬로 연관 PRD/spec/DB/SQA 일괄 갱신 → 변경으로 생긴 새 할일을 GitHub 이슈로 발행하는 오케스트레이터 스킬. (1)대화로 변경 내용 확정 → (2)[게이트] 영향 범위 확인 후 전파 적용 → (3)[게이트] 할일 목록 확인 후 이슈 발행. "이 기능 바꿀래"·"기획 수정"·"이거 추가해줘(기존 프로젝트)" 류 요청 시.
4
+ allowed-tools: Bash(ch:*) Bash(git:*) Bash(gh:*) Read Write
5
+ version: 1.4.0
6
+ ---
7
+
8
+ <!-- ch-version-gate -->
9
+ ## ⚠️ 시작 전 필수 — 버전 게이트 (생략 금지)
10
+
11
+ 이 스킬로 **어떤 작업이든 수행하기 전에 가장 먼저** 아래를 실행한다:
12
+
13
+ ```bash
14
+ ch check
15
+ ```
16
+
17
+ - exit code 0(통과)이 **아니면 즉시 중단**한다. 출력에 안내된 업데이트 명령(`npm install -g @decencia/ch-cli@latest` 또는 `ch setup-skill`)을 사용자에게 전달하고, 갱신이 끝나기 전까지 **이 스킬의 어떤 단계도 진행하지 않는다.**
18
+ - `ch`가 미설치/미인증이어도 먼저 `ch check`를 시도한다. (네트워크 불가 시 ch check는 통과시키되 경고를 남긴다.)
19
+
20
+ 구버전 스킬·CLI 사용을 막기 위한 게이트다. 건너뛰지 말 것.
21
+
22
+
23
+ # 2t-decencia-channel-change-manager — 기존 기획 변경 관리
24
+
25
+ 기존 프로젝트의 **기능 추가/수정**을 사용자와 대화로 명확화하고, **연관 문서 전체를 동기화**한 뒤, 변경으로 새로 생긴 **할일을 GitHub 이슈로 발행**한다.
26
+ 이 스킬은 **오케스트레이터**다 — 영향 분석·문서 갱신은 `2t-decencia-channel-change-propagation-v2`에, 이슈 발행은 `2t-decencia-channel-github-issue`에 위임하고(중복 작성 금지), 흐름·승인 게이트만 책임진다.
27
+
28
+ > 짝꿍: 신규 세팅은 [[2t-decencia-channel-project-bootstrap]], 변경 관리는 이 스킬. 발행된 이슈는 issue-coder → pr-merger로 흘러간다.
29
+
30
+ ## 핵심 원칙
31
+ - **게이트 2개** — 외부 가시·파괴적(기존 문서 수정/외부 이슈) 작업이므로 사용자 확인 후 진행.
32
+ - ① **전파 적용 전**: 무엇이 어떻게 바뀌는지(영향 범위)를 보여주고 승인받는다.
33
+ - ② **이슈 발행 전**: 발행할 이슈 목록을 보여주고 승인받는다.
34
+ - 위임: 전파→`2t-decencia-channel-change-propagation-v2`, 이슈→`2t-decencia-channel-github-issue`, 업로드→`2t-decencia-channel-cli-v2`. (전파 스킬이 내부적으로 spec/db-schema/sqa-v2를 활용)
35
+
36
+ ## Use when
37
+ - "이 기능 바꿀 건데 영향 가는 곳 다 고쳐줘", "기획 수정", "기존 프로젝트에 이거 추가해줘", 명세·DB·SQA 정합성이 어긋난 의심이 들 때.
38
+
39
+ ---
40
+
41
+ ## 0. 대상 프로젝트 확정
42
+ - cwd(또는 상위)의 `.ch-project`에서 `projectId` 확보. 없으면 사용자에게 묻는다.
43
+ - 인증 확인: `ch auth status`, (이슈 발행 대비) `gh auth status`. 미인증이면 안내 후 중단.
44
+
45
+ ## 1. 변경 내용 명확화 (대화형)
46
+ - 사용자와 **대화로 좁힌다**: **추가(feat) vs 수정(fix)** 구분, 구체적으로 무엇을·왜, 대상 기능/화면/spec.
47
+ - 모호하면 한 번에 단정하지 말고 계속 질문. "현재 X → Y로 바꾼다" 수준까지 또렷하게.
48
+
49
+ ## 2. 영향 전파 (게이트 ①)
50
+ *(변경 내용 확정 후)*
51
+ - `2t-decencia-channel-change-propagation-v2`로 **영향 분석**: 이 변경이 닿는 PRD·spec(ui·logic·dbTableRefs·tasks)·db-schema/db-tables·SQA·workStatus를 빠짐없이 식별.
52
+ - → **[게이트] 영향 범위를 사용자에게 제시하고 확인받는다** (어떤 문서가 어떻게 바뀌는지 요약). 승인 전에는 문서를 건드리지 않는다.
53
+ - 승인되면 전파 스킬 절차대로 **연관 문서를 순차 갱신**. `spec.dbTableRefs` ↔ `dbTable.relatedSpecIds` 양방향 동기화 유지.
54
+
55
+ ## 3. 할일 → GitHub 이슈 (게이트 ②)
56
+ *(전파 적용 후)*
57
+ - 변경으로 **새로 생기거나 바뀐 할일**을 처리 단위로 정리한다 — 전파가 식별한 처리 항목 + 추가/변경된 `spec.tasks`. (구현이 필요 없는 순수 문서 정합은 이슈로 만들지 않는다)
58
+ - → **[게이트] 발행할 이슈 목록(제목·유형·관련 specid)을 사용자에게 보여주고 확인받는다.** (github-issue 스킬은 멱등성/중복방지를 안 하므로, 여기서 확인이 안전장치)
59
+ - 승인되면 `2t-decencia-channel-github-issue`로 발행: **추가=feat / 수정=fix**, 결함이면 bug. 관련 specid 백링크·완료조건 자동.
60
+ - 발행된 이슈 URL을 모아 보고하고, **issue-coder로 이어진다**고 안내.
61
+
62
+ ---
63
+
64
+ ## 업로드/CLI 주의 (공통)
65
+ - 모든 문서 갱신은 `2t-decencia-channel-cli-v2`(=`ch` CLI) 경유.
66
+ - ⚠️ content는 **마크다운**(HTML 아님) + **CRLF 정제**(`tr -d '\r'`). PowerShell 인자 분리 실패 시 Bash 도구로 우회.
67
+ - spec 필드는 **단수+복수 동시 저장**(device/devices 등) 규칙 유지(미준수 시 웹 빈 칼럼).
68
+ - `ch specs get`/`--json` 조회가 Windows에서 빈 출력이면 PowerShell `Out-File` + forward-slash 경로로 우회.
69
+ - 이슈 본문은 `--body-file`(LF) 사용 — 따옴표/줄바꿈/한글 안전.
70
+
71
+ ## 경계
72
+ - **PR·머지·이슈 close는 하지 않는다** — 이슈 발행까지가 이 스킬의 끝(이후는 issue-coder/pr-merger/사람).
73
+ - 두 게이트 모두 사용자 승인 없이는 넘어가지 않는다. 수정 요청이면 해당 단계 반복.