@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.
- package/dist/commands/audit.d.ts +14 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +138 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/config.d.ts +11 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +128 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/init.d.ts +24 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +125 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/policy-add-rule.d.ts +16 -0
- package/dist/commands/policy-add-rule.d.ts.map +1 -0
- package/dist/commands/policy-add-rule.js +125 -0
- package/dist/commands/policy-add-rule.js.map +1 -0
- package/dist/commands/policy-edit.d.ts +11 -0
- package/dist/commands/policy-edit.d.ts.map +1 -0
- package/dist/commands/policy-edit.js +34 -0
- package/dist/commands/policy-edit.js.map +1 -0
- package/dist/commands/policy-show.d.ts +11 -0
- package/dist/commands/policy-show.d.ts.map +1 -0
- package/dist/commands/policy-show.js +111 -0
- package/dist/commands/policy-show.js.map +1 -0
- package/dist/commands/preset.d.ts +14 -0
- package/dist/commands/preset.d.ts.map +1 -0
- package/dist/commands/preset.js +115 -0
- package/dist/commands/preset.js.map +1 -0
- package/dist/commands/status.d.ts +11 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +52 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/validate.d.ts +10 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +123 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +113 -0
- package/dist/index.js.map +1 -0
- package/dist/policy/validate.d.ts +7 -0
- package/dist/policy/validate.d.ts.map +1 -0
- package/dist/policy/validate.js +89 -0
- package/dist/policy/validate.js.map +1 -0
- package/dist/presets/index.d.ts +57 -0
- package/dist/presets/index.d.ts.map +1 -0
- package/dist/presets/index.js +231 -0
- package/dist/presets/index.js.map +1 -0
- 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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|