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.
- package/dist/assets/MarketPage-aY16UW1_.js +51 -0
- package/dist/assets/{PromptTab-DPxKgALd.js → PromptTab-C3aTJS6u.js} +7 -7
- package/dist/assets/_baseUniq-DxEFlwNt.js +1 -0
- package/dist/assets/{arc-Wd7DG8CX.js → arc-BCQAokB1.js} +1 -1
- package/dist/assets/architectureDiagram-UYN6MBPD-Bc87ujv2.js +36 -0
- package/dist/assets/blockDiagram-ZHA2E4KO-wC9uH8Lb.js +121 -0
- package/dist/assets/{c4Diagram-6F5ED5ID-CcfPHYky.js → c4Diagram-6F5ED5ID-CqB7lqni.js} +1 -1
- package/dist/assets/channel-DNLHkiNp.js +1 -0
- package/dist/assets/{chunk-5HRBRIJM-TGnRph8o.js → chunk-5HRBRIJM-Cc1L17Eh.js} +1 -1
- package/dist/assets/{chunk-7U56Z5CX-D24Jb5U0.js → chunk-7U56Z5CX-Df3nu_7G.js} +1 -1
- package/dist/assets/{chunk-ASOPGD6M-zBk7x36Z.js → chunk-ASOPGD6M-DIXslLG-.js} +1 -1
- package/dist/assets/{chunk-KFBOBJHC-U1tpWuJd.js → chunk-KFBOBJHC-FytVljyP.js} +1 -1
- package/dist/assets/{chunk-T2TOU4HS-P78s0i18.js → chunk-T2TOU4HS-CU5z-cXq.js} +1 -1
- package/dist/assets/{chunk-TMUBEWPD-_9HBqU-T.js → chunk-TMUBEWPD-CWo1AFyn.js} +1 -1
- package/dist/assets/classDiagram-LNE6IOMH-B430Onym.js +1 -0
- package/dist/assets/classDiagram-v2-MQ7JQ4JX-B430Onym.js +1 -0
- package/dist/assets/clone-B9O3E3P1.js +1 -0
- package/dist/assets/dagre-4EVJKHTY-CgZW5tg4.js +4 -0
- package/dist/assets/diagram-QW4FP2JN-CJAng8RC.js +24 -0
- package/dist/assets/{erDiagram-6RL3IURR-CR3kiDSu.js → erDiagram-6RL3IURR-C1uHztHX.js} +2 -2
- package/dist/assets/{flowDiagram-7ASYPVHJ-B0gVEfBk.js → flowDiagram-7ASYPVHJ-Yiu2odO-.js} +1 -1
- package/dist/assets/{ganttDiagram-NTVNEXSI-CIEk1X3_.js → ganttDiagram-NTVNEXSI-tutc0dJP.js} +3 -3
- package/dist/assets/gitGraph-YCYPL57B-C3jM6T4G.js +133 -0
- package/dist/assets/gitGraphDiagram-NRZ2UAAF-0aqHEKzz.js +65 -0
- package/dist/assets/graph-DC224ILV.js +1 -0
- package/dist/assets/infoDiagram-A4XQUW5V-Do7Mpzkx.js +2 -0
- package/dist/assets/{journeyDiagram-G5WM74LC-U9w5k3my.js → journeyDiagram-G5WM74LC-DAruEJc7.js} +1 -1
- package/dist/assets/{kanban-definition-QRCXZQQD-CO8Lwd1_.js → kanban-definition-QRCXZQQD-DB63vLR0.js} +1 -1
- package/dist/assets/layout-BiYH5x6Q.js +1 -0
- package/dist/assets/{linear-CHGWcXFV.js → linear-CLyGW2s0.js} +1 -1
- package/dist/assets/main-CEKkUqZb.js +1094 -0
- package/dist/assets/main-D3YeRndF.css +10 -0
- package/dist/assets/min-ChJMFU2N.js +1 -0
- package/dist/assets/{mindmap-definition-GWI6TPTV-FRHfidFi.js → mindmap-definition-GWI6TPTV-CtADqQgd.js} +1 -1
- package/dist/assets/pieDiagram-YF2LJOPJ-BSOfzo3O.js +30 -0
- package/dist/assets/{quadrantDiagram-OS5C2QUG-N0MJL1hU.js → quadrantDiagram-OS5C2QUG-BLBQNFVb.js} +1 -1
- package/dist/assets/{requirementDiagram-MIRIMTAZ-n0yYIEdg.js → requirementDiagram-MIRIMTAZ-DqorvuS6.js} +2 -2
- package/dist/assets/{sankeyDiagram-Y46BX6SQ-DzRt1UUn.js → sankeyDiagram-Y46BX6SQ-4NDcrLkB.js} +1 -1
- package/dist/assets/{sequenceDiagram-G6AWOVSC-Bw73EL9L.js → sequenceDiagram-G6AWOVSC-yha6BxK2.js} +1 -1
- package/dist/assets/stateDiagram-MAYHULR4-XJ_I41ez.js +1 -0
- package/dist/assets/stateDiagram-v2-4JROLMXI-CxcyPJO2.js +1 -0
- package/dist/assets/{timeline-definition-U7ZMHBDA-BEgtmEeC.js → timeline-definition-U7ZMHBDA-DCNrmvE7.js} +1 -1
- package/dist/assets/{xychartDiagram-6QU3TZC5-bWuCFYmh.js → xychartDiagram-6QU3TZC5-9N-Ohhdp.js} +2 -2
- package/dist/index.html +2 -2
- package/dist-server/app.module.js +6 -0
- package/dist-server/common/analytics.client.js +180 -0
- package/dist-server/common/analytics.module.js +21 -0
- package/dist-server/common/device-id.js +33 -0
- package/dist-server/domain/cli/cli.service.js +66 -4
- package/dist-server/domain/document/document.service.js +6 -3
- package/dist-server/domain/goal/dto/goal.dto.js +49 -0
- package/dist-server/domain/goal/goal.controller.js +86 -0
- package/dist-server/domain/goal/goal.module.js +22 -0
- package/dist-server/domain/goal/goal.service.js +197 -0
- package/dist-server/domain/goal/parser/goal-md-parser.js +166 -0
- package/dist-server/domain/goal/parser/goal-md-serializer.js +110 -0
- package/dist-server/domain/market/market.controller.js +25 -1
- package/dist-server/domain/market/market.service.js +414 -18
- package/dist-server/domain/planner/dto/planner.dto.js +7 -44
- package/dist-server/domain/planner/planner.controller.js +2 -2
- package/dist-server/domain/planner/planner.service.js +24 -0
- package/dist-server/domain/settings/settings.controller.js +52 -0
- package/dist-server/domain/settings/settings.module.js +22 -0
- package/dist-server/domain/settings/settings.service.js +105 -0
- package/dist-server/domain/task/task.service.js +20 -0
- package/dist-server/domain/thread/thread.controller.js +28 -0
- package/dist-server/domain/thread/thread.service.js +20 -0
- package/dist-server/main.js +1 -0
- package/dist-server/repository/task.repository.js +4 -0
- package/dist-server/repository/thread.repository.js +22 -0
- package/package.json +13 -8
- package/packages/cli/dist/builtin.js +1 -0
- package/packages/cli/dist/commands/init.js +251 -8
- package/packages/cli/package.json +2 -1
- package/server.js +6 -3
- package/dist/assets/MarketPage-CjJYSssq.js +0 -56
- package/dist/assets/architectureDiagram-UYN6MBPD-CMavUkL9.js +0 -36
- package/dist/assets/blockDiagram-ZHA2E4KO-D1rNF19s.js +0 -121
- package/dist/assets/channel-CyMi7jVG.js +0 -1
- package/dist/assets/classDiagram-LNE6IOMH-DVWuJ-Df.js +0 -1
- package/dist/assets/classDiagram-v2-MQ7JQ4JX-DVWuJ-Df.js +0 -1
- package/dist/assets/dagre-4EVJKHTY-CcSwRLTq.js +0 -4
- package/dist/assets/diagram-QW4FP2JN-N887K_Ef.js +0 -24
- package/dist/assets/gitGraph-YCYPL57B-Zl60oDrh.js +0 -133
- package/dist/assets/gitGraphDiagram-NRZ2UAAF-CmIpkGbx.js +0 -65
- package/dist/assets/graph-BlwPajkw.js +0 -1
- package/dist/assets/infoDiagram-A4XQUW5V-D3UxyUCV.js +0 -2
- package/dist/assets/layout-Bvwu4dCi.js +0 -1
- package/dist/assets/main-Dnmo7KzM.js +0 -1064
- package/dist/assets/main-Fz5tpoGZ.css +0 -10
- package/dist/assets/pieDiagram-YF2LJOPJ-Eo_N9Dkd.js +0 -30
- package/dist/assets/stateDiagram-MAYHULR4-hqIdsHFt.js +0 -1
- package/dist/assets/stateDiagram-v2-4JROLMXI-BoqygJ0s.js +0 -1
- /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 =
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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);
|