@grantex/cli 0.1.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/client.d.ts +7 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +18 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/agents.d.ts +3 -0
- package/dist/commands/agents.d.ts.map +1 -0
- package/dist/commands/agents.js +67 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/anomalies.d.ts +3 -0
- package/dist/commands/anomalies.d.ts.map +1 -0
- package/dist/commands/anomalies.js +58 -0
- package/dist/commands/anomalies.js.map +1 -0
- package/dist/commands/audit.d.ts +3 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +35 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/compliance.d.ts +3 -0
- package/dist/commands/compliance.d.ts.map +1 -0
- package/dist/commands/compliance.js +155 -0
- package/dist/commands/compliance.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +35 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/grants.d.ts +3 -0
- package/dist/commands/grants.d.ts.map +1 -0
- package/dist/commands/grants.js +39 -0
- package/dist/commands/grants.js.map +1 -0
- package/dist/commands/tokens.d.ts +3 -0
- package/dist/commands/tokens.d.ts.map +1 -0
- package/dist/commands/tokens.js +36 -0
- package/dist/commands/tokens.js.map +1 -0
- package/dist/commands/webhooks.d.ts +3 -0
- package/dist/commands/webhooks.d.ts.map +1 -0
- package/dist/commands/webhooks.js +50 -0
- package/dist/commands/webhooks.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +31 -0
- package/dist/config.js.map +1 -0
- package/dist/format.d.ts +10 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +36 -0
- package/dist/format.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/package.json +40 -0
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Grantex } from '@grantex/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Load config from file + env and return an authenticated Grantex client.
|
|
4
|
+
* Exits with a helpful message if the CLI has not been configured yet.
|
|
5
|
+
*/
|
|
6
|
+
export declare function requireClient(): Promise<Grantex>;
|
|
7
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CActD"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Grantex } from '@grantex/sdk';
|
|
2
|
+
import { defaultConfigPath, loadConfig, resolveConfig } from './config.js';
|
|
3
|
+
/**
|
|
4
|
+
* Load config from file + env and return an authenticated Grantex client.
|
|
5
|
+
* Exits with a helpful message if the CLI has not been configured yet.
|
|
6
|
+
*/
|
|
7
|
+
export async function requireClient() {
|
|
8
|
+
const fileConfig = await loadConfig(defaultConfigPath());
|
|
9
|
+
const config = resolveConfig(fileConfig);
|
|
10
|
+
if (!config) {
|
|
11
|
+
console.error('Error: Grantex is not configured.\n' +
|
|
12
|
+
'Run: grantex config set --url <url> --key <api-key>\n' +
|
|
13
|
+
'Or set the GRANTEX_URL and GRANTEX_KEY environment variables.');
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
return new Grantex({ baseUrl: config.baseUrl, apiKey: config.apiKey });
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE3E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IAEzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CACX,qCAAqC;YACnC,wDAAwD;YACxD,+DAA+D,CAClE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,aAAa,IAAI,OAAO,CAqEvC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { requireClient } from '../client.js';
|
|
4
|
+
import { printTable, printRecord, shortDate } from '../format.js';
|
|
5
|
+
export function agentsCommand() {
|
|
6
|
+
const cmd = new Command('agents').description('Manage registered agents');
|
|
7
|
+
cmd
|
|
8
|
+
.command('list')
|
|
9
|
+
.description('List all agents')
|
|
10
|
+
.action(async () => {
|
|
11
|
+
const client = await requireClient();
|
|
12
|
+
const { agents } = await client.agents.list();
|
|
13
|
+
printTable(agents.map((a) => ({
|
|
14
|
+
ID: a.id,
|
|
15
|
+
NAME: a.name,
|
|
16
|
+
DID: a.did,
|
|
17
|
+
CREATED: shortDate(a.createdAt),
|
|
18
|
+
})), ['ID', 'NAME', 'DID', 'CREATED']);
|
|
19
|
+
});
|
|
20
|
+
cmd
|
|
21
|
+
.command('register')
|
|
22
|
+
.description('Register a new agent')
|
|
23
|
+
.requiredOption('--name <name>', 'Human-readable agent name')
|
|
24
|
+
.requiredOption('--description <desc>', 'Agent description')
|
|
25
|
+
.requiredOption('--scopes <scopes>', 'Comma-separated list of requested scopes')
|
|
26
|
+
.action(async (opts) => {
|
|
27
|
+
const client = await requireClient();
|
|
28
|
+
const agent = await client.agents.register({
|
|
29
|
+
name: opts.name,
|
|
30
|
+
description: opts.description,
|
|
31
|
+
scopes: opts.scopes.split(',').map((s) => s.trim()),
|
|
32
|
+
});
|
|
33
|
+
console.log(chalk.green('✓') + ` Agent registered: ${agent.id}`);
|
|
34
|
+
printRecord({
|
|
35
|
+
id: agent.id,
|
|
36
|
+
name: agent.name,
|
|
37
|
+
did: agent.did,
|
|
38
|
+
scopes: agent.scopes.join(', '),
|
|
39
|
+
createdAt: shortDate(agent.createdAt),
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
cmd
|
|
43
|
+
.command('get <agentId>')
|
|
44
|
+
.description('Get details for a single agent')
|
|
45
|
+
.action(async (agentId) => {
|
|
46
|
+
const client = await requireClient();
|
|
47
|
+
const agent = await client.agents.get(agentId);
|
|
48
|
+
printRecord({
|
|
49
|
+
id: agent.id,
|
|
50
|
+
name: agent.name,
|
|
51
|
+
did: agent.did,
|
|
52
|
+
description: agent.description,
|
|
53
|
+
scopes: agent.scopes.join(', '),
|
|
54
|
+
createdAt: shortDate(agent.createdAt),
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
cmd
|
|
58
|
+
.command('delete <agentId>')
|
|
59
|
+
.description('Delete an agent')
|
|
60
|
+
.action(async (agentId) => {
|
|
61
|
+
const client = await requireClient();
|
|
62
|
+
await client.agents.delete(agentId);
|
|
63
|
+
console.log(chalk.green('✓') + ` Agent ${agentId} deleted.`);
|
|
64
|
+
});
|
|
65
|
+
return cmd;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anomalies.d.ts","sourceRoot":"","sources":["../../src/commands/anomalies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,gBAAgB,IAAI,OAAO,CAgD1C"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { requireClient } from '../client.js';
|
|
4
|
+
import { printTable } from '../format.js';
|
|
5
|
+
const SEVERITY_COLOR = {
|
|
6
|
+
high: chalk.red,
|
|
7
|
+
medium: chalk.yellow,
|
|
8
|
+
low: chalk.cyan,
|
|
9
|
+
};
|
|
10
|
+
function colorSeverity(severity) {
|
|
11
|
+
return (SEVERITY_COLOR[severity] ?? ((s) => s))(severity);
|
|
12
|
+
}
|
|
13
|
+
export function anomaliesCommand() {
|
|
14
|
+
const cmd = new Command('anomalies').description('Detect and manage agent anomalies');
|
|
15
|
+
cmd
|
|
16
|
+
.command('detect')
|
|
17
|
+
.description('Run anomaly detection across all agents')
|
|
18
|
+
.action(async () => {
|
|
19
|
+
const client = await requireClient();
|
|
20
|
+
const result = await client.anomalies.detect();
|
|
21
|
+
if (result.total === 0) {
|
|
22
|
+
console.log(chalk.green('✓') + ' No anomalies detected.');
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
console.log(`Detected ${result.total} anomaly${result.total !== 1 ? 's' : ''}:\n`);
|
|
26
|
+
printTable(result.anomalies.map(formatRow), ['ID', 'TYPE', 'SEVERITY', 'AGENT', 'DESCRIPTION']);
|
|
27
|
+
});
|
|
28
|
+
cmd
|
|
29
|
+
.command('list')
|
|
30
|
+
.description('List stored anomalies')
|
|
31
|
+
.option('--unacknowledged', 'Show only unacknowledged anomalies')
|
|
32
|
+
.action(async (opts) => {
|
|
33
|
+
const client = await requireClient();
|
|
34
|
+
const result = await client.anomalies.list({
|
|
35
|
+
...(opts.unacknowledged ? { unacknowledged: true } : {}),
|
|
36
|
+
});
|
|
37
|
+
printTable(result.anomalies.map(formatRow), ['ID', 'TYPE', 'SEVERITY', 'AGENT', 'DESCRIPTION']);
|
|
38
|
+
});
|
|
39
|
+
cmd
|
|
40
|
+
.command('acknowledge <anomalyId>')
|
|
41
|
+
.description('Acknowledge an anomaly')
|
|
42
|
+
.action(async (anomalyId) => {
|
|
43
|
+
const client = await requireClient();
|
|
44
|
+
await client.anomalies.acknowledge(anomalyId);
|
|
45
|
+
console.log(chalk.green('✓') + ` Anomaly ${anomalyId} acknowledged.`);
|
|
46
|
+
});
|
|
47
|
+
return cmd;
|
|
48
|
+
}
|
|
49
|
+
function formatRow(a) {
|
|
50
|
+
return {
|
|
51
|
+
ID: a.id,
|
|
52
|
+
TYPE: a.type,
|
|
53
|
+
SEVERITY: colorSeverity(a.severity),
|
|
54
|
+
AGENT: a.agentId ?? '—',
|
|
55
|
+
DESCRIPTION: a.description.length > 60 ? a.description.slice(0, 57) + '...' : a.description,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=anomalies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anomalies.js","sourceRoot":"","sources":["../../src/commands/anomalies.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,YAAY,IAAI,OAAO,CA4CtC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { requireClient } from '../client.js';
|
|
3
|
+
import { printTable, shortDate } from '../format.js';
|
|
4
|
+
export function auditCommand() {
|
|
5
|
+
const cmd = new Command('audit').description('View the audit log');
|
|
6
|
+
cmd
|
|
7
|
+
.command('list')
|
|
8
|
+
.description('List audit entries')
|
|
9
|
+
.option('--agent <agentId>', 'Filter by agent ID')
|
|
10
|
+
.option('--grant <grantId>', 'Filter by grant ID')
|
|
11
|
+
.option('--principal <principalId>', 'Filter by principal ID')
|
|
12
|
+
.option('--action <action>', 'Filter by action string')
|
|
13
|
+
.option('--since <iso>', 'Only entries after this ISO date')
|
|
14
|
+
.option('--until <iso>', 'Only entries before this ISO date')
|
|
15
|
+
.action(async (opts) => {
|
|
16
|
+
const client = await requireClient();
|
|
17
|
+
const { entries } = await client.audit.list({
|
|
18
|
+
...(opts.agent ? { agentId: opts.agent } : {}),
|
|
19
|
+
...(opts.grant ? { grantId: opts.grant } : {}),
|
|
20
|
+
...(opts.principal ? { principalId: opts.principal } : {}),
|
|
21
|
+
...(opts.action ? { action: opts.action } : {}),
|
|
22
|
+
...(opts.since ? { since: opts.since } : {}),
|
|
23
|
+
...(opts.until ? { until: opts.until } : {}),
|
|
24
|
+
});
|
|
25
|
+
printTable(entries.map((e) => ({
|
|
26
|
+
ID: e.entryId,
|
|
27
|
+
AGENT: e.agentId,
|
|
28
|
+
ACTION: e.action,
|
|
29
|
+
STATUS: e.status,
|
|
30
|
+
TIMESTAMP: shortDate(e.timestamp),
|
|
31
|
+
})), ['ID', 'AGENT', 'ACTION', 'STATUS', 'TIMESTAMP']);
|
|
32
|
+
});
|
|
33
|
+
return cmd;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAEnE,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,oBAAoB,CAAC;SACjC,MAAM,CAAC,mBAAmB,EAAE,oBAAoB,CAAC;SACjD,MAAM,CAAC,mBAAmB,EAAE,oBAAoB,CAAC;SACjD,MAAM,CAAC,2BAA2B,EAAE,wBAAwB,CAAC;SAC7D,MAAM,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;SACtD,MAAM,CAAC,eAAe,EAAE,kCAAkC,CAAC;SAC3D,MAAM,CAAC,eAAe,EAAE,mCAAmC,CAAC;SAC5D,MAAM,CACL,KAAK,EAAE,IAON,EAAE,EAAE;QACH,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;YAC1C,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1D,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7C,CAAC,CAAC;QACH,UAAU,CACR,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClB,EAAE,EAAE,CAAC,CAAC,OAAO;YACb,KAAK,EAAE,CAAC,CAAC,OAAO;YAChB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;SAClC,CAAC,CAAC,EACH,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC,CACjD,CAAC;IACJ,CAAC,CACF,CAAC;IAEJ,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compliance.d.ts","sourceRoot":"","sources":["../../src/commands/compliance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,iBAAiB,IAAI,OAAO,CAgI3C"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { writeFileSync } from 'fs';
|
|
3
|
+
import { requireClient } from '../client.js';
|
|
4
|
+
import { printRecord, shortDate } from '../format.js';
|
|
5
|
+
export function complianceCommand() {
|
|
6
|
+
const cmd = new Command('compliance').description('Enterprise compliance tools');
|
|
7
|
+
cmd
|
|
8
|
+
.command('summary')
|
|
9
|
+
.description('Get an org-wide compliance summary')
|
|
10
|
+
.option('--since <iso>', 'Start of reporting window (ISO date)')
|
|
11
|
+
.option('--until <iso>', 'End of reporting window (ISO date)')
|
|
12
|
+
.action(async (opts) => {
|
|
13
|
+
const client = await requireClient();
|
|
14
|
+
const s = await client.compliance.getSummary({
|
|
15
|
+
...(opts.since ? { since: opts.since } : {}),
|
|
16
|
+
...(opts.until ? { until: opts.until } : {}),
|
|
17
|
+
});
|
|
18
|
+
printRecord({
|
|
19
|
+
'Generated at': shortDate(s.generatedAt),
|
|
20
|
+
'Plan': s.plan,
|
|
21
|
+
'Agents': `total=${s.agents.total} active=${s.agents.active} suspended=${s.agents.suspended} revoked=${s.agents.revoked}`,
|
|
22
|
+
'Grants': `total=${s.grants.total} active=${s.grants.active} revoked=${s.grants.revoked} expired=${s.grants.expired}`,
|
|
23
|
+
'Audit entries': `total=${s.auditEntries.total} success=${s.auditEntries.success} failure=${s.auditEntries.failure} blocked=${s.auditEntries.blocked}`,
|
|
24
|
+
'Policies': `total=${s.policies.total}`,
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
const exportCmd = new Command('export').description('Export compliance data');
|
|
28
|
+
exportCmd
|
|
29
|
+
.command('grants')
|
|
30
|
+
.description('Export all grants as JSON or CSV')
|
|
31
|
+
.option('--since <iso>', 'Only grants issued after this date')
|
|
32
|
+
.option('--until <iso>', 'Only grants issued before this date')
|
|
33
|
+
.option('--status <status>', 'Filter by status (active|revoked|expired)')
|
|
34
|
+
.option('--format <fmt>', 'Output format: json or table (default: table)', 'table')
|
|
35
|
+
.option('--output <file>', 'Write output to a file instead of stdout')
|
|
36
|
+
.action(async (opts) => {
|
|
37
|
+
const client = await requireClient();
|
|
38
|
+
const result = await client.compliance.exportGrants({
|
|
39
|
+
...(opts.since ? { since: opts.since } : {}),
|
|
40
|
+
...(opts.until ? { until: opts.until } : {}),
|
|
41
|
+
...(opts.status
|
|
42
|
+
? { status: opts.status }
|
|
43
|
+
: {}),
|
|
44
|
+
});
|
|
45
|
+
const output = renderGrants(result.grants, opts.format);
|
|
46
|
+
writeOutput(output, opts.output);
|
|
47
|
+
});
|
|
48
|
+
exportCmd
|
|
49
|
+
.command('audit')
|
|
50
|
+
.description('Export all audit entries as JSON or CSV')
|
|
51
|
+
.option('--since <iso>', 'Only entries after this date')
|
|
52
|
+
.option('--until <iso>', 'Only entries before this date')
|
|
53
|
+
.option('--agent <agentId>', 'Filter by agent ID')
|
|
54
|
+
.option('--status <status>', 'Filter by status (success|failure|blocked)')
|
|
55
|
+
.option('--format <fmt>', 'Output format: json or table (default: table)', 'table')
|
|
56
|
+
.option('--output <file>', 'Write output to a file instead of stdout')
|
|
57
|
+
.action(async (opts) => {
|
|
58
|
+
const client = await requireClient();
|
|
59
|
+
const result = await client.compliance.exportAudit({
|
|
60
|
+
...(opts.since ? { since: opts.since } : {}),
|
|
61
|
+
...(opts.until ? { until: opts.until } : {}),
|
|
62
|
+
...(opts.agent ? { agentId: opts.agent } : {}),
|
|
63
|
+
...(opts.status
|
|
64
|
+
? { status: opts.status }
|
|
65
|
+
: {}),
|
|
66
|
+
});
|
|
67
|
+
const output = renderAudit(result.entries, opts.format);
|
|
68
|
+
writeOutput(output, opts.output);
|
|
69
|
+
});
|
|
70
|
+
cmd.addCommand(exportCmd);
|
|
71
|
+
cmd
|
|
72
|
+
.command('evidence-pack')
|
|
73
|
+
.description('Generate a SOC2/GDPR evidence pack with chain integrity verification')
|
|
74
|
+
.option('--since <iso>', 'Start of reporting window (ISO date)')
|
|
75
|
+
.option('--until <iso>', 'End of reporting window (ISO date)')
|
|
76
|
+
.option('--framework <fw>', 'Framework: soc2, gdpr, or all (default: all)', 'all')
|
|
77
|
+
.option('--output <file>', 'Write JSON output to a file (default: evidence-pack-<date>.json)')
|
|
78
|
+
.action(async (opts) => {
|
|
79
|
+
const client = await requireClient();
|
|
80
|
+
const pack = await client.compliance.evidencePack({
|
|
81
|
+
framework: opts.framework,
|
|
82
|
+
...(opts.since ? { since: opts.since } : {}),
|
|
83
|
+
...(opts.until ? { until: opts.until } : {}),
|
|
84
|
+
});
|
|
85
|
+
const defaultFile = `evidence-pack-${new Date().toISOString().slice(0, 10)}.json`;
|
|
86
|
+
const outFile = opts.output ?? defaultFile;
|
|
87
|
+
writeFileSync(outFile, JSON.stringify(pack, null, 2) + '\n', 'utf8');
|
|
88
|
+
// Print a summary to stdout
|
|
89
|
+
const ci = pack.chainIntegrity;
|
|
90
|
+
printRecord({
|
|
91
|
+
'Framework': pack.meta.framework,
|
|
92
|
+
'Generated at': shortDate(pack.meta.generatedAt),
|
|
93
|
+
'Grants': String(pack.grants.length),
|
|
94
|
+
'Audit entries': String(pack.auditEntries.length),
|
|
95
|
+
'Policies': String(pack.policies.length),
|
|
96
|
+
'Chain integrity': ci.valid
|
|
97
|
+
? `✓ valid (${ci.checkedEntries} entries checked)`
|
|
98
|
+
: `✗ BROKEN at entry ${ci.firstBrokenAt ?? 'unknown'}`,
|
|
99
|
+
'Output file': outFile,
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
return cmd;
|
|
103
|
+
}
|
|
104
|
+
function renderGrants(grants, format) {
|
|
105
|
+
if (format === 'json') {
|
|
106
|
+
return JSON.stringify(grants, null, 2);
|
|
107
|
+
}
|
|
108
|
+
if (grants.length === 0)
|
|
109
|
+
return '(no results)';
|
|
110
|
+
return tableToString(grants.map((g) => ({
|
|
111
|
+
ID: g.id,
|
|
112
|
+
AGENT: g.agentId,
|
|
113
|
+
PRINCIPAL: g.principalId,
|
|
114
|
+
STATUS: g.status,
|
|
115
|
+
EXPIRES: shortDate(g.expiresAt),
|
|
116
|
+
})), ['ID', 'AGENT', 'PRINCIPAL', 'STATUS', 'EXPIRES']);
|
|
117
|
+
}
|
|
118
|
+
function renderAudit(entries, format) {
|
|
119
|
+
if (format === 'json') {
|
|
120
|
+
return JSON.stringify(entries, null, 2);
|
|
121
|
+
}
|
|
122
|
+
if (entries.length === 0)
|
|
123
|
+
return '(no results)';
|
|
124
|
+
return tableToString(entries.map((e) => ({
|
|
125
|
+
ID: e.entryId,
|
|
126
|
+
AGENT: e.agentId,
|
|
127
|
+
ACTION: e.action,
|
|
128
|
+
STATUS: e.status,
|
|
129
|
+
TIMESTAMP: shortDate(e.timestamp),
|
|
130
|
+
})), ['ID', 'AGENT', 'ACTION', 'STATUS', 'TIMESTAMP']);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Build a printTable-style string without printing to stdout.
|
|
134
|
+
* (printTable() writes directly; here we return the string for --output support.)
|
|
135
|
+
*/
|
|
136
|
+
function tableToString(rows, columns) {
|
|
137
|
+
const widths = columns.map((col) => Math.max(col.length, ...rows.map((r) => (r[col] ?? '').length)));
|
|
138
|
+
const pad = (s, w) => s.padEnd(w);
|
|
139
|
+
const lines = [
|
|
140
|
+
columns.map((c, i) => pad(c.toUpperCase(), widths[i] ?? c.length)).join(' '),
|
|
141
|
+
widths.map((w) => '-'.repeat(w)).join(' '),
|
|
142
|
+
...rows.map((row) => columns.map((c, i) => pad(row[c] ?? '', widths[i] ?? 0)).join(' ')),
|
|
143
|
+
];
|
|
144
|
+
return lines.join('\n');
|
|
145
|
+
}
|
|
146
|
+
function writeOutput(content, file) {
|
|
147
|
+
if (file) {
|
|
148
|
+
writeFileSync(file, content + '\n', 'utf8');
|
|
149
|
+
console.log(`Wrote ${file}`);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
console.log(content);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=compliance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compliance.js","sourceRoot":"","sources":["../../src/commands/compliance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,aAAa,IAAI,OAAO,CAsCvC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { defaultConfigPath, loadConfig, resolveConfig, saveConfig } from '../config.js';
|
|
4
|
+
export function configCommand() {
|
|
5
|
+
const cmd = new Command('config').description('Manage CLI configuration');
|
|
6
|
+
cmd
|
|
7
|
+
.command('set')
|
|
8
|
+
.description('Set the Grantex server URL and API key')
|
|
9
|
+
.requiredOption('--url <url>', 'Auth service base URL (e.g. http://localhost:3000)')
|
|
10
|
+
.requiredOption('--key <api-key>', 'Developer API key')
|
|
11
|
+
.action(async (opts) => {
|
|
12
|
+
const configPath = defaultConfigPath();
|
|
13
|
+
await saveConfig(configPath, { baseUrl: opts.url, apiKey: opts.key });
|
|
14
|
+
console.log(chalk.green('✓') + ` Config saved to ${configPath}`);
|
|
15
|
+
});
|
|
16
|
+
cmd
|
|
17
|
+
.command('show')
|
|
18
|
+
.description('Print the current configuration')
|
|
19
|
+
.action(async () => {
|
|
20
|
+
const fileConfig = await loadConfig(defaultConfigPath());
|
|
21
|
+
const config = resolveConfig(fileConfig);
|
|
22
|
+
if (!config) {
|
|
23
|
+
console.error(chalk.yellow('Not configured.') +
|
|
24
|
+
' Run: grantex config set --url <url> --key <api-key>');
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
console.log(`URL ${config.baseUrl}`);
|
|
28
|
+
console.log(`API key ${config.apiKey}`);
|
|
29
|
+
if (process.env['GRANTEX_URL'] || process.env['GRANTEX_KEY']) {
|
|
30
|
+
console.log(chalk.dim('(env vars take precedence over config file)'));
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
return cmd;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAExF,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAE1E,GAAG;SACA,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,wCAAwC,CAAC;SACrD,cAAc,CAAC,aAAa,EAAE,oDAAoD,CAAC;SACnF,cAAc,CAAC,iBAAiB,EAAE,mBAAmB,CAAC;SACtD,MAAM,CAAC,KAAK,EAAE,IAAkC,EAAE,EAAE;QACnD,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;QACvC,MAAM,UAAU,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,oBAAoB,UAAU,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QAEzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC;gBAC7B,sDAAsD,CACzD,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAEzC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grants.d.ts","sourceRoot":"","sources":["../../src/commands/grants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,aAAa,IAAI,OAAO,CAuCvC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { requireClient } from '../client.js';
|
|
4
|
+
import { printTable, shortDate } from '../format.js';
|
|
5
|
+
export function grantsCommand() {
|
|
6
|
+
const cmd = new Command('grants').description('View and manage grants');
|
|
7
|
+
cmd
|
|
8
|
+
.command('list')
|
|
9
|
+
.description('List grants')
|
|
10
|
+
.option('--agent <agentId>', 'Filter by agent ID')
|
|
11
|
+
.option('--principal <principalId>', 'Filter by principal ID')
|
|
12
|
+
.option('--status <status>', 'Filter by status (active|revoked|expired)')
|
|
13
|
+
.action(async (opts) => {
|
|
14
|
+
const client = await requireClient();
|
|
15
|
+
const { grants } = await client.grants.list({
|
|
16
|
+
...(opts.agent ? { agentId: opts.agent } : {}),
|
|
17
|
+
...(opts.principal ? { principalId: opts.principal } : {}),
|
|
18
|
+
...(opts.status ? { status: opts.status } : {}),
|
|
19
|
+
});
|
|
20
|
+
printTable(grants.map((g) => ({
|
|
21
|
+
ID: g.id,
|
|
22
|
+
AGENT: g.agentId,
|
|
23
|
+
PRINCIPAL: g.principalId,
|
|
24
|
+
STATUS: g.status,
|
|
25
|
+
SCOPES: g.scopes.join(', '),
|
|
26
|
+
EXPIRES: shortDate(g.expiresAt),
|
|
27
|
+
})), ['ID', 'AGENT', 'PRINCIPAL', 'STATUS', 'SCOPES', 'EXPIRES']);
|
|
28
|
+
});
|
|
29
|
+
cmd
|
|
30
|
+
.command('revoke <grantId>')
|
|
31
|
+
.description('Revoke a grant (and all its delegated descendants)')
|
|
32
|
+
.action(async (grantId) => {
|
|
33
|
+
const client = await requireClient();
|
|
34
|
+
await client.grants.revoke(grantId);
|
|
35
|
+
console.log(chalk.green('✓') + ` Grant ${grantId} revoked.`);
|
|
36
|
+
});
|
|
37
|
+
return cmd;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=grants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grants.js","sourceRoot":"","sources":["../../src/commands/grants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;IAExE,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,aAAa,CAAC;SAC1B,MAAM,CAAC,mBAAmB,EAAE,oBAAoB,CAAC;SACjD,MAAM,CAAC,2BAA2B,EAAE,wBAAwB,CAAC;SAC7D,MAAM,CAAC,mBAAmB,EAAE,2CAA2C,CAAC;SACxE,MAAM,CAAC,KAAK,EAAE,IAA6D,EAAE,EAAE;QAC9E,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YAC1C,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1D,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAA0C,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpF,CAAC,CAAC;QACH,UAAU,CACR,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,OAAO;YAChB,SAAS,EAAE,CAAC,CAAC,WAAW;YACxB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YAC3B,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;SAChC,CAAC,CAAC,EACH,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAC5D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;QAChC,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,UAAU,OAAO,WAAW,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/commands/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,aAAa,IAAI,OAAO,CAmCvC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { requireClient } from '../client.js';
|
|
4
|
+
import { printRecord, shortDate } from '../format.js';
|
|
5
|
+
export function tokensCommand() {
|
|
6
|
+
const cmd = new Command('tokens').description('Verify and revoke grant tokens');
|
|
7
|
+
cmd
|
|
8
|
+
.command('verify <token>')
|
|
9
|
+
.description('Verify a grant token (online check)')
|
|
10
|
+
.action(async (token) => {
|
|
11
|
+
const client = await requireClient();
|
|
12
|
+
const res = await client.tokens.verify(token);
|
|
13
|
+
if (!res.valid) {
|
|
14
|
+
console.error(chalk.red('✗') + ' Token is invalid or has been revoked.');
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
console.log(chalk.green('✓') + ' Token is valid.');
|
|
18
|
+
printRecord({
|
|
19
|
+
grantId: res.grantId ?? '',
|
|
20
|
+
scopes: (res.scopes ?? []).join(', '),
|
|
21
|
+
principal: res.principal ?? '',
|
|
22
|
+
agent: res.agent ?? '',
|
|
23
|
+
expiresAt: res.expiresAt ? shortDate(res.expiresAt) : '',
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
cmd
|
|
27
|
+
.command('revoke <jti>')
|
|
28
|
+
.description('Revoke a grant token by JTI')
|
|
29
|
+
.action(async (jti) => {
|
|
30
|
+
const client = await requireClient();
|
|
31
|
+
await client.tokens.revoke(jti);
|
|
32
|
+
console.log(chalk.green('✓') + ` Token ${jti} revoked.`);
|
|
33
|
+
});
|
|
34
|
+
return cmd;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/commands/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,gCAAgC,CAAC,CAAC;IAEhF,GAAG;SACA,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QAC9B,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE9C,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,wCAAwC,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC,CAAC;QACnD,WAAW,CAAC;YACV,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE;YAC1B,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACrC,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE;YAC9B,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE;YACtB,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;SACzD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;QAC5B,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,WAAW,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/commands/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,eAAe,IAAI,OAAO,CAwDzC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { requireClient } from '../client.js';
|
|
4
|
+
import { printTable, shortDate } from '../format.js';
|
|
5
|
+
const VALID_EVENTS = ['grant.created', 'grant.revoked', 'token.issued'];
|
|
6
|
+
export function webhooksCommand() {
|
|
7
|
+
const cmd = new Command('webhooks').description('Manage webhook endpoints');
|
|
8
|
+
cmd
|
|
9
|
+
.command('list')
|
|
10
|
+
.description('List registered webhook endpoints')
|
|
11
|
+
.action(async () => {
|
|
12
|
+
const client = await requireClient();
|
|
13
|
+
const { webhooks } = await client.webhooks.list();
|
|
14
|
+
printTable(webhooks.map((w) => ({
|
|
15
|
+
ID: w.id,
|
|
16
|
+
URL: w.url,
|
|
17
|
+
EVENTS: w.events.join(', '),
|
|
18
|
+
CREATED: shortDate(w.createdAt),
|
|
19
|
+
})), ['ID', 'URL', 'EVENTS', 'CREATED']);
|
|
20
|
+
});
|
|
21
|
+
cmd
|
|
22
|
+
.command('create')
|
|
23
|
+
.description('Register a new webhook endpoint')
|
|
24
|
+
.requiredOption('--url <url>', 'HTTPS endpoint URL to deliver events to')
|
|
25
|
+
.requiredOption('--events <events>', `Comma-separated event types (${VALID_EVENTS.join(', ')})`)
|
|
26
|
+
.action(async (opts) => {
|
|
27
|
+
const events = opts.events.split(',').map((e) => e.trim());
|
|
28
|
+
const invalid = events.filter((e) => !VALID_EVENTS.includes(e));
|
|
29
|
+
if (invalid.length > 0) {
|
|
30
|
+
console.error(chalk.red('Error:') +
|
|
31
|
+
` Unknown event type(s): ${invalid.join(', ')}\n` +
|
|
32
|
+
`Valid events: ${VALID_EVENTS.join(', ')}`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
const client = await requireClient();
|
|
36
|
+
const wh = await client.webhooks.create({ url: opts.url, events });
|
|
37
|
+
console.log(chalk.green('✓') + ` Webhook registered: ${wh.id}`);
|
|
38
|
+
console.log(`Secret: ${chalk.bold(wh.secret)} (shown once — store it securely)`);
|
|
39
|
+
});
|
|
40
|
+
cmd
|
|
41
|
+
.command('delete <webhookId>')
|
|
42
|
+
.description('Delete a webhook endpoint')
|
|
43
|
+
.action(async (webhookId) => {
|
|
44
|
+
const client = await requireClient();
|
|
45
|
+
await client.webhooks.delete(webhookId);
|
|
46
|
+
console.log(chalk.green('✓') + ` Webhook ${webhookId} deleted.`);
|
|
47
|
+
});
|
|
48
|
+
return cmd;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/commands/webhooks.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface CliConfig {
|
|
2
|
+
baseUrl: string;
|
|
3
|
+
apiKey: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function defaultConfigPath(): string;
|
|
6
|
+
export declare function loadConfig(configPath: string): Promise<CliConfig | null>;
|
|
7
|
+
export declare function saveConfig(configPath: string, config: CliConfig): Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Merge env vars (highest precedence) over the file-based config.
|
|
10
|
+
* Returns null if baseUrl or apiKey cannot be resolved.
|
|
11
|
+
*/
|
|
12
|
+
export declare function resolveConfig(fileConfig: CliConfig | null): CliConfig | null;
|
|
13
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAO9E;AAED,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAK5E"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import * as os from 'node:os';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
export function defaultConfigPath() {
|
|
5
|
+
return path.join(os.homedir(), '.grantex', 'config.json');
|
|
6
|
+
}
|
|
7
|
+
export async function loadConfig(configPath) {
|
|
8
|
+
try {
|
|
9
|
+
const raw = await fs.readFile(configPath, 'utf8');
|
|
10
|
+
return JSON.parse(raw);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export async function saveConfig(configPath, config) {
|
|
17
|
+
await fs.mkdir(path.dirname(configPath), { recursive: true });
|
|
18
|
+
await fs.writeFile(configPath, JSON.stringify(config, null, 2) + '\n', 'utf8');
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Merge env vars (highest precedence) over the file-based config.
|
|
22
|
+
* Returns null if baseUrl or apiKey cannot be resolved.
|
|
23
|
+
*/
|
|
24
|
+
export function resolveConfig(fileConfig) {
|
|
25
|
+
const baseUrl = process.env['GRANTEX_URL'] ?? fileConfig?.baseUrl;
|
|
26
|
+
const apiKey = process.env['GRANTEX_KEY'] ?? fileConfig?.apiKey;
|
|
27
|
+
if (!baseUrl || !apiKey)
|
|
28
|
+
return null;
|
|
29
|
+
return { baseUrl, apiKey };
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAOlC,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAkB;IACjD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAkB,EAAE,MAAiB;IACpE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AACjF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,UAA4B;IACxD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,UAAU,EAAE,OAAO,CAAC;IAClE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,UAAU,EAAE,MAAM,CAAC;IAChE,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC"}
|
package/dist/format.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal table formatter for CLI output.
|
|
3
|
+
* Prints a header row + divider + data rows, padded to column widths.
|
|
4
|
+
*/
|
|
5
|
+
export declare function printTable(rows: Record<string, string>[], columns: string[]): void;
|
|
6
|
+
/** Format an ISO date string to a short local representation. */
|
|
7
|
+
export declare function shortDate(iso: string): string;
|
|
8
|
+
/** Print a labelled key-value block (for single-record views). */
|
|
9
|
+
export declare function printRecord(record: Record<string, string>): void;
|
|
10
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAkBlF;AAED,iEAAiE;AACjE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQ7C;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAKhE"}
|
package/dist/format.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal table formatter for CLI output.
|
|
3
|
+
* Prints a header row + divider + data rows, padded to column widths.
|
|
4
|
+
*/
|
|
5
|
+
export function printTable(rows, columns) {
|
|
6
|
+
if (rows.length === 0) {
|
|
7
|
+
console.log('(no results)');
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const widths = columns.map((col) => Math.max(col.length, ...rows.map((r) => (r[col] ?? '').length)));
|
|
11
|
+
const pad = (s, w) => s.padEnd(w);
|
|
12
|
+
const divider = widths.map((w) => '-'.repeat(w)).join(' ');
|
|
13
|
+
console.log(columns.map((c, i) => pad(c.toUpperCase(), widths[i] ?? c.length)).join(' '));
|
|
14
|
+
console.log(divider);
|
|
15
|
+
for (const row of rows) {
|
|
16
|
+
console.log(columns.map((c, i) => pad(row[c] ?? '', widths[i] ?? 0)).join(' '));
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** Format an ISO date string to a short local representation. */
|
|
20
|
+
export function shortDate(iso) {
|
|
21
|
+
return new Date(iso).toLocaleString(undefined, {
|
|
22
|
+
year: 'numeric',
|
|
23
|
+
month: 'short',
|
|
24
|
+
day: '2-digit',
|
|
25
|
+
hour: '2-digit',
|
|
26
|
+
minute: '2-digit',
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/** Print a labelled key-value block (for single-record views). */
|
|
30
|
+
export function printRecord(record) {
|
|
31
|
+
const keyWidth = Math.max(...Object.keys(record).map((k) => k.length));
|
|
32
|
+
for (const [k, v] of Object.entries(record)) {
|
|
33
|
+
console.log(`${k.padEnd(keyWidth)} ${v}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAA8B,EAAE,OAAiB;IAC1E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACjC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAChE,CAAC;IAEF,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,SAAS,EAAE;QAC7C,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,OAAO;QACd,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;AACL,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,WAAW,CAAC,MAA8B;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACvE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { agentsCommand } from './commands/agents.js';
|
|
4
|
+
import { anomaliesCommand } from './commands/anomalies.js';
|
|
5
|
+
import { auditCommand } from './commands/audit.js';
|
|
6
|
+
import { complianceCommand } from './commands/compliance.js';
|
|
7
|
+
import { configCommand } from './commands/config.js';
|
|
8
|
+
import { grantsCommand } from './commands/grants.js';
|
|
9
|
+
import { tokensCommand } from './commands/tokens.js';
|
|
10
|
+
import { webhooksCommand } from './commands/webhooks.js';
|
|
11
|
+
const program = new Command();
|
|
12
|
+
program
|
|
13
|
+
.name('grantex')
|
|
14
|
+
.description('CLI tool for local Grantex development')
|
|
15
|
+
.version('0.1.0');
|
|
16
|
+
program.addCommand(configCommand());
|
|
17
|
+
program.addCommand(agentsCommand());
|
|
18
|
+
program.addCommand(grantsCommand());
|
|
19
|
+
program.addCommand(tokensCommand());
|
|
20
|
+
program.addCommand(auditCommand());
|
|
21
|
+
program.addCommand(webhooksCommand());
|
|
22
|
+
program.addCommand(complianceCommand());
|
|
23
|
+
program.addCommand(anomaliesCommand());
|
|
24
|
+
program.parseAsync(process.argv).catch((err) => {
|
|
25
|
+
console.error((err instanceof Error ? err.message : String(err)));
|
|
26
|
+
process.exit(1);
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,wCAAwC,CAAC;KACrD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;AACxC,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;AAEvC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtD,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@grantex/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI tool for local Grantex development",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"grantex": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc -p tsconfig.build.json",
|
|
14
|
+
"typecheck": "tsc --noEmit",
|
|
15
|
+
"test": "vitest run",
|
|
16
|
+
"test:watch": "vitest",
|
|
17
|
+
"dev": "node --loader ts-node/esm src/index.ts"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@grantex/sdk": "^0.1.1",
|
|
21
|
+
"chalk": "^5.3.0",
|
|
22
|
+
"commander": "^12.0.0"
|
|
23
|
+
},
|
|
24
|
+
"overrides": {
|
|
25
|
+
"esbuild": ">=0.25.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "^20.11.0",
|
|
29
|
+
"typescript": "^5.3.3",
|
|
30
|
+
"vitest": "^1.3.1"
|
|
31
|
+
},
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=18.0.0"
|
|
34
|
+
},
|
|
35
|
+
"license": "Apache-2.0",
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "https://github.com/mishrasanjeev/grantex"
|
|
39
|
+
}
|
|
40
|
+
}
|