@decencia/ch-cli 1.0.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 (101) hide show
  1. package/dist/client.d.ts +15 -0
  2. package/dist/client.d.ts.map +1 -0
  3. package/dist/client.js +117 -0
  4. package/dist/client.js.map +1 -0
  5. package/dist/commands/archives.d.ts +3 -0
  6. package/dist/commands/archives.d.ts.map +1 -0
  7. package/dist/commands/archives.js +371 -0
  8. package/dist/commands/archives.js.map +1 -0
  9. package/dist/commands/auth.d.ts +3 -0
  10. package/dist/commands/auth.d.ts.map +1 -0
  11. package/dist/commands/auth.js +149 -0
  12. package/dist/commands/auth.js.map +1 -0
  13. package/dist/commands/dashboard.d.ts +3 -0
  14. package/dist/commands/dashboard.d.ts.map +1 -0
  15. package/dist/commands/dashboard.js +115 -0
  16. package/dist/commands/dashboard.js.map +1 -0
  17. package/dist/commands/db-schema.d.ts +3 -0
  18. package/dist/commands/db-schema.d.ts.map +1 -0
  19. package/dist/commands/db-schema.js +76 -0
  20. package/dist/commands/db-schema.js.map +1 -0
  21. package/dist/commands/dev-status.d.ts +3 -0
  22. package/dist/commands/dev-status.d.ts.map +1 -0
  23. package/dist/commands/dev-status.js +175 -0
  24. package/dist/commands/dev-status.js.map +1 -0
  25. package/dist/commands/init.d.ts +3 -0
  26. package/dist/commands/init.d.ts.map +1 -0
  27. package/dist/commands/init.js +124 -0
  28. package/dist/commands/init.js.map +1 -0
  29. package/dist/commands/invitations.d.ts +3 -0
  30. package/dist/commands/invitations.d.ts.map +1 -0
  31. package/dist/commands/invitations.js +48 -0
  32. package/dist/commands/invitations.js.map +1 -0
  33. package/dist/commands/members.d.ts +3 -0
  34. package/dist/commands/members.d.ts.map +1 -0
  35. package/dist/commands/members.js +93 -0
  36. package/dist/commands/members.js.map +1 -0
  37. package/dist/commands/notifications.d.ts +3 -0
  38. package/dist/commands/notifications.d.ts.map +1 -0
  39. package/dist/commands/notifications.js +163 -0
  40. package/dist/commands/notifications.js.map +1 -0
  41. package/dist/commands/prd.d.ts +3 -0
  42. package/dist/commands/prd.d.ts.map +1 -0
  43. package/dist/commands/prd.js +74 -0
  44. package/dist/commands/prd.js.map +1 -0
  45. package/dist/commands/projects.d.ts +3 -0
  46. package/dist/commands/projects.d.ts.map +1 -0
  47. package/dist/commands/projects.js +215 -0
  48. package/dist/commands/projects.js.map +1 -0
  49. package/dist/commands/qna.d.ts +3 -0
  50. package/dist/commands/qna.d.ts.map +1 -0
  51. package/dist/commands/qna.js +211 -0
  52. package/dist/commands/qna.js.map +1 -0
  53. package/dist/commands/specs.d.ts +3 -0
  54. package/dist/commands/specs.d.ts.map +1 -0
  55. package/dist/commands/specs.js +277 -0
  56. package/dist/commands/specs.js.map +1 -0
  57. package/dist/commands/sprints.d.ts +3 -0
  58. package/dist/commands/sprints.d.ts.map +1 -0
  59. package/dist/commands/sprints.js +262 -0
  60. package/dist/commands/sprints.js.map +1 -0
  61. package/dist/commands/sqa.d.ts +3 -0
  62. package/dist/commands/sqa.d.ts.map +1 -0
  63. package/dist/commands/sqa.js +452 -0
  64. package/dist/commands/sqa.js.map +1 -0
  65. package/dist/config.d.ts +28 -0
  66. package/dist/config.d.ts.map +1 -0
  67. package/dist/config.js +115 -0
  68. package/dist/config.js.map +1 -0
  69. package/dist/index.d.ts +3 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +97 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/output.d.ts +13 -0
  74. package/dist/output.d.ts.map +1 -0
  75. package/dist/output.js +174 -0
  76. package/dist/output.js.map +1 -0
  77. package/dist/utils.d.ts +2 -0
  78. package/dist/utils.d.ts.map +1 -0
  79. package/dist/utils.js +7 -0
  80. package/dist/utils.js.map +1 -0
  81. package/package.json +33 -0
  82. package/src/client.ts +137 -0
  83. package/src/commands/archives.ts +334 -0
  84. package/src/commands/auth.ts +154 -0
  85. package/src/commands/dashboard.ts +112 -0
  86. package/src/commands/db-schema.ts +74 -0
  87. package/src/commands/dev-status.ts +166 -0
  88. package/src/commands/init.ts +92 -0
  89. package/src/commands/members.ts +92 -0
  90. package/src/commands/notifications.ts +169 -0
  91. package/src/commands/prd.ts +72 -0
  92. package/src/commands/projects.ts +207 -0
  93. package/src/commands/qna.ts +205 -0
  94. package/src/commands/specs.ts +257 -0
  95. package/src/commands/sprints.ts +255 -0
  96. package/src/commands/sqa.ts +422 -0
  97. package/src/config.ts +98 -0
  98. package/src/index.ts +69 -0
  99. package/src/output.ts +186 -0
  100. package/src/utils.ts +3 -0
  101. package/tsconfig.json +18 -0
