@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,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":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EACL,WAAW,EACX,SAAS,EACT,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAcxB;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAA2B;IACpD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC;IACxC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;IAEtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAE5D,+BAA+B;IAC/B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC;QACrF,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kDAAkD,CAAC,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC,CAAC;YAC5E,OAAO;QACT,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,QAAQ,GAAwE,IAAI,CAAC;IACzF,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrC,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACvC,QAAQ,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,OAAO,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,QAAQ,CAAC,UAAU,cAAc,CAAC,CAAC;YACpG,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,IAAI,WAAwB,CAAC;IAC7B,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,sDAAsD;QACtD,WAAW,GAAG,iBAAiB,CAAC;YAC9B,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,QAAQ,EAAE,KAAK;YACvC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC,CAAC;IAClF,CAAC;SAAM,CAAC;QACN,mBAAmB;QACnB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,WAAW,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,KAAK,IAAI,IAAI,EAAE;YACrD,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,yBAAyB;IACzB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAEjD,IAAI,CAAC;QACH,qBAAqB;QACrB,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7E,uBAAuB;QACvB,MAAM,SAAS,CACb,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,CAAC,EAC7C,kBAAkB,CAAC,WAAW,CAAC,CAChC,CAAC;QAEF,uBAAuB;QACvB,MAAM,SAAS,CACb,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC,KAAK,OAAO,CAAC,EACvE,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC,CAClC,CAAC;QAEF,0BAA0B;QAC1B,MAAM,SAAS,CACb,IAAI,CAAC,WAAW,EAAE,6BAA6B,CAAC,EAChD,qBAAqB,CAAC,WAAW,CAAC,CACnC,CAAC;QAEF,wBAAwB;QACxB,MAAM,SAAS,CACb,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EACjC,kBAAkB,CAAC,WAAW,CAAC,CAChC,CAAC;QAEF,OAAO,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACrD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,2BAA2B;IAC3B,cAAc,CAAC,WAAW,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,OAAoB;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;IAE1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,OAAO,CAAC,KAAK,sBAAsB,CAAC,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC,CAAC;IAEnF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,mDAAmD,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;IAErD,IAAI,OAAO,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,qDAAqD,CAAC,CAAC;IAC1F,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC,CAAC;IAEpF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,2CAA2C,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC,CAAC;IAEhF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACvF,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
|
|
@@ -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
|