crewx 0.8.7-rc.2 → 0.8.7-rc.21

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 (94) hide show
  1. package/dist/assets/MarketPage-aY16UW1_.js +51 -0
  2. package/dist/assets/{PromptTab-DPxKgALd.js → PromptTab-C3aTJS6u.js} +7 -7
  3. package/dist/assets/_baseUniq-DxEFlwNt.js +1 -0
  4. package/dist/assets/{arc-Wd7DG8CX.js → arc-BCQAokB1.js} +1 -1
  5. package/dist/assets/architectureDiagram-UYN6MBPD-Bc87ujv2.js +36 -0
  6. package/dist/assets/blockDiagram-ZHA2E4KO-wC9uH8Lb.js +121 -0
  7. package/dist/assets/{c4Diagram-6F5ED5ID-CcfPHYky.js → c4Diagram-6F5ED5ID-CqB7lqni.js} +1 -1
  8. package/dist/assets/channel-DNLHkiNp.js +1 -0
  9. package/dist/assets/{chunk-5HRBRIJM-TGnRph8o.js → chunk-5HRBRIJM-Cc1L17Eh.js} +1 -1
  10. package/dist/assets/{chunk-7U56Z5CX-D24Jb5U0.js → chunk-7U56Z5CX-Df3nu_7G.js} +1 -1
  11. package/dist/assets/{chunk-ASOPGD6M-zBk7x36Z.js → chunk-ASOPGD6M-DIXslLG-.js} +1 -1
  12. package/dist/assets/{chunk-KFBOBJHC-U1tpWuJd.js → chunk-KFBOBJHC-FytVljyP.js} +1 -1
  13. package/dist/assets/{chunk-T2TOU4HS-P78s0i18.js → chunk-T2TOU4HS-CU5z-cXq.js} +1 -1
  14. package/dist/assets/{chunk-TMUBEWPD-_9HBqU-T.js → chunk-TMUBEWPD-CWo1AFyn.js} +1 -1
  15. package/dist/assets/classDiagram-LNE6IOMH-B430Onym.js +1 -0
  16. package/dist/assets/classDiagram-v2-MQ7JQ4JX-B430Onym.js +1 -0
  17. package/dist/assets/clone-B9O3E3P1.js +1 -0
  18. package/dist/assets/dagre-4EVJKHTY-CgZW5tg4.js +4 -0
  19. package/dist/assets/diagram-QW4FP2JN-CJAng8RC.js +24 -0
  20. package/dist/assets/{erDiagram-6RL3IURR-CR3kiDSu.js → erDiagram-6RL3IURR-C1uHztHX.js} +2 -2
  21. package/dist/assets/{flowDiagram-7ASYPVHJ-B0gVEfBk.js → flowDiagram-7ASYPVHJ-Yiu2odO-.js} +1 -1
  22. package/dist/assets/{ganttDiagram-NTVNEXSI-CIEk1X3_.js → ganttDiagram-NTVNEXSI-tutc0dJP.js} +3 -3
  23. package/dist/assets/gitGraph-YCYPL57B-C3jM6T4G.js +133 -0
  24. package/dist/assets/gitGraphDiagram-NRZ2UAAF-0aqHEKzz.js +65 -0
  25. package/dist/assets/graph-DC224ILV.js +1 -0
  26. package/dist/assets/infoDiagram-A4XQUW5V-Do7Mpzkx.js +2 -0
  27. package/dist/assets/{journeyDiagram-G5WM74LC-U9w5k3my.js → journeyDiagram-G5WM74LC-DAruEJc7.js} +1 -1
  28. package/dist/assets/{kanban-definition-QRCXZQQD-CO8Lwd1_.js → kanban-definition-QRCXZQQD-DB63vLR0.js} +1 -1
  29. package/dist/assets/layout-BiYH5x6Q.js +1 -0
  30. package/dist/assets/{linear-CHGWcXFV.js → linear-CLyGW2s0.js} +1 -1
  31. package/dist/assets/main-CEKkUqZb.js +1094 -0
  32. package/dist/assets/main-D3YeRndF.css +10 -0
  33. package/dist/assets/min-ChJMFU2N.js +1 -0
  34. package/dist/assets/{mindmap-definition-GWI6TPTV-FRHfidFi.js → mindmap-definition-GWI6TPTV-CtADqQgd.js} +1 -1
  35. package/dist/assets/pieDiagram-YF2LJOPJ-BSOfzo3O.js +30 -0
  36. package/dist/assets/{quadrantDiagram-OS5C2QUG-N0MJL1hU.js → quadrantDiagram-OS5C2QUG-BLBQNFVb.js} +1 -1
  37. package/dist/assets/{requirementDiagram-MIRIMTAZ-n0yYIEdg.js → requirementDiagram-MIRIMTAZ-DqorvuS6.js} +2 -2
  38. package/dist/assets/{sankeyDiagram-Y46BX6SQ-DzRt1UUn.js → sankeyDiagram-Y46BX6SQ-4NDcrLkB.js} +1 -1
  39. package/dist/assets/{sequenceDiagram-G6AWOVSC-Bw73EL9L.js → sequenceDiagram-G6AWOVSC-yha6BxK2.js} +1 -1
  40. package/dist/assets/stateDiagram-MAYHULR4-XJ_I41ez.js +1 -0
  41. package/dist/assets/stateDiagram-v2-4JROLMXI-CxcyPJO2.js +1 -0
  42. package/dist/assets/{timeline-definition-U7ZMHBDA-BEgtmEeC.js → timeline-definition-U7ZMHBDA-DCNrmvE7.js} +1 -1
  43. package/dist/assets/{xychartDiagram-6QU3TZC5-bWuCFYmh.js → xychartDiagram-6QU3TZC5-9N-Ohhdp.js} +2 -2
  44. package/dist/index.html +2 -2
  45. package/dist-server/app.module.js +6 -0
  46. package/dist-server/common/analytics.client.js +180 -0
  47. package/dist-server/common/analytics.module.js +21 -0
  48. package/dist-server/common/device-id.js +33 -0
  49. package/dist-server/domain/cli/cli.service.js +66 -4
  50. package/dist-server/domain/document/document.service.js +6 -3
  51. package/dist-server/domain/goal/dto/goal.dto.js +49 -0
  52. package/dist-server/domain/goal/goal.controller.js +86 -0
  53. package/dist-server/domain/goal/goal.module.js +22 -0
  54. package/dist-server/domain/goal/goal.service.js +197 -0
  55. package/dist-server/domain/goal/parser/goal-md-parser.js +166 -0
  56. package/dist-server/domain/goal/parser/goal-md-serializer.js +110 -0
  57. package/dist-server/domain/market/market.controller.js +25 -1
  58. package/dist-server/domain/market/market.service.js +414 -18
  59. package/dist-server/domain/planner/dto/planner.dto.js +7 -44
  60. package/dist-server/domain/planner/planner.controller.js +2 -2
  61. package/dist-server/domain/planner/planner.service.js +24 -0
  62. package/dist-server/domain/settings/settings.controller.js +52 -0
  63. package/dist-server/domain/settings/settings.module.js +22 -0
  64. package/dist-server/domain/settings/settings.service.js +105 -0
  65. package/dist-server/domain/task/task.service.js +20 -0
  66. package/dist-server/domain/thread/thread.controller.js +28 -0
  67. package/dist-server/domain/thread/thread.service.js +20 -0
  68. package/dist-server/main.js +1 -0
  69. package/dist-server/repository/task.repository.js +4 -0
  70. package/dist-server/repository/thread.repository.js +22 -0
  71. package/package.json +13 -8
  72. package/packages/cli/dist/builtin.js +1 -0
  73. package/packages/cli/dist/commands/init.js +251 -8
  74. package/packages/cli/package.json +2 -1
  75. package/server.js +6 -3
  76. package/dist/assets/MarketPage-CjJYSssq.js +0 -56
  77. package/dist/assets/architectureDiagram-UYN6MBPD-CMavUkL9.js +0 -36
  78. package/dist/assets/blockDiagram-ZHA2E4KO-D1rNF19s.js +0 -121
  79. package/dist/assets/channel-CyMi7jVG.js +0 -1
  80. package/dist/assets/classDiagram-LNE6IOMH-DVWuJ-Df.js +0 -1
  81. package/dist/assets/classDiagram-v2-MQ7JQ4JX-DVWuJ-Df.js +0 -1
  82. package/dist/assets/dagre-4EVJKHTY-CcSwRLTq.js +0 -4
  83. package/dist/assets/diagram-QW4FP2JN-N887K_Ef.js +0 -24
  84. package/dist/assets/gitGraph-YCYPL57B-Zl60oDrh.js +0 -133
  85. package/dist/assets/gitGraphDiagram-NRZ2UAAF-CmIpkGbx.js +0 -65
  86. package/dist/assets/graph-BlwPajkw.js +0 -1
  87. package/dist/assets/infoDiagram-A4XQUW5V-D3UxyUCV.js +0 -2
  88. package/dist/assets/layout-Bvwu4dCi.js +0 -1
  89. package/dist/assets/main-Dnmo7KzM.js +0 -1064
  90. package/dist/assets/main-Fz5tpoGZ.css +0 -10
  91. package/dist/assets/pieDiagram-YF2LJOPJ-Eo_N9Dkd.js +0 -30
  92. package/dist/assets/stateDiagram-MAYHULR4-hqIdsHFt.js +0 -1
  93. package/dist/assets/stateDiagram-v2-4JROLMXI-BoqygJ0s.js +0 -1
  94. /package/dist/assets/{gemini-logo.svg → google-logo.svg} +0 -0