@@ -0,0 +1,124 @@
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.registerInitCommand = registerInitCommand;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const client_1 = require("../client");
40
+ const output_1 = require("../output");
41
+ const config_1 = require("../config");
42
+ function registerInitCommand(program) {
43
+ program
44
+ .command('init')
45
+ .description('현재 디렉토리에 .ch-project 파일 생성 (로컬 프로젝트 설정)')
46
+ .requiredOption('--project-id <projectId>', '프로젝트 ID')
47
+ .option('--project-name <projectName>', '프로젝트명 (표시용)')
48
+ .action(async (options) => {
49
+ const targetPath = path.join(process.cwd(), '.ch-project');
50
+ if (fs.existsSync(targetPath)) {
51
+ try {
52
+ const existing = JSON.parse(fs.readFileSync(targetPath, 'utf-8'));
53
+ (0, output_1.printError)(`.ch-project 파일이 이미 존재합니다 (projectId: ${existing.projectId}). 덮어쓰려면 파일을 삭제 후 다시 실행하세요.`);
54
+ }
55
+ catch {
56
+ (0, output_1.printError)('.ch-project 파일이 이미 존재합니다. 덮어쓰려면 파일을 삭제 후 다시 실행하세요.');
57
+ }
58
+ return;
59
+ }
60
+ // If projectName not given, try to fetch from API (only if API key is available)
61
+ let projectName = options.projectName;
62
+ if (!projectName) {
63
+ const config = (0, config_1.loadConfig)();
64
+ if (config?.apiKey) {
65
+ try {
66
+ const client = (0, client_1.createClient)({ projectId: options.projectId });
67
+ const { data } = await client.get('/projects/current');
68
+ projectName = data.name;
69
+ }
70
+ catch {
71
+ // API call failed, proceed without name
72
+ }
73
+ }
74
+ }
75
+ const content = { projectId: options.projectId };
76
+ if (projectName)
77
+ content.projectName = projectName;
78
+ fs.writeFileSync(targetPath, JSON.stringify(content, null, 2) + '\n', 'utf-8');
79
+ (0, output_1.printSuccess)(`✅ .ch-project 파일이 생성되었습니다.`);
80
+ (0, output_1.printInfo)(` projectId: ${options.projectId}`);
81
+ if (projectName) {
82
+ (0, output_1.printInfo)(` projectName: ${projectName}`);
83
+ }
84
+ (0, output_1.printInfo)(` 경로: ${targetPath}`);
85
+ });
86
+ // ch status - show current project context
87
+ program
88
+ .command('status')
89
+ .description('현재 프로젝트 설정 상태 확인')
90
+ .action(() => {
91
+ const config = (0, config_1.loadConfig)();
92
+ const local = (0, config_1.findLocalProject)();
93
+ console.log('');
94
+ if (local) {
95
+ (0, output_1.printSuccess)(`로컬 설정 (.ch-project):`);
96
+ (0, output_1.printInfo)(` projectId: ${local.projectId}`);
97
+ if (local.projectName)
98
+ (0, output_1.printInfo)(` projectName: ${local.projectName}`);
99
+ }
100
+ else {
101
+ (0, output_1.printInfo)('로컬 설정 (.ch-project): 없음');
102
+ }
103
+ console.log('');
104
+ if (config) {
105
+ (0, output_1.printSuccess)('글로벌 설정 (~/.ch/config.json):');
106
+ (0, output_1.printInfo)(` apiUrl: ${config.apiUrl}`);
107
+ (0, output_1.printInfo)(` projectId: ${config.projectId || '(없음)'}`);
108
+ (0, output_1.printInfo)(` apiKey: ${config.apiKey ? '***설정됨***' : '(없음)'}`);
109
+ }
110
+ else {
111
+ (0, output_1.printInfo)('글로벌 설정 (~/.ch/config.json): 없음');
112
+ }
113
+ console.log('');
114
+ const effectiveProjectId = local?.projectId || config?.projectId;
115
+ const source = local ? '.ch-project (로컬)' : config?.projectId ? '~/.ch/config.json (글로벌)' : '없음';
116
+ if (effectiveProjectId) {
117
+ (0, output_1.printSuccess)(`→ 현재 사용할 projectId: ${effectiveProjectId} (출처: ${source})`);
118
+ }
119
+ else {
120
+ (0, output_1.printError)('프로젝트가 설정되지 않았습니다. "ch init --project-id <id>" 또는 "ch auth login"을 실행하세요.');
121
+ }
122
+ });
123
+ }
124
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerInvitationsCommand(program: Command): void;
3
+ //# sourceMappingURL=invitations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invitations.d.ts","sourceRoot":"","sources":["../../src/commands/invitations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyCjE"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerInvitationsCommand = registerInvitationsCommand;
4
+ const client_1 = require("../client");
5
+ const output_1 = require("../output");
6
+ function registerInvitationsCommand(program) {
7
+ const invitations = program
8
+ .command('invitations')
9
+ .description('초대 수락/조회');
10
+ // ch invitations info
11
+ invitations
12
+ .command('info')
13
+ .description('초대 토큰 정보 조회')
14
+ .requiredOption('--token <token>', '초대 토큰')
15
+ .action(async (options) => {
16
+ const globalOpts = program.opts();
17
+ try {
18
+ const client = (0, client_1.createUnauthClient)();
19
+ const { data } = await client.get(`/invitations/${options.token}`);
20
+ (0, output_1.formatOutput)(data, globalOpts);
21
+ }
22
+ catch (error) {
23
+ // Error already handled
24
+ }
25
+ });
26
+ // ch invitations accept
27
+ invitations
28
+ .command('accept')
29
+ .description('초대 수락')
30
+ .requiredOption('--token <token>', '초대 토큰')
31
+ .action(async (options) => {
32
+ const globalOpts = program.opts();
33
+ try {
34
+ if (globalOpts.dryRun) {
35
+ (0, output_1.printInfo)(`[DRY-RUN] 초대 수락 요청 (토큰: ${options.token.substring(0, 8)}...)`);
36
+ return;
37
+ }
38
+ const client = (0, client_1.createUnauthClient)();
39
+ const { data } = await client.post(`/invitations/${options.token}/accept`);
40
+ (0, output_1.formatOutput)(data, globalOpts);
41
+ (0, output_1.printSuccess)('초대가 수락되었습니다.');
42
+ }
43
+ catch (error) {
44
+ // Error already handled
45
+ }
46
+ });
47
+ }
48
+ //# sourceMappingURL=invitations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invitations.js","sourceRoot":"","sources":["../../src/commands/invitations.ts"],"names":[],"mappings":";;AAIA,gEAyCC;AA5CD,sCAA+C;AAC/C,sCAAkE;AAElE,SAAgB,0BAA0B,CAAC,OAAgB;IACzD,MAAM,WAAW,GAAG,OAAO;SACxB,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,UAAU,CAAC,CAAC;IAE3B,sBAAsB;IACtB,WAAW;SACR,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,aAAa,CAAC;SAC1B,cAAc,CAAC,iBAAiB,EAAE,OAAO,CAAC;SAC1C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,2BAAkB,GAAE,CAAC;YACpC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YACnE,IAAA,qBAAY,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,wBAAwB;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,wBAAwB;IACxB,WAAW;SACR,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,OAAO,CAAC;SACpB,cAAc,CAAC,iBAAiB,EAAE,OAAO,CAAC;SAC1C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBACtB,IAAA,kBAAS,EAAC,2BAA2B,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;gBAC1E,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,IAAA,2BAAkB,GAAE,CAAC;YACpC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC;YAC3E,IAAA,qBAAY,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC/B,IAAA,qBAAY,EAAC,cAAc,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,wBAAwB;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerMembersCommand(program: Command): void;
3
+ //# sourceMappingURL=members.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"members.d.ts","sourceRoot":"","sources":["../../src/commands/members.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuF7D"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerMembersCommand = registerMembersCommand;
4
+ const client_1 = require("../client");
5
+ const output_1 = require("../output");
6
+ function registerMembersCommand(program) {
7
+ const members = program
8
+ .command('members')
9
+ .description('멤버 관리');
10
+ // ch members list
11
+ members
12
+ .command('list')
13
+ .description('멤버 목록 조회')
14
+ .action(async () => {
15
+ const globalOpts = program.opts();
16
+ try {
17
+ const client = (0, client_1.createClient)({ projectId: globalOpts.project });
18
+ const { data } = await client.get('/members');
19
+ (0, output_1.formatOutput)(data, globalOpts);
20
+ }
21
+ catch (error) {
22
+ // Error already handled
23
+ }
24
+ });
25
+ // ch members invite
26
+ members
27
+ .command('invite')
28
+ .description('멤버 추가 (이메일로 사용자를 찾아 바로 권한 부여)')
29
+ .requiredOption('--email <email>', '추가할 사용자 이메일')
30
+ .requiredOption('--role <role>', '역할 (developer|client)')
31
+ .action(async (options) => {
32
+ const globalOpts = program.opts();
33
+ try {
34
+ if (globalOpts.dryRun) {
35
+ (0, output_1.printInfo)(`[DRY-RUN] "${options.email}" 멤버 추가 요청`);
36
+ return;
37
+ }
38
+ const client = (0, client_1.createClient)({ projectId: globalOpts.project });
39
+ const { data } = await client.post('/members/invite', {
40
+ email: options.email,
41
+ role: options.role,
42
+ });
43
+ (0, output_1.formatOutput)(data, globalOpts);
44
+ (0, output_1.printSuccess)(data.message || '멤버가 추가되었습니다.');
45
+ }
46
+ catch (error) {
47
+ // Error already handled
48
+ }
49
+ });
50
+ // ch members set-role
51
+ members
52
+ .command('set-role <userId>')
53
+ .description('멤버 역할 변경')
54
+ .requiredOption('--role <role>', '새 역할 (admin|developer|client)')
55
+ .action(async (userId, options) => {
56
+ const globalOpts = program.opts();
57
+ try {
58
+ if (globalOpts.dryRun) {
59
+ (0, output_1.printInfo)(`[DRY-RUN] 멤버 "${userId}" 역할을 "${options.role}"로 변경 요청`);
60
+ return;
61
+ }
62
+ const client = (0, client_1.createClient)({ projectId: globalOpts.project });
63
+ const { data } = await client.patch(`/members/${userId}/role`, {
64
+ role: options.role,
65
+ });
66
+ (0, output_1.formatOutput)(data, globalOpts);
67
+ (0, output_1.printSuccess)(`멤버 역할이 "${options.role}"로 변경되었습니다.`);
68
+ }
69
+ catch (error) {
70
+ // Error already handled
71
+ }
72
+ });
73
+ // ch members remove
74
+ members
75
+ .command('remove <userId>')
76
+ .description('멤버 제거')
77
+ .action(async (userId) => {
78
+ const globalOpts = program.opts();
79
+ try {
80
+ if (globalOpts.dryRun) {
81
+ (0, output_1.printInfo)(`[DRY-RUN] 멤버 "${userId}" 제거 요청`);
82
+ return;
83
+ }
84
+ const client = (0, client_1.createClient)({ projectId: globalOpts.project });
85
+ await client.delete(`/members/${userId}`);
86
+ (0, output_1.printSuccess)('멤버가 제거되었습니다.');
87
+ }
88
+ catch (error) {
89
+ // Error already handled
90
+ }
91
+ });
92
+ }
93
+ //# sourceMappingURL=members.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"members.js","sourceRoot":"","sources":["../../src/commands/members.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerNotificationsCommand(program: Command): void;
3
+ //# sourceMappingURL=notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/commands/notifications.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoKnE"}
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerNotificationsCommand = registerNotificationsCommand;
4
+ const client_1 = require("../client");
5
+ const output_1 = require("../output");
6
+ function registerNotificationsCommand(program) {
7
+ const notifications = program
8
+ .command('notifications')
9
+ .description('알림 설정 관리');
10
+ // ch notifications get
11
+ notifications
12
+ .command('get')
13
+ .description('현재 알림 설정 조회')
14
+ .action(async () => {
15
+ const globalOpts = program.opts();
16
+ try {
17
+ const client = (0, client_1.createClient)({ projectId: globalOpts.project });
18
+ const { data } = await client.get('/notifications');
19
+ (0, output_1.formatOutput)(data, globalOpts);
20
+ }
21
+ catch (error) {
22
+ // Error already handled
23
+ }
24
+ });
25
+ // ch notifications set-webhook
26
+ notifications
27
+ .command('set-webhook')
28
+ .description('Webhook URL 설정')
29
+ .option('--kakao <url>', '카카오워크 Webhook URL')
30
+ .option('--slack <url>', 'Slack Webhook URL')
31
+ .action(async (options) => {
32
+ const globalOpts = program.opts();
33
+ try {
34
+ if (!options.kakao && !options.slack) {
35
+ (0, output_1.printError)('--kakao 또는 --slack 옵션을 지정하세요.');
36
+ return;
37
+ }
38
+ if (globalOpts.dryRun) {
39
+ (0, output_1.printInfo)('[DRY-RUN] Webhook URL 설정 요청');
40
+ return;
41
+ }
42
+ const body = {};
43
+ if (options.kakao)
44
+ body.kakaoworkWebhookUrl = options.kakao;
45
+ if (options.slack)
46
+ body.slackWebhookUrl = options.slack;
47
+ const client = (0, client_1.createClient)({ projectId: globalOpts.project });
48
+ const { data } = await client.patch('/notifications/webhook', body);
49
+ (0, output_1.formatOutput)(data, globalOpts);
50
+ (0, output_1.printSuccess)('Webhook URL이 설정되었습니다.');
51
+ }
52
+ catch (error) {
53
+ // Error already handled
54
+ }
55
+ });
56
+ // ch notifications remove-webhook
57
+ notifications
58
+ .command('remove-webhook')
59
+ .description('Webhook URL 제거')
60
+ .option('--kakao', '카카오워크 Webhook 제거')
61
+ .option('--slack', 'Slack Webhook 제거')
62
+ .action(async (options) => {
63
+ const globalOpts = program.opts();
64
+ try {
65
+ if (!options.kakao && !options.slack) {
66
+ (0, output_1.printError)('--kakao 또는 --slack 옵션을 지정하세요.');
67
+ return;
68
+ }
69
+ if (globalOpts.dryRun) {
70
+ (0, output_1.printInfo)('[DRY-RUN] Webhook URL 제거 요청');
71
+ return;
72
+ }
73
+ const client = (0, client_1.createClient)({ projectId: globalOpts.project });
74
+ if (options.kakao) {
75
+ await client.delete('/notifications/webhook/kakao');
76
+ (0, output_1.printSuccess)('카카오워크 Webhook URL이 제거되었습니다.');
77
+ }
78
+ if (options.slack) {
79
+ await client.delete('/notifications/webhook/slack');
80
+ (0, output_1.printSuccess)('Slack Webhook URL이 제거되었습니다.');
81
+ }
82
+ }
83
+ catch (error) {
84
+ // Error already handled
85
+ }
86
+ });
87
+ // ch notifications test
88
+ notifications
89
+ .command('test')
90
+ .description('테스트 알림 발송')
91
+ .option('--kakao', '카카오워크로 테스트')
92
+ .option('--slack', 'Slack으로 테스트')
93
+ .action(async (options) => {
94
+ const globalOpts = program.opts();
95
+ try {
96
+ if (!options.kakao && !options.slack) {
97
+ (0, output_1.printError)('--kakao 또는 --slack 옵션을 지정하세요.');
98
+ return;
99
+ }
100
+ const client = (0, client_1.createClient)({ projectId: globalOpts.project });
101
+ if (options.kakao) {
102
+ const { data } = await client.post('/notifications/test/kakao');
103
+ (0, output_1.formatOutput)(data, globalOpts);
104
+ (0, output_1.printSuccess)('카카오워크 테스트 알림이 발송되었습니다.');
105
+ }
106
+ if (options.slack) {
107
+ const { data } = await client.post('/notifications/test/slack');
108
+ (0, output_1.formatOutput)(data, globalOpts);
109
+ (0, output_1.printSuccess)('Slack 테스트 알림이 발송되었습니다.');
110
+ }
111
+ }
112
+ catch (error) {
113
+ // Error already handled
114
+ }
115
+ });
116
+ // ch notifications toggle
117
+ notifications
118
+ .command('toggle <eventName>')
119
+ .description('이벤트 알림 ON/OFF 토글')
120
+ .option('--on', '알림 활성화')
121
+ .option('--off', '알림 비활성화')
122
+ .action(async (eventName, options) => {
123
+ const globalOpts = program.opts();
124
+ try {
125
+ if (!options.on && !options.off) {
126
+ (0, output_1.printError)('--on 또는 --off 옵션을 지정하세요.');
127
+ return;
128
+ }
129
+ if (globalOpts.dryRun) {
130
+ const state = options.on ? 'ON' : 'OFF';
131
+ (0, output_1.printInfo)(`[DRY-RUN] 이벤트 "${eventName}" ${state} 요청`);
132
+ return;
133
+ }
134
+ const enabled = !!options.on;
135
+ const client = (0, client_1.createClient)({ projectId: globalOpts.project });
136
+ const { data } = await client.patch(`/notifications/events/${eventName}`, { enabled });
137
+ (0, output_1.formatOutput)(data, globalOpts);
138
+ (0, output_1.printSuccess)(`이벤트 "${eventName}"이 ${enabled ? '활성화' : '비활성화'}되었습니다.`);
139
+ }
140
+ catch (error) {
141
+ // Error already handled
142
+ }
143
+ });
144
+ // ch notifications logs
145
+ notifications
146
+ .command('logs')
147
+ .description('알림 발송 로그 조회')
148
+ .option('--page <number>', '페이지 번호', '1')
149
+ .action(async (options) => {
150
+ const globalOpts = program.opts();
151
+ try {
152
+ const client = (0, client_1.createClient)({ projectId: globalOpts.project });
153
+ const { data } = await client.get('/notifications/logs', {
154
+ params: { page: parseInt(options.page, 10) },
155
+ });
156
+ (0, output_1.formatOutput)(data, globalOpts);
157
+ }
158
+ catch (error) {
159
+ // Error already handled
160
+ }
161
+ });
162
+ }
163
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/commands/notifications.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerPrdCommand(program: Command): void;
3
+ //# sourceMappingURL=prd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prd.d.ts","sourceRoot":"","sources":["../../src/commands/prd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmEzD"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerPrdCommand = registerPrdCommand;
4
+ const client_1 = require("../client");
5
+ const output_1 = require("../output");
6
+ function registerPrdCommand(program) {
7
+ const prd = program
8
+ .command('prd')
9
+ .description('PRD(Product Requirements Document) 관리');
10
+ // ch prd get
11
+ prd
12
+ .command('get')
13
+ .description('PRD 조회')
14
+ .action(async () => {
15
+ const globalOpts = program.opts();
16
+ try {
17
+ const client = (0, client_1.createClient)({ projectId: globalOpts.project });
18
+ const { data } = await client.get('/prd');
19
+ if (!data) {
20
+ (0, output_1.printInfo)('PRD가 아직 작성되지 않았습니다.');
21
+ return;
22
+ }
23
+ (0, output_1.formatOutput)(data, globalOpts);
24
+ }
25
+ catch (error) {
26
+ // Error already handled
27
+ }
28
+ });
29
+ // ch prd set
30
+ prd
31
+ .command('set')
32
+ .description('PRD 생성/수정')
33
+ .requiredOption('--title <title>', 'PRD 제목')
34
+ .requiredOption('--content <content>', 'PRD 본문 (마크다운)')
35
+ .option('--new-version', '새 버전으로 기록')
36
+ .action(async (options) => {
37
+ const globalOpts = program.opts();
38
+ try {
39
+ if (globalOpts.dryRun) {
40
+ (0, output_1.printInfo)(`[DRY-RUN] PRD "${options.title}" 생성/수정 요청`);
41
+ return;
42
+ }
43
+ const client = (0, client_1.createClient)({ projectId: globalOpts.project });
44
+ const params = {};
45
+ if (options.newVersion)
46
+ params.newVersion = 'true';
47
+ const { data } = await client.put('/prd', {
48
+ title: options.title,
49
+ content: options.content,
50
+ }, { params });
51
+ (0, output_1.formatOutput)(data, globalOpts);
52
+ (0, output_1.printSuccess)(data.message || 'PRD가 저장되었습니다.');
53
+ }
54
+ catch (error) {
55
+ // Error already handled
56
+ }
57
+ });
58
+ // ch prd versions
59
+ prd
60
+ .command('versions')
61
+ .description('PRD 버전 이력 조회')
62
+ .action(async () => {
63
+ const globalOpts = program.opts();
64
+ try {
65
+ const client = (0, client_1.createClient)({ projectId: globalOpts.project });
66
+ const { data } = await client.get('/prd/versions');
67
+ (0, output_1.formatOutput)(data, globalOpts);
68
+ }
69
+ catch (error) {
70
+ // Error already handled
71
+ }
72
+ });
73
+ }
74
+ //# sourceMappingURL=prd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prd.js","sourceRoot":"","sources":["../../src/commands/prd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerProjectsCommand(program: Command): void;
3
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyM9D"}