@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 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
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerOrgCommands(program: Command): void;
3
+ //# sourceMappingURL=org.d.ts.map
@@ -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"}
@@ -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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@indemn/cli",
3
- "version": "1.2.2",
3
+ "version": "1.3.0",
4
4
  "description": "CLI, MCP server, and plugin for managing Indemn AI agents",
5
5
  "type": "module",
6
6
  "main": "./dist/sdk/index.js",
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
+ }