@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.
Files changed (49) hide show
  1. package/dist/client.d.ts +7 -0
  2. package/dist/client.d.ts.map +1 -0
  3. package/dist/client.js +18 -0
  4. package/dist/client.js.map +1 -0
  5. package/dist/commands/agents.d.ts +3 -0
  6. package/dist/commands/agents.d.ts.map +1 -0
  7. package/dist/commands/agents.js +67 -0
  8. package/dist/commands/agents.js.map +1 -0
  9. package/dist/commands/anomalies.d.ts +3 -0
  10. package/dist/commands/anomalies.d.ts.map +1 -0
  11. package/dist/commands/anomalies.js +58 -0
  12. package/dist/commands/anomalies.js.map +1 -0
  13. package/dist/commands/audit.d.ts +3 -0
  14. package/dist/commands/audit.d.ts.map +1 -0
  15. package/dist/commands/audit.js +35 -0
  16. package/dist/commands/audit.js.map +1 -0
  17. package/dist/commands/compliance.d.ts +3 -0
  18. package/dist/commands/compliance.d.ts.map +1 -0
  19. package/dist/commands/compliance.js +155 -0
  20. package/dist/commands/compliance.js.map +1 -0
  21. package/dist/commands/config.d.ts +3 -0
  22. package/dist/commands/config.d.ts.map +1 -0
  23. package/dist/commands/config.js +35 -0
  24. package/dist/commands/config.js.map +1 -0
  25. package/dist/commands/grants.d.ts +3 -0
  26. package/dist/commands/grants.d.ts.map +1 -0
  27. package/dist/commands/grants.js +39 -0
  28. package/dist/commands/grants.js.map +1 -0
  29. package/dist/commands/tokens.d.ts +3 -0
  30. package/dist/commands/tokens.d.ts.map +1 -0
  31. package/dist/commands/tokens.js +36 -0
  32. package/dist/commands/tokens.js.map +1 -0
  33. package/dist/commands/webhooks.d.ts +3 -0
  34. package/dist/commands/webhooks.d.ts.map +1 -0
  35. package/dist/commands/webhooks.js +50 -0
  36. package/dist/commands/webhooks.js.map +1 -0
  37. package/dist/config.d.ts +13 -0
  38. package/dist/config.d.ts.map +1 -0
  39. package/dist/config.js +31 -0
  40. package/dist/config.js.map +1 -0
  41. package/dist/format.d.ts +10 -0
  42. package/dist/format.d.ts.map +1 -0
  43. package/dist/format.js +36 -0
  44. package/dist/format.js.map +1 -0
  45. package/dist/index.d.ts +3 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +28 -0
  48. package/dist/index.js.map +1 -0
  49. package/package.json +40 -0
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function agentsCommand(): Command;
3
+ //# sourceMappingURL=agents.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function anomaliesCommand(): Command;
3
+ //# sourceMappingURL=anomalies.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function auditCommand(): Command;
3
+ //# sourceMappingURL=audit.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function complianceCommand(): Command;
3
+ //# sourceMappingURL=compliance.d.ts.map
@@ -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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGtD,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,6BAA6B,CAAC,CAAC;IAEjF,GAAG;SACA,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,eAAe,EAAE,sCAAsC,CAAC;SAC/D,MAAM,CAAC,eAAe,EAAE,oCAAoC,CAAC;SAC7D,MAAM,CAAC,KAAK,EAAE,IAAwC,EAAE,EAAE;QACzD,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC;YAC3C,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,WAAW,CAAC;YACV,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;YACxC,MAAM,EAAU,CAAC,CAAC,IAAI;YACtB,QAAQ,EAAQ,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,YAAY,CAAC,CAAC,MAAM,CAAC,MAAM,eAAe,CAAC,CAAC,MAAM,CAAC,SAAS,aAAa,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE;YAClI,QAAQ,EAAQ,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,YAAY,CAAC,CAAC,MAAM,CAAC,MAAM,aAAa,CAAC,CAAC,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE;YAC9H,eAAe,EAAC,SAAS,CAAC,CAAC,YAAY,CAAC,KAAK,aAAa,CAAC,CAAC,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE;YACxJ,UAAU,EAAM,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE;SAC5C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,MAAM,SAAS,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;IAE9E,SAAS;SACN,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,eAAe,EAAE,oCAAoC,CAAC;SAC7D,MAAM,CAAC,eAAe,EAAE,qCAAqC,CAAC;SAC9D,MAAM,CAAC,mBAAmB,EAAE,2CAA2C,CAAC;SACxE,MAAM,CAAC,gBAAgB,EAAE,+CAA+C,EAAE,OAAO,CAAC;SAClF,MAAM,CAAC,iBAAiB,EAAE,0CAA0C,CAAC;SACrE,MAAM,CACL,KAAK,EAAE,IAMN,EAAE,EAAE;QACH,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC;YAClD,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;YAC5C,GAAG,CAAC,IAAI,CAAC,MAAM;gBACb,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAA0C,EAAE;gBAC7D,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACxD,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CACF,CAAC;IAEJ,SAAS;SACN,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,yCAAyC,CAAC;SACtD,MAAM,CAAC,eAAe,EAAE,8BAA8B,CAAC;SACvD,MAAM,CAAC,eAAe,EAAE,+BAA+B,CAAC;SACxD,MAAM,CAAC,mBAAmB,EAAE,oBAAoB,CAAC;SACjD,MAAM,CAAC,mBAAmB,EAAE,4CAA4C,CAAC;SACzE,MAAM,CAAC,gBAAgB,EAAE,+CAA+C,EAAE,OAAO,CAAC;SAClF,MAAM,CAAC,iBAAiB,EAAE,0CAA0C,CAAC;SACrE,MAAM,CACL,KAAK,EAAE,IAON,EAAE,EAAE;QACH,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC;YACjD,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;YAC5C,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,MAAM;gBACb,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAA2C,EAAE;gBAC9D,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACxD,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CACF,CAAC;IAEJ,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAE1B,GAAG;SACA,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,sEAAsE,CAAC;SACnF,MAAM,CAAC,eAAe,EAAE,sCAAsC,CAAC;SAC/D,MAAM,CAAC,eAAe,EAAE,oCAAoC,CAAC;SAC7D,MAAM,CAAC,kBAAkB,EAAE,8CAA8C,EAAE,KAAK,CAAC;SACjF,MAAM,CAAC,iBAAiB,EAAE,kEAAkE,CAAC;SAC7F,MAAM,CACL,KAAK,EAAE,IAA4E,EAAE,EAAE;QACrF,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC;YAChD,SAAS,EAAE,IAAI,CAAC,SAAoC;YACpD,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;QAEH,MAAM,WAAW,GAAG,iBAAiB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC;QAClF,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC;QAC3C,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QAErE,4BAA4B;QAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC;QAC/B,WAAW,CAAC;YACV,WAAW,EAAQ,IAAI,CAAC,IAAI,CAAC,SAAS;YACtC,cAAc,EAAK,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;YACnD,QAAQ,EAAW,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YAC7C,eAAe,EAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;YACnD,UAAU,EAAS,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC/C,iBAAiB,EAAE,EAAE,CAAC,KAAK;gBACzB,CAAC,CAAC,YAAY,EAAE,CAAC,cAAc,mBAAmB;gBAClD,CAAC,CAAC,qBAAqB,EAAE,CAAC,aAAa,IAAI,SAAS,EAAE;YACxD,aAAa,EAAM,OAAO;SAC3B,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IAEJ,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,MAAwB,EAAE,MAAc;IAC5D,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,cAAc,CAAC;IAC/C,OAAO,aAAa,CAClB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjB,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,OAAO;QAChB,SAAS,EAAE,CAAC,CAAC,WAAW;QACxB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;KAChC,CAAC,CAAC,EACH,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,CAClD,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,OAA8B,EAAE,MAAc;IACjE,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,cAAc,CAAC;IAChD,OAAO,aAAa,CAClB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClB,EAAE,EAAE,CAAC,CAAC,OAAO;QACb,KAAK,EAAE,CAAC,CAAC,OAAO;QAChB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;KAClC,CAAC,CAAC,EACH,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC,CACjD,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,IAA8B,EAAE,OAAiB;IACtE,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;IACF,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,KAAK,GAAa;QACtB,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;QAC7E,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3C,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAClB,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,CACpE;KACF,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,IAAa;IACjD,IAAI,IAAI,EAAE,CAAC;QACT,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function configCommand(): Command;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function grantsCommand(): Command;
3
+ //# sourceMappingURL=grants.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function tokensCommand(): Command;
3
+ //# sourceMappingURL=tokens.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function webhooksCommand(): Command;
3
+ //# sourceMappingURL=webhooks.d.ts.map
@@ -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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"}
@@ -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"}
@@ -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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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
+ }