@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,14 @@
1
+ /**
2
+ * tankgate audit command
3
+ *
4
+ * Shows audit history - what was allowed, blocked, and why.
5
+ * This is how users SEE THE VALUE of TankGate.
6
+ */
7
+ export interface AuditOptions {
8
+ limit: number;
9
+ blocked: boolean;
10
+ json: boolean;
11
+ db: string;
12
+ }
13
+ export declare function audit(options: AuditOptions): Promise<void>;
14
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;CACZ;AAcD,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA6ChE"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * tankgate audit command
3
+ *
4
+ * Shows audit history - what was allowed, blocked, and why.
5
+ * This is how users SEE THE VALUE of TankGate.
6
+ */
7
+ import chalk from 'chalk';
8
+ import { Database } from 'bun:sqlite';
9
+ export async function audit(options) {
10
+ const dbPath = options.db || './.tankgate/audit.db';
11
+ let db;
12
+ try {
13
+ db = new Database(dbPath, { readonly: true });
14
+ }
15
+ catch {
16
+ console.error(chalk.red('Error: Cannot open audit database'));
17
+ console.log(chalk.gray(`Path: ${dbPath}`));
18
+ console.log(chalk.gray('Make sure TankGate is running and has processed some requests.'));
19
+ process.exit(1);
20
+ }
21
+ try {
22
+ // Get stats
23
+ const stats = getStats(db);
24
+ // Get entries
25
+ let query = `SELECT * FROM audit_log ORDER BY timestamp DESC LIMIT ?`;
26
+ if (options.blocked) {
27
+ query = `SELECT * FROM audit_log WHERE decision = 'blocked' OR level = 'level_4' ORDER BY timestamp DESC LIMIT ?`;
28
+ }
29
+ const entries = db.query(query).all(options.limit);
30
+ if (options.json) {
31
+ console.log(JSON.stringify({ stats, entries }, null, 2));
32
+ return;
33
+ }
34
+ // Print summary
35
+ printSummary(stats);
36
+ // Print entries
37
+ if (entries.length > 0) {
38
+ console.log(chalk.bold('\nšŸ“‹ Recent Activity\n'));
39
+ entries.forEach(entry => printEntry(entry));
40
+ }
41
+ else {
42
+ console.log(chalk.gray('\nNo audit entries found.'));
43
+ console.log(chalk.gray('Use your AI agent with TankGate to see activity here.'));
44
+ }
45
+ }
46
+ finally {
47
+ db.close();
48
+ }
49
+ }
50
+ function getStats(db) {
51
+ const row = db.query(`
52
+ SELECT
53
+ COUNT(*) as total,
54
+ SUM(CASE WHEN decision = 'blocked' OR level = 'level_4' THEN 1 ELSE 0 END) as blocked,
55
+ SUM(CASE WHEN level = 'level_0' THEN 1 ELSE 0 END) as level_0,
56
+ SUM(CASE WHEN level = 'level_1' THEN 1 ELSE 0 END) as level_1,
57
+ SUM(CASE WHEN level = 'level_2' THEN 1 ELSE 0 END) as level_2,
58
+ SUM(CASE WHEN level = 'level_3' THEN 1 ELSE 0 END) as level_3,
59
+ SUM(CASE WHEN level = 'level_4' THEN 1 ELSE 0 END) as level_4
60
+ FROM audit_log
61
+ `).get();
62
+ return {
63
+ total: row?.total || 0,
64
+ blocked: row?.blocked || 0,
65
+ approved: 0, // Would need to track this separately
66
+ level_0: row?.level_0 || 0,
67
+ level_1: row?.level_1 || 0,
68
+ level_2: row?.level_2 || 0,
69
+ level_3: row?.level_3 || 0,
70
+ level_4: row?.level_4 || 0,
71
+ };
72
+ }
73
+ function printSummary(stats) {
74
+ console.log(chalk.bold('\nšŸ›”ļø TankGate Audit Summary\n'));
75
+ // Value proposition
76
+ if (stats.blocked > 0) {
77
+ console.log(chalk.green(` āœ… Blocked ${chalk.bold(stats.blocked)} dangerous actions`));
78
+ }
79
+ else {
80
+ console.log(chalk.gray(' No dangerous actions blocked yet'));
81
+ }
82
+ console.log();
83
+ console.log(` Total requests: ${chalk.cyan(stats.total)}`);
84
+ console.log();
85
+ console.log(' By action level:');
86
+ console.log(` ${chalk.gray('level_0')} (silent): ${stats.level_0}`);
87
+ console.log(` ${chalk.cyan('level_1')} (log): ${stats.level_1}`);
88
+ console.log(` ${chalk.yellow('level_2')} (notify): ${stats.level_2}`);
89
+ console.log(` ${chalk.magenta('level_3')} (approve): ${stats.level_3}`);
90
+ console.log(` ${chalk.red('level_4')} (block): ${stats.level_4}`);
91
+ }
92
+ function printEntry(entry) {
93
+ const time = new Date(entry.timestamp).toLocaleTimeString();
94
+ const date = new Date(entry.timestamp).toLocaleDateString();
95
+ // Color based on level
96
+ let levelColor = chalk.gray;
97
+ let levelIcon = 'ā—‹';
98
+ if (entry.level === 'level_1') {
99
+ levelColor = chalk.cyan;
100
+ levelIcon = 'ā—';
101
+ }
102
+ if (entry.level === 'level_2') {
103
+ levelColor = chalk.yellow;
104
+ levelIcon = '◐';
105
+ }
106
+ if (entry.level === 'level_3') {
107
+ levelColor = chalk.magenta;
108
+ levelIcon = 'ā—‘';
109
+ }
110
+ if (entry.level === 'level_4' || entry.decision === 'blocked') {
111
+ levelColor = chalk.red;
112
+ levelIcon = 'āœ—';
113
+ }
114
+ console.log(` ${levelIcon} ${chalk.gray(`${date} ${time}`)} ${levelColor(entry.level || entry.decision)}`);
115
+ if (entry.tool && entry.action) {
116
+ console.log(` ${chalk.cyan(entry.tool)}.${chalk.cyan(entry.action)}`);
117
+ }
118
+ if (entry.reason) {
119
+ console.log(` ${entry.reason}`);
120
+ }
121
+ // Parse and show args if relevant
122
+ if (entry.args) {
123
+ try {
124
+ const args = JSON.parse(entry.args);
125
+ if (args.command) {
126
+ console.log(` ${chalk.gray('$')} ${args.command}`);
127
+ }
128
+ if (args.path) {
129
+ console.log(` ${chalk.gray('path:')} ${args.path}`);
130
+ }
131
+ }
132
+ catch {
133
+ // Ignore parse errors
134
+ }
135
+ }
136
+ console.log();
137
+ }
138
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * tankgate config command
3
+ *
4
+ * Simplified configuration for common settings.
5
+ * No need to edit YAML - just answer questions!
6
+ */
7
+ export interface ConfigOptions {
8
+ path: string;
9
+ }
10
+ export declare function config(options: ConfigOptions): Promise<void>;
11
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAgIlE"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * tankgate config command
3
+ *
4
+ * Simplified configuration for common settings.
5
+ * No need to edit YAML - just answer questions!
6
+ */
7
+ import chalk from 'chalk';
8
+ import { select, checkbox, confirm } from '@inquirer/prompts';
9
+ import { writeFileSync } from 'fs';
10
+ import { resolve } from 'path';
11
+ import { stringify } from 'yaml';
12
+ import { SERVICE_PRESETS, PRESETS } from '../presets';
13
+ export async function config(options) {
14
+ const policyPath = resolve(options.path || '.tankgate/policies/default.yaml');
15
+ console.log(chalk.bold('\nāš™ļø TankGate Configuration\n'));
16
+ console.log(chalk.gray('Answer a few questions to configure your security settings.\n'));
17
+ // 1. Security Level
18
+ const securityLevel = await select({
19
+ message: 'How restrictive should TankGate be?',
20
+ choices: [
21
+ { name: 'šŸ›”ļø Safe - Block dangerous operations, require approval for changes', value: 'safe' },
22
+ { name: 'āš–ļø Balanced - Block dangerous, allow normal dev work', value: 'balanced' },
23
+ { name: 'šŸ”“ Permissive - Allow most things, just log', value: 'permissive' },
24
+ { name: 'šŸ‘ļø Read-Only - Only allow reading, no modifications', value: 'readonly' },
25
+ ],
26
+ });
27
+ // 2. Allowed Services (skip for readonly)
28
+ let allowedServices = [];
29
+ if (securityLevel !== 'readonly') {
30
+ allowedServices = await checkbox({
31
+ message: 'Which tools/services should OpenClaw be able to use?',
32
+ choices: [
33
+ { name: 'git - Version control (status, commit, push)', value: 'git', checked: true },
34
+ { name: 'npm/bun - Package management', value: 'npm', checked: true },
35
+ { name: 'docker - Container management', value: 'docker' },
36
+ { name: 'python - Python & pip', value: 'python' },
37
+ { name: 'all - Allow all tools', value: 'all' },
38
+ ],
39
+ });
40
+ }
41
+ // 3. Protected Paths
42
+ const protectSecrets = await confirm({
43
+ message: 'Block access to .env and secrets files?',
44
+ default: true,
45
+ });
46
+ // 4. Network Access
47
+ const blockNetwork = await confirm({
48
+ message: 'Block network commands (curl, wget, ssh)?',
49
+ default: securityLevel === 'safe',
50
+ });
51
+ // 5. Approval Channel
52
+ const approvalChannel = await select({
53
+ message: 'How should TankGate notify you about important actions?',
54
+ choices: [
55
+ { name: 'šŸ“± Telegram - Get approval requests on Telegram', value: 'telegram' },
56
+ { name: 'šŸ“‹ Log only - Just log to console', value: 'log' },
57
+ { name: '🚫 Block - Block anything requiring approval', value: 'block' },
58
+ ],
59
+ });
60
+ // Build the policy
61
+ const basePreset = PRESETS[securityLevel];
62
+ const rules = [...basePreset.rules];
63
+ // Add service allowlist rules
64
+ if (allowedServices.length > 0 && !allowedServices.includes('all')) {
65
+ const allowedPatterns = allowedServices
66
+ .flatMap(s => SERVICE_PRESETS[s] || [])
67
+ .join('|');
68
+ rules.unshift({
69
+ name: 'Allow approved services',
70
+ level: 'level_0',
71
+ match: { tool: 'Bash', pattern: `^(${allowedPatterns})` },
72
+ message: null
73
+ });
74
+ }
75
+ // Add network block if requested
76
+ if (blockNetwork && securityLevel !== 'safe') {
77
+ rules.push({
78
+ name: 'Block network commands',
79
+ level: 'level_4',
80
+ match: { tool: 'Bash', pattern: 'curl|wget|nc|ssh|scp|rsync' },
81
+ message: 'Network commands are blocked'
82
+ });
83
+ }
84
+ // Add secrets protection if requested
85
+ if (protectSecrets && securityLevel !== 'safe') {
86
+ rules.push({
87
+ name: 'Block secrets access',
88
+ level: 'level_4',
89
+ match: { tool: '*', pattern: '\\.env|secrets/|credentials/|\\.pem|\\.key' },
90
+ message: 'Access to secrets is blocked'
91
+ });
92
+ }
93
+ const policy = {
94
+ metadata: {
95
+ name: 'tankgate-policy',
96
+ version: '1.0',
97
+ preset: securityLevel,
98
+ generated: new Date().toISOString()
99
+ },
100
+ defaults: {
101
+ action_level: basePreset.level,
102
+ network_mode: 'proxy',
103
+ approval_channel: approvalChannel
104
+ },
105
+ rules
106
+ };
107
+ // Save
108
+ const yamlContent = stringify(policy, { lineWidth: 0 });
109
+ writeFileSync(policyPath, yamlContent);
110
+ console.log(chalk.green('\nāœ“ Configuration saved!'));
111
+ console.log();
112
+ console.log(chalk.cyan('Your settings:'));
113
+ console.log(` Security: ${chalk.white(securityLevel)}`);
114
+ if (allowedServices.length > 0) {
115
+ console.log(` Services: ${chalk.white(allowedServices.join(', '))}`);
116
+ }
117
+ console.log(` Block secrets: ${protectSecrets ? chalk.green('Yes') : chalk.red('No')}`);
118
+ console.log(` Block network: ${blockNetwork ? chalk.green('Yes') : chalk.red('No')}`);
119
+ console.log(` Notifications: ${chalk.white(approvalChannel)}`);
120
+ console.log();
121
+ console.log(chalk.gray(`Policy saved to: ${policyPath}`));
122
+ console.log();
123
+ console.log(chalk.cyan('Next steps:'));
124
+ console.log(chalk.gray(' • tankgate policy show - View your policy'));
125
+ console.log(chalk.gray(' • tankgate audit - See what\'s been blocked'));
126
+ console.log(chalk.gray(' • tankgate config - Change settings'));
127
+ }
128
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * tankgate init command
3
+ *
4
+ * Initializes TankGate in a project by:
5
+ * 1. Detecting the AI agent being used
6
+ * 2. Running an interactive wizard (or using CLI flags)
7
+ * 3. Generating configuration files
8
+ */
9
+ import type { AgentType } from '@tankgate/core';
10
+ export interface InitCommandOptions {
11
+ path: string;
12
+ detect: boolean;
13
+ force: boolean;
14
+ agent?: AgentType;
15
+ mode?: 'contained' | 'convenience';
16
+ profile?: 'fast' | 'standard' | 'paranoid';
17
+ approval?: 'telegram' | 'none';
18
+ yes: boolean;
19
+ }
20
+ /**
21
+ * Run the init command
22
+ */
23
+ export declare function init(options: InitCommandOptions): Promise<void>;
24
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,gBAAgB,CAAC;AAE7D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,IAAI,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC3C,QAAQ,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IAC/B,GAAG,EAAE,OAAO,CAAC;CACd;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6FrE"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * tankgate init command
3
+ *
4
+ * Initializes TankGate in a project by:
5
+ * 1. Detecting the AI agent being used
6
+ * 2. Running an interactive wizard (or using CLI flags)
7
+ * 3. Generating configuration files
8
+ */
9
+ import { mkdir, writeFile, access } from 'fs/promises';
10
+ import { join } from 'path';
11
+ import chalk from 'chalk';
12
+ import ora from 'ora';
13
+ import { detectAgent, runWizard, generateDockerCompose, generatePolicy, generateConfigYaml, generateEnvExample, mergeWithDefaults, } from '@tankgate/core';
14
+ /**
15
+ * Run the init command
16
+ */
17
+ export async function init(options) {
18
+ const projectPath = options.path || '.';
19
+ const spinner = ora();
20
+ console.log(chalk.bold('\nšŸ›”ļø TankGate Initialization\n'));
21
+ // Check if already initialized
22
+ if (!options.force) {
23
+ const configExists = await fileExists(join(projectPath, '.tankgate', 'config.yaml'));
24
+ if (configExists) {
25
+ console.log(chalk.yellow('TankGate is already initialized in this project.'));
26
+ console.log(chalk.gray('Use --force to overwrite existing configuration.'));
27
+ return;
28
+ }
29
+ }
30
+ // Step 1: Detect agent
31
+ let detected = null;
32
+ if (options.detect || !options.agent) {
33
+ spinner.start('Detecting AI agent...');
34
+ detected = await detectAgent(projectPath);
35
+ if (detected) {
36
+ spinner.succeed(`Detected ${chalk.cyan(detected.agent)} agent (${detected.confidence} confidence)`);
37
+ if (detected.evidence.length > 0) {
38
+ console.log(chalk.gray(` Evidence: ${detected.evidence.join(', ')}`));
39
+ }
40
+ }
41
+ else {
42
+ spinner.info('No AI agent detected');
43
+ }
44
+ }
45
+ // Step 2: Run wizard or use defaults
46
+ let initOptions;
47
+ if (options.yes) {
48
+ // Non-interactive mode: use defaults + provided flags
49
+ initOptions = mergeWithDefaults({
50
+ agent: options.agent ?? detected?.agent,
51
+ mode: options.mode,
52
+ profile: options.profile,
53
+ approval: options.approval,
54
+ });
55
+ console.log(chalk.gray('\nUsing default configuration (non-interactive mode)'));
56
+ }
57
+ else {
58
+ // Interactive mode
59
+ console.log();
60
+ initOptions = await runWizard(detected?.agent ?? null, {
61
+ agent: options.agent,
62
+ mode: options.mode,
63
+ profile: options.profile,
64
+ approval: options.approval,
65
+ });
66
+ }
67
+ // Step 3: Generate files
68
+ console.log();
69
+ spinner.start('Creating configuration files...');
70
+ try {
71
+ // Create directories
72
+ await mkdir(join(projectPath, '.tankgate', 'policies'), { recursive: true });
73
+ // Generate config.yaml
74
+ await writeFile(join(projectPath, '.tankgate', 'config.yaml'), generateConfigYaml(initOptions));
75
+ // Generate policy file
76
+ await writeFile(join(projectPath, '.tankgate', 'policies', `${initOptions.agent}.yaml`), generatePolicy(initOptions.agent));
77
+ // Generate docker-compose
78
+ await writeFile(join(projectPath, 'docker-compose.tankgate.yml'), generateDockerCompose(initOptions));
79
+ // Generate .env.example
80
+ await writeFile(join(projectPath, '.env.example'), generateEnvExample(initOptions));
81
+ spinner.succeed('Configuration files created');
82
+ }
83
+ catch (error) {
84
+ spinner.fail('Failed to create configuration files');
85
+ throw error;
86
+ }
87
+ // Step 4: Print next steps
88
+ printNextSteps(initOptions);
89
+ }
90
+ /**
91
+ * Check if a file exists
92
+ */
93
+ async function fileExists(path) {
94
+ try {
95
+ await access(path);
96
+ return true;
97
+ }
98
+ catch {
99
+ return false;
100
+ }
101
+ }
102
+ /**
103
+ * Print next steps for the user
104
+ */
105
+ function printNextSteps(options) {
106
+ console.log(chalk.bold.green('\nāœ… TankGate initialized successfully!\n'));
107
+ console.log(chalk.bold('Configuration files created:'));
108
+ console.log(chalk.gray(' .tankgate/config.yaml - Main configuration'));
109
+ console.log(chalk.gray(` .tankgate/policies/${options.agent}.yaml - Agent policy`));
110
+ console.log(chalk.gray(' docker-compose.tankgate.yml - Docker configuration'));
111
+ console.log(chalk.gray(' .env.example - Environment template'));
112
+ console.log(chalk.bold('\nNext steps:'));
113
+ console.log(chalk.cyan(' 1.') + ' Copy .env.example to .env and add your API keys:');
114
+ console.log(chalk.gray(' cp .env.example .env'));
115
+ if (options.approval === 'telegram') {
116
+ console.log(chalk.cyan(' 2.') + ' Configure Telegram for approval (see .env.example)');
117
+ }
118
+ console.log(chalk.cyan(' 3.') + ' Start TankGate:');
119
+ console.log(chalk.gray(' docker compose -f docker-compose.tankgate.yml up -d'));
120
+ console.log(chalk.cyan(' 4.') + ' Configure your AI agent to use TankGate:');
121
+ console.log(chalk.gray(' export OPENAI_BASE_URL=http://localhost:8080/v1'));
122
+ console.log(chalk.bold('\nDocumentation: ') + chalk.blue('https://tankgate.dev/docs'));
123
+ console.log();
124
+ }
125
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * tankgate policy add-rule command
3
+ *
4
+ * Interactively add a new rule to the policy.
5
+ * This is the EASIEST way to add rules without editing YAML.
6
+ */
7
+ export interface PolicyAddRuleOptions {
8
+ path: string;
9
+ tool?: string;
10
+ action?: string;
11
+ level?: string;
12
+ pattern?: string;
13
+ name?: string;
14
+ }
15
+ export declare function policyAddRule(options: PolicyAddRuleOptions): Promise<void>;
16
+ //# sourceMappingURL=policy-add-rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-add-rule.d.ts","sourceRoot":"","sources":["../../src/commands/policy-add-rule.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoHhF"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * tankgate policy add-rule command
3
+ *
4
+ * Interactively add a new rule to the policy.
5
+ * This is the EASIEST way to add rules without editing YAML.
6
+ */
7
+ import chalk from 'chalk';
8
+ import { select, input } from '@inquirer/prompts';
9
+ import { existsSync, readFileSync, writeFileSync } from 'fs';
10
+ import { resolve } from 'path';
11
+ import { parse, stringify } from 'yaml';
12
+ export async function policyAddRule(options) {
13
+ const policyPath = resolve(options.path || '.tankgate/policies/default.yaml');
14
+ if (!existsSync(policyPath)) {
15
+ console.error(chalk.red(`Error: Policy file not found: ${policyPath}`));
16
+ console.log(chalk.gray('\nRun `tankgate init` to create a policy file first.'));
17
+ process.exit(1);
18
+ }
19
+ const content = readFileSync(policyPath, 'utf-8');
20
+ const policy = parse(content);
21
+ // Initialize rules array if not exists
22
+ if (!policy.rules) {
23
+ policy.rules = [];
24
+ }
25
+ console.log(chalk.bold('\nāž• Add New Policy Rule\n'));
26
+ // Get rule details (interactive or from options)
27
+ const name = options.name || await input({
28
+ message: 'Rule name (e.g., "Block production access"):',
29
+ default: `Rule ${policy.rules.length + 1}`,
30
+ });
31
+ const tool = options.tool || await select({
32
+ message: 'Which tool does this rule apply to?',
33
+ choices: [
34
+ { name: 'Bash - Shell commands', value: 'Bash' },
35
+ { name: 'Read - File reading', value: 'Read' },
36
+ { name: 'Write - File writing', value: 'Write' },
37
+ { name: 'Edit - File editing', value: 'Edit' },
38
+ { name: 'WebSearch - Web searches', value: 'WebSearch' },
39
+ { name: '* - All tools', value: '*' },
40
+ ],
41
+ });
42
+ const action = options.action || await select({
43
+ message: 'Which action?',
44
+ choices: tool === '*' || tool === 'WebSearch'
45
+ ? [{ name: '* - All actions', value: '*' }]
46
+ : [
47
+ { name: '* - All actions', value: '*' },
48
+ { name: 'read - Reading', value: 'read' },
49
+ { name: 'write - Writing', value: 'write' },
50
+ { name: 'execute - Executing', value: 'execute' },
51
+ ],
52
+ });
53
+ const level = options.level || await select({
54
+ message: 'What should happen when this rule matches?',
55
+ choices: [
56
+ { name: 'ā—‹ level_0 - Silent allow (no logging)', value: 'level_0' },
57
+ { name: 'ā— level_1 - Log only', value: 'level_1' },
58
+ { name: '◐ level_2 - Notify (Telegram)', value: 'level_2' },
59
+ { name: 'ā—‘ level_3 - Require approval', value: 'level_3' },
60
+ { name: 'āœ— level_4 - Block completely', value: 'level_4' },
61
+ ],
62
+ });
63
+ let pattern = options.pattern;
64
+ if (!pattern && tool === 'Bash') {
65
+ pattern = await input({
66
+ message: 'Command pattern (regex, e.g., "rm -rf|sudo|npm publish"):',
67
+ default: '.*',
68
+ });
69
+ }
70
+ else if (!pattern && (tool === 'Read' || tool === 'Write' || tool === 'Edit')) {
71
+ pattern = await input({
72
+ message: 'Path pattern (regex, e.g., "\\.env|secrets/|credentials"):',
73
+ default: '.*',
74
+ });
75
+ }
76
+ const message = await input({
77
+ message: 'Custom message (shown when rule matches):',
78
+ default: '',
79
+ });
80
+ // Build the rule
81
+ const rule = {
82
+ name,
83
+ level,
84
+ match: {
85
+ tool,
86
+ action,
87
+ },
88
+ };
89
+ if (pattern && pattern !== '.*') {
90
+ rule.match.pattern = pattern;
91
+ }
92
+ if (message) {
93
+ rule.message = message;
94
+ }
95
+ // Add to policy
96
+ policy.rules.push(rule);
97
+ // Write back
98
+ const yamlContent = stringify(policy, { lineWidth: 0 });
99
+ writeFileSync(policyPath, yamlContent);
100
+ console.log(chalk.green('\nāœ“ Rule added successfully!\n'));
101
+ console.log(chalk.gray('Rule details:'));
102
+ console.log(` Name: ${chalk.white(name)}`);
103
+ console.log(` Tool: ${chalk.cyan(tool)}`);
104
+ console.log(` Action: ${chalk.cyan(action)}`);
105
+ console.log(` Level: ${formatLevel(level)}`);
106
+ if (pattern)
107
+ console.log(` Pattern: ${chalk.gray(pattern)}`);
108
+ if (message)
109
+ console.log(` Message: ${chalk.gray(message)}`);
110
+ console.log(chalk.gray('\n─'.repeat(50)));
111
+ console.log(chalk.gray('View all rules: tankgate policy show'));
112
+ console.log(chalk.gray('Edit manually: tankgate policy edit'));
113
+ console.log(chalk.gray('Validate: tankgate validate'));
114
+ }
115
+ function formatLevel(level) {
116
+ const colors = {
117
+ level_0: chalk.gray,
118
+ level_1: chalk.cyan,
119
+ level_2: chalk.yellow,
120
+ level_3: chalk.magenta,
121
+ level_4: chalk.red,
122
+ };
123
+ return (colors[level] || chalk.white)(level);
124
+ }
125
+ //# sourceMappingURL=policy-add-rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-add-rule.js","sourceRoot":"","sources":["../../src/commands/policy-add-rule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
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
+ export interface PolicyEditOptions {
8
+ path: string;
9
+ }
10
+ export declare function policyEdit(options: PolicyEditOptions): Promise<void>;
11
+ //# sourceMappingURL=policy-edit.d.ts.map