@tankgate/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/commands/audit.d.ts +14 -0
  2. package/dist/commands/audit.d.ts.map +1 -0
  3. package/dist/commands/audit.js +138 -0
  4. package/dist/commands/audit.js.map +1 -0
  5. package/dist/commands/config.d.ts +11 -0
  6. package/dist/commands/config.d.ts.map +1 -0
  7. package/dist/commands/config.js +128 -0
  8. package/dist/commands/config.js.map +1 -0
  9. package/dist/commands/init.d.ts +24 -0
  10. package/dist/commands/init.d.ts.map +1 -0
  11. package/dist/commands/init.js +125 -0
  12. package/dist/commands/init.js.map +1 -0
  13. package/dist/commands/policy-add-rule.d.ts +16 -0
  14. package/dist/commands/policy-add-rule.d.ts.map +1 -0
  15. package/dist/commands/policy-add-rule.js +125 -0
  16. package/dist/commands/policy-add-rule.js.map +1 -0
  17. package/dist/commands/policy-edit.d.ts +11 -0
  18. package/dist/commands/policy-edit.d.ts.map +1 -0
  19. package/dist/commands/policy-edit.js +34 -0
  20. package/dist/commands/policy-edit.js.map +1 -0
  21. package/dist/commands/policy-show.d.ts +11 -0
  22. package/dist/commands/policy-show.d.ts.map +1 -0
  23. package/dist/commands/policy-show.js +111 -0
  24. package/dist/commands/policy-show.js.map +1 -0
  25. package/dist/commands/preset.d.ts +14 -0
  26. package/dist/commands/preset.d.ts.map +1 -0
  27. package/dist/commands/preset.js +115 -0
  28. package/dist/commands/preset.js.map +1 -0
  29. package/dist/commands/status.d.ts +11 -0
  30. package/dist/commands/status.d.ts.map +1 -0
  31. package/dist/commands/status.js +52 -0
  32. package/dist/commands/status.js.map +1 -0
  33. package/dist/commands/validate.d.ts +10 -0
  34. package/dist/commands/validate.d.ts.map +1 -0
  35. package/dist/commands/validate.js +123 -0
  36. package/dist/commands/validate.js.map +1 -0
  37. package/dist/index.d.ts +13 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +113 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/policy/validate.d.ts +7 -0
  42. package/dist/policy/validate.d.ts.map +1 -0
  43. package/dist/policy/validate.js +89 -0
  44. package/dist/policy/validate.js.map +1 -0
  45. package/dist/presets/index.d.ts +57 -0
  46. package/dist/presets/index.d.ts.map +1 -0
  47. package/dist/presets/index.js +231 -0
  48. package/dist/presets/index.js.map +1 -0
  49. package/package.json +65 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-edit.d.ts","sourceRoot":"","sources":["../../src/commands/policy-edit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B1E"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * tankgate policy edit command
3
+ *
4
+ * Opens policy file in user's default editor ($EDITOR or nano).
5
+ * This is the EASIEST way to modify policies.
6
+ */
7
+ import chalk from 'chalk';
8
+ import { $ } from 'bun';
9
+ import { existsSync } from 'fs';
10
+ import { resolve } from 'path';
11
+ export async function policyEdit(options) {
12
+ const policyPath = resolve(options.path || '.tankgate/policies/default.yaml');
13
+ if (!existsSync(policyPath)) {
14
+ console.error(chalk.red(`Error: Policy file not found: ${policyPath}`));
15
+ console.log(chalk.gray('\nRun `tankgate init` to create a policy file first.'));
16
+ process.exit(1);
17
+ }
18
+ const editor = process.env.EDITOR || process.env.VISUAL || 'nano';
19
+ console.log(chalk.cyan(`Opening policy in ${editor}...`));
20
+ console.log(chalk.gray(`File: ${policyPath}\n`));
21
+ try {
22
+ // Use Bun's shell to run the editor
23
+ await $ `${editor} ${policyPath}`.quiet();
24
+ console.log(chalk.green('\n✓Policy file saved.'));
25
+ console.log(chalk.gray('Run `tankgate validate` to check for errors.'));
26
+ }
27
+ catch (error) {
28
+ console.error(chalk.red('Error opening editor'));
29
+ console.log(chalk.gray('\nYou can manually edit the file at:'));
30
+ console.log(chalk.white(` ${policyPath}`));
31
+ process.exit(1);
32
+ }
33
+ }
34
+ //# sourceMappingURL=policy-edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-edit.js","sourceRoot":"","sources":["../../src/commands/policy-edit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAM/B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAA0B;IACzD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,iCAAiC,CAAC,CAAC;IAE9E,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,UAAU,EAAE,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC;IAElE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,MAAM,KAAK,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,UAAU,IAAI,CAAC,CAAC,CAAC;IAEjD,IAAI,CAAC;QACH,oCAAoC;QACpC,MAAM,CAAC,CAAA,GAAG,MAAM,IAAI,UAAU,EAAE,CAAC,KAAK,EAAE,CAAC;QAEzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC,CAAC;IAC1E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * tankgate policy show command
3
+ *
4
+ * Displays the current policy in a readable format.
5
+ */
6
+ export interface PolicyShowOptions {
7
+ path: string;
8
+ json: boolean;
9
+ }
10
+ export declare function policyShow(options: PolicyShowOptions): Promise<void>;
11
+ //# sourceMappingURL=policy-show.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-show.d.ts","sourceRoot":"","sources":["../../src/commands/policy-show.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuF1E"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * tankgate policy show command
3
+ *
4
+ * Displays the current policy in a readable format.
5
+ */
6
+ import chalk from 'chalk';
7
+ import { existsSync, readFileSync } from 'fs';
8
+ import { resolve } from 'path';
9
+ import { parse } from 'yaml';
10
+ export async function policyShow(options) {
11
+ const policyPath = resolve(options.path || '.tankgate/policies/default.yaml');
12
+ if (!existsSync(policyPath)) {
13
+ console.error(chalk.red(`Error: Policy file not found: ${policyPath}`));
14
+ console.log(chalk.gray('\nRun `tankgate init` to create a policy file first.'));
15
+ process.exit(1);
16
+ }
17
+ const content = readFileSync(policyPath, 'utf-8');
18
+ const policy = parse(content);
19
+ if (options.json) {
20
+ console.log(JSON.stringify(policy, null, 2));
21
+ return;
22
+ }
23
+ console.log(chalk.bold('\n📋 TankGate Policy\n'));
24
+ console.log(chalk.gray(`File: ${policyPath}\n`));
25
+ // Show metadata
26
+ if (policy.metadata) {
27
+ console.log(chalk.cyan('Metadata:'));
28
+ console.log(` Name: ${policy.metadata.name || 'unnamed'}`);
29
+ console.log(` Version: ${policy.metadata.version || '1.0'}`);
30
+ if (policy.metadata.description) {
31
+ console.log(` Description: ${policy.metadata.description}`);
32
+ }
33
+ console.log();
34
+ }
35
+ // Show defaults
36
+ if (policy.defaults) {
37
+ console.log(chalk.cyan('Defaults:'));
38
+ console.log(` Action Level: ${formatLevel(policy.defaults.action_level)}`);
39
+ console.log(` Network Mode: ${policy.defaults.network_mode || 'proxy'}`);
40
+ console.log();
41
+ }
42
+ // Show rules
43
+ if (policy.rules && policy.rules.length > 0) {
44
+ console.log(chalk.cyan(`Rules (${policy.rules.length}):`));
45
+ policy.rules.forEach((rule, index) => {
46
+ const level = formatLevel(rule.level);
47
+ const icon = getLevelIcon(rule.level);
48
+ console.log(`\n ${icon} Rule #${index + 1}: ${chalk.white(rule.name || 'unnamed')}`);
49
+ console.log(` Level: ${level}`);
50
+ if (rule.match) {
51
+ console.log(` Match:`);
52
+ if (rule.match.tool)
53
+ console.log(` tool: ${rule.match.tool}`);
54
+ if (rule.match.action)
55
+ console.log(` action: ${rule.match.action}`);
56
+ if (rule.match.pattern)
57
+ console.log(` pattern: ${chalk.gray(rule.match.pattern)}`);
58
+ }
59
+ if (rule.message) {
60
+ console.log(` Message: ${chalk.gray(rule.message)}`);
61
+ }
62
+ });
63
+ console.log();
64
+ }
65
+ // Show commands
66
+ if (policy.commands) {
67
+ console.log(chalk.cyan('Commands:'));
68
+ ['allowed', 'blocked', 'restricted'].forEach(category => {
69
+ if (policy.commands[category]?.length > 0) {
70
+ const color = category === 'blocked' ? chalk.red : category === 'restricted' ? chalk.yellow : chalk.green;
71
+ console.log(` ${category}: ${color(policy.commands[category].join(', '))}`);
72
+ }
73
+ });
74
+ console.log();
75
+ }
76
+ // Show paths
77
+ if (policy.paths) {
78
+ console.log(chalk.cyan('Paths:'));
79
+ ['allowed', 'blocked', 'restricted'].forEach(category => {
80
+ if (policy.paths[category]?.length > 0) {
81
+ const color = category === 'blocked' ? chalk.red : category === 'restricted' ? chalk.yellow : chalk.green;
82
+ console.log(` ${category}: ${color(policy.paths[category].join(', '))}`);
83
+ }
84
+ });
85
+ console.log();
86
+ }
87
+ console.log(chalk.gray('─'.repeat(50)));
88
+ console.log(chalk.gray(`Edit this policy: tankgate policy edit`));
89
+ console.log(chalk.gray(`Validate: tankgate validate`));
90
+ }
91
+ function formatLevel(level) {
92
+ const colors = {
93
+ level_0: chalk.gray,
94
+ level_1: chalk.cyan,
95
+ level_2: chalk.yellow,
96
+ level_3: chalk.magenta,
97
+ level_4: chalk.red,
98
+ };
99
+ return (colors[level] || chalk.white)(level);
100
+ }
101
+ function getLevelIcon(level) {
102
+ const icons = {
103
+ level_0: '○',
104
+ level_1: '●',
105
+ level_2: '◐',
106
+ level_3: '◑',
107
+ level_4: '✗',
108
+ };
109
+ return icons[level] || '○';
110
+ }
111
+ //# sourceMappingURL=policy-show.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-show.js","sourceRoot":"","sources":["../../src/commands/policy-show.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * tankgate preset command
3
+ *
4
+ * Quick way to switch between security presets.
5
+ * No need to understand the policy DSL - just pick a preset!
6
+ */
7
+ import { type PresetName } from '../presets';
8
+ export interface PresetOptions {
9
+ path: string;
10
+ list: boolean;
11
+ }
12
+ export declare function preset(options: PresetOptions): Promise<void>;
13
+ export declare function applyPreset(name: PresetName, policyPath: string): Promise<void>;
14
+ //# sourceMappingURL=preset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset.d.ts","sourceRoot":"","sources":["../../src/commands/preset.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,EAAmC,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAE9E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA6FlE;AAGD,wBAAsB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBrF"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * tankgate preset command
3
+ *
4
+ * Quick way to switch between security presets.
5
+ * No need to understand the policy DSL - just pick a preset!
6
+ */
7
+ import chalk from 'chalk';
8
+ import { select, confirm } from '@inquirer/prompts';
9
+ import { existsSync, writeFileSync, mkdirSync } from 'fs';
10
+ import { resolve, dirname } from 'path';
11
+ import { stringify } from 'yaml';
12
+ import { getPreset, listPresets } from '../presets';
13
+ export async function preset(options) {
14
+ if (options.list) {
15
+ console.log(chalk.bold('\n🔒 TankGate Security Presets\n'));
16
+ console.log('Choose a preset based on your trust level:\n');
17
+ const presets = listPresets();
18
+ presets.forEach(p => {
19
+ const icon = p.name === 'safe' ? '🛡️' :
20
+ p.name === 'balanced' ? '⚖️ ' :
21
+ p.name === 'permissive' ? '🔓' : '👁️';
22
+ console.log(` ${icon} ${chalk.cyan(p.name.padEnd(12))} - ${p.description}`);
23
+ });
24
+ console.log(chalk.gray('\nUsage: tankgate preset safe'));
25
+ console.log(chalk.gray(' tankgate preset balanced'));
26
+ return;
27
+ }
28
+ const policyPath = resolve(options.path || '.tankgate/policies/default.yaml');
29
+ // Interactive preset selection
30
+ const presetName = await select({
31
+ message: 'Choose your security level:',
32
+ choices: [
33
+ { name: '🛡️ safe - Maximum security, blocks dangerous ops, requires approval', value: 'safe' },
34
+ { name: '⚖️ balanced - Good security, blocks dangerous, logs others', value: 'balanced' },
35
+ { name: '🔓 permissive - Minimal restrictions, logs only', value: 'permissive' },
36
+ { name: '👁️ readonly - Can only read, no modifications allowed', value: 'readonly' },
37
+ ],
38
+ });
39
+ const selectedPreset = getPreset(presetName);
40
+ console.log(chalk.bold(`\n🔒 ${selectedPreset.name}\n`));
41
+ console.log(chalk.gray(selectedPreset.description));
42
+ console.log();
43
+ // Show what this preset does
44
+ console.log(chalk.cyan('What this preset does:'));
45
+ selectedPreset.rules.slice(0, 5).forEach(rule => {
46
+ const levelIcon = rule.level === 'level_4' ? '✗' :
47
+ rule.level === 'level_3' ? '◑' :
48
+ rule.level === 'level_2' ? '◐' :
49
+ rule.level === 'level_1' ? '●' : '○';
50
+ console.log(` ${levelIcon} ${rule.name}`);
51
+ });
52
+ if (selectedPreset.rules.length > 5) {
53
+ console.log(chalk.gray(` ... and ${selectedPreset.rules.length - 5} more rules`));
54
+ }
55
+ console.log();
56
+ const apply = await confirm({
57
+ message: 'Apply this preset?',
58
+ default: true,
59
+ });
60
+ if (!apply) {
61
+ console.log(chalk.gray('Cancelled.'));
62
+ return;
63
+ }
64
+ // Build policy YAML
65
+ const policy = {
66
+ metadata: {
67
+ name: 'tankgate-policy',
68
+ version: '1.0',
69
+ preset: presetName,
70
+ description: selectedPreset.description
71
+ },
72
+ defaults: {
73
+ action_level: selectedPreset.level,
74
+ network_mode: 'proxy'
75
+ },
76
+ rules: selectedPreset.rules
77
+ };
78
+ // Ensure directory exists
79
+ const dir = dirname(policyPath);
80
+ if (!existsSync(dir)) {
81
+ mkdirSync(dir, { recursive: true });
82
+ }
83
+ // Write policy
84
+ const yamlContent = stringify(policy, { lineWidth: 0 });
85
+ writeFileSync(policyPath, yamlContent);
86
+ console.log(chalk.green('\n✓ Preset applied!'));
87
+ console.log(chalk.gray(`Policy saved to: ${policyPath}`));
88
+ console.log();
89
+ console.log(chalk.cyan('Next steps:'));
90
+ console.log(chalk.gray(' • View your policy: tankgate policy show'));
91
+ console.log(chalk.gray(' • Add custom rules: tankgate policy add-rule'));
92
+ console.log(chalk.gray(' • See what\'s blocked: tankgate audit'));
93
+ }
94
+ // Non-interactive version for CLI args
95
+ export async function applyPreset(name, policyPath) {
96
+ const preset = getPreset(name);
97
+ const policy = {
98
+ metadata: {
99
+ name: 'tankgate-policy',
100
+ version: '1.0',
101
+ preset: name,
102
+ description: preset.description
103
+ },
104
+ defaults: {
105
+ action_level: preset.level,
106
+ network_mode: 'proxy'
107
+ },
108
+ rules: preset.rules
109
+ };
110
+ const yamlContent = stringify(policy, { lineWidth: 0 });
111
+ writeFileSync(policyPath, yamlContent);
112
+ console.log(chalk.green(`✓ Applied ${chalk.bold(name)} preset`));
113
+ console.log(chalk.gray(` ${preset.description}`));
114
+ }
115
+ //# sourceMappingURL=preset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset.js","sourceRoot":"","sources":["../../src/commands/preset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * tankgate status command
3
+ *
4
+ * Shows the current status of TankGate by calling the /health endpoint.
5
+ */
6
+ export interface StatusOptions {
7
+ json: boolean;
8
+ url: string;
9
+ }
10
+ export declare function status(options: StatusOptions): Promise<void>;
11
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAkBD,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BlE"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * tankgate status command
3
+ *
4
+ * Shows the current status of TankGate by calling the /health endpoint.
5
+ */
6
+ import chalk from 'chalk';
7
+ export async function status(options) {
8
+ try {
9
+ const response = await fetch(`${options.url}/health`);
10
+ if (!response.ok) {
11
+ console.error(chalk.red(`Error: TankGate returned status ${response.status}`));
12
+ process.exit(1);
13
+ }
14
+ const health = (await response.json());
15
+ if (options.json) {
16
+ console.log(JSON.stringify(health, null, 2));
17
+ return;
18
+ }
19
+ printStatusTable(health);
20
+ }
21
+ catch (error) {
22
+ if (error instanceof Error && error.message.includes('fetch')) {
23
+ console.error(chalk.red('Error: Cannot connect to TankGate'));
24
+ console.log(chalk.gray(`Make sure TankGate is running at ${options.url}`));
25
+ }
26
+ else {
27
+ throw error;
28
+ }
29
+ process.exit(1);
30
+ }
31
+ }
32
+ function printStatusTable(health) {
33
+ console.log(chalk.bold('\n🛡️ TankGate Status\n'));
34
+ // Status
35
+ const statusColor = health.status === 'ok' ? chalk.green : chalk.red;
36
+ console.log(` Status: ${statusColor(health.status)}`);
37
+ // Policy
38
+ console.log(` Policy: ${chalk.cyan(health.policy)} (${health.rules} rules)`);
39
+ // Scanner
40
+ console.log('\n Scanner:');
41
+ console.log(` Profile: ${chalk.cyan(health.scanner.profile)}`);
42
+ console.log(` Backend: ${chalk.cyan(health.scanner.backend)}`);
43
+ console.log(` Fast: ${health.scanner.fast ? chalk.green('✓') : chalk.red('✗')}`);
44
+ console.log(` ML: ${health.scanner.ml ? chalk.green('✓') : chalk.gray('✗')}`);
45
+ // Approval
46
+ console.log('\n Approval:');
47
+ console.log(` Channel: ${chalk.cyan(health.approval.channel)}`);
48
+ const healthyStatus = health.approval.healthy ? chalk.green('✓') : chalk.red('✗');
49
+ console.log(` Healthy: ${healthyStatus}`);
50
+ console.log();
51
+ }
52
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * tankgate validate command
3
+ *
4
+ * Validates TankGate configuration files.
5
+ */
6
+ export interface ValidateOptions {
7
+ path: string;
8
+ }
9
+ export declare function validate(options: ValidateOptions): Promise<void>;
10
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd;AAQD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAqEtE"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * tankgate validate command
3
+ *
4
+ * Validates TankGate configuration files.
5
+ */
6
+ import { access, readdir } from 'fs/promises';
7
+ import { join } from 'path';
8
+ import chalk from 'chalk';
9
+ import { parse } from 'yaml';
10
+ export async function validate(options) {
11
+ console.log(chalk.bold('\n🔍 Validating TankGate configuration\n'));
12
+ const results = {
13
+ valid: true,
14
+ errors: [],
15
+ warnings: [],
16
+ };
17
+ const configDir = options.path;
18
+ // Check config.yaml
19
+ await validateFile(join(configDir, 'config.yaml'), 'config.yaml', results, validateConfigYaml);
20
+ // Check policy files
21
+ const policiesDir = join(configDir, 'policies');
22
+ try {
23
+ const files = await readdir(policiesDir);
24
+ const yamlFiles = files.filter((f) => f.endsWith('.yaml') || f.endsWith('.yml'));
25
+ if (yamlFiles.length === 0) {
26
+ results.warnings.push('No policy files found in .tankgate/policies/');
27
+ }
28
+ for (const file of yamlFiles) {
29
+ await validateFile(join(policiesDir, file), `policies/${file}`, results, validatePolicyYaml);
30
+ }
31
+ }
32
+ catch {
33
+ results.errors.push('Policies directory not found: .tankgate/policies/');
34
+ results.valid = false;
35
+ }
36
+ // Check docker-compose file
37
+ await validateFile('docker-compose.tankgate.yml', 'docker-compose.tankgate.yml', results, validateDockerCompose);
38
+ // Print results
39
+ if (results.valid && results.errors.length === 0) {
40
+ console.log(chalk.green('✓ All configurations valid\n'));
41
+ }
42
+ else {
43
+ console.log(chalk.red('✗ Validation failed\n'));
44
+ }
45
+ if (results.errors.length > 0) {
46
+ console.log(chalk.red('Errors:'));
47
+ for (const error of results.errors) {
48
+ console.log(chalk.red(` ✗ ${error}`));
49
+ }
50
+ }
51
+ if (results.warnings.length > 0) {
52
+ console.log(chalk.yellow('Warnings:'));
53
+ for (const warning of results.warnings) {
54
+ console.log(chalk.yellow(` ⚠ ${warning}`));
55
+ }
56
+ }
57
+ if (!results.valid) {
58
+ process.exit(1);
59
+ }
60
+ }
61
+ async function validateFile(path, name, results, validator) {
62
+ try {
63
+ await access(path);
64
+ // Read and validate content
65
+ const content = await Bun.file(path).text();
66
+ const error = validator(content);
67
+ if (error) {
68
+ results.errors.push(`${name}: ${error}`);
69
+ results.valid = false;
70
+ }
71
+ else {
72
+ console.log(chalk.green(` ✓ ${name}`));
73
+ }
74
+ }
75
+ catch {
76
+ results.errors.push(`${name}: File not found`);
77
+ results.valid = false;
78
+ console.log(chalk.red(` ✗ ${name}: File not found`));
79
+ }
80
+ }
81
+ function validateConfigYaml(content) {
82
+ try {
83
+ const parsed = parse(content);
84
+ if (!parsed.agent || !parsed.scanner || !parsed.approval) {
85
+ return 'Missing required sections (agent, scanner, approval)';
86
+ }
87
+ return null;
88
+ }
89
+ catch (e) {
90
+ return `Invalid YAML: ${e instanceof Error ? e.message : 'Unknown error'}`;
91
+ }
92
+ }
93
+ function validatePolicyYaml(content) {
94
+ try {
95
+ const parsed = parse(content);
96
+ if (!parsed.apiVersion || !parsed.kind || !parsed.metadata) {
97
+ return 'Missing required fields (apiVersion, kind, metadata)';
98
+ }
99
+ if (parsed.apiVersion !== 'tankgate.dev/v1') {
100
+ return `Invalid apiVersion: ${parsed.apiVersion}`;
101
+ }
102
+ if (parsed.kind !== 'AgentPolicy') {
103
+ return `Invalid kind: ${parsed.kind}`;
104
+ }
105
+ return null;
106
+ }
107
+ catch (e) {
108
+ return `Invalid YAML: ${e instanceof Error ? e.message : 'Unknown error'}`;
109
+ }
110
+ }
111
+ function validateDockerCompose(content) {
112
+ try {
113
+ const parsed = parse(content);
114
+ if (!parsed.services || !parsed.services.tankgate) {
115
+ return 'Missing tankgate service';
116
+ }
117
+ return null;
118
+ }
119
+ catch (e) {
120
+ return `Invalid YAML: ${e instanceof Error ? e.message : 'Unknown error'}`;
121
+ }
122
+ }
123
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * TankGate CLI
4
+ *
5
+ * Runtime policy and containment layer for AI coding agents.
6
+ *
7
+ * Quick Start:
8
+ * tankgate init --preset safe # Initialize with safe preset
9
+ * tankgate config # Interactive configuration
10
+ * tankgate audit # See what's been blocked
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}