@getstackrun/cli 0.6.1 → 0.7.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 (50) hide show
  1. package/dist/agent.d.ts.map +1 -1
  2. package/dist/agent.js +113 -3
  3. package/dist/agent.js.map +1 -1
  4. package/dist/api.d.ts +26 -0
  5. package/dist/api.d.ts.map +1 -0
  6. package/dist/api.js +90 -0
  7. package/dist/api.js.map +1 -0
  8. package/dist/audit.d.ts +2 -0
  9. package/dist/audit.d.ts.map +1 -0
  10. package/dist/audit.js +69 -0
  11. package/dist/audit.js.map +1 -0
  12. package/dist/dropoffs.d.ts +2 -0
  13. package/dist/dropoffs.d.ts.map +1 -0
  14. package/dist/dropoffs.js +140 -0
  15. package/dist/dropoffs.js.map +1 -0
  16. package/dist/events.d.ts +2 -0
  17. package/dist/events.d.ts.map +1 -0
  18. package/dist/events.js +77 -0
  19. package/dist/events.js.map +1 -0
  20. package/dist/format.d.ts +16 -0
  21. package/dist/format.d.ts.map +1 -0
  22. package/dist/format.js +77 -0
  23. package/dist/format.js.map +1 -0
  24. package/dist/identity.d.ts +2 -0
  25. package/dist/identity.d.ts.map +1 -0
  26. package/dist/identity.js +86 -0
  27. package/dist/identity.js.map +1 -0
  28. package/dist/index.js +120 -4
  29. package/dist/index.js.map +1 -1
  30. package/dist/me.d.ts +2 -0
  31. package/dist/me.d.ts.map +1 -0
  32. package/dist/me.js +11 -0
  33. package/dist/me.js.map +1 -0
  34. package/dist/passports.d.ts +2 -0
  35. package/dist/passports.d.ts.map +1 -0
  36. package/dist/passports.js +157 -0
  37. package/dist/passports.js.map +1 -0
  38. package/dist/services.d.ts +2 -0
  39. package/dist/services.d.ts.map +1 -0
  40. package/dist/services.js +97 -0
  41. package/dist/services.js.map +1 -0
  42. package/dist/skills.d.ts +2 -0
  43. package/dist/skills.d.ts.map +1 -0
  44. package/dist/skills.js +96 -0
  45. package/dist/skills.js.map +1 -0
  46. package/dist/team.d.ts +2 -0
  47. package/dist/team.d.ts.map +1 -0
  48. package/dist/team.js +86 -0
  49. package/dist/team.js.map +1 -0
  50. package/package.json +1 -1
@@ -0,0 +1,157 @@
1
+ // passports subcommands — thin wrappers over /v1/passports/*.
2
+ import { stdout, stderr, exit } from 'node:process';
3
+ import { api, takeFlag } from './api.js';
4
+ import { invokeHint } from './auth.js';
5
+ import { printJson, printTable, printRecord, fmt, fmtTs } from './format.js';
6
+ async function cmdList(args, json) {
7
+ const agentId = takeFlag(args, '--agent');
8
+ const sessionId = takeFlag(args, '--session');
9
+ const list = await api('GET', '/v1/passports/active', {
10
+ query: {
11
+ agent_id: typeof agentId === 'string' ? agentId : undefined,
12
+ session_id: typeof sessionId === 'string' ? sessionId : undefined,
13
+ },
14
+ });
15
+ if (json)
16
+ return printJson(list);
17
+ if (list.length === 0) {
18
+ stdout.write('(no active passports)\n');
19
+ return;
20
+ }
21
+ const rows = list.map((p) => [
22
+ p.jti,
23
+ p.agent_id,
24
+ String(p.delegation_depth),
25
+ fmtTs(p.issued_at),
26
+ fmtTs(p.expires_at),
27
+ ]);
28
+ printTable(['JTI', 'AGENT', 'DEPTH', 'ISSUED', 'EXPIRES'], rows);
29
+ }
30
+ async function cmdIssue(args, json) {
31
+ const agentId = takeFlag(args, '--agent');
32
+ const intentSummary = takeFlag(args, '--intent');
33
+ const servicesRaw = takeFlag(args, '--services');
34
+ const ttl = takeFlag(args, '--ttl');
35
+ if (typeof agentId !== 'string' || typeof intentSummary !== 'string' || typeof servicesRaw !== 'string') {
36
+ stderr.write(`usage: ${invokeHint('passport issue --agent <id> --intent "<summary>" --services slack,stripe [--ttl <seconds>]')}\n`);
37
+ exit(2);
38
+ }
39
+ const serviceList = servicesRaw.split(',').map((s) => s.trim()).filter(Boolean);
40
+ const body = {
41
+ agent_id: agentId,
42
+ intent: { summary: intentSummary, services: serviceList },
43
+ scopes: serviceList.map((service_id) => ({ service_id })),
44
+ };
45
+ if (typeof ttl === 'string')
46
+ body.ttl_seconds = parseInt(ttl, 10);
47
+ const issued = await api('POST', '/v1/passports/issue', { body });
48
+ if (json)
49
+ return printJson(issued);
50
+ stdout.write(`issued ${issued.jti}\n expires ${fmtTs(issued.expires_at)}\n token: ${issued.token}\n`);
51
+ }
52
+ async function cmdRefresh(jti, args, json) {
53
+ // /v1/passports/refresh takes a token, not a jti. Caller must pipe in
54
+ // the token via --token (or stdin) since the CLI doesn't store
55
+ // passports locally. Surface the constraint with a clear usage line
56
+ // when --token is absent.
57
+ const tokenFlag = takeFlag(args, '--token');
58
+ if (typeof tokenFlag !== 'string') {
59
+ stderr.write(`usage: ${invokeHint(`passport refresh <jti> --token <jwt>`)}\n` +
60
+ `(refresh takes the full passport JWT, not just the jti — pass via --token)\n`);
61
+ exit(2);
62
+ }
63
+ void jti; // accepted for symmetry but unused — token is the source
64
+ const ttl = takeFlag(args, '--ttl');
65
+ const body = { token: tokenFlag };
66
+ if (typeof ttl === 'string')
67
+ body.ttl_seconds = parseInt(ttl, 10);
68
+ const out = await api('POST', '/v1/passports/refresh', { body });
69
+ if (json)
70
+ return printJson(out);
71
+ printRecord(out);
72
+ }
73
+ async function cmdVerify(token, json) {
74
+ const out = await api('POST', '/v1/passports/verify', { body: { token } });
75
+ if (json)
76
+ return printJson(out);
77
+ printRecord(out);
78
+ }
79
+ async function cmdRevoke(jti, args, json) {
80
+ const reason = takeFlag(args, '--reason');
81
+ const out = await api('POST', '/v1/passports/revoke', {
82
+ body: { jti, reason: typeof reason === 'string' ? reason : undefined },
83
+ });
84
+ if (json)
85
+ return printJson(out);
86
+ stdout.write(`revoked ${jti}\n`);
87
+ }
88
+ async function cmdRevokeAgent(agentId, args, json) {
89
+ const reason = takeFlag(args, '--reason');
90
+ const out = await api('POST', `/v1/passports/revoke-agent/${encodeURIComponent(agentId)}`, {
91
+ body: { reason: typeof reason === 'string' ? reason : 'CLI revoke' },
92
+ });
93
+ if (json)
94
+ return printJson(out);
95
+ stdout.write(`revoked ${out.revoked_count} passport(s) for ${agentId}\n`);
96
+ }
97
+ async function cmdRevokeAll(args, json) {
98
+ const yes = !!takeFlag(args, '--yes');
99
+ const reason = takeFlag(args, '--reason');
100
+ if (!yes) {
101
+ stderr.write(`error: passport revoke-all is destructive across all agents.\n` +
102
+ `Pass --yes to confirm. Optional: --reason "<text>".\n`);
103
+ exit(2);
104
+ }
105
+ const out = await api('POST', '/v1/passports/revoke-all', {
106
+ body: { confirm: true, reason: typeof reason === 'string' ? reason : 'CLI revoke-all' },
107
+ });
108
+ if (json)
109
+ return printJson(out);
110
+ stdout.write(`revoked ${out.revoked_count} passport(s)\n`);
111
+ }
112
+ export async function cmdPassport(args) {
113
+ const json = !!takeFlag(args, '--json');
114
+ const sub = args[0];
115
+ const arg1 = args[1];
116
+ if (sub === 'list' || sub === 'ls' || sub === 'active')
117
+ return cmdList(args.slice(1), json);
118
+ if (sub === 'issue')
119
+ return cmdIssue(args.slice(1), json);
120
+ if (sub === 'refresh') {
121
+ if (!arg1) {
122
+ stderr.write(`usage: ${invokeHint('passport refresh <jti> --token <jwt>')}\n`);
123
+ exit(2);
124
+ }
125
+ return cmdRefresh(arg1, args.slice(2), json);
126
+ }
127
+ if (sub === 'verify') {
128
+ if (!arg1) {
129
+ stderr.write(`usage: ${invokeHint('passport verify <jwt-token>')}\n`);
130
+ exit(2);
131
+ }
132
+ return cmdVerify(arg1, json);
133
+ }
134
+ if (sub === 'revoke') {
135
+ if (!arg1) {
136
+ stderr.write(`usage: ${invokeHint('passport revoke <jti> [--reason "..."]')}\n`);
137
+ exit(2);
138
+ }
139
+ return cmdRevoke(arg1, args.slice(2), json);
140
+ }
141
+ if (sub === 'revoke-agent') {
142
+ if (!arg1) {
143
+ stderr.write(`usage: ${invokeHint('passport revoke-agent <agent-id> [--reason "..."]')}\n`);
144
+ exit(2);
145
+ }
146
+ return cmdRevokeAgent(arg1, args.slice(2), json);
147
+ }
148
+ if (sub === 'revoke-all')
149
+ return cmdRevokeAll(args.slice(1), json);
150
+ stderr.write(`error: unknown passport subcommand "${sub ?? ''}".\n` +
151
+ `Use list | issue | refresh | verify | revoke | revoke-agent | revoke-all\n`);
152
+ exit(2);
153
+ }
154
+ // Silence the unused-imports warnings for the fields we re-export-like
155
+ // when building the table headers.
156
+ void fmt;
157
+ //# sourceMappingURL=passports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passports.js","sourceRoot":"","sources":["../src/passports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function cmdService(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAyEA,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyC9D"}
@@ -0,0 +1,97 @@
1
+ // services subcommands — thin wrappers over /v1/services/* + /v1/credentials/*.
2
+ import { stdout, stderr, exit } from 'node:process';
3
+ import { api, takeFlag } from './api.js';
4
+ import { invokeHint } from './auth.js';
5
+ import { printJson, printTable, printRecord, fmt } from './format.js';
6
+ async function cmdCatalog(json) {
7
+ const list = await api('GET', '/v1/services');
8
+ if (json)
9
+ return printJson(list);
10
+ const rows = list.map((s) => [s.provider, s.name, s.available === false ? fmt.dim('soon') : fmt.ok('yes')]);
11
+ printTable(['PROVIDER', 'NAME', 'AVAILABLE'], rows);
12
+ }
13
+ async function cmdConnections(json) {
14
+ // /v1/services returns the catalog (services + connections). Dashboard
15
+ // route returns `{connections: [...]}` envelope after auth filter.
16
+ // Re-use that path so a CLI user sees the same authoritative list.
17
+ const out = await api('GET', '/v1/services');
18
+ const list = Array.isArray(out) ? out : (out?.connections ?? []);
19
+ if (json)
20
+ return printJson(list);
21
+ if (list.length === 0) {
22
+ stdout.write('(no service connections)\n');
23
+ return;
24
+ }
25
+ const rows = list.map((c) => [c.id, c.provider, c.status, (c.scopes ?? []).join(', ')]);
26
+ printTable(['ID', 'PROVIDER', 'STATUS', 'SCOPES'], rows);
27
+ }
28
+ async function cmdShow(connectionId, json) {
29
+ const out = await api('GET', `/v1/services/${encodeURIComponent(connectionId)}`);
30
+ if (json)
31
+ return printJson(out);
32
+ printRecord(out);
33
+ }
34
+ async function cmdVerify(connectionId, json) {
35
+ const out = await api('POST', `/v1/services/${encodeURIComponent(connectionId)}/verify`);
36
+ if (json)
37
+ return printJson(out);
38
+ printRecord(out);
39
+ }
40
+ async function cmdDisconnect(connectionId, json) {
41
+ const out = await api('DELETE', `/v1/services/${encodeURIComponent(connectionId)}/disconnect`);
42
+ if (json)
43
+ return printJson(out);
44
+ stdout.write(`disconnected ${connectionId}\n`);
45
+ }
46
+ async function cmdCredential(provider, json) {
47
+ // Returns the raw credential — operator-only path. WARNING for the
48
+ // human: shouldn't be in shell history; we don't suppress that here
49
+ // because pipeline use cases (e.g. `cred = $(stack-cli services
50
+ // credential stripe --json | jq .access_token)`) are legitimate.
51
+ const out = await api('GET', `/v1/credentials/${encodeURIComponent(provider)}`);
52
+ if (json)
53
+ return printJson(out);
54
+ printRecord(out);
55
+ }
56
+ export async function cmdService(args) {
57
+ const json = !!takeFlag(args, '--json');
58
+ const sub = args[0];
59
+ const arg1 = args[1];
60
+ if (sub === 'catalog' || sub === 'available' || sub === 'list')
61
+ return cmdCatalog(json);
62
+ if (sub === 'connections' || sub === 'connected')
63
+ return cmdConnections(json);
64
+ if (sub === 'show') {
65
+ if (!arg1) {
66
+ stderr.write(`usage: ${invokeHint('service show <connection-id>')}\n`);
67
+ exit(2);
68
+ }
69
+ return cmdShow(arg1, json);
70
+ }
71
+ if (sub === 'verify') {
72
+ if (!arg1) {
73
+ stderr.write(`usage: ${invokeHint('service verify <connection-id>')}\n`);
74
+ exit(2);
75
+ }
76
+ return cmdVerify(arg1, json);
77
+ }
78
+ if (sub === 'disconnect') {
79
+ if (!arg1) {
80
+ stderr.write(`usage: ${invokeHint('service disconnect <connection-id>')}\n`);
81
+ exit(2);
82
+ }
83
+ return cmdDisconnect(arg1, json);
84
+ }
85
+ if (sub === 'credential') {
86
+ if (!arg1) {
87
+ stderr.write(`usage: ${invokeHint('service credential <provider>')}\n`);
88
+ exit(2);
89
+ }
90
+ return cmdCredential(arg1, json);
91
+ }
92
+ stderr.write(`error: unknown service subcommand "${sub ?? ''}".\n` +
93
+ `Use catalog | connections | show | verify | disconnect | credential\n` +
94
+ `Note: connecting a new service is OAuth-driven via the dashboard.\n`);
95
+ exit(2);
96
+ }
97
+ //# sourceMappingURL=services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.js","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function cmdSkill(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAuEA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC5D"}
package/dist/skills.js ADDED
@@ -0,0 +1,96 @@
1
+ // skills subcommands.
2
+ import { stdout, stderr, exit } from 'node:process';
3
+ import { api, takeFlag } from './api.js';
4
+ import { invokeHint } from './auth.js';
5
+ import { printJson, printTable, printRecord, fmt } from './format.js';
6
+ async function cmdBrowse(args, json) {
7
+ const query = takeFlag(args, '--q');
8
+ const list = await api('GET', '/v1/skills', {
9
+ query: { q: typeof query === 'string' ? query : undefined },
10
+ });
11
+ if (json)
12
+ return printJson(list);
13
+ if (list.length === 0) {
14
+ stdout.write('(no skills match)\n');
15
+ return;
16
+ }
17
+ const rows = list.map((s) => [
18
+ s.id,
19
+ s.name,
20
+ s.trust_required ?? '—',
21
+ s.price_cents != null ? `$${(s.price_cents / 100).toFixed(2)}` : fmt.dim('free'),
22
+ ]);
23
+ printTable(['ID', 'NAME', 'TRUST', 'PRICE'], rows);
24
+ }
25
+ async function cmdMine(json) {
26
+ const list = await api('GET', '/v1/skills/mine');
27
+ if (json)
28
+ return printJson(list);
29
+ if (list.length === 0) {
30
+ stdout.write('(you have no published skills)\n');
31
+ return;
32
+ }
33
+ const rows = list.map((s) => [s.id, s.name, s.status ?? '—']);
34
+ printTable(['ID', 'NAME', 'STATUS'], rows);
35
+ }
36
+ async function cmdShow(id, json) {
37
+ const out = await api('GET', `/v1/skills/${encodeURIComponent(id)}`);
38
+ if (json)
39
+ return printJson(out);
40
+ printRecord(out);
41
+ }
42
+ async function cmdSuspend(id, state, json) {
43
+ const out = await api('POST', `/v1/skills/${encodeURIComponent(id)}/${state}`);
44
+ if (json)
45
+ return printJson(out);
46
+ stdout.write(`${state}d ${id}\n`);
47
+ }
48
+ async function cmdRequestsList(json) {
49
+ const out = await api('GET', '/v1/skill-requests');
50
+ const list = Array.isArray(out) ? out : (out?.requests ?? []);
51
+ if (json)
52
+ return printJson(list);
53
+ printJson(list);
54
+ }
55
+ async function cmdRequestPost(description, json) {
56
+ const out = await api('POST', '/v1/skill-requests', { body: { description } });
57
+ if (json)
58
+ return printJson(out);
59
+ printRecord(out);
60
+ }
61
+ export async function cmdSkill(args) {
62
+ const json = !!takeFlag(args, '--json');
63
+ const sub = args[0];
64
+ const arg1 = args[1];
65
+ if (sub === 'list' || sub === 'browse')
66
+ return cmdBrowse(args.slice(1), json);
67
+ if (sub === 'mine' || sub === 'published')
68
+ return cmdMine(json);
69
+ if (sub === 'show' || sub === 'get') {
70
+ if (!arg1) {
71
+ stderr.write(`usage: ${invokeHint('skill show <id>')}\n`);
72
+ exit(2);
73
+ }
74
+ return cmdShow(arg1, json);
75
+ }
76
+ if (sub === 'suspend' || sub === 'activate') {
77
+ if (!arg1) {
78
+ stderr.write(`usage: ${invokeHint(`skill ${sub} <id>`)}\n`);
79
+ exit(2);
80
+ }
81
+ return cmdSuspend(arg1, sub, json);
82
+ }
83
+ if (sub === 'requests')
84
+ return cmdRequestsList(json);
85
+ if (sub === 'post-request') {
86
+ if (!arg1) {
87
+ stderr.write(`usage: ${invokeHint('skill post-request "<description>"')}\n`);
88
+ exit(2);
89
+ }
90
+ return cmdRequestPost(arg1, json);
91
+ }
92
+ stderr.write(`error: unknown skill subcommand "${sub ?? ''}".\n` +
93
+ `Use list | mine | show | suspend | activate | requests | post-request\n`);
94
+ exit(2);
95
+ }
96
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
package/dist/team.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function cmdTeam(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=team.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team.d.ts","sourceRoot":"","sources":["../src/team.ts"],"names":[],"mappings":"AAmEA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB3D"}
package/dist/team.js ADDED
@@ -0,0 +1,86 @@
1
+ // team / members subcommands.
2
+ import { stdout, stderr, exit } from 'node:process';
3
+ import { api, takeFlag } from './api.js';
4
+ import { invokeHint } from './auth.js';
5
+ import { printJson, printTable, printRecord, fmt, fmtTs } from './format.js';
6
+ async function cmdList(json) {
7
+ const list = await api('GET', '/v1/team/members');
8
+ if (json)
9
+ return printJson(list);
10
+ if (list.length === 0) {
11
+ stdout.write('(no team members)\n');
12
+ return;
13
+ }
14
+ const rows = list.map((m) => [
15
+ m.id,
16
+ m.email,
17
+ m.role,
18
+ m.status === 'active' ? fmt.ok(m.status) : m.status === 'pending' ? fmt.warn(m.status) : fmt.dim(m.status),
19
+ fmtTs(m.created_at ?? null),
20
+ ]);
21
+ printTable(['ID', 'EMAIL', 'ROLE', 'STATUS', 'JOINED'], rows);
22
+ }
23
+ async function cmdInvite(args, json) {
24
+ const email = args[0];
25
+ const role = takeFlag(args, '--role');
26
+ if (!email) {
27
+ stderr.write(`usage: ${invokeHint('team invite <email> [--role admin|standard|readonly]')}\n`);
28
+ exit(2);
29
+ }
30
+ const body = { email };
31
+ if (typeof role === 'string')
32
+ body.role = role;
33
+ const out = await api('POST', '/v1/team/members', { body });
34
+ if (json)
35
+ return printJson(out);
36
+ stdout.write(`invited ${out.email} (${out.id}) — role=${out.role}\n`);
37
+ }
38
+ async function cmdUpdate(id, args, json) {
39
+ const role = takeFlag(args, '--role');
40
+ const status = takeFlag(args, '--status');
41
+ const body = {};
42
+ if (typeof role === 'string')
43
+ body.role = role;
44
+ if (typeof status === 'string')
45
+ body.status = status;
46
+ if (Object.keys(body).length === 0) {
47
+ stderr.write(`usage: ${invokeHint('team update <id> [--role ...] [--status ...]')}\n`);
48
+ exit(2);
49
+ }
50
+ const out = await api('PATCH', `/v1/team/members/${encodeURIComponent(id)}`, { body });
51
+ if (json)
52
+ return printJson(out);
53
+ printRecord(out);
54
+ }
55
+ async function cmdRevoke(id, json) {
56
+ const out = await api('DELETE', `/v1/team/members/${encodeURIComponent(id)}`);
57
+ if (json)
58
+ return printJson(out);
59
+ stdout.write(`revoked ${id}\n`);
60
+ }
61
+ export async function cmdTeam(args) {
62
+ const json = !!takeFlag(args, '--json');
63
+ const sub = args[0];
64
+ const arg1 = args[1];
65
+ if (sub === 'list' || sub === 'ls')
66
+ return cmdList(json);
67
+ if (sub === 'invite')
68
+ return cmdInvite(args.slice(1), json);
69
+ if (sub === 'update') {
70
+ if (!arg1) {
71
+ stderr.write(`usage: ${invokeHint('team update <id> [--role ...] [--status ...]')}\n`);
72
+ exit(2);
73
+ }
74
+ return cmdUpdate(arg1, args.slice(2), json);
75
+ }
76
+ if (sub === 'revoke' || sub === 'remove') {
77
+ if (!arg1) {
78
+ stderr.write(`usage: ${invokeHint('team revoke <id>')}\n`);
79
+ exit(2);
80
+ }
81
+ return cmdRevoke(arg1, json);
82
+ }
83
+ stderr.write(`error: unknown team subcommand "${sub ?? ''}".\nUse list | invite | update | revoke\n`);
84
+ exit(2);
85
+ }
86
+ //# sourceMappingURL=team.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team.js","sourceRoot":"","sources":["../src/team.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getstackrun/cli",
3
- "version": "0.6.1",
3
+ "version": "0.7.0",
4
4
  "description": "Tail STACK runtime activity in your terminal — replay a real-shape demo or stream your own audit_log.",
5
5
  "type": "module",
6
6
  "bin": {