@indemn/cli 1.2.2 → 1.3.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/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/org.d.ts +3 -0
- package/dist/cli/org.d.ts.map +1 -0
- package/dist/cli/org.js +97 -0
- package/dist/cli/org.js.map +1 -0
- package/package.json +1 -1
- package/src/cli/index.ts +2 -0
- package/src/cli/org.ts +107 -0
package/dist/cli/index.js
CHANGED
|
@@ -10,6 +10,7 @@ import { registerFunctionCommands } from './functions.js';
|
|
|
10
10
|
import { registerKBCommands } from './kb.js';
|
|
11
11
|
import { registerEvalCommands } from './eval.js';
|
|
12
12
|
import { registerChatCommand } from './chat.js';
|
|
13
|
+
import { registerOrgCommands } from './org.js';
|
|
13
14
|
const program = new Command();
|
|
14
15
|
program
|
|
15
16
|
.name('indemn')
|
|
@@ -31,6 +32,7 @@ registerFunctionCommands(program);
|
|
|
31
32
|
registerKBCommands(program);
|
|
32
33
|
registerEvalCommands(program);
|
|
33
34
|
registerChatCommand(program);
|
|
35
|
+
registerOrgCommands(program);
|
|
34
36
|
// MCP serve command
|
|
35
37
|
const mcp = program.command('mcp').description('MCP server commands');
|
|
36
38
|
mcp
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org.d.ts","sourceRoot":"","sources":["../../src/cli/org.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoG1D"}
|
package/dist/cli/org.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { IndemnClient } from '../sdk/client.js';
|
|
4
|
+
import { printError, printJson } from './utils/output.js';
|
|
5
|
+
export function registerOrgCommands(program) {
|
|
6
|
+
const org = program.command('org').description('Manage organizations');
|
|
7
|
+
org
|
|
8
|
+
.command('list')
|
|
9
|
+
.description('List organizations you have access to')
|
|
10
|
+
.option('--json', 'Output as JSON')
|
|
11
|
+
.action(async (options) => {
|
|
12
|
+
try {
|
|
13
|
+
const client = new IndemnClient();
|
|
14
|
+
const spinner = ora('Fetching organizations...').start();
|
|
15
|
+
// Get all project memberships
|
|
16
|
+
const res = await fetch(client.getHosts().copilot + '/projects', {
|
|
17
|
+
headers: {
|
|
18
|
+
'Authorization': `Bearer ${client.getApiKey()}`,
|
|
19
|
+
'Content-Type': 'application/json',
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
if (!res.ok)
|
|
23
|
+
throw new Error(`Failed to fetch projects (${res.status})`);
|
|
24
|
+
const memberships = await res.json();
|
|
25
|
+
// Get unique org IDs
|
|
26
|
+
const orgIds = [...new Set(memberships.map(m => m.id_organization).filter(Boolean))];
|
|
27
|
+
// Fetch org details
|
|
28
|
+
const orgs = [];
|
|
29
|
+
for (const orgId of orgIds) {
|
|
30
|
+
try {
|
|
31
|
+
const orgRes = await fetch(client.getHosts().copilot + '/organization/' + orgId, {
|
|
32
|
+
headers: {
|
|
33
|
+
'Authorization': `Bearer ${client.getApiKey()}`,
|
|
34
|
+
'Content-Type': 'application/json',
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
if (orgRes.ok) {
|
|
38
|
+
const data = await orgRes.json();
|
|
39
|
+
orgs.push(data.organization);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Skip orgs we can't fetch
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
spinner.stop();
|
|
47
|
+
if (options.json) {
|
|
48
|
+
printJson(orgs.map(o => ({ id: o._id, name: o.name, active: o.active })));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const currentOrgId = client.getOrgId();
|
|
52
|
+
console.log(chalk.bold('Organizations'));
|
|
53
|
+
console.log('');
|
|
54
|
+
for (const o of orgs.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
55
|
+
const marker = o._id === currentOrgId ? chalk.green(' (active)') : '';
|
|
56
|
+
console.log(` ${o._id} ${o.name}${marker}`);
|
|
57
|
+
}
|
|
58
|
+
console.log('');
|
|
59
|
+
console.log(chalk.dim(`${orgs.length} organizations. Switch with: indemn org switch <id>`));
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
printError(err);
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
org
|
|
67
|
+
.command('switch')
|
|
68
|
+
.description('Switch active organization')
|
|
69
|
+
.argument('<org-id>', 'Organization ID to switch to')
|
|
70
|
+
.action(async (orgId) => {
|
|
71
|
+
try {
|
|
72
|
+
const client = new IndemnClient();
|
|
73
|
+
const spinner = ora('Switching organization...').start();
|
|
74
|
+
// Verify the user has access to this org
|
|
75
|
+
const orgRes = await fetch(client.getHosts().copilot + '/organization/' + orgId, {
|
|
76
|
+
headers: {
|
|
77
|
+
'Authorization': `Bearer ${client.getApiKey()}`,
|
|
78
|
+
'Content-Type': 'application/json',
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
if (!orgRes.ok) {
|
|
82
|
+
spinner.fail('Organization not found or you don\'t have access.');
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
const data = await orgRes.json();
|
|
86
|
+
const orgName = data.organization.name;
|
|
87
|
+
// Update config
|
|
88
|
+
IndemnClient.saveConfig({ org_id: orgId });
|
|
89
|
+
spinner.succeed(`Switched to ${orgName} (${orgId})`);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
printError(err);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=org.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org.js","sourceRoot":"","sources":["../../src/cli/org.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE1D,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;IAEvE,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,GAAG,CAAC,2BAA2B,CAAC,CAAC,KAAK,EAAE,CAAC;YAEzD,8BAA8B;YAC9B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,GAAG,WAAW,EAAE;gBAC/D,OAAO,EAAE;oBACP,eAAe,EAAE,UAAU,MAAM,CAAC,SAAS,EAAE,EAAE;oBAC/C,cAAc,EAAE,kBAAkB;iBACnC;aACF,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;YACzE,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,IAAI,EAAyC,CAAC;YAE5E,qBAAqB;YACrB,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAa,CAAC;YAEjG,oBAAoB;YACpB,MAAM,IAAI,GAA0D,EAAE,CAAC;YACvE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,GAAG,gBAAgB,GAAG,KAAK,EAAE;wBAC/E,OAAO,EAAE;4BACP,eAAe,EAAE,UAAU,MAAM,CAAC,SAAS,EAAE,EAAE;4BAC/C,cAAc,EAAE,kBAAkB;yBACnC;qBACF,CAAC,CAAC;oBACH,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;wBACd,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAsE,CAAC;wBACrG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;oBAC/B,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,2BAA2B;gBAC7B,CAAC;YACH,CAAC;YAED,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC1E,OAAO;YACT,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBAClE,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC;YAChD,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,qDAAqD,CAAC,CAAC,CAAC;QAC9F,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4BAA4B,CAAC;SACzC,QAAQ,CAAC,UAAU,EAAE,8BAA8B,CAAC;SACpD,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,GAAG,CAAC,2BAA2B,CAAC,CAAC,KAAK,EAAE,CAAC;YAEzD,yCAAyC;YACzC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,GAAG,gBAAgB,GAAG,KAAK,EAAE;gBAC/E,OAAO,EAAE;oBACP,eAAe,EAAE,UAAU,MAAM,CAAC,SAAS,EAAE,EAAE;oBAC/C,cAAc,EAAE,kBAAkB;iBACnC;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;gBAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAqD,CAAC;YACpF,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YAEvC,gBAAgB;YAChB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAE3C,OAAO,CAAC,OAAO,CAAC,eAAe,OAAO,KAAK,KAAK,GAAG,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/package.json
CHANGED
package/src/cli/index.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { registerFunctionCommands } from './functions.js';
|
|
|
10
10
|
import { registerKBCommands } from './kb.js';
|
|
11
11
|
import { registerEvalCommands } from './eval.js';
|
|
12
12
|
import { registerChatCommand } from './chat.js';
|
|
13
|
+
import { registerOrgCommands } from './org.js';
|
|
13
14
|
|
|
14
15
|
const program = new Command();
|
|
15
16
|
|
|
@@ -36,6 +37,7 @@ registerFunctionCommands(program);
|
|
|
36
37
|
registerKBCommands(program);
|
|
37
38
|
registerEvalCommands(program);
|
|
38
39
|
registerChatCommand(program);
|
|
40
|
+
registerOrgCommands(program);
|
|
39
41
|
|
|
40
42
|
// MCP serve command
|
|
41
43
|
const mcp = program.command('mcp').description('MCP server commands');
|
package/src/cli/org.ts
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { IndemnClient } from '../sdk/client.js';
|
|
5
|
+
import { printError, printJson } from './utils/output.js';
|
|
6
|
+
|
|
7
|
+
export function registerOrgCommands(program: Command): void {
|
|
8
|
+
const org = program.command('org').description('Manage organizations');
|
|
9
|
+
|
|
10
|
+
org
|
|
11
|
+
.command('list')
|
|
12
|
+
.description('List organizations you have access to')
|
|
13
|
+
.option('--json', 'Output as JSON')
|
|
14
|
+
.action(async (options) => {
|
|
15
|
+
try {
|
|
16
|
+
const client = new IndemnClient();
|
|
17
|
+
const spinner = ora('Fetching organizations...').start();
|
|
18
|
+
|
|
19
|
+
// Get all project memberships
|
|
20
|
+
const res = await fetch(client.getHosts().copilot + '/projects', {
|
|
21
|
+
headers: {
|
|
22
|
+
'Authorization': `Bearer ${client.getApiKey()}`,
|
|
23
|
+
'Content-Type': 'application/json',
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
if (!res.ok) throw new Error(`Failed to fetch projects (${res.status})`);
|
|
27
|
+
const memberships = await res.json() as Array<{ id_organization?: string }>;
|
|
28
|
+
|
|
29
|
+
// Get unique org IDs
|
|
30
|
+
const orgIds = [...new Set(memberships.map(m => m.id_organization).filter(Boolean))] as string[];
|
|
31
|
+
|
|
32
|
+
// Fetch org details
|
|
33
|
+
const orgs: Array<{ _id: string; name: string; active: boolean }> = [];
|
|
34
|
+
for (const orgId of orgIds) {
|
|
35
|
+
try {
|
|
36
|
+
const orgRes = await fetch(client.getHosts().copilot + '/organization/' + orgId, {
|
|
37
|
+
headers: {
|
|
38
|
+
'Authorization': `Bearer ${client.getApiKey()}`,
|
|
39
|
+
'Content-Type': 'application/json',
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
if (orgRes.ok) {
|
|
43
|
+
const data = await orgRes.json() as { organization: { _id: string; name: string; active: boolean } };
|
|
44
|
+
orgs.push(data.organization);
|
|
45
|
+
}
|
|
46
|
+
} catch {
|
|
47
|
+
// Skip orgs we can't fetch
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
spinner.stop();
|
|
52
|
+
|
|
53
|
+
if (options.json) {
|
|
54
|
+
printJson(orgs.map(o => ({ id: o._id, name: o.name, active: o.active })));
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const currentOrgId = client.getOrgId();
|
|
59
|
+
console.log(chalk.bold('Organizations'));
|
|
60
|
+
console.log('');
|
|
61
|
+
for (const o of orgs.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
62
|
+
const marker = o._id === currentOrgId ? chalk.green(' (active)') : '';
|
|
63
|
+
console.log(` ${o._id} ${o.name}${marker}`);
|
|
64
|
+
}
|
|
65
|
+
console.log('');
|
|
66
|
+
console.log(chalk.dim(`${orgs.length} organizations. Switch with: indemn org switch <id>`));
|
|
67
|
+
} catch (err) {
|
|
68
|
+
printError(err);
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
org
|
|
74
|
+
.command('switch')
|
|
75
|
+
.description('Switch active organization')
|
|
76
|
+
.argument('<org-id>', 'Organization ID to switch to')
|
|
77
|
+
.action(async (orgId: string) => {
|
|
78
|
+
try {
|
|
79
|
+
const client = new IndemnClient();
|
|
80
|
+
const spinner = ora('Switching organization...').start();
|
|
81
|
+
|
|
82
|
+
// Verify the user has access to this org
|
|
83
|
+
const orgRes = await fetch(client.getHosts().copilot + '/organization/' + orgId, {
|
|
84
|
+
headers: {
|
|
85
|
+
'Authorization': `Bearer ${client.getApiKey()}`,
|
|
86
|
+
'Content-Type': 'application/json',
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
if (!orgRes.ok) {
|
|
91
|
+
spinner.fail('Organization not found or you don\'t have access.');
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const data = await orgRes.json() as { organization: { _id: string; name: string } };
|
|
96
|
+
const orgName = data.organization.name;
|
|
97
|
+
|
|
98
|
+
// Update config
|
|
99
|
+
IndemnClient.saveConfig({ org_id: orgId });
|
|
100
|
+
|
|
101
|
+
spinner.succeed(`Switched to ${orgName} (${orgId})`);
|
|
102
|
+
} catch (err) {
|
|
103
|
+
printError(err);
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|