@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.
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +113 -3
- package/dist/agent.js.map +1 -1
- package/dist/api.d.ts +26 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +90 -0
- package/dist/api.js.map +1 -0
- package/dist/audit.d.ts +2 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +69 -0
- package/dist/audit.js.map +1 -0
- package/dist/dropoffs.d.ts +2 -0
- package/dist/dropoffs.d.ts.map +1 -0
- package/dist/dropoffs.js +140 -0
- package/dist/dropoffs.js.map +1 -0
- package/dist/events.d.ts +2 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +77 -0
- package/dist/events.js.map +1 -0
- package/dist/format.d.ts +16 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +77 -0
- package/dist/format.js.map +1 -0
- package/dist/identity.d.ts +2 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +86 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.js +120 -4
- package/dist/index.js.map +1 -1
- package/dist/me.d.ts +2 -0
- package/dist/me.d.ts.map +1 -0
- package/dist/me.js +11 -0
- package/dist/me.js.map +1 -0
- package/dist/passports.d.ts +2 -0
- package/dist/passports.d.ts.map +1 -0
- package/dist/passports.js +157 -0
- package/dist/passports.js.map +1 -0
- package/dist/services.d.ts +2 -0
- package/dist/services.d.ts.map +1 -0
- package/dist/services.js +97 -0
- package/dist/services.js.map +1 -0
- package/dist/skills.d.ts +2 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +96 -0
- package/dist/skills.js.map +1 -0
- package/dist/team.d.ts +2 -0
- package/dist/team.d.ts.map +1 -0
- package/dist/team.js +86 -0
- package/dist/team.js.map +1 -0
- 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 @@
|
|
|
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"}
|
package/dist/services.js
ADDED
|
@@ -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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"}
|
package/dist/skills.d.ts
ADDED
|
@@ -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 @@
|
|
|
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
|
package/dist/team.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team.js","sourceRoot":"","sources":["../src/team.ts"],"names":[],"mappings":"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"}
|