@@ -0,0 +1,180 @@
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 __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ var AnalyticsService_1;
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.AnalyticsService = void 0;
47
+ const fs_1 = require("fs");
48
+ const os_1 = require("os");
49
+ const path_1 = require("path");
50
+ const common_1 = require("@nestjs/common");
51
+ const yaml = __importStar(require("js-yaml"));
52
+ const device_id_js_1 = require("./device-id.js");
53
+ const ENDPOINT = 'https://analytics.sowonai.com/api/v1/events';
54
+ const FLUSH_INTERVAL_MS = 60_000;
55
+ const MAX_RETRIES = 3;
56
+ const MAX_QUEUE_SIZE = 100;
57
+ const APP_VERSION = (() => {
58
+ try {
59
+ const pkg = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(__dirname, '../../package.json'), 'utf8'));
60
+ return pkg.version ?? '0.0.0';
61
+ }
62
+ catch {
63
+ return '0.0.0';
64
+ }
65
+ })();
66
+ let AnalyticsService = AnalyticsService_1 = class AnalyticsService {
67
+ logger = new common_1.Logger(AnalyticsService_1.name);
68
+ queue = [];
69
+ timer = null;
70
+ disabled = false;
71
+ constructor() {
72
+ this.disabled = this.checkOptOut();
73
+ if (!this.disabled) {
74
+ this.timer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);
75
+ this.timer.unref();
76
+ }
77
+ }
78
+ track(event, props = {}) {
79
+ if (this.disabled)
80
+ return;
81
+ this.queue.push({
82
+ event: {
83
+ app_id: 'crewx',
84
+ app_version: APP_VERSION,
85
+ device_id: (0, device_id_js_1.getDeviceId)(),
86
+ os: (0, os_1.platform)(),
87
+ arch: (0, os_1.arch)(),
88
+ node_version: process.versions.node,
89
+ source: 'web_ui',
90
+ event,
91
+ props,
92
+ ts: new Date().toISOString(),
93
+ },
94
+ retries: 0,
95
+ });
96
+ if (this.queue.length >= MAX_QUEUE_SIZE) {
97
+ this.flush();
98
+ }
99
+ }
100
+ async flush() {
101
+ if (this.queue.length === 0)
102
+ return;
103
+ const batch = this.queue.splice(0);
104
+ const events = batch.map((e) => e.event);
105
+ try {
106
+ const res = await fetch(ENDPOINT, {
107
+ method: 'POST',
108
+ headers: { 'Content-Type': 'application/json' },
109
+ body: JSON.stringify({ events }),
110
+ signal: AbortSignal.timeout(10_000),
111
+ });
112
+ if (!res.ok)
113
+ throw new Error(`HTTP ${res.status}`);
114
+ }
115
+ catch (err) {
116
+ const retryable = batch.filter((e) => e.retries < MAX_RETRIES);
117
+ for (const entry of retryable)
118
+ entry.retries++;
119
+ this.queue.push(...retryable);
120
+ if (retryable.length > 0) {
121
+ this.logger.warn(`Analytics flush failed (${retryable.length} events queued for retry): ${err}`);
122
+ }
123
+ }
124
+ }
125
+ async fetchInstallStats(items) {
126
+ if (items.length === 0)
127
+ return {};
128
+ try {
129
+ const params = new URLSearchParams({ items: items.join(',') });
130
+ const res = await fetch(`https://analytics.sowonai.com/api/v1/stats/installs?${params}`, { signal: AbortSignal.timeout(5_000) });
131
+ if (!res.ok)
132
+ return {};
133
+ const body = (await res.json());
134
+ return body.data ?? {};
135
+ }
136
+ catch {
137
+ return {};
138
+ }
139
+ }
140
+ setEnabled(enabled) {
141
+ this.disabled = !enabled;
142
+ if (this.disabled && this.timer) {
143
+ clearInterval(this.timer);
144
+ this.timer = null;
145
+ }
146
+ else if (!this.disabled && !this.timer) {
147
+ this.timer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);
148
+ this.timer.unref();
149
+ }
150
+ }
151
+ isEnabled() {
152
+ return !this.disabled;
153
+ }
154
+ onModuleDestroy() {
155
+ if (this.timer) {
156
+ clearInterval(this.timer);
157
+ this.timer = null;
158
+ }
159
+ this.flush();
160
+ }
161
+ checkOptOut() {
162
+ try {
163
+ const configPath = process.env.CREWX_CONFIG || 'crewx.yaml';
164
+ if (!(0, fs_1.existsSync)(configPath))
165
+ return false;
166
+ const raw = (0, fs_1.readFileSync)(configPath, 'utf-8');
167
+ const config = yaml.load(raw);
168
+ const settings = (config?.settings ?? {});
169
+ return settings.analytics === false;
170
+ }
171
+ catch {
172
+ return false;
173
+ }
174
+ }
175
+ };
176
+ exports.AnalyticsService = AnalyticsService;
177
+ exports.AnalyticsService = AnalyticsService = AnalyticsService_1 = __decorate([
178
+ (0, common_1.Injectable)(),
179
+ __metadata("design:paramtypes", [])
180
+ ], AnalyticsService);
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AnalyticsModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const analytics_client_js_1 = require("./analytics.client.js");
12
+ let AnalyticsModule = class AnalyticsModule {
13
+ };
14
+ exports.AnalyticsModule = AnalyticsModule;
15
+ exports.AnalyticsModule = AnalyticsModule = __decorate([
16
+ (0, common_1.Global)(),
17
+ (0, common_1.Module)({
18
+ providers: [analytics_client_js_1.AnalyticsService],
19
+ exports: [analytics_client_js_1.AnalyticsService],
20
+ })
21
+ ], AnalyticsModule);
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDeviceId = getDeviceId;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const os_1 = require("os");
7
+ const crypto_1 = require("crypto");
8
+ const DEVICE_ID_PATH = (0, path_1.join)((0, os_1.homedir)(), '.crewx', 'device-id');
9
+ let cached = null;
10
+ function getDeviceId() {
11
+ if (cached)
12
+ return cached;
13
+ try {
14
+ if ((0, fs_1.existsSync)(DEVICE_ID_PATH)) {
15
+ const id = (0, fs_1.readFileSync)(DEVICE_ID_PATH, 'utf-8').trim();
16
+ if (id) {
17
+ cached = id;
18
+ return id;
19
+ }
20
+ }
21
+ const id = (0, crypto_1.randomUUID)();
22
+ (0, fs_1.mkdirSync)((0, path_1.join)((0, os_1.homedir)(), '.crewx'), { recursive: true });
23
+ (0, fs_1.writeFileSync)(DEVICE_ID_PATH, id, 'utf-8');
24
+ cached = id;
25
+ return id;
26
+ }
27
+ catch {
28
+ // Fallback: per-session temporary UUID
29
+ const id = (0, crypto_1.randomUUID)();
30
+ cached = id;
31
+ return id;
32
+ }
33
+ }
@@ -218,6 +218,7 @@ const CLI_LIST = [
218
218
  packageName: '@anthropic-ai/claude-code',
219
219
  versionCommand: 'claude --version',
220
220
  loginCommand: LOGIN_COMMANDS['claude'],
221
+ installStrategy: 'npm',
221
222
  },
222
223
  {
223
224
  name: 'codex',
@@ -226,6 +227,7 @@ const CLI_LIST = [
226
227
  packageName: '@openai/codex',
227
228
  versionCommand: 'codex --version',
228
229
  loginCommand: LOGIN_COMMANDS['codex'],
230
+ installStrategy: 'npm',
229
231
  },
230
232
  {
231
233
  name: 'gemini',
@@ -234,6 +236,18 @@ const CLI_LIST = [
234
236
  packageName: '@google/gemini-cli',
235
237
  versionCommand: 'gemini --version',
236
238
  loginCommand: LOGIN_COMMANDS['gemini'],
239
+ installStrategy: 'npm',
240
+ deprecated: 'Antigravity CLI로 전환하세요 (2026-06-18 종료)',
241
+ },
242
+ {
243
+ name: 'antigravity',
244
+ displayName: 'Antigravity',
245
+ provider: 'Google',
246
+ packageName: '',
247
+ versionCommand: 'agy --version',
248
+ loginCommand: null,
249
+ installStrategy: 'script',
250
+ installScript: 'curl -fsSL https://antigravity.google/cli/install.sh | bash',
237
251
  },
238
252
  {
239
253
  name: 'copilot',
@@ -242,6 +256,7 @@ const CLI_LIST = [
242
256
  packageName: '@github/copilot',
243
257
  versionCommand: 'copilot --version',
244
258
  loginCommand: LOGIN_COMMANDS['copilot'],
259
+ installStrategy: 'npm',
245
260
  },
246
261
  {
247
262
  name: 'opencode',
@@ -250,6 +265,7 @@ const CLI_LIST = [
250
265
  packageName: 'opencode-ai',
251
266
  versionCommand: 'opencode --version',
252
267
  loginCommand: null,
268
+ installStrategy: 'npm',
253
269
  },
254
270
  {
255
271
  name: 'crewx',
@@ -258,11 +274,27 @@ const CLI_LIST = [
258
274
  packageName: 'crewx',
259
275
  versionCommand: 'crewx --version',
260
276
  loginCommand: null,
277
+ installStrategy: 'npm',
261
278
  },
262
279
  ];
263
280
  let CliService = class CliService {
264
281
  async getVersions() {
265
- const results = await Promise.all(CLI_LIST.map(async (cli) => {
282
+ const results = [];
283
+ for (const cli of CLI_LIST) {
284
+ if (cli.installStrategy === 'script') {
285
+ const currentVersion = await this.getCurrentVersion(cli.versionCommand);
286
+ results.push({
287
+ name: cli.name,
288
+ displayName: cli.displayName,
289
+ provider: cli.provider,
290
+ installed: currentVersion !== null,
291
+ currentVersion,
292
+ latestVersion: null,
293
+ updateAvailable: false,
294
+ packageName: cli.packageName,
295
+ });
296
+ continue;
297
+ }
266
298
  // Primary: global npm (immune to node_modules/.bin shim)
267
299
  let currentVersion = await this.getNpmGlobalVersion(cli.packageName);
268
300
  let installed = currentVersion !== null;
@@ -272,7 +304,7 @@ let CliService = class CliService {
272
304
  installed = currentVersion !== null;
273
305
  }
274
306
  const latestVersion = await this.getLatestVersion(cli.packageName);
275
- return {
307
+ results.push({
276
308
  name: cli.name,
277
309
  displayName: cli.displayName,
278
310
  provider: cli.provider,
@@ -281,8 +313,8 @@ let CliService = class CliService {
281
313
  latestVersion,
282
314
  updateAvailable: currentVersion !== null && latestVersion !== 'unknown' && isOlderVersion(currentVersion, latestVersion),
283
315
  packageName: cli.packageName,
284
- };
285
- }));
316
+ });
317
+ }
286
318
  return results;
287
319
  }
288
320
  async update(name, version) {
@@ -292,6 +324,14 @@ let CliService = class CliService {
292
324
  }
293
325
  const previousVersion = (await this.getCurrentVersion(cli.versionCommand)) ||
294
326
  (await this.getNpmGlobalVersion(cli.packageName));
327
+ if (cli.installStrategy === 'script') {
328
+ return {
329
+ name: cli.name,
330
+ previousVersion: previousVersion || 'none',
331
+ newVersion: previousVersion || 'unknown',
332
+ message: `${cli.displayName}은 npm으로 업데이트할 수 없습니다. 터미널에서 실행: ${cli.installScript}`,
333
+ };
334
+ }
295
335
  const targetVersion = version || 'latest';
296
336
  try {
297
337
  await execCommand(`npm install -g ${cli.packageName}@${targetVersion}`, 60000);
@@ -317,6 +357,10 @@ let CliService = class CliService {
317
357
  const cli = CLI_LIST.find((c) => c.name === name);
318
358
  if (!cli)
319
359
  continue;
360
+ if (cli.installStrategy === 'script') {
361
+ send('log', { cli: cli.name, text: `${cli.displayName} — 수동 설치: ${cli.installScript}`, type: 'output' });
362
+ continue;
363
+ }
320
364
  const currentVersion = await this.getCurrentVersion(cli.versionCommand);
321
365
  const installed = currentVersion !== null || !!(await this.getNpmGlobalVersion(cli.packageName));
322
366
  const authenticated = await this.checkAuthenticated(cli.name);
@@ -376,6 +420,19 @@ let CliService = class CliService {
376
420
  loginCommand: null,
377
421
  };
378
422
  }
423
+ if (cli.installStrategy === 'script') {
424
+ const currentVersion = await this.getCurrentVersion(cli.versionCommand);
425
+ const authenticated = await this.checkAuthenticated(name);
426
+ return {
427
+ name: cli.name,
428
+ installed: currentVersion !== null,
429
+ currentVersion,
430
+ latestVersion: null,
431
+ path: null,
432
+ authenticated,
433
+ loginCommand: cli.loginCommand,
434
+ };
435
+ }
379
436
  // Primary: global npm (immune to node_modules/.bin shim)
380
437
  let currentVersion = await this.getNpmGlobalVersion(cli.packageName);
381
438
  let installed = currentVersion !== null;
@@ -407,6 +464,8 @@ let CliService = class CliService {
407
464
  return this.checkCopilotAuth();
408
465
  case 'gemini':
409
466
  return this.checkGeminiAuth();
467
+ case 'antigravity':
468
+ return null; // 인증 방식 미확정, 실측 후 보완
410
469
  default:
411
470
  return null;
412
471
  }
@@ -474,6 +533,9 @@ let CliService = class CliService {
474
533
  if (!cli) {
475
534
  return { name, versions: [] };
476
535
  }
536
+ if (cli.installStrategy === 'script') {
537
+ return { name, versions: [] };
538
+ }
477
539
  try {
478
540
  const { stdout } = await execCommand(`npm view ${cli.packageName} versions --json`, 15000);
479
541
  const parsed = JSON.parse(stdout.trim());
@@ -206,10 +206,13 @@ let DocumentService = class DocumentService {
206
206
  */
207
207
  appendToCrewxYaml(yamlPath, key, relPath) {
208
208
  const raw = (0, fs_1.readFileSync)(yamlPath, 'utf-8');
209
- // Locate the documents: top-level key
210
- const docsMatch = /^documents:\s*$/m.exec(raw);
209
+ // Locate the documents: top-level key (allow inline comments)
210
+ const docsMatch = /^documents:\s*(#.*)?$/m.exec(raw);
211
211
  if (!docsMatch || docsMatch.index === undefined) {
212
- throw new common_1.BadRequestException('documents: section not found in crewx.yaml');
212
+ const separator = raw.endsWith('\n') ? '' : '\n';
213
+ const newEntry = `${separator}\ndocuments:\n ${key}:\n path: ${relPath}\n`;
214
+ (0, fs_1.writeFileSync)(yamlPath, raw + newEntry, 'utf-8');
215
+ return;
213
216
  }
214
217
  // Content starts right after "documents:\n"
215
218
  const docsContentStart = docsMatch.index + docsMatch[0].length + 1; // +1 for '\n'
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.UpdateGoalDto = void 0;
13
+ const class_validator_1 = require("class-validator");
14
+ class UpdateGoalDto {
15
+ title;
16
+ period;
17
+ objective;
18
+ keyResults;
19
+ notes;
20
+ reflection;
21
+ }
22
+ exports.UpdateGoalDto = UpdateGoalDto;
23
+ __decorate([
24
+ (0, class_validator_1.IsString)(),
25
+ __metadata("design:type", String)
26
+ ], UpdateGoalDto.prototype, "title", void 0);
27
+ __decorate([
28
+ (0, class_validator_1.IsOptional)(),
29
+ __metadata("design:type", Object)
30
+ ], UpdateGoalDto.prototype, "period", void 0);
31
+ __decorate([
32
+ (0, class_validator_1.IsOptional)(),
33
+ __metadata("design:type", Object)
34
+ ], UpdateGoalDto.prototype, "objective", void 0);
35
+ __decorate([
36
+ (0, class_validator_1.IsOptional)(),
37
+ (0, class_validator_1.IsArray)(),
38
+ __metadata("design:type", Array)
39
+ ], UpdateGoalDto.prototype, "keyResults", void 0);
40
+ __decorate([
41
+ (0, class_validator_1.IsOptional)(),
42
+ (0, class_validator_1.IsString)(),
43
+ __metadata("design:type", String)
44
+ ], UpdateGoalDto.prototype, "notes", void 0);
45
+ __decorate([
46
+ (0, class_validator_1.IsOptional)(),
47
+ (0, class_validator_1.IsString)(),
48
+ __metadata("design:type", String)
49
+ ], UpdateGoalDto.prototype, "reflection", void 0);
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.GoalController = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const swagger_1 = require("@nestjs/swagger");
18
+ const goal_service_js_1 = require("./goal.service.js");
19
+ const goal_dto_js_1 = require("./dto/goal.dto.js");
20
+ const workspace_decorator_js_1 = require("../../common/decorators/workspace.decorator.js");
21
+ let GoalController = class GoalController {
22
+ goalService;
23
+ constructor(goalService) {
24
+ this.goalService = goalService;
25
+ }
26
+ listGoals(ws, status) {
27
+ const data = this.goalService.listGoals(ws.path, status);
28
+ return { success: true, data };
29
+ }
30
+ getGoal(goalId, ws) {
31
+ const data = this.goalService.getGoal(ws.path, goalId);
32
+ return { success: true, data };
33
+ }
34
+ putGoal(goalId, dto, ws, createOnly) {
35
+ const data = this.goalService.putGoal(ws.path, goalId, dto, createOnly === 'true');
36
+ return { success: true, data };
37
+ }
38
+ deleteGoal(goalId, ws) {
39
+ const data = this.goalService.deleteGoal(ws.path, goalId);
40
+ return { success: true, data };
41
+ }
42
+ };
43
+ exports.GoalController = GoalController;
44
+ __decorate([
45
+ (0, swagger_1.ApiOperation)({ operationId: 'GOAL.LIST', summary: 'List goals' }),
46
+ (0, common_1.Get)(),
47
+ __param(0, (0, workspace_decorator_js_1.Workspace)()),
48
+ __param(1, (0, common_1.Query)('status')),
49
+ __metadata("design:type", Function),
50
+ __metadata("design:paramtypes", [Object, String]),
51
+ __metadata("design:returntype", void 0)
52
+ ], GoalController.prototype, "listGoals", null);
53
+ __decorate([
54
+ (0, swagger_1.ApiOperation)({ operationId: 'GOAL.GET', summary: 'Get goal detail' }),
55
+ (0, common_1.Get)(':goalId'),
56
+ __param(0, (0, common_1.Param)('goalId')),
57
+ __param(1, (0, workspace_decorator_js_1.Workspace)()),
58
+ __metadata("design:type", Function),
59
+ __metadata("design:paramtypes", [String, Object]),
60
+ __metadata("design:returntype", void 0)
61
+ ], GoalController.prototype, "getGoal", null);
62
+ __decorate([
63
+ (0, swagger_1.ApiOperation)({ operationId: 'GOAL.PUT', summary: 'Create or update goal' }),
64
+ (0, common_1.Put)(':goalId'),
65
+ __param(0, (0, common_1.Param)('goalId')),
66
+ __param(1, (0, common_1.Body)()),
67
+ __param(2, (0, workspace_decorator_js_1.Workspace)()),
68
+ __param(3, (0, common_1.Query)('createOnly')),
69
+ __metadata("design:type", Function),
70
+ __metadata("design:paramtypes", [String, goal_dto_js_1.UpdateGoalDto, Object, String]),
71
+ __metadata("design:returntype", void 0)
72
+ ], GoalController.prototype, "putGoal", null);
73
+ __decorate([
74
+ (0, swagger_1.ApiOperation)({ operationId: 'GOAL.DELETE', summary: 'Delete goal' }),
75
+ (0, common_1.Delete)(':goalId'),
76
+ __param(0, (0, common_1.Param)('goalId')),
77
+ __param(1, (0, workspace_decorator_js_1.Workspace)()),
78
+ __metadata("design:type", Function),
79
+ __metadata("design:paramtypes", [String, Object]),
80
+ __metadata("design:returntype", void 0)
81
+ ], GoalController.prototype, "deleteGoal", null);
82
+ exports.GoalController = GoalController = __decorate([
83
+ (0, swagger_1.ApiTags)('goals'),
84
+ (0, common_1.Controller)('ws/:slug/goals'),
85
+ __metadata("design:paramtypes", [goal_service_js_1.GoalService])
86
+ ], GoalController);
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.GoalModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const goal_controller_js_1 = require("./goal.controller.js");
12
+ const goal_service_js_1 = require("./goal.service.js");
13
+ let GoalModule = class GoalModule {
14
+ };
15
+ exports.GoalModule = GoalModule;
16
+ exports.GoalModule = GoalModule = __decorate([
17
+ (0, common_1.Module)({
18
+ controllers: [goal_controller_js_1.GoalController],
19
+ providers: [goal_service_js_1.GoalService],
20
+ exports: [goal_service_js_1.GoalService],
21
+ })
22
+ ], GoalModule);