@guildai/cli 0.11.0 → 0.12.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.
- package/dist/auth-CRMO5O3N.js +29 -0
- package/dist/auth-CRMO5O3N.js.map +7 -0
- package/dist/chat-5VX2WJH2.js +303 -0
- package/dist/chat-5VX2WJH2.js.map +7 -0
- package/dist/chat-SIKDYZQK.js +31 -0
- package/dist/chat-SIKDYZQK.js.map +7 -0
- package/dist/chunk-56YCMGL3.js +522 -0
- package/dist/chunk-56YCMGL3.js.map +7 -0
- package/dist/chunk-6EX6E7WP.js +7042 -0
- package/dist/chunk-6EX6E7WP.js.map +7 -0
- package/dist/chunk-B7VAF5UG.js +532 -0
- package/dist/chunk-B7VAF5UG.js.map +7 -0
- package/dist/chunk-DOIYVBNY.js +3057 -0
- package/dist/chunk-DOIYVBNY.js.map +7 -0
- package/dist/chunk-ENKEEJ45.js +17 -0
- package/dist/chunk-ENKEEJ45.js.map +7 -0
- package/dist/chunk-IBRKVGMZ.js +97041 -0
- package/dist/chunk-IBRKVGMZ.js.map +7 -0
- package/dist/chunk-LFMQJOKC.js +19778 -0
- package/dist/chunk-LFMQJOKC.js.map +7 -0
- package/dist/chunk-M347HP6M.js +22896 -0
- package/dist/chunk-M347HP6M.js.map +7 -0
- package/dist/chunk-OYQ476FQ.js +44 -0
- package/dist/chunk-OYQ476FQ.js.map +7 -0
- package/dist/chunk-PNCUR4OB.js +257 -0
- package/dist/chunk-PNCUR4OB.js.map +7 -0
- package/dist/chunk-RIG2HZWM.js +317 -0
- package/dist/chunk-RIG2HZWM.js.map +7 -0
- package/dist/chunk-SPZPZXUN.js +826 -0
- package/dist/chunk-SPZPZXUN.js.map +7 -0
- package/dist/chunk-VVSOU6ON.js +53 -0
- package/dist/chunk-VVSOU6ON.js.map +7 -0
- package/dist/chunk-X3ADGWOF.js +3643 -0
- package/dist/chunk-X3ADGWOF.js.map +7 -0
- package/dist/commands/skill/create.d.ts +3 -0
- package/dist/commands/skill/get.d.ts +3 -0
- package/dist/commands/skill/list.d.ts +3 -0
- package/dist/commands/skill/update.d.ts +3 -0
- package/dist/commands/skill/version/create.d.ts +3 -0
- package/dist/commands/skill/version/get.d.ts +3 -0
- package/dist/commands/skill/version/list.d.ts +3 -0
- package/dist/devtools-AO7YSDOD.js +67 -0
- package/dist/devtools-AO7YSDOD.js.map +7 -0
- package/dist/dist-4CBK6X5H.js +1566 -0
- package/dist/dist-4CBK6X5H.js.map +7 -0
- package/dist/esm-FRAVZP4J.js +13 -0
- package/dist/esm-FRAVZP4J.js.map +7 -0
- package/dist/execa-XQMWSABC.js +35 -0
- package/dist/execa-XQMWSABC.js.map +7 -0
- package/dist/index.js +8230 -263
- package/dist/index.js.map +7 -0
- package/dist/lib/api-types.d.ts +44 -0
- package/dist/lib/config.d.ts +9 -0
- package/dist/lib/errors.d.ts +1 -1
- package/dist/lib/output.d.ts +11 -1
- package/dist/lib/session-events.d.ts +1 -1
- package/dist/lib/session-polling.d.ts +24 -1
- package/dist/lib/websocket-client.d.ts +46 -0
- package/dist/open-RF4X5MOP.js +13 -0
- package/dist/open-RF4X5MOP.js.map +7 -0
- package/dist/server-JYVH64FD.js +27659 -0
- package/dist/server-JYVH64FD.js.map +7 -0
- package/dist/test-SNIYRJ32.js +692 -0
- package/dist/test-SNIYRJ32.js.map +7 -0
- package/docs/skills/codex-agent-dev.md +2 -2
- package/package.json +8 -12
- package/dist/commands/agent/chat.js +0 -281
- package/dist/commands/agent/clone.js +0 -118
- package/dist/commands/agent/code.js +0 -87
- package/dist/commands/agent/fork.js +0 -220
- package/dist/commands/agent/get.js +0 -37
- package/dist/commands/agent/grep.js +0 -107
- package/dist/commands/agent/init.js +0 -403
- package/dist/commands/agent/list.js +0 -110
- package/dist/commands/agent/logs.js +0 -62
- package/dist/commands/agent/owners.js +0 -74
- package/dist/commands/agent/publish.js +0 -91
- package/dist/commands/agent/pull.js +0 -194
- package/dist/commands/agent/revalidate.js +0 -56
- package/dist/commands/agent/save.js +0 -345
- package/dist/commands/agent/search.js +0 -61
- package/dist/commands/agent/tags/add.js +0 -73
- package/dist/commands/agent/tags/list.js +0 -43
- package/dist/commands/agent/tags/remove.js +0 -84
- package/dist/commands/agent/tags/set.js +0 -71
- package/dist/commands/agent/test.js +0 -489
- package/dist/commands/agent/unpublish.js +0 -64
- package/dist/commands/agent/update.js +0 -118
- package/dist/commands/agent/versions.js +0 -55
- package/dist/commands/agent/workspaces.js +0 -54
- package/dist/commands/auth/login.js +0 -31
- package/dist/commands/auth/logout.js +0 -24
- package/dist/commands/auth/status.js +0 -38
- package/dist/commands/auth/token.js +0 -19
- package/dist/commands/chat.js +0 -1416
- package/dist/commands/config/get.js +0 -64
- package/dist/commands/config/list.js +0 -46
- package/dist/commands/config/path.js +0 -37
- package/dist/commands/config/set.js +0 -132
- package/dist/commands/credentials/endpoint-list.js +0 -88
- package/dist/commands/credentials/list.js +0 -50
- package/dist/commands/credentials/policy-create.js +0 -66
- package/dist/commands/credentials/policy-delete.js +0 -33
- package/dist/commands/credentials/policy-list.js +0 -45
- package/dist/commands/credentials/policy-update.js +0 -66
- package/dist/commands/doctor.js +0 -233
- package/dist/commands/integration/connect.js +0 -76
- package/dist/commands/integration/create.js +0 -298
- package/dist/commands/integration/get.js +0 -95
- package/dist/commands/integration/list.js +0 -62
- package/dist/commands/integration/operation/create.js +0 -164
- package/dist/commands/integration/operation/list.js +0 -92
- package/dist/commands/integration/update.js +0 -139
- package/dist/commands/integration/version/build.js +0 -86
- package/dist/commands/integration/version/create.js +0 -45
- package/dist/commands/integration/version/get.js +0 -72
- package/dist/commands/integration/version/list.js +0 -45
- package/dist/commands/integration/version/publish.js +0 -79
- package/dist/commands/integration/version/test.js +0 -104
- package/dist/commands/job/get-step.js +0 -40
- package/dist/commands/job/get.js +0 -44
- package/dist/commands/mcp.js +0 -34
- package/dist/commands/session/create.js +0 -59
- package/dist/commands/session/events.js +0 -56
- package/dist/commands/session/get.js +0 -33
- package/dist/commands/session/interrupt.js +0 -33
- package/dist/commands/session/list.js +0 -59
- package/dist/commands/session/send.js +0 -54
- package/dist/commands/session/tasks.js +0 -45
- package/dist/commands/setup.js +0 -260
- package/dist/commands/trigger/activate.js +0 -41
- package/dist/commands/trigger/create.js +0 -197
- package/dist/commands/trigger/deactivate.js +0 -41
- package/dist/commands/trigger/get.js +0 -33
- package/dist/commands/trigger/list.js +0 -57
- package/dist/commands/trigger/sessions.js +0 -48
- package/dist/commands/trigger/update.js +0 -128
- package/dist/commands/version.js +0 -24
- package/dist/commands/workspace/agent/add.js +0 -114
- package/dist/commands/workspace/agent/list.js +0 -78
- package/dist/commands/workspace/agent/remove.js +0 -78
- package/dist/commands/workspace/clear.js +0 -45
- package/dist/commands/workspace/context/edit.js +0 -107
- package/dist/commands/workspace/context/get.js +0 -47
- package/dist/commands/workspace/context/list.js +0 -51
- package/dist/commands/workspace/context/publish.js +0 -42
- package/dist/commands/workspace/create.js +0 -51
- package/dist/commands/workspace/current.js +0 -63
- package/dist/commands/workspace/get.js +0 -39
- package/dist/commands/workspace/list.js +0 -70
- package/dist/commands/workspace/select.js +0 -184
- package/dist/components/AgentInstallPrompt.js +0 -97
- package/dist/components/SplashAnimation.js +0 -321
- package/dist/components/TaskView.js +0 -268
- package/dist/lib/agent-helpers.js +0 -306
- package/dist/lib/alternate-screen.js +0 -59
- package/dist/lib/api-client.js +0 -154
- package/dist/lib/api-types.js +0 -10
- package/dist/lib/auth.js +0 -284
- package/dist/lib/braille-canvas.js +0 -321
- package/dist/lib/colors.js +0 -46
- package/dist/lib/config-cache.js +0 -45
- package/dist/lib/config.js +0 -153
- package/dist/lib/did-you-mean.js +0 -144
- package/dist/lib/errors.js +0 -375
- package/dist/lib/event-filter.js +0 -91
- package/dist/lib/generated-types.js +0 -56
- package/dist/lib/git.js +0 -176
- package/dist/lib/gk.js +0 -91
- package/dist/lib/guild-config.js +0 -178
- package/dist/lib/iap.js +0 -117
- package/dist/lib/integration-helpers.js +0 -38
- package/dist/lib/loading-messages.js +0 -72
- package/dist/lib/logo.js +0 -141
- package/dist/lib/lottie-serverside.js +0 -181
- package/dist/lib/markdown.js +0 -38
- package/dist/lib/npmrc.js +0 -59
- package/dist/lib/output-mode.js +0 -54
- package/dist/lib/output.js +0 -622
- package/dist/lib/owner-helpers.js +0 -112
- package/dist/lib/polling.js +0 -76
- package/dist/lib/progress.js +0 -324
- package/dist/lib/session-events-fetch.js +0 -25
- package/dist/lib/session-events.js +0 -126
- package/dist/lib/session-polling.js +0 -166
- package/dist/lib/session-resume.js +0 -229
- package/dist/lib/spinners.js +0 -770
- package/dist/lib/splash.js +0 -42
- package/dist/lib/stdin.js +0 -91
- package/dist/lib/svg-to-braille.js +0 -76
- package/dist/lib/table.js +0 -59
- package/dist/lib/update-check.js +0 -65
- package/dist/lib/validate-input-schema.js +0 -208
- package/dist/lib/version-helpers.js +0 -137
- package/dist/lib/workspace-helpers.js +0 -49
- package/dist/mcp/resources.js +0 -67
- package/dist/mcp/server.js +0 -64
- package/dist/mcp/tools.js +0 -753
package/dist/commands/doctor.js
DELETED
|
@@ -1,233 +0,0 @@
|
|
|
1
|
-
// Copyright 2026 Guild.ai
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
import { Command } from 'commander';
|
|
4
|
-
import chalk from 'chalk';
|
|
5
|
-
import axios from 'axios';
|
|
6
|
-
import { getAuthToken } from '../lib/auth.js';
|
|
7
|
-
import { getGuildcoreUrl } from '../lib/config.js';
|
|
8
|
-
import { loadGlobalConfig, isAgentDirectory, getGlobalConfigPath, loadLocalConfig, } from '../lib/guild-config.js';
|
|
9
|
-
import { isMachineReadable } from '../lib/output-mode.js';
|
|
10
|
-
import { createOutputWriter } from '../lib/output.js';
|
|
11
|
-
async function checkAuth() {
|
|
12
|
-
const token = await getAuthToken();
|
|
13
|
-
if (token) {
|
|
14
|
-
return { name: 'Authentication', status: 'pass', message: 'Logged in' };
|
|
15
|
-
}
|
|
16
|
-
return {
|
|
17
|
-
name: 'Authentication',
|
|
18
|
-
status: 'fail',
|
|
19
|
-
message: 'Not logged in',
|
|
20
|
-
suggestion: 'Run: guild auth login',
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
async function checkServer() {
|
|
24
|
-
const url = getGuildcoreUrl();
|
|
25
|
-
const token = await getAuthToken();
|
|
26
|
-
const headers = {};
|
|
27
|
-
if (token) {
|
|
28
|
-
headers['Authorization'] = `Bearer ${token}`;
|
|
29
|
-
}
|
|
30
|
-
const start = Date.now();
|
|
31
|
-
try {
|
|
32
|
-
const response = await axios.get(`${url}/me`, {
|
|
33
|
-
timeout: 10000,
|
|
34
|
-
headers,
|
|
35
|
-
validateStatus: () => true,
|
|
36
|
-
});
|
|
37
|
-
const elapsed = Date.now() - start;
|
|
38
|
-
if (response.status >= 200 && response.status < 300) {
|
|
39
|
-
return {
|
|
40
|
-
name: 'Server',
|
|
41
|
-
status: 'pass',
|
|
42
|
-
message: `Connected to ${url} (${elapsed}ms)`,
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
if (response.status === 401) {
|
|
46
|
-
// Server is up but auth failed — still a successful connectivity check.
|
|
47
|
-
// checkAuth handles the auth failure separately.
|
|
48
|
-
return {
|
|
49
|
-
name: 'Server',
|
|
50
|
-
status: 'pass',
|
|
51
|
-
message: `Connected to ${url} (${elapsed}ms, auth required)`,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
return {
|
|
55
|
-
name: 'Server',
|
|
56
|
-
status: 'pass',
|
|
57
|
-
message: `Connected to ${url} (${elapsed}ms, HTTP ${response.status})`,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
catch {
|
|
61
|
-
return {
|
|
62
|
-
name: 'Server',
|
|
63
|
-
status: 'fail',
|
|
64
|
-
message: `Cannot connect to ${url}`,
|
|
65
|
-
suggestion: 'Check your network connection',
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
async function checkGlobalConfig() {
|
|
70
|
-
const config = await loadGlobalConfig();
|
|
71
|
-
const configPath = getGlobalConfigPath();
|
|
72
|
-
if (config) {
|
|
73
|
-
return {
|
|
74
|
-
name: 'Global config',
|
|
75
|
-
status: 'pass',
|
|
76
|
-
message: configPath.replace(process.env.HOME || '', '~'),
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
return {
|
|
80
|
-
name: 'Global config',
|
|
81
|
-
status: 'fail',
|
|
82
|
-
message: 'Not found',
|
|
83
|
-
suggestion: `Expected at ${configPath.replace(process.env.HOME || '', '~')}`,
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
async function checkDefaultWorkspace() {
|
|
87
|
-
const config = await loadGlobalConfig();
|
|
88
|
-
if (config?.default_workspace) {
|
|
89
|
-
const display = config.default_workspace_name || config.default_workspace;
|
|
90
|
-
return {
|
|
91
|
-
name: 'Default workspace',
|
|
92
|
-
status: 'pass',
|
|
93
|
-
message: display,
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
return {
|
|
97
|
-
name: 'Default workspace',
|
|
98
|
-
status: 'fail',
|
|
99
|
-
message: 'Not configured',
|
|
100
|
-
suggestion: 'Run: guild workspace select',
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
async function checkLocalConfig() {
|
|
104
|
-
const isAgent = await isAgentDirectory();
|
|
105
|
-
if (!isAgent) {
|
|
106
|
-
return {
|
|
107
|
-
name: 'Local config',
|
|
108
|
-
status: 'skip',
|
|
109
|
-
message: 'Not in an agent directory',
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
const config = await loadLocalConfig();
|
|
113
|
-
if (config) {
|
|
114
|
-
return {
|
|
115
|
-
name: 'Local config',
|
|
116
|
-
status: 'pass',
|
|
117
|
-
message: `Agent: ${config.name || config.agent_id}`,
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
return {
|
|
121
|
-
name: 'Local config',
|
|
122
|
-
status: 'fail',
|
|
123
|
-
message: 'guild.json found but could not be parsed',
|
|
124
|
-
suggestion: 'Check guild.json for valid JSON',
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
async function checkConfigFlags() {
|
|
128
|
-
const config = await loadGlobalConfig();
|
|
129
|
-
const flags = ['debug', 'json', 'quiet'];
|
|
130
|
-
const enabled = flags.filter((f) => config?.[f] === true);
|
|
131
|
-
if (enabled.length > 0) {
|
|
132
|
-
return {
|
|
133
|
-
name: 'Config flags',
|
|
134
|
-
status: 'pass',
|
|
135
|
-
message: `Enabled: ${enabled.join(', ')}`,
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
return {
|
|
139
|
-
name: 'Config flags',
|
|
140
|
-
status: 'skip',
|
|
141
|
-
message: 'No persistent flags set',
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
async function checkGit() {
|
|
145
|
-
const isAgent = await isAgentDirectory();
|
|
146
|
-
if (!isAgent) {
|
|
147
|
-
return {
|
|
148
|
-
name: 'Git',
|
|
149
|
-
status: 'skip',
|
|
150
|
-
message: 'Not in an agent directory',
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
try {
|
|
154
|
-
const { execa } = await import('execa');
|
|
155
|
-
await execa('git', ['--version']);
|
|
156
|
-
// Check for remote
|
|
157
|
-
const { stdout } = await execa('git', ['remote', '-v'], { reject: false });
|
|
158
|
-
if (stdout && stdout.includes('origin')) {
|
|
159
|
-
return { name: 'Git', status: 'pass', message: 'Installed, remote configured' };
|
|
160
|
-
}
|
|
161
|
-
return {
|
|
162
|
-
name: 'Git',
|
|
163
|
-
status: 'fail',
|
|
164
|
-
message: 'Installed but no remote configured',
|
|
165
|
-
suggestion: 'Run: git remote add origin <url>',
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
catch {
|
|
169
|
-
return {
|
|
170
|
-
name: 'Git',
|
|
171
|
-
status: 'fail',
|
|
172
|
-
message: 'Git not found',
|
|
173
|
-
suggestion: 'Install git: https://git-scm.com',
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
export function createDoctorCommand() {
|
|
178
|
-
const cmd = new Command('doctor');
|
|
179
|
-
cmd.description('Check CLI setup and diagnose issues').action(async () => {
|
|
180
|
-
const output = createOutputWriter();
|
|
181
|
-
const jsonMode = isMachineReadable();
|
|
182
|
-
const checks = [];
|
|
183
|
-
if (!jsonMode) {
|
|
184
|
-
output.progress('\nChecking Guild CLI setup...\n');
|
|
185
|
-
}
|
|
186
|
-
const runners = [
|
|
187
|
-
checkAuth,
|
|
188
|
-
checkServer,
|
|
189
|
-
checkGlobalConfig,
|
|
190
|
-
checkDefaultWorkspace,
|
|
191
|
-
checkConfigFlags,
|
|
192
|
-
checkLocalConfig,
|
|
193
|
-
checkGit,
|
|
194
|
-
];
|
|
195
|
-
for (const runner of runners) {
|
|
196
|
-
const result = await runner();
|
|
197
|
-
checks.push(result);
|
|
198
|
-
if (!jsonMode) {
|
|
199
|
-
const icon = result.status === 'pass'
|
|
200
|
-
? chalk.green('✓')
|
|
201
|
-
: result.status === 'fail'
|
|
202
|
-
? chalk.red('✗')
|
|
203
|
-
: chalk.dim('-');
|
|
204
|
-
const nameCol = result.name.padEnd(20);
|
|
205
|
-
output.progress(` ${icon} ${chalk.bold(nameCol)} ${result.message}`);
|
|
206
|
-
if (result.suggestion) {
|
|
207
|
-
output.progress(` ${chalk.dim(result.suggestion)}`);
|
|
208
|
-
output.progress('');
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
const passed = checks.filter((c) => c.status === 'pass').length;
|
|
213
|
-
const failed = checks.filter((c) => c.status === 'fail').length;
|
|
214
|
-
const skipped = checks.filter((c) => c.status === 'skip').length;
|
|
215
|
-
if (jsonMode) {
|
|
216
|
-
output.data({ checks, passed, failed, skipped });
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
output.progress('');
|
|
220
|
-
const parts = [];
|
|
221
|
-
if (passed > 0)
|
|
222
|
-
parts.push(chalk.green(`${passed} passed`));
|
|
223
|
-
if (failed > 0)
|
|
224
|
-
parts.push(chalk.red(`${failed} failed`));
|
|
225
|
-
if (skipped > 0)
|
|
226
|
-
parts.push(chalk.dim(`${skipped} skipped`));
|
|
227
|
-
output.progress(parts.join(', '));
|
|
228
|
-
}
|
|
229
|
-
process.exit(failed > 0 ? 1 : 0);
|
|
230
|
-
});
|
|
231
|
-
return cmd;
|
|
232
|
-
}
|
|
233
|
-
//# sourceMappingURL=doctor.js.map
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
// Copyright 2026 Guild.ai
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
import { Command } from 'commander';
|
|
4
|
-
import chalk from 'chalk';
|
|
5
|
-
import { GuildAPIClient } from '../../lib/api-client.js';
|
|
6
|
-
import { getAuthToken } from '../../lib/auth.js';
|
|
7
|
-
import { handleAxiosError } from '../../lib/errors.js';
|
|
8
|
-
import { isMachineReadable } from '../../lib/output-mode.js';
|
|
9
|
-
import { createOutputWriter } from '../../lib/output.js';
|
|
10
|
-
import { isInteractive } from '../../lib/stdin.js';
|
|
11
|
-
export function createIntegrationConnectCommand() {
|
|
12
|
-
const cmd = new Command('connect');
|
|
13
|
-
cmd
|
|
14
|
-
.description('Connect credentials to an integration')
|
|
15
|
-
.argument('<id_or_name>', 'Integration ID (UUID) or name in owner~name format (e.g. myorg~my-integration)')
|
|
16
|
-
.option('--token <value>', 'API key value (required in non-interactive mode)')
|
|
17
|
-
.requiredOption('--owner <id_or_name>', 'Account to own the credential — username, org name, or account ID')
|
|
18
|
-
.action(async (identifier, options) => {
|
|
19
|
-
const output = createOutputWriter();
|
|
20
|
-
try {
|
|
21
|
-
const token = await getAuthToken();
|
|
22
|
-
if (!token) {
|
|
23
|
-
output.error('Not authenticated. Please log in first.', 'Run: guild auth login');
|
|
24
|
-
process.exit(1);
|
|
25
|
-
}
|
|
26
|
-
if (!options.token && !isInteractive()) {
|
|
27
|
-
output.error('--token is required in non-interactive mode');
|
|
28
|
-
process.exit(1);
|
|
29
|
-
}
|
|
30
|
-
const client = new GuildAPIClient();
|
|
31
|
-
const integration = await client.get(`/integrations/${identifier}`);
|
|
32
|
-
if (!integration.auth_config) {
|
|
33
|
-
output.error('This integration has no authentication configured.');
|
|
34
|
-
process.exit(1);
|
|
35
|
-
}
|
|
36
|
-
if (integration.auth_config.entity_type !== 'EntIntegrationAuthConfigApiKey') {
|
|
37
|
-
output.error('OAuth integrations must be connected via the dashboard.');
|
|
38
|
-
process.exit(1);
|
|
39
|
-
}
|
|
40
|
-
let apiKey = options.token;
|
|
41
|
-
if (!apiKey) {
|
|
42
|
-
const { default: inquirer } = await import('inquirer');
|
|
43
|
-
const answer = await inquirer.prompt([
|
|
44
|
-
{
|
|
45
|
-
type: 'password',
|
|
46
|
-
name: 'apiKey',
|
|
47
|
-
message: 'API Key:',
|
|
48
|
-
validate: (input) => input.length > 0 || 'API key cannot be empty',
|
|
49
|
-
},
|
|
50
|
-
]);
|
|
51
|
-
apiKey = answer.apiKey;
|
|
52
|
-
}
|
|
53
|
-
const params = new URLSearchParams();
|
|
54
|
-
params.append('auth_config_id', integration.auth_config.id);
|
|
55
|
-
params.append('owner_id', options.owner);
|
|
56
|
-
const credential = await client.post(`/credentials/api-key?${params.toString()}`, { tokens: { token: apiKey } });
|
|
57
|
-
if (isMachineReadable()) {
|
|
58
|
-
output.data(credential);
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
console.log(chalk.green('Connected to ') + chalk.bold(integration.name));
|
|
62
|
-
console.log();
|
|
63
|
-
console.log(` ${'Credential ID'.padEnd(15)}${credential.id}`);
|
|
64
|
-
console.log(` ${'Integration'.padEnd(15)}${integration.owner.name}~${integration.name}`);
|
|
65
|
-
console.log(` ${'Owner'.padEnd(15)}${options.owner}`);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
catch (error) {
|
|
69
|
-
const formattedError = handleAxiosError(error);
|
|
70
|
-
output.error(`Failed to connect: ${formattedError.details}`);
|
|
71
|
-
process.exit(1);
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
return cmd;
|
|
75
|
-
}
|
|
76
|
-
//# sourceMappingURL=connect.js.map
|
|
@@ -1,298 +0,0 @@
|
|
|
1
|
-
// Copyright 2026 Guild.ai
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
import { Command } from 'commander';
|
|
4
|
-
import chalk from 'chalk';
|
|
5
|
-
import { GuildAPIClient } from '../../lib/api-client.js';
|
|
6
|
-
import { getAuthToken } from '../../lib/auth.js';
|
|
7
|
-
import { handleAxiosError } from '../../lib/errors.js';
|
|
8
|
-
import { isMachineReadable } from '../../lib/output-mode.js';
|
|
9
|
-
import { createOutputWriter } from '../../lib/output.js';
|
|
10
|
-
import { resolveOwnerId } from '../../lib/owner-helpers.js';
|
|
11
|
-
import { isInteractive } from '../../lib/stdin.js';
|
|
12
|
-
function formatCreatedIntegration(integration) {
|
|
13
|
-
console.log(chalk.green('Integration created successfully'));
|
|
14
|
-
console.log();
|
|
15
|
-
console.log(` ${'Name'.padEnd(15)}${integration.name}`);
|
|
16
|
-
console.log(` ${'Description'.padEnd(15)}${integration.description || chalk.dim('—')}`);
|
|
17
|
-
console.log(` ${'Visibility'.padEnd(15)}${integration.is_public ? 'public' : 'internal'}`);
|
|
18
|
-
console.log(` ${'Owner'.padEnd(15)}${integration.owner?.name || chalk.dim('—')}`);
|
|
19
|
-
console.log(` ${'Base URL'.padEnd(15)}${integration.protocol_config.base_url}`);
|
|
20
|
-
const scheme = integration.auth_config.auth_scheme === 'API_KEY' ? 'API Key' : 'OAuth 2.0';
|
|
21
|
-
console.log(` ${'Auth Scheme'.padEnd(15)}${scheme}`);
|
|
22
|
-
if (integration.auth_config.token_header_template) {
|
|
23
|
-
console.log(` ${'Header'.padEnd(15)}${integration.auth_config.token_header_template}`);
|
|
24
|
-
}
|
|
25
|
-
if (integration.webhook_config) {
|
|
26
|
-
console.log(` ${'Webhooks'.padEnd(15)}Enabled`);
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
console.log(` ${'Webhooks'.padEnd(15)}${chalk.dim('Not configured')}`);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
export function createIntegrationCreateCommand() {
|
|
33
|
-
const cmd = new Command('create');
|
|
34
|
-
cmd
|
|
35
|
-
.description('Create a new integration')
|
|
36
|
-
.argument('<name>', 'Integration name')
|
|
37
|
-
.option('--description <text>', 'What this integration does')
|
|
38
|
-
.option('--base-url <url>', 'Base URL for all API requests')
|
|
39
|
-
.option('--owner <account>', 'Owner account name or ID (default: current user)')
|
|
40
|
-
.option('--public', 'Make this integration visible to all users')
|
|
41
|
-
.option('--auth-scheme <scheme>', 'Authentication scheme: api-key or oauth')
|
|
42
|
-
.option('--header-template <template>', 'Header template for API Key auth (default: "X-API-Key: {token}")')
|
|
43
|
-
.option('--install-url <url>', 'OAuth authorization endpoint')
|
|
44
|
-
.option('--token-url <url>', 'OAuth token exchange endpoint')
|
|
45
|
-
.option('--client-id <id>', 'OAuth client ID')
|
|
46
|
-
.option('--client-secret <secret>', 'OAuth client secret')
|
|
47
|
-
.option('--scopes <scopes>', 'Comma-separated OAuth scopes')
|
|
48
|
-
.option('--token-content-type <type>', 'Content-Type for OAuth token request')
|
|
49
|
-
.option('--webhook-events <events>', 'Enable webhooks with events as JSON')
|
|
50
|
-
.action(async (name, options) => {
|
|
51
|
-
const output = createOutputWriter();
|
|
52
|
-
try {
|
|
53
|
-
const token = await getAuthToken();
|
|
54
|
-
if (!token) {
|
|
55
|
-
output.error('Not authenticated. Please log in first.', 'Run: guild auth login');
|
|
56
|
-
process.exit(1);
|
|
57
|
-
}
|
|
58
|
-
const client = new GuildAPIClient();
|
|
59
|
-
const interactive = isInteractive();
|
|
60
|
-
// Resolve owner
|
|
61
|
-
const owner = await resolveOwnerId({
|
|
62
|
-
ownerFlag: options.owner,
|
|
63
|
-
client,
|
|
64
|
-
interactive,
|
|
65
|
-
});
|
|
66
|
-
// Resolve description
|
|
67
|
-
let description = options.description;
|
|
68
|
-
if (!description && interactive) {
|
|
69
|
-
const { default: inquirer } = await import('inquirer');
|
|
70
|
-
const answer = await inquirer.prompt([
|
|
71
|
-
{ type: 'input', name: 'description', message: 'Description:' },
|
|
72
|
-
]);
|
|
73
|
-
description = answer.description;
|
|
74
|
-
}
|
|
75
|
-
// Resolve base URL
|
|
76
|
-
let baseUrl = options.baseUrl;
|
|
77
|
-
if (!baseUrl && interactive) {
|
|
78
|
-
const { default: inquirer } = await import('inquirer');
|
|
79
|
-
const answer = await inquirer.prompt([
|
|
80
|
-
{ type: 'input', name: 'baseUrl', message: 'Base URL:' },
|
|
81
|
-
]);
|
|
82
|
-
baseUrl = answer.baseUrl;
|
|
83
|
-
}
|
|
84
|
-
// Resolve auth scheme
|
|
85
|
-
let authScheme = options.authScheme;
|
|
86
|
-
if (!authScheme && interactive) {
|
|
87
|
-
const { default: inquirer } = await import('inquirer');
|
|
88
|
-
const answer = await inquirer.prompt([
|
|
89
|
-
{
|
|
90
|
-
type: 'list',
|
|
91
|
-
name: 'authScheme',
|
|
92
|
-
message: 'Select authentication scheme:',
|
|
93
|
-
choices: [
|
|
94
|
-
{
|
|
95
|
-
name: 'API Key - Static token sent in request headers',
|
|
96
|
-
value: 'api-key',
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
name: 'OAuth 2.0 - User grants access via authorization flow',
|
|
100
|
-
value: 'oauth',
|
|
101
|
-
},
|
|
102
|
-
],
|
|
103
|
-
},
|
|
104
|
-
]);
|
|
105
|
-
authScheme = answer.authScheme;
|
|
106
|
-
}
|
|
107
|
-
// Validate required fields in non-interactive mode
|
|
108
|
-
const missing = [];
|
|
109
|
-
if (!description)
|
|
110
|
-
missing.push('--description <text>');
|
|
111
|
-
if (!baseUrl)
|
|
112
|
-
missing.push('--base-url <url>');
|
|
113
|
-
if (!authScheme)
|
|
114
|
-
missing.push('--auth-scheme <scheme>');
|
|
115
|
-
if (missing.length > 0) {
|
|
116
|
-
output.error(`Error: The following options are required in non-interactive mode:\n ${missing.join('\n ')}`, 'Provide all required options, or run interactively (in a TTY) to be prompted.');
|
|
117
|
-
process.exit(1);
|
|
118
|
-
}
|
|
119
|
-
// Build auth config
|
|
120
|
-
let authConfig;
|
|
121
|
-
const normalizedScheme = authScheme.toLowerCase();
|
|
122
|
-
if (normalizedScheme === 'api-key') {
|
|
123
|
-
let headerTemplate = options.headerTemplate || 'X-API-Key: {token}';
|
|
124
|
-
if (interactive && !options.headerTemplate) {
|
|
125
|
-
const { default: inquirer } = await import('inquirer');
|
|
126
|
-
const answer = await inquirer.prompt([
|
|
127
|
-
{
|
|
128
|
-
type: 'input',
|
|
129
|
-
name: 'headerTemplate',
|
|
130
|
-
message: 'Header template:',
|
|
131
|
-
default: 'X-API-Key: {token}',
|
|
132
|
-
},
|
|
133
|
-
]);
|
|
134
|
-
headerTemplate = answer.headerTemplate;
|
|
135
|
-
}
|
|
136
|
-
if (!headerTemplate.includes('{token}')) {
|
|
137
|
-
output.error('Error: --header-template must contain {token} placeholder');
|
|
138
|
-
process.exit(1);
|
|
139
|
-
}
|
|
140
|
-
authConfig = {
|
|
141
|
-
auth_scheme: 'API_KEY',
|
|
142
|
-
token_header_template: headerTemplate,
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
else if (normalizedScheme === 'oauth') {
|
|
146
|
-
let installUrl = options.installUrl;
|
|
147
|
-
let tokenUrl = options.tokenUrl;
|
|
148
|
-
let clientId = options.clientId;
|
|
149
|
-
let clientSecret = options.clientSecret;
|
|
150
|
-
if (interactive) {
|
|
151
|
-
const { default: inquirer } = await import('inquirer');
|
|
152
|
-
if (!installUrl) {
|
|
153
|
-
const a = await inquirer.prompt([
|
|
154
|
-
{ type: 'input', name: 'val', message: 'Install URL:' },
|
|
155
|
-
]);
|
|
156
|
-
installUrl = a.val;
|
|
157
|
-
}
|
|
158
|
-
if (!tokenUrl) {
|
|
159
|
-
const a = await inquirer.prompt([
|
|
160
|
-
{ type: 'input', name: 'val', message: 'Token URL:' },
|
|
161
|
-
]);
|
|
162
|
-
tokenUrl = a.val;
|
|
163
|
-
}
|
|
164
|
-
if (!clientId) {
|
|
165
|
-
const a = await inquirer.prompt([
|
|
166
|
-
{ type: 'input', name: 'val', message: 'Client ID:' },
|
|
167
|
-
]);
|
|
168
|
-
clientId = a.val;
|
|
169
|
-
}
|
|
170
|
-
if (!clientSecret) {
|
|
171
|
-
const a = await inquirer.prompt([
|
|
172
|
-
{
|
|
173
|
-
type: 'password',
|
|
174
|
-
name: 'val',
|
|
175
|
-
message: 'Client Secret:',
|
|
176
|
-
},
|
|
177
|
-
]);
|
|
178
|
-
clientSecret = a.val;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
const oauthMissing = [];
|
|
182
|
-
if (!installUrl)
|
|
183
|
-
oauthMissing.push('--install-url');
|
|
184
|
-
if (!tokenUrl)
|
|
185
|
-
oauthMissing.push('--token-url');
|
|
186
|
-
if (!clientId)
|
|
187
|
-
oauthMissing.push('--client-id');
|
|
188
|
-
if (!clientSecret)
|
|
189
|
-
oauthMissing.push('--client-secret');
|
|
190
|
-
if (oauthMissing.length > 0) {
|
|
191
|
-
output.error(`Error: ${oauthMissing.join(', ')}, and --client-secret are required when --auth-scheme is oauth`);
|
|
192
|
-
process.exit(1);
|
|
193
|
-
}
|
|
194
|
-
authConfig = {
|
|
195
|
-
auth_scheme: 'OAUTH',
|
|
196
|
-
install_url: installUrl,
|
|
197
|
-
token_url: tokenUrl,
|
|
198
|
-
client_id: clientId,
|
|
199
|
-
client_secret: clientSecret,
|
|
200
|
-
token_url_content_type: options.tokenContentType || 'application/x-www-form-urlencoded',
|
|
201
|
-
};
|
|
202
|
-
if (options.scopes) {
|
|
203
|
-
authConfig.scopes = options.scopes.split(',').map((s) => s.trim());
|
|
204
|
-
}
|
|
205
|
-
else if (interactive) {
|
|
206
|
-
const { default: inquirer } = await import('inquirer');
|
|
207
|
-
const answer = await inquirer.prompt([
|
|
208
|
-
{
|
|
209
|
-
type: 'input',
|
|
210
|
-
name: 'scopes',
|
|
211
|
-
message: 'Scopes (comma-separated, optional):',
|
|
212
|
-
},
|
|
213
|
-
]);
|
|
214
|
-
if (answer.scopes) {
|
|
215
|
-
authConfig.scopes = answer.scopes
|
|
216
|
-
.split(',')
|
|
217
|
-
.map((s) => s.trim())
|
|
218
|
-
.filter(Boolean);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
else {
|
|
223
|
-
output.error(`Error: Invalid auth scheme '${authScheme}'`, 'Valid schemes: api-key, oauth');
|
|
224
|
-
process.exit(1);
|
|
225
|
-
}
|
|
226
|
-
// Build webhook config
|
|
227
|
-
let webhookConfig;
|
|
228
|
-
if (options.webhookEvents) {
|
|
229
|
-
try {
|
|
230
|
-
const events = JSON.parse(options.webhookEvents);
|
|
231
|
-
webhookConfig = { events };
|
|
232
|
-
}
|
|
233
|
-
catch {
|
|
234
|
-
output.error(`Error: Invalid JSON for --webhook-events: ${options.webhookEvents}`);
|
|
235
|
-
process.exit(1);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
else if (interactive) {
|
|
239
|
-
const { default: inquirer } = await import('inquirer');
|
|
240
|
-
const answer = await inquirer.prompt([
|
|
241
|
-
{
|
|
242
|
-
type: 'confirm',
|
|
243
|
-
name: 'configureWebhooks',
|
|
244
|
-
message: 'Configure webhooks?',
|
|
245
|
-
default: false,
|
|
246
|
-
},
|
|
247
|
-
]);
|
|
248
|
-
if (answer.configureWebhooks) {
|
|
249
|
-
const eventsAnswer = await inquirer.prompt([
|
|
250
|
-
{
|
|
251
|
-
type: 'input',
|
|
252
|
-
name: 'events',
|
|
253
|
-
message: 'Webhook events (JSON):',
|
|
254
|
-
},
|
|
255
|
-
]);
|
|
256
|
-
if (eventsAnswer.events) {
|
|
257
|
-
try {
|
|
258
|
-
const events = JSON.parse(eventsAnswer.events);
|
|
259
|
-
webhookConfig = { events };
|
|
260
|
-
}
|
|
261
|
-
catch {
|
|
262
|
-
output.error('Error: Invalid JSON for webhook events');
|
|
263
|
-
process.exit(1);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
// Build request body
|
|
269
|
-
const body = {
|
|
270
|
-
name,
|
|
271
|
-
description: description,
|
|
272
|
-
is_public: options.public || false,
|
|
273
|
-
protocol_config: {
|
|
274
|
-
protocol: 'REST',
|
|
275
|
-
base_url: baseUrl,
|
|
276
|
-
},
|
|
277
|
-
auth_config: authConfig,
|
|
278
|
-
};
|
|
279
|
-
if (webhookConfig) {
|
|
280
|
-
body.webhook_config = webhookConfig;
|
|
281
|
-
}
|
|
282
|
-
const response = await client.post(`/accounts/${owner.name}/integrations`, body);
|
|
283
|
-
if (isMachineReadable()) {
|
|
284
|
-
output.data(response);
|
|
285
|
-
}
|
|
286
|
-
else {
|
|
287
|
-
formatCreatedIntegration(response);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
catch (error) {
|
|
291
|
-
const formattedError = handleAxiosError(error);
|
|
292
|
-
output.error(`Failed to create integration: ${formattedError.details}`);
|
|
293
|
-
process.exit(1);
|
|
294
|
-
}
|
|
295
|
-
});
|
|
296
|
-
return cmd;
|
|
297
|
-
}
|
|
298
|
-
//# sourceMappingURL=create.js.map
|