crewx 0.8.4 → 0.8.5-rc.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 (153) hide show
  1. package/package.json +1 -1
  2. package/packages/cli/package.json +1 -1
  3. package/dist-server/adapters/adapter.module.js +0 -35
  4. package/dist-server/adapters/adapter.service.js +0 -79
  5. package/dist-server/adapters/http-router.service.js +0 -91
  6. package/dist-server/app.module.js +0 -102
  7. package/dist-server/bootstrap/crewx-server.js +0 -79
  8. package/dist-server/common/cors.js +0 -15
  9. package/dist-server/common/decorators/project.decorator.js +0 -21
  10. package/dist-server/common/decorators/workspace.decorator.js +0 -24
  11. package/dist-server/common/interceptor/api-id-header.interceptor.js +0 -53
  12. package/dist-server/common/interceptor/http-logging.interceptor.js +0 -124
  13. package/dist-server/common/limits/defaults.js +0 -13
  14. package/dist-server/common/limits/limits-provider.js +0 -6
  15. package/dist-server/common/limits/limits.controller.js +0 -38
  16. package/dist-server/common/limits/limits.module.js +0 -24
  17. package/dist-server/common/limits/local-limits.provider.js +0 -27
  18. package/dist-server/common/middleware/workspace.middleware.js +0 -210
  19. package/dist-server/common/repository.exception-filter.js +0 -48
  20. package/dist-server/common/workspace-context.store.js +0 -25
  21. package/dist-server/domain/agent/agent.controller.js +0 -96
  22. package/dist-server/domain/agent/agent.module.js +0 -26
  23. package/dist-server/domain/agent/agent.service.js +0 -317
  24. package/dist-server/domain/agent/agent.types.js +0 -3
  25. package/dist-server/domain/agent/dto/create-agent.dto.js +0 -80
  26. package/dist-server/domain/agent/dto/preview-prompt.dto.js +0 -77
  27. package/dist-server/domain/agent/dto/provider-meta.dto.js +0 -2
  28. package/dist-server/domain/agent/dto/update-agent.dto.js +0 -92
  29. package/dist-server/domain/agent/provider.controller.js +0 -38
  30. package/dist-server/domain/agent/template-processor.service.js +0 -71
  31. package/dist-server/domain/auth/auth.constants.js +0 -4
  32. package/dist-server/domain/auth/auth.controller.js +0 -120
  33. package/dist-server/domain/auth/auth.module.js +0 -47
  34. package/dist-server/domain/auth/decorators/public.decorator.js +0 -7
  35. package/dist-server/domain/auth/guards/base-auth.guard.js +0 -62
  36. package/dist-server/domain/auth/utils/ip.utils.js +0 -31
  37. package/dist-server/domain/box/box.controller.js +0 -77
  38. package/dist-server/domain/box/box.module.js +0 -21
  39. package/dist-server/domain/box/box.service.js +0 -97
  40. package/dist-server/domain/box/dto/create-box.dto.js +0 -74
  41. package/dist-server/domain/cli/cli.controller.js +0 -88
  42. package/dist-server/domain/cli/cli.module.js +0 -21
  43. package/dist-server/domain/cli/cli.service.js +0 -435
  44. package/dist-server/domain/cli/dto/update-cli.dto.js +0 -31
  45. package/dist-server/domain/doc/doc.controller.js +0 -95
  46. package/dist-server/domain/doc/doc.module.js +0 -21
  47. package/dist-server/domain/doc/doc.service.js +0 -368
  48. package/dist-server/domain/doc/dto/doc.dto.js +0 -64
  49. package/dist-server/domain/document/document.controller.js +0 -57
  50. package/dist-server/domain/document/document.module.js +0 -22
  51. package/dist-server/domain/document/document.service.js +0 -271
  52. package/dist-server/domain/document/dto/register-document.dto.js +0 -24
  53. package/dist-server/domain/fs/dto/mkdir-request.dto.js +0 -47
  54. package/dist-server/domain/fs/dto/mkdir-response.dto.js +0 -2
  55. package/dist-server/domain/fs/dto/quick-access.dto.js +0 -2
  56. package/dist-server/domain/fs/dto/tree-node.dto.js +0 -2
  57. package/dist-server/domain/fs/dto/tree-query.dto.js +0 -35
  58. package/dist-server/domain/fs/fs.controller.js +0 -63
  59. package/dist-server/domain/fs/fs.module.js +0 -22
  60. package/dist-server/domain/fs/fs.service.js +0 -303
  61. package/dist-server/domain/git/git.module.js +0 -20
  62. package/dist-server/domain/git/git.service.js +0 -222
  63. package/dist-server/domain/health/health.controller.js +0 -57
  64. package/dist-server/domain/health/health.module.js +0 -19
  65. package/dist-server/domain/knowledge/dto/graph-knowledge.dto.js +0 -27
  66. package/dist-server/domain/knowledge/dto/knowledge.dto.js +0 -71
  67. package/dist-server/domain/knowledge/knowledge.controller.js +0 -122
  68. package/dist-server/domain/knowledge/knowledge.module.js +0 -21
  69. package/dist-server/domain/knowledge/knowledge.service.js +0 -538
  70. package/dist-server/domain/mcp/browser-session.store.js +0 -247
  71. package/dist-server/domain/mcp/crewx-tool.factory.js +0 -117
  72. package/dist-server/domain/mcp/mcp-auth.guard.js +0 -61
  73. package/dist-server/domain/mcp/mcp.constants.js +0 -4
  74. package/dist-server/domain/mcp/mcp.controller.js +0 -125
  75. package/dist-server/domain/mcp/mcp.dto.js +0 -12
  76. package/dist-server/domain/mcp/mcp.module.js +0 -49
  77. package/dist-server/domain/mcp/mcp.service.js +0 -682
  78. package/dist-server/domain/mcp/tool-router.service.js +0 -120
  79. package/dist-server/domain/message/dto/list-messages.dto.js +0 -57
  80. package/dist-server/domain/message/dto/send-message.dto.js +0 -45
  81. package/dist-server/domain/message/message.controller.js +0 -73
  82. package/dist-server/domain/message/message.module.js +0 -25
  83. package/dist-server/domain/message/message.service.js +0 -158
  84. package/dist-server/domain/onboarding/onboarding.controller.js +0 -97
  85. package/dist-server/domain/onboarding/onboarding.module.js +0 -23
  86. package/dist-server/domain/onboarding/onboarding.service.js +0 -106
  87. package/dist-server/domain/onboarding/onboarding.types.js +0 -2
  88. package/dist-server/domain/onboarding/presets/custom.js +0 -10
  89. package/dist-server/domain/onboarding/presets/dev-team.js +0 -41
  90. package/dist-server/domain/onboarding/presets/index.js +0 -15
  91. package/dist-server/domain/onboarding/presets/marketing-team.js +0 -29
  92. package/dist-server/domain/onboarding/presets/planning-team.js +0 -29
  93. package/dist-server/domain/onboarding/presets/solo.js +0 -17
  94. package/dist-server/domain/project/dto/create-project.dto.js +0 -46
  95. package/dist-server/domain/project/dto/update-project.dto.js +0 -60
  96. package/dist-server/domain/project/project.controller.js +0 -129
  97. package/dist-server/domain/project/project.module.js +0 -22
  98. package/dist-server/domain/project/project.service.js +0 -173
  99. package/dist-server/domain/skill/dto/add-registry.dto.js +0 -23
  100. package/dist-server/domain/skill/dto/install-skill.dto.js +0 -30
  101. package/dist-server/domain/skill/skill.controller.js +0 -136
  102. package/dist-server/domain/skill/skill.module.js +0 -22
  103. package/dist-server/domain/skill/skill.service.js +0 -632
  104. package/dist-server/domain/task/dto/all-tasks.dto.js +0 -55
  105. package/dist-server/domain/task/dto/list-tasks.dto.js +0 -69
  106. package/dist-server/domain/task/dto/search-tasks.dto.js +0 -66
  107. package/dist-server/domain/task/dto/send-message.dto.js +0 -31
  108. package/dist-server/domain/task/dto/task-status.dto.js +0 -34
  109. package/dist-server/domain/task/dto/workspace-usage.dto.js +0 -38
  110. package/dist-server/domain/task/task.constants.js +0 -5
  111. package/dist-server/domain/task/task.controller.js +0 -169
  112. package/dist-server/domain/task/task.module.js +0 -23
  113. package/dist-server/domain/task/task.service.js +0 -722
  114. package/dist-server/domain/thread/dto/build-context.dto.js +0 -42
  115. package/dist-server/domain/thread/dto/list-messages.dto.js +0 -49
  116. package/dist-server/domain/thread/dto/list-threads.dto.js +0 -70
  117. package/dist-server/domain/thread/dto/search-threads.dto.js +0 -13
  118. package/dist-server/domain/thread/dto/update-thread.dto.js +0 -23
  119. package/dist-server/domain/thread/thread.controller.js +0 -132
  120. package/dist-server/domain/thread/thread.module.js +0 -23
  121. package/dist-server/domain/thread/thread.service.js +0 -399
  122. package/dist-server/domain/usage/usage.controller.js +0 -118
  123. package/dist-server/domain/usage/usage.module.js +0 -21
  124. package/dist-server/domain/usage/usage.service.js +0 -343
  125. package/dist-server/domain/usage/usage.types.js +0 -4
  126. package/dist-server/domain/wbs/wbs.controller.js +0 -51
  127. package/dist-server/domain/wbs/wbs.module.js +0 -21
  128. package/dist-server/domain/wbs/wbs.service.js +0 -94
  129. package/dist-server/domain/workflow/workflow.controller.js +0 -53
  130. package/dist-server/domain/workflow/workflow.module.js +0 -21
  131. package/dist-server/domain/workflow/workflow.service.js +0 -209
  132. package/dist-server/domain/workspace/dto/create-workspace.dto.js +0 -45
  133. package/dist-server/domain/workspace/dto/switch-workspace.dto.js +0 -32
  134. package/dist-server/domain/workspace/dto/workspace-info.dto.js +0 -2
  135. package/dist-server/domain/workspace/workspace.controller.js +0 -98
  136. package/dist-server/domain/workspace/workspace.module.js +0 -22
  137. package/dist-server/domain/workspace/workspace.service.js +0 -216
  138. package/dist-server/main.js +0 -175
  139. package/dist-server/modules/crewx-pool.service.js +0 -70
  140. package/dist-server/modules/crewx.module.js +0 -47
  141. package/dist-server/package.json +0 -3
  142. package/dist-server/repository/base-sqlite.repository.js +0 -18
  143. package/dist-server/repository/box.repository.js +0 -99
  144. package/dist-server/repository/message.repository.js +0 -22
  145. package/dist-server/repository/project.repository.js +0 -48
  146. package/dist-server/repository/repository.module.js +0 -34
  147. package/dist-server/repository/request-log.repository.js +0 -96
  148. package/dist-server/repository/task.repository.js +0 -102
  149. package/dist-server/repository/thread.repository.js +0 -143
  150. package/dist-server/shared/crewx-home.js +0 -58
  151. package/dist-server/shared/crewx-state.js +0 -66
  152. package/dist-server/test-utils/compat-database.js +0 -30
  153. package/dist-server/utils/tokenizer.js +0 -8
@@ -1,88 +0,0 @@
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.CliController = void 0;
16
- const common_1 = require("@nestjs/common");
17
- const swagger_1 = require("@nestjs/swagger");
18
- const cli_service_js_1 = require("./cli.service.js");
19
- const update_cli_dto_js_1 = require("./dto/update-cli.dto.js");
20
- let CliController = class CliController {
21
- cliService;
22
- constructor(cliService) {
23
- this.cliService = cliService;
24
- }
25
- // CLI.LIST: CLI 목록 조회
26
- async getVersions() {
27
- const versions = await this.cliService.getVersions();
28
- return {
29
- success: true,
30
- data: versions,
31
- };
32
- }
33
- // CLI.UPDATE: CLI 업데이트
34
- async update(updateDto) {
35
- const data = await this.cliService.update(updateDto.name, updateDto.version);
36
- return { success: true, data };
37
- }
38
- // CLI.VERSIONS: CLI 버전 목록 조회
39
- async getAvailableVersions(name) {
40
- const result = await this.cliService.getAvailableVersions(name);
41
- return {
42
- success: true,
43
- data: result,
44
- };
45
- }
46
- // CLI.CHECK: CLI 상태 체크
47
- async check(name) {
48
- const result = await this.cliService.check(name);
49
- return { success: true, data: result };
50
- }
51
- };
52
- exports.CliController = CliController;
53
- __decorate([
54
- (0, swagger_1.ApiOperation)({ operationId: 'CLI.LIST', summary: 'List available CLI versions' }),
55
- (0, common_1.Get)('versions'),
56
- __metadata("design:type", Function),
57
- __metadata("design:paramtypes", []),
58
- __metadata("design:returntype", Promise)
59
- ], CliController.prototype, "getVersions", null);
60
- __decorate([
61
- (0, swagger_1.ApiOperation)({ operationId: 'CLI.UPDATE', summary: 'Update a CLI tool' }),
62
- (0, common_1.Post)('update'),
63
- __param(0, (0, common_1.Body)()),
64
- __metadata("design:type", Function),
65
- __metadata("design:paramtypes", [update_cli_dto_js_1.UpdateCliDto]),
66
- __metadata("design:returntype", Promise)
67
- ], CliController.prototype, "update", null);
68
- __decorate([
69
- (0, swagger_1.ApiOperation)({ operationId: 'CLI.VERSIONS', summary: 'Get available versions for a CLI tool' }),
70
- (0, common_1.Get)('available-versions'),
71
- __param(0, (0, common_1.Query)('name')),
72
- __metadata("design:type", Function),
73
- __metadata("design:paramtypes", [String]),
74
- __metadata("design:returntype", Promise)
75
- ], CliController.prototype, "getAvailableVersions", null);
76
- __decorate([
77
- (0, swagger_1.ApiOperation)({ operationId: 'CLI.CHECK', summary: 'Check CLI tool status' }),
78
- (0, common_1.Get)('check'),
79
- __param(0, (0, common_1.Query)('name')),
80
- __metadata("design:type", Function),
81
- __metadata("design:paramtypes", [String]),
82
- __metadata("design:returntype", Promise)
83
- ], CliController.prototype, "check", null);
84
- exports.CliController = CliController = __decorate([
85
- (0, swagger_1.ApiTags)('cli'),
86
- (0, common_1.Controller)('cli'),
87
- __metadata("design:paramtypes", [cli_service_js_1.CliService])
88
- ], CliController);
@@ -1,21 +0,0 @@
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.CliModule = void 0;
10
- const common_1 = require("@nestjs/common");
11
- const cli_controller_js_1 = require("./cli.controller.js");
12
- const cli_service_js_1 = require("./cli.service.js");
13
- let CliModule = class CliModule {
14
- };
15
- exports.CliModule = CliModule;
16
- exports.CliModule = CliModule = __decorate([
17
- (0, common_1.Module)({
18
- controllers: [cli_controller_js_1.CliController],
19
- providers: [cli_service_js_1.CliService],
20
- })
21
- ], CliModule);
@@ -1,435 +0,0 @@
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.CliService = void 0;
10
- exports.getShellEnv = getShellEnv;
11
- exports.resetShellEnvCache = resetShellEnvCache;
12
- exports.execCommand = execCommand;
13
- exports.parseVersion = parseVersion;
14
- exports.isOlderVersion = isOlderVersion;
15
- exports.findLatestVersion = findLatestVersion;
16
- const common_1 = require("@nestjs/common");
17
- const child_process_1 = require("child_process");
18
- const fs_1 = require("fs");
19
- const os_1 = require("os");
20
- const path_1 = require("path");
21
- const util_1 = require("util");
22
- const execAsync = (0, util_1.promisify)(child_process_1.exec);
23
- const isWindows = process.platform === 'win32';
24
- const logger = new common_1.Logger('CliService');
25
- // Cache the shell env Promise (not the value) to prevent race conditions.
26
- // Multiple concurrent callers will await the same promise instead of
27
- // each spawning their own interactive shell.
28
- let envPromise = null;
29
- function parseEnvOutput(stdout) {
30
- const env = {};
31
- for (const line of stdout.split('\n')) {
32
- const idx = line.indexOf('=');
33
- if (idx > 0) {
34
- env[line.slice(0, idx)] = line.slice(idx + 1);
35
- }
36
- }
37
- return env;
38
- }
39
- async function tryShellEnv(shell, flags) {
40
- try {
41
- const { stdout } = await execAsync(`${shell} ${flags} 'env'`, { timeout: 10000 });
42
- const env = parseEnvOutput(stdout);
43
- if (env.PATH && env.PATH !== process.env.PATH) {
44
- return env;
45
- }
46
- return env;
47
- }
48
- catch (err) {
49
- logger.debug(`Shell env detection failed with "${shell} ${flags}": ${err instanceof Error ? err.message : err}`);
50
- return null;
51
- }
52
- }
53
- // Resolves the user's shell environment once; subsequent calls return the same promise.
54
- function getShellEnv() {
55
- if (envPromise)
56
- return envPromise;
57
- envPromise = (async () => {
58
- if (isWindows) {
59
- return process.env;
60
- }
61
- const shell = process.env.SHELL || '/bin/bash';
62
- const strategies = [
63
- { flags: '-ic', desc: 'interactive' },
64
- { flags: '-lc', desc: 'login' },
65
- ];
66
- for (const { flags, desc } of strategies) {
67
- const env = await tryShellEnv(shell, flags);
68
- if (env) {
69
- const merged = { ...process.env, ...env };
70
- logger.log(`Detected shell env via ${shell} ${flags} (${desc})`);
71
- logger.log(`Detected shell env PATH: ${merged.PATH?.substring(0, 200)}...`);
72
- return merged;
73
- }
74
- }
75
- logger.warn('Shell env detection failed for all strategies, using process.env');
76
- return process.env;
77
- })();
78
- return envPromise;
79
- }
80
- // Reset the cached env promise (useful for testing)
81
- function resetShellEnvCache() {
82
- envPromise = null;
83
- }
84
- function getUserShell() {
85
- return process.env.SHELL || '/bin/zsh';
86
- }
87
- // Execute a command inside the user's actual login shell so that
88
- // PATH ordering (nvm, homebrew, etc.) matches what the user sees
89
- // in their terminal.
90
- async function execCommand(cmd, timeout = 10000) {
91
- if (isWindows) {
92
- return execAsync(cmd, { timeout, shell: process.env.ComSpec || 'cmd.exe' });
93
- }
94
- const shell = getUserShell();
95
- // Use -ilc (interactive + login) so zsh builds PATH from scratch
96
- // via .zprofile + .zshrc, not inheriting VSCode's polluted env.
97
- const escapedCmd = cmd.replace(/'/g, "'\\''");
98
- return execAsync(`${shell} -ilc '${escapedCmd}'`, {
99
- timeout,
100
- env: {
101
- HOME: process.env.HOME || '',
102
- USER: process.env.USER || '',
103
- SHELL: process.env.SHELL || shell,
104
- TERM: process.env.TERM || 'xterm-256color',
105
- DISABLE_AUTO_UPDATE: 'true',
106
- },
107
- });
108
- }
109
- // Parse version string (supports semver with prerelease)
110
- function parseVersion(versionOutput) {
111
- if (!versionOutput)
112
- return '';
113
- const match = versionOutput.match(/v?(\d+\.\d+\.\d+(?:-[a-zA-Z0-9.]+)?)/);
114
- return match ? match[1] : versionOutput.split('\n')[0].slice(0, 30).trim();
115
- }
116
- // Compare semver: returns true if v1 < v2 (prerelease-aware)
117
- function isOlderVersion(v1, v2) {
118
- if (!v1 || !v2)
119
- return false;
120
- const parse = (v) => {
121
- const [core, pre] = v.split('-');
122
- const parts = core.split('.').map(Number);
123
- return { parts, pre: pre || '' };
124
- };
125
- const a = parse(v1);
126
- const b = parse(v2);
127
- for (let i = 0; i < 3; i++) {
128
- if ((a.parts[i] || 0) < (b.parts[i] || 0))
129
- return true;
130
- if ((a.parts[i] || 0) > (b.parts[i] || 0))
131
- return false;
132
- }
133
- // Same core: prerelease < release (1.0.0-rc.1 < 1.0.0)
134
- if (a.pre && !b.pre)
135
- return true;
136
- if (!a.pre && b.pre)
137
- return false;
138
- if (a.pre && b.pre)
139
- return a.pre.localeCompare(b.pre, undefined, { numeric: true }) < 0;
140
- return false;
141
- }
142
- // Pick the highest version from a list of semver strings
143
- function findLatestVersion(versions) {
144
- if (!versions.length)
145
- return 'unknown';
146
- let latest = versions[0];
147
- for (let i = 1; i < versions.length; i++) {
148
- if (isOlderVersion(latest, versions[i])) {
149
- latest = versions[i];
150
- }
151
- }
152
- return latest;
153
- }
154
- // CLI-specific login commands (SSOT)
155
- const LOGIN_COMMANDS = {
156
- claude: 'claude login',
157
- gemini: 'gemini auth login',
158
- codex: 'codex login',
159
- copilot: 'gh auth login',
160
- };
161
- const CLI_LIST = [
162
- {
163
- name: 'claude',
164
- displayName: 'Claude Code',
165
- provider: 'Anthropic',
166
- packageName: '@anthropic-ai/claude-code',
167
- versionCommand: 'claude --version',
168
- loginCommand: LOGIN_COMMANDS['claude'],
169
- },
170
- {
171
- name: 'codex',
172
- displayName: 'Codex CLI',
173
- provider: 'OpenAI',
174
- packageName: '@openai/codex',
175
- versionCommand: 'codex --version',
176
- loginCommand: LOGIN_COMMANDS['codex'],
177
- },
178
- {
179
- name: 'gemini',
180
- displayName: 'Gemini CLI',
181
- provider: 'Google',
182
- packageName: '@google/gemini-cli',
183
- versionCommand: 'gemini --version',
184
- loginCommand: LOGIN_COMMANDS['gemini'],
185
- },
186
- {
187
- name: 'copilot',
188
- displayName: 'GitHub Copilot',
189
- provider: 'GitHub',
190
- packageName: '@github/copilot',
191
- versionCommand: 'copilot --version',
192
- loginCommand: LOGIN_COMMANDS['copilot'],
193
- },
194
- {
195
- name: 'opencode',
196
- displayName: 'OpenCode',
197
- provider: 'OpenCode',
198
- packageName: 'opencode-ai',
199
- versionCommand: 'opencode --version',
200
- loginCommand: null,
201
- },
202
- {
203
- name: 'crewx',
204
- displayName: 'CrewX',
205
- provider: 'CrewX',
206
- packageName: 'crewx',
207
- versionCommand: 'crewx --version',
208
- loginCommand: null,
209
- },
210
- ];
211
- let CliService = class CliService {
212
- async getVersions() {
213
- const results = await Promise.all(CLI_LIST.map(async (cli) => {
214
- let currentVersion = await this.getCurrentVersion(cli.versionCommand);
215
- const latestVersion = await this.getLatestVersion(cli.packageName);
216
- // Fallback: if --version fails (e.g. Node version mismatch), check npm list
217
- let installed = currentVersion !== null;
218
- if (!installed) {
219
- const npmVersion = await this.getNpmGlobalVersion(cli.packageName);
220
- if (npmVersion) {
221
- installed = true;
222
- currentVersion = npmVersion;
223
- }
224
- }
225
- return {
226
- name: cli.name,
227
- displayName: cli.displayName,
228
- provider: cli.provider,
229
- installed,
230
- currentVersion,
231
- latestVersion,
232
- updateAvailable: currentVersion !== null && latestVersion !== 'unknown' && isOlderVersion(currentVersion, latestVersion),
233
- packageName: cli.packageName,
234
- };
235
- }));
236
- return results;
237
- }
238
- async update(name, version) {
239
- const cli = CLI_LIST.find((c) => c.name === name);
240
- if (!cli) {
241
- throw new common_1.NotFoundException(`CLI not found: ${name}`);
242
- }
243
- const previousVersion = (await this.getCurrentVersion(cli.versionCommand)) ||
244
- (await this.getNpmGlobalVersion(cli.packageName));
245
- const targetVersion = version || 'latest';
246
- try {
247
- await execCommand(`npm install -g ${cli.packageName}@${targetVersion}`, 60000);
248
- }
249
- catch (error) {
250
- const errorMessage = error instanceof Error ? error.message : String(error);
251
- throw new common_1.InternalServerErrorException(`Update failed: ${errorMessage}`);
252
- }
253
- // Use npm list as primary source — some CLIs (e.g. copilot) report different versions via --version
254
- const newVersion = (await this.getNpmGlobalVersion(cli.packageName)) ||
255
- (await this.getCurrentVersion(cli.versionCommand));
256
- return {
257
- name: cli.name,
258
- previousVersion: previousVersion || 'none',
259
- newVersion: newVersion || 'unknown',
260
- message: `Updated ${cli.displayName} from ${previousVersion || 'none'} to ${newVersion || 'unknown'}`,
261
- };
262
- }
263
- async check(name) {
264
- const cli = CLI_LIST.find((c) => c.name === name);
265
- if (!cli) {
266
- return {
267
- name,
268
- installed: false,
269
- currentVersion: null,
270
- latestVersion: 'unknown',
271
- path: null,
272
- authenticated: null,
273
- loginCommand: null,
274
- };
275
- }
276
- let currentVersion = await this.getCurrentVersion(cli.versionCommand);
277
- const latestVersion = await this.getLatestVersion(cli.packageName);
278
- const path = await this.getCliPath(cli.versionCommand.split(' ')[0]);
279
- const authenticated = await this.checkAuthenticated(cli.name);
280
- // Fallback: if --version fails (e.g. Node version mismatch), check npm list
281
- let installed = currentVersion !== null;
282
- if (!installed) {
283
- const npmVersion = await this.getNpmGlobalVersion(cli.packageName);
284
- if (npmVersion) {
285
- installed = true;
286
- currentVersion = npmVersion;
287
- }
288
- }
289
- return {
290
- name: cli.name,
291
- installed,
292
- currentVersion,
293
- latestVersion,
294
- path,
295
- authenticated,
296
- loginCommand: cli.loginCommand,
297
- };
298
- }
299
- async checkAuthenticated(cliName) {
300
- switch (cliName) {
301
- case 'claude':
302
- return this.checkClaudeAuth();
303
- case 'codex':
304
- return this.checkCodexAuth();
305
- case 'copilot':
306
- return this.checkCopilotAuth();
307
- case 'gemini':
308
- return this.checkGeminiAuth();
309
- default:
310
- return null;
311
- }
312
- }
313
- async checkClaudeAuth() {
314
- try {
315
- const { stdout } = await execCommand('claude auth status --json', 10000);
316
- try {
317
- const parsed = JSON.parse(stdout.trim());
318
- return parsed.loggedIn === true;
319
- }
320
- catch {
321
- return this.parseAuthString(stdout);
322
- }
323
- }
324
- catch {
325
- try {
326
- const { stdout } = await execCommand('claude auth status', 10000);
327
- return this.parseAuthString(stdout);
328
- }
329
- catch {
330
- return null;
331
- }
332
- }
333
- }
334
- async checkCodexAuth() {
335
- try {
336
- const { stdout, stderr } = await execCommand('codex login status', 10000);
337
- // codex outputs to stderr
338
- const output = stdout || stderr;
339
- return this.parseAuthString(output);
340
- }
341
- catch {
342
- // exit != 0 means not logged in
343
- return false;
344
- }
345
- }
346
- async checkCopilotAuth() {
347
- try {
348
- const { stdout, stderr } = await execCommand('gh auth status', 10000);
349
- const output = stdout || stderr;
350
- const lower = output.toLowerCase();
351
- if (lower.includes('logged in'))
352
- return true;
353
- return false;
354
- }
355
- catch {
356
- // exit != 0 means not logged in
357
- return false;
358
- }
359
- }
360
- checkGeminiAuth() {
361
- const credsPath = (0, path_1.join)((0, os_1.homedir)(), '.gemini', 'oauth_creds.json');
362
- return (0, fs_1.existsSync)(credsPath);
363
- }
364
- parseAuthString(stdout) {
365
- const lower = stdout.toLowerCase();
366
- if (lower.includes('not authenticated') || lower.includes('not logged in'))
367
- return false;
368
- if (lower.includes('logged in') || lower.includes('authenticated'))
369
- return true;
370
- return null;
371
- }
372
- async getAvailableVersions(name) {
373
- const cli = CLI_LIST.find((c) => c.name === name);
374
- if (!cli) {
375
- return { name, versions: [] };
376
- }
377
- try {
378
- const { stdout } = await execCommand(`npm view ${cli.packageName} versions --json`, 15000);
379
- const parsed = JSON.parse(stdout.trim());
380
- // npm returns a single string when only one version exists
381
- const all = Array.isArray(parsed) ? parsed : [parsed];
382
- // Semver: versions with a hyphen are prerelease (rc, alpha, beta, nightly, platform builds, etc.)
383
- const stable = all.filter(v => !v.includes('-'));
384
- const versions = stable.reverse().slice(0, 20);
385
- return { name, versions };
386
- }
387
- catch {
388
- return { name, versions: [] };
389
- }
390
- }
391
- async getCurrentVersion(command) {
392
- try {
393
- const { stdout } = await execCommand(command);
394
- const version = parseVersion(stdout.trim());
395
- return version || null;
396
- }
397
- catch {
398
- return null;
399
- }
400
- }
401
- async getNpmGlobalVersion(packageName) {
402
- try {
403
- const { stdout } = await execCommand(`npm list -g ${packageName} --depth=0 --json`, 10000);
404
- const parsed = JSON.parse(stdout.trim());
405
- const version = parsed?.dependencies?.[packageName]?.version;
406
- return version || null;
407
- }
408
- catch {
409
- return null;
410
- }
411
- }
412
- async getLatestVersion(packageName) {
413
- try {
414
- const { stdout } = await execCommand(`npm view ${packageName}@latest version`, 15000);
415
- return stdout.trim() || 'unknown';
416
- }
417
- catch {
418
- return 'unknown';
419
- }
420
- }
421
- async getCliPath(command) {
422
- try {
423
- const cmd = isWindows ? `where ${command}` : `which ${command}`;
424
- const { stdout } = await execCommand(cmd);
425
- return stdout.trim().split('\n')[0];
426
- }
427
- catch {
428
- return null;
429
- }
430
- }
431
- };
432
- exports.CliService = CliService;
433
- exports.CliService = CliService = __decorate([
434
- (0, common_1.Injectable)()
435
- ], CliService);
@@ -1,31 +0,0 @@
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.UpdateCliDto = void 0;
13
- const swagger_1 = require("@nestjs/swagger");
14
- const class_validator_1 = require("class-validator");
15
- class UpdateCliDto {
16
- name;
17
- version;
18
- }
19
- exports.UpdateCliDto = UpdateCliDto;
20
- __decorate([
21
- (0, swagger_1.ApiProperty)({ description: 'CLI tool name to update' }),
22
- (0, class_validator_1.IsString)(),
23
- (0, class_validator_1.IsNotEmpty)(),
24
- __metadata("design:type", String)
25
- ], UpdateCliDto.prototype, "name", void 0);
26
- __decorate([
27
- (0, swagger_1.ApiPropertyOptional)({ description: 'Version to install (default: latest)', example: '1.0.0' }),
28
- (0, class_validator_1.IsString)(),
29
- (0, class_validator_1.IsOptional)(),
30
- __metadata("design:type", String)
31
- ], UpdateCliDto.prototype, "version", void 0);
@@ -1,95 +0,0 @@
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.DocController = void 0;
16
- const common_1 = require("@nestjs/common");
17
- const swagger_1 = require("@nestjs/swagger");
18
- const doc_service_js_1 = require("./doc.service.js");
19
- const doc_dto_js_1 = require("./dto/doc.dto.js");
20
- let DocController = class DocController {
21
- docService;
22
- constructor(docService) {
23
- this.docService = docService;
24
- }
25
- // DOC.TREE: Document file tree
26
- getTree(q) {
27
- const data = this.docService.getDocTree(q?.trim() || undefined);
28
- return { success: true, data };
29
- }
30
- // DOC.TOC: Table of contents for a markdown file
31
- getToc(query) {
32
- const data = this.docService.getToc(query.path);
33
- return { success: true, data };
34
- }
35
- // DOC.GET: File content (full or section)
36
- getContent(query) {
37
- const data = this.docService.getContent(query.path, query.section);
38
- return { success: true, data };
39
- }
40
- // DOC.STATUS: Implementation status matrix (spec × pencil × code)
41
- getImplStatus() {
42
- const data = this.docService.getImplStatus();
43
- return { success: true, data };
44
- }
45
- // DOC.SAVE: Save document content
46
- async saveContent(body) {
47
- const data = await this.docService.saveContent(body.path, body.content, body.mtime);
48
- return { success: true, data };
49
- }
50
- };
51
- exports.DocController = DocController;
52
- __decorate([
53
- (0, swagger_1.ApiOperation)({ operationId: 'DOC.TREE', summary: 'Get document file tree' }),
54
- (0, common_1.Get)('tree'),
55
- __param(0, (0, common_1.Query)('q')),
56
- __metadata("design:type", Function),
57
- __metadata("design:paramtypes", [String]),
58
- __metadata("design:returntype", void 0)
59
- ], DocController.prototype, "getTree", null);
60
- __decorate([
61
- (0, swagger_1.ApiOperation)({ operationId: 'DOC.TOC', summary: 'Get table of contents for a document' }),
62
- (0, common_1.Get)('toc'),
63
- __param(0, (0, common_1.Query)()),
64
- __metadata("design:type", Function),
65
- __metadata("design:paramtypes", [doc_dto_js_1.GetTocDto]),
66
- __metadata("design:returntype", void 0)
67
- ], DocController.prototype, "getToc", null);
68
- __decorate([
69
- (0, swagger_1.ApiOperation)({ operationId: 'DOC.GET', summary: 'Get document content' }),
70
- (0, common_1.Get)('content'),
71
- __param(0, (0, common_1.Query)()),
72
- __metadata("design:type", Function),
73
- __metadata("design:paramtypes", [doc_dto_js_1.GetContentDto]),
74
- __metadata("design:returntype", void 0)
75
- ], DocController.prototype, "getContent", null);
76
- __decorate([
77
- (0, swagger_1.ApiOperation)({ operationId: 'DOC.STATUS', summary: 'Get implementation status matrix' }),
78
- (0, common_1.Get)('impl-status'),
79
- __metadata("design:type", Function),
80
- __metadata("design:paramtypes", []),
81
- __metadata("design:returntype", void 0)
82
- ], DocController.prototype, "getImplStatus", null);
83
- __decorate([
84
- (0, swagger_1.ApiOperation)({ operationId: 'DOC.SAVE', summary: 'Save document content' }),
85
- (0, common_1.Put)('content'),
86
- __param(0, (0, common_1.Body)()),
87
- __metadata("design:type", Function),
88
- __metadata("design:paramtypes", [doc_dto_js_1.SaveContentDto]),
89
- __metadata("design:returntype", Promise)
90
- ], DocController.prototype, "saveContent", null);
91
- exports.DocController = DocController = __decorate([
92
- (0, swagger_1.ApiTags)('docs'),
93
- (0, common_1.Controller)('ws/:slug/docs'),
94
- __metadata("design:paramtypes", [doc_service_js_1.DocService])
95
- ], DocController);