@dotsetlabs/tollgate 0.2.2 → 0.3.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/README.md +138 -0
- package/dist/analyzers/filesystem.d.ts +5 -0
- package/dist/analyzers/filesystem.d.ts.map +1 -1
- package/dist/analyzers/filesystem.js +61 -7
- package/dist/analyzers/filesystem.js.map +1 -1
- package/dist/analyzers/loader.d.ts +5 -0
- package/dist/analyzers/loader.d.ts.map +1 -1
- package/dist/analyzers/loader.js +112 -6
- package/dist/analyzers/loader.js.map +1 -1
- package/dist/analyzers/prompt-injection.d.ts +1 -0
- package/dist/analyzers/prompt-injection.d.ts.map +1 -1
- package/dist/analyzers/prompt-injection.js +48 -2
- package/dist/analyzers/prompt-injection.js.map +1 -1
- package/dist/analyzers/shell.d.ts +8 -0
- package/dist/analyzers/shell.d.ts.map +1 -1
- package/dist/analyzers/shell.js +109 -8
- package/dist/analyzers/shell.js.map +1 -1
- package/dist/analyzers/sql.d.ts.map +1 -1
- package/dist/analyzers/sql.js +8 -7
- package/dist/analyzers/sql.js.map +1 -1
- package/dist/approval/interactive.d.ts +1 -1
- package/dist/approval/interactive.d.ts.map +1 -1
- package/dist/approval/interactive.js +13 -1
- package/dist/approval/interactive.js.map +1 -1
- package/dist/approval/rate-limiter.d.ts +115 -0
- package/dist/approval/rate-limiter.d.ts.map +1 -0
- package/dist/approval/rate-limiter.js +200 -0
- package/dist/approval/rate-limiter.js.map +1 -0
- package/dist/approval/url-validator.d.ts +51 -0
- package/dist/approval/url-validator.d.ts.map +1 -0
- package/dist/approval/url-validator.js +184 -0
- package/dist/approval/url-validator.js.map +1 -0
- package/dist/approval/webhook.d.ts +48 -0
- package/dist/approval/webhook.d.ts.map +1 -1
- package/dist/approval/webhook.js +89 -0
- package/dist/approval/webhook.js.map +1 -1
- package/dist/audit/integrity.d.ts +107 -0
- package/dist/audit/integrity.d.ts.map +1 -0
- package/dist/audit/integrity.js +191 -0
- package/dist/audit/integrity.js.map +1 -0
- package/dist/audit/logger.d.ts.map +1 -1
- package/dist/audit/logger.js +6 -5
- package/dist/audit/logger.js.map +1 -1
- package/dist/audit/redaction.js +6 -4
- package/dist/audit/redaction.js.map +1 -1
- package/dist/cli/commands/guard.d.ts +97 -0
- package/dist/cli/commands/guard.d.ts.map +1 -0
- package/dist/cli/commands/guard.js +456 -0
- package/dist/cli/commands/guard.js.map +1 -0
- package/dist/cli/commands/serve.js +1 -1
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/index.js +3 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/input-validation.d.ts +83 -0
- package/dist/cli/input-validation.d.ts.map +1 -0
- package/dist/cli/input-validation.js +237 -0
- package/dist/cli/input-validation.js.map +1 -0
- package/dist/cli/ui.js +2 -2
- package/dist/cli/ui.js.map +1 -1
- package/dist/guard/alternatives/index.d.ts +68 -0
- package/dist/guard/alternatives/index.d.ts.map +1 -0
- package/dist/guard/alternatives/index.js +224 -0
- package/dist/guard/alternatives/index.js.map +1 -0
- package/dist/guard/alternatives/registry.d.ts +16 -0
- package/dist/guard/alternatives/registry.d.ts.map +1 -0
- package/dist/guard/alternatives/registry.js +518 -0
- package/dist/guard/alternatives/registry.js.map +1 -0
- package/dist/guard/alternatives/types.d.ts +86 -0
- package/dist/guard/alternatives/types.d.ts.map +1 -0
- package/dist/guard/alternatives/types.js +5 -0
- package/dist/guard/alternatives/types.js.map +1 -0
- package/dist/guard/approval/enhanced-terminal.d.ts +110 -0
- package/dist/guard/approval/enhanced-terminal.d.ts.map +1 -0
- package/dist/guard/approval/enhanced-terminal.js +387 -0
- package/dist/guard/approval/enhanced-terminal.js.map +1 -0
- package/dist/guard/config.d.ts +80 -0
- package/dist/guard/config.d.ts.map +1 -0
- package/dist/guard/config.js +260 -0
- package/dist/guard/config.js.map +1 -0
- package/dist/guard/context/directory.d.ts +35 -0
- package/dist/guard/context/directory.d.ts.map +1 -0
- package/dist/guard/context/directory.js +243 -0
- package/dist/guard/context/directory.js.map +1 -0
- package/dist/guard/context/environment.d.ts +31 -0
- package/dist/guard/context/environment.d.ts.map +1 -0
- package/dist/guard/context/environment.js +204 -0
- package/dist/guard/context/environment.js.map +1 -0
- package/dist/guard/context/git.d.ts +52 -0
- package/dist/guard/context/git.d.ts.map +1 -0
- package/dist/guard/context/git.js +278 -0
- package/dist/guard/context/git.js.map +1 -0
- package/dist/guard/context/index.d.ts +64 -0
- package/dist/guard/context/index.d.ts.map +1 -0
- package/dist/guard/context/index.js +227 -0
- package/dist/guard/context/index.js.map +1 -0
- package/dist/guard/context/project.d.ts +47 -0
- package/dist/guard/context/project.d.ts.map +1 -0
- package/dist/guard/context/project.js +281 -0
- package/dist/guard/context/project.js.map +1 -0
- package/dist/guard/context/types.d.ts +152 -0
- package/dist/guard/context/types.d.ts.map +1 -0
- package/dist/guard/context/types.js +7 -0
- package/dist/guard/context/types.js.map +1 -0
- package/dist/guard/engine.d.ts +107 -0
- package/dist/guard/engine.d.ts.map +1 -0
- package/dist/guard/engine.js +430 -0
- package/dist/guard/engine.js.map +1 -0
- package/dist/guard/enhanced-engine.d.ts +151 -0
- package/dist/guard/enhanced-engine.d.ts.map +1 -0
- package/dist/guard/enhanced-engine.js +622 -0
- package/dist/guard/enhanced-engine.js.map +1 -0
- package/dist/guard/hooks/index.d.ts +50 -0
- package/dist/guard/hooks/index.d.ts.map +1 -0
- package/dist/guard/hooks/index.js +325 -0
- package/dist/guard/hooks/index.js.map +1 -0
- package/dist/guard/index.d.ts +29 -0
- package/dist/guard/index.d.ts.map +1 -0
- package/dist/guard/index.js +31 -0
- package/dist/guard/index.js.map +1 -0
- package/dist/guard/learning/index.d.ts +136 -0
- package/dist/guard/learning/index.d.ts.map +1 -0
- package/dist/guard/learning/index.js +314 -0
- package/dist/guard/learning/index.js.map +1 -0
- package/dist/guard/learning/pattern-extractor.d.ts +50 -0
- package/dist/guard/learning/pattern-extractor.d.ts.map +1 -0
- package/dist/guard/learning/pattern-extractor.js +372 -0
- package/dist/guard/learning/pattern-extractor.js.map +1 -0
- package/dist/guard/learning/rule-suggester.d.ts +67 -0
- package/dist/guard/learning/rule-suggester.d.ts.map +1 -0
- package/dist/guard/learning/rule-suggester.js +345 -0
- package/dist/guard/learning/rule-suggester.js.map +1 -0
- package/dist/guard/learning/types.d.ts +211 -0
- package/dist/guard/learning/types.d.ts.map +1 -0
- package/dist/guard/learning/types.js +18 -0
- package/dist/guard/learning/types.js.map +1 -0
- package/dist/guard/preview/effects.d.ts +15 -0
- package/dist/guard/preview/effects.d.ts.map +1 -0
- package/dist/guard/preview/effects.js +413 -0
- package/dist/guard/preview/effects.js.map +1 -0
- package/dist/guard/preview/index.d.ts +49 -0
- package/dist/guard/preview/index.d.ts.map +1 -0
- package/dist/guard/preview/index.js +196 -0
- package/dist/guard/preview/index.js.map +1 -0
- package/dist/guard/preview/parser.d.ts +34 -0
- package/dist/guard/preview/parser.d.ts.map +1 -0
- package/dist/guard/preview/parser.js +292 -0
- package/dist/guard/preview/parser.js.map +1 -0
- package/dist/guard/preview/types.d.ts +140 -0
- package/dist/guard/preview/types.d.ts.map +1 -0
- package/dist/guard/preview/types.js +5 -0
- package/dist/guard/preview/types.js.map +1 -0
- package/dist/guard/reversibility/index.d.ts +88 -0
- package/dist/guard/reversibility/index.d.ts.map +1 -0
- package/dist/guard/reversibility/index.js +310 -0
- package/dist/guard/reversibility/index.js.map +1 -0
- package/dist/guard/types.d.ts +192 -0
- package/dist/guard/types.d.ts.map +1 -0
- package/dist/guard/types.js +8 -0
- package/dist/guard/types.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -1
- package/dist/orchestrator/manager.d.ts.map +1 -1
- package/dist/orchestrator/manager.js +6 -1
- package/dist/orchestrator/manager.js.map +1 -1
- package/dist/policy/engine.d.ts.map +1 -1
- package/dist/policy/engine.js +11 -3
- package/dist/policy/engine.js.map +1 -1
- package/dist/policy/parser.d.ts.map +1 -1
- package/dist/policy/parser.js +3 -0
- package/dist/policy/parser.js.map +1 -1
- package/dist/proxy/server.d.ts.map +1 -1
- package/dist/proxy/server.js +8 -6
- package/dist/proxy/server.js.map +1 -1
- package/dist/session/manager.d.ts +2 -2
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +106 -88
- package/dist/session/manager.js.map +1 -1
- package/dist/session/signing.d.ts +88 -0
- package/dist/session/signing.d.ts.map +1 -0
- package/dist/session/signing.js +166 -0
- package/dist/session/signing.js.map +1 -0
- package/dist/session/types.d.ts +2 -0
- package/dist/session/types.d.ts.map +1 -1
- package/dist/session/types.js.map +1 -1
- package/dist/utils/security-logger.d.ts +146 -0
- package/dist/utils/security-logger.d.ts.map +1 -0
- package/dist/utils/security-logger.js +222 -0
- package/dist/utils/security-logger.js.map +1 -0
- package/dist/wizard.d.ts.map +1 -1
- package/dist/wizard.js +7 -1
- package/dist/wizard.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alternatives Registry for Shell Guardian
|
|
3
|
+
*
|
|
4
|
+
* Comprehensive mapping of dangerous commands to safer alternatives.
|
|
5
|
+
*/
|
|
6
|
+
import { isRegenerablePath } from '../context/project.js';
|
|
7
|
+
/**
|
|
8
|
+
* Registry of alternative command mappings.
|
|
9
|
+
* Sorted by priority (higher priority checked first).
|
|
10
|
+
*/
|
|
11
|
+
export const ALTERNATIVE_MAPPINGS = [
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// File Deletion Alternatives
|
|
14
|
+
// ============================================================================
|
|
15
|
+
{
|
|
16
|
+
pattern: /^rm\s+(-[rRfiv]+\s+)*(.+)$/,
|
|
17
|
+
description: 'rm command with various flags',
|
|
18
|
+
priority: 100,
|
|
19
|
+
suggest: ({ match, context }) => {
|
|
20
|
+
const flags = match[1]?.trim() || '';
|
|
21
|
+
const targets = match[2].trim();
|
|
22
|
+
const alternatives = [];
|
|
23
|
+
const hasForce = flags.includes('f');
|
|
24
|
+
const hasRecursive = flags.includes('r') || flags.includes('R');
|
|
25
|
+
// Check if targets are regenerable
|
|
26
|
+
const isRegenerable = context.project &&
|
|
27
|
+
targets.split(/\s+/).every(t => {
|
|
28
|
+
const resolved = t.startsWith('/') ? t : `${context.cwd}/${t}`;
|
|
29
|
+
return isRegenerablePath(resolved, context.project);
|
|
30
|
+
});
|
|
31
|
+
// Suggest trash-cli
|
|
32
|
+
alternatives.push({
|
|
33
|
+
command: `trash ${targets}`,
|
|
34
|
+
reason: 'Moves files to trash instead of permanent deletion. Can be restored with trash-restore.',
|
|
35
|
+
safetyImprovement: 85,
|
|
36
|
+
requiresTool: 'trash-cli',
|
|
37
|
+
installInstructions: 'npm install -g trash-cli',
|
|
38
|
+
reversible: true,
|
|
39
|
+
category: 'trash',
|
|
40
|
+
riskLevel: 'safe',
|
|
41
|
+
});
|
|
42
|
+
// Suggest interactive rm if not already interactive
|
|
43
|
+
if (!flags.includes('i')) {
|
|
44
|
+
alternatives.push({
|
|
45
|
+
command: `rm -i ${hasRecursive ? '-r ' : ''}${targets}`,
|
|
46
|
+
reason: 'Prompts for confirmation before each file deletion.',
|
|
47
|
+
safetyImprovement: 40,
|
|
48
|
+
reversible: false,
|
|
49
|
+
category: 'interactive',
|
|
50
|
+
riskLevel: 'write',
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
// Suggest listing first
|
|
54
|
+
alternatives.push({
|
|
55
|
+
command: hasRecursive
|
|
56
|
+
? `find ${targets} -type f | head -20 && echo "... and more. Proceed? (y/n)" && read confirm && [ "$confirm" = "y" ] && rm ${flags}${targets}`
|
|
57
|
+
: `ls -la ${targets} && echo "Delete these? (y/n)" && read confirm && [ "$confirm" = "y" ] && rm ${flags}${targets}`,
|
|
58
|
+
reason: 'Preview files before deletion.',
|
|
59
|
+
safetyImprovement: 50,
|
|
60
|
+
reversible: false,
|
|
61
|
+
category: 'preview',
|
|
62
|
+
riskLevel: 'write',
|
|
63
|
+
});
|
|
64
|
+
// If in git repo and files are tracked
|
|
65
|
+
if (context.git?.isRepo) {
|
|
66
|
+
alternatives.push({
|
|
67
|
+
command: `git rm ${hasRecursive ? '-r ' : ''}${hasForce ? '-f ' : ''}${targets}`,
|
|
68
|
+
reason: 'Removes files through git - can be recovered from history.',
|
|
69
|
+
safetyImprovement: 60,
|
|
70
|
+
reversible: true,
|
|
71
|
+
category: 'version-control',
|
|
72
|
+
riskLevel: 'write',
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
// If regenerable, note that recovery is easy
|
|
76
|
+
if (isRegenerable && context.project) {
|
|
77
|
+
const regenCmd = context.project.type === 'nodejs' ? 'npm install' :
|
|
78
|
+
context.project.type === 'python' ? 'pip install -e .' :
|
|
79
|
+
context.project.type === 'go' ? 'go mod download' :
|
|
80
|
+
context.project.type === 'rust' ? 'cargo build' :
|
|
81
|
+
'package manager install';
|
|
82
|
+
alternatives.push({
|
|
83
|
+
command: match[0],
|
|
84
|
+
reason: `This is a regenerable directory. Can be recreated with: ${regenCmd}`,
|
|
85
|
+
safetyImprovement: 0, // Same command, just informational
|
|
86
|
+
reversible: true,
|
|
87
|
+
category: 'different-tool',
|
|
88
|
+
riskLevel: 'safe',
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return alternatives;
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
// ============================================================================
|
|
95
|
+
// Permission Changes
|
|
96
|
+
// ============================================================================
|
|
97
|
+
{
|
|
98
|
+
pattern: /^chmod\s+777\s+(.+)$/,
|
|
99
|
+
description: 'chmod 777 (world-writable)',
|
|
100
|
+
priority: 90,
|
|
101
|
+
suggest: ({ match }) => {
|
|
102
|
+
const target = match[1];
|
|
103
|
+
return [
|
|
104
|
+
{
|
|
105
|
+
command: `chmod 755 ${target}`,
|
|
106
|
+
reason: 'Allows read/execute for all, write only for owner. Standard for executables.',
|
|
107
|
+
safetyImprovement: 70,
|
|
108
|
+
reversible: true,
|
|
109
|
+
category: 'safer-flags',
|
|
110
|
+
riskLevel: 'write',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
command: `chmod 700 ${target}`,
|
|
114
|
+
reason: 'Full permissions for owner only. Most restrictive.',
|
|
115
|
+
safetyImprovement: 90,
|
|
116
|
+
reversible: true,
|
|
117
|
+
category: 'safer-flags',
|
|
118
|
+
riskLevel: 'write',
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
command: `chmod u+x ${target}`,
|
|
122
|
+
reason: 'Only adds execute permission for owner. Minimal change.',
|
|
123
|
+
safetyImprovement: 85,
|
|
124
|
+
reversible: true,
|
|
125
|
+
category: 'safer-flags',
|
|
126
|
+
riskLevel: 'write',
|
|
127
|
+
},
|
|
128
|
+
];
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
pattern: /^chmod\s+666\s+(.+)$/,
|
|
133
|
+
description: 'chmod 666 (world-readable/writable)',
|
|
134
|
+
priority: 90,
|
|
135
|
+
suggest: ({ match }) => {
|
|
136
|
+
const target = match[1];
|
|
137
|
+
return [
|
|
138
|
+
{
|
|
139
|
+
command: `chmod 644 ${target}`,
|
|
140
|
+
reason: 'Read for all, write only for owner. Standard for files.',
|
|
141
|
+
safetyImprovement: 70,
|
|
142
|
+
reversible: true,
|
|
143
|
+
category: 'safer-flags',
|
|
144
|
+
riskLevel: 'write',
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
command: `chmod 600 ${target}`,
|
|
148
|
+
reason: 'Read/write for owner only. Most secure for sensitive files.',
|
|
149
|
+
safetyImprovement: 90,
|
|
150
|
+
reversible: true,
|
|
151
|
+
category: 'safer-flags',
|
|
152
|
+
riskLevel: 'write',
|
|
153
|
+
},
|
|
154
|
+
];
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
// ============================================================================
|
|
158
|
+
// Remote Code Execution
|
|
159
|
+
// ============================================================================
|
|
160
|
+
{
|
|
161
|
+
pattern: /^(curl|wget)\s+.+\|\s*(bash|sh|zsh)$/,
|
|
162
|
+
description: 'Piping remote script to shell',
|
|
163
|
+
priority: 100,
|
|
164
|
+
suggest: ({ match }) => {
|
|
165
|
+
const downloader = match[1];
|
|
166
|
+
const shell = match[2];
|
|
167
|
+
// Extract URL - simple extraction
|
|
168
|
+
const urlMatch = match[0].match(/(https?:\/\/\S+)/);
|
|
169
|
+
const url = urlMatch ? urlMatch[1] : '<url>';
|
|
170
|
+
const filename = 'downloaded_script.sh';
|
|
171
|
+
return [
|
|
172
|
+
{
|
|
173
|
+
command: `${downloader} -o ${filename} ${url} && cat ${filename} && read -p "Run this script? (y/n) " confirm && [ "$confirm" = "y" ] && ${shell} ${filename}`,
|
|
174
|
+
reason: 'Download first, inspect the script, then run if approved.',
|
|
175
|
+
safetyImprovement: 80,
|
|
176
|
+
reversible: false,
|
|
177
|
+
category: 'preview',
|
|
178
|
+
riskLevel: 'write',
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
command: `${downloader} -o ${filename} ${url}`,
|
|
182
|
+
reason: 'Download only - manually inspect and run later.',
|
|
183
|
+
safetyImprovement: 95,
|
|
184
|
+
reversible: true,
|
|
185
|
+
category: 'split-operation',
|
|
186
|
+
riskLevel: 'read',
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
command: `${downloader} ${url} | head -50`,
|
|
190
|
+
reason: 'Preview the first 50 lines without executing.',
|
|
191
|
+
safetyImprovement: 100,
|
|
192
|
+
reversible: true,
|
|
193
|
+
category: 'preview',
|
|
194
|
+
riskLevel: 'safe',
|
|
195
|
+
},
|
|
196
|
+
];
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
// ============================================================================
|
|
200
|
+
// Git Destructive Operations
|
|
201
|
+
// ============================================================================
|
|
202
|
+
{
|
|
203
|
+
pattern: /^git\s+(reset|checkout)\s+--hard/,
|
|
204
|
+
description: 'Git hard reset/checkout',
|
|
205
|
+
priority: 95,
|
|
206
|
+
suggest: ({ match }) => {
|
|
207
|
+
const alternatives = [];
|
|
208
|
+
// Suggest stash
|
|
209
|
+
alternatives.push({
|
|
210
|
+
command: 'git stash',
|
|
211
|
+
reason: 'Stash changes instead of discarding. Recover with: git stash pop',
|
|
212
|
+
safetyImprovement: 95,
|
|
213
|
+
reversible: true,
|
|
214
|
+
category: 'version-control',
|
|
215
|
+
riskLevel: 'safe',
|
|
216
|
+
});
|
|
217
|
+
// Suggest creating a backup branch
|
|
218
|
+
alternatives.push({
|
|
219
|
+
command: `git branch backup-$(date +%Y%m%d-%H%M%S) && ${match[0]}`,
|
|
220
|
+
reason: 'Create a backup branch first, then proceed.',
|
|
221
|
+
safetyImprovement: 70,
|
|
222
|
+
reversible: true,
|
|
223
|
+
category: 'version-control',
|
|
224
|
+
riskLevel: 'write',
|
|
225
|
+
});
|
|
226
|
+
// Suggest showing what would change
|
|
227
|
+
alternatives.push({
|
|
228
|
+
command: 'git diff && git status',
|
|
229
|
+
reason: 'Preview what would be lost before proceeding.',
|
|
230
|
+
safetyImprovement: 100,
|
|
231
|
+
reversible: true,
|
|
232
|
+
category: 'preview',
|
|
233
|
+
riskLevel: 'safe',
|
|
234
|
+
});
|
|
235
|
+
return alternatives;
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
pattern: /^git\s+clean\s+-[dfx]+/,
|
|
240
|
+
description: 'Git clean (remove untracked files)',
|
|
241
|
+
priority: 95,
|
|
242
|
+
suggest: ({ match }) => {
|
|
243
|
+
return [
|
|
244
|
+
{
|
|
245
|
+
command: match[0].replace(/-([dfx]+)/, '-n$1'),
|
|
246
|
+
reason: 'Dry-run mode: show what would be deleted without deleting.',
|
|
247
|
+
safetyImprovement: 100,
|
|
248
|
+
reversible: true,
|
|
249
|
+
category: 'preview',
|
|
250
|
+
riskLevel: 'safe',
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
command: match[0].replace(/-([dfx]+)/, '-i'),
|
|
254
|
+
reason: 'Interactive mode: choose which files to delete.',
|
|
255
|
+
safetyImprovement: 60,
|
|
256
|
+
reversible: false,
|
|
257
|
+
category: 'interactive',
|
|
258
|
+
riskLevel: 'write',
|
|
259
|
+
},
|
|
260
|
+
];
|
|
261
|
+
},
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
pattern: /^git\s+push\s+.*--force/,
|
|
265
|
+
description: 'Git force push',
|
|
266
|
+
priority: 100,
|
|
267
|
+
suggest: ({ match }) => {
|
|
268
|
+
return [
|
|
269
|
+
{
|
|
270
|
+
command: match[0].replace('--force', '--force-with-lease'),
|
|
271
|
+
reason: 'Safer force push: fails if remote has new commits you haven\'t seen.',
|
|
272
|
+
safetyImprovement: 60,
|
|
273
|
+
reversible: false,
|
|
274
|
+
category: 'safer-flags',
|
|
275
|
+
riskLevel: 'destructive',
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
command: 'git fetch && git log HEAD..@{u}',
|
|
279
|
+
reason: 'Check what commits exist on remote first.',
|
|
280
|
+
safetyImprovement: 100,
|
|
281
|
+
reversible: true,
|
|
282
|
+
category: 'preview',
|
|
283
|
+
riskLevel: 'safe',
|
|
284
|
+
},
|
|
285
|
+
];
|
|
286
|
+
},
|
|
287
|
+
},
|
|
288
|
+
// ============================================================================
|
|
289
|
+
// Package Management
|
|
290
|
+
// ============================================================================
|
|
291
|
+
{
|
|
292
|
+
pattern: /^(sudo\s+)?(apt|apt-get)\s+(remove|purge)\s+(.+)$/,
|
|
293
|
+
description: 'APT package removal',
|
|
294
|
+
priority: 80,
|
|
295
|
+
suggest: ({ match }) => {
|
|
296
|
+
const sudo = match[1] || '';
|
|
297
|
+
const apt = match[2];
|
|
298
|
+
const action = match[3];
|
|
299
|
+
const packages = match[4];
|
|
300
|
+
const alternatives = [];
|
|
301
|
+
// Suggest simulation first
|
|
302
|
+
alternatives.push({
|
|
303
|
+
command: `${sudo}${apt} ${action} --simulate ${packages}`,
|
|
304
|
+
reason: 'Simulate the removal to see what would be affected.',
|
|
305
|
+
safetyImprovement: 100,
|
|
306
|
+
reversible: true,
|
|
307
|
+
category: 'preview',
|
|
308
|
+
riskLevel: 'safe',
|
|
309
|
+
});
|
|
310
|
+
// Suggest remove instead of purge
|
|
311
|
+
if (action === 'purge') {
|
|
312
|
+
alternatives.push({
|
|
313
|
+
command: `${sudo}${apt} remove ${packages}`,
|
|
314
|
+
reason: 'Remove keeps config files, purge deletes everything.',
|
|
315
|
+
safetyImprovement: 40,
|
|
316
|
+
reversible: false,
|
|
317
|
+
category: 'safer-flags',
|
|
318
|
+
riskLevel: 'write',
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
return alternatives;
|
|
322
|
+
},
|
|
323
|
+
},
|
|
324
|
+
// ============================================================================
|
|
325
|
+
// Disk Operations
|
|
326
|
+
// ============================================================================
|
|
327
|
+
{
|
|
328
|
+
pattern: /^(sudo\s+)?dd\s+.*of=\/dev\/\w+/,
|
|
329
|
+
description: 'dd writing to device',
|
|
330
|
+
priority: 100,
|
|
331
|
+
suggest: ({ match }) => {
|
|
332
|
+
return [
|
|
333
|
+
{
|
|
334
|
+
command: match[0].replace(/\bof=/, 'of=/tmp/test_output_'),
|
|
335
|
+
reason: 'Write to a test file first to verify the command works correctly.',
|
|
336
|
+
safetyImprovement: 95,
|
|
337
|
+
reversible: true,
|
|
338
|
+
category: 'preview',
|
|
339
|
+
riskLevel: 'write',
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
command: `lsblk && ${match[0]}`,
|
|
343
|
+
reason: 'List block devices first to confirm target device.',
|
|
344
|
+
safetyImprovement: 30,
|
|
345
|
+
reversible: false,
|
|
346
|
+
category: 'preview',
|
|
347
|
+
riskLevel: 'dangerous',
|
|
348
|
+
},
|
|
349
|
+
];
|
|
350
|
+
},
|
|
351
|
+
},
|
|
352
|
+
// ============================================================================
|
|
353
|
+
// Sudo Operations
|
|
354
|
+
// ============================================================================
|
|
355
|
+
{
|
|
356
|
+
pattern: /^sudo\s+rm\s+(-[rRfiv]+\s+)*(.+)$/,
|
|
357
|
+
description: 'sudo rm',
|
|
358
|
+
priority: 100,
|
|
359
|
+
suggest: ({ match }) => {
|
|
360
|
+
const flags = match[1]?.trim() || '';
|
|
361
|
+
const targets = match[2];
|
|
362
|
+
const hasRecursive = flags.includes('r') || flags.includes('R');
|
|
363
|
+
return [
|
|
364
|
+
{
|
|
365
|
+
command: `sudo ls -la ${targets}`,
|
|
366
|
+
reason: 'List files first to verify what would be deleted.',
|
|
367
|
+
safetyImprovement: 100,
|
|
368
|
+
reversible: true,
|
|
369
|
+
category: 'preview',
|
|
370
|
+
riskLevel: 'safe',
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
command: `sudo rm -i ${hasRecursive ? '-r ' : ''}${targets}`,
|
|
374
|
+
reason: 'Add interactive mode to confirm each deletion.',
|
|
375
|
+
safetyImprovement: 50,
|
|
376
|
+
reversible: false,
|
|
377
|
+
category: 'interactive',
|
|
378
|
+
riskLevel: 'destructive',
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
command: `sudo mv ${targets} /tmp/to_delete_$(date +%Y%m%d)`,
|
|
382
|
+
reason: 'Move to temp directory instead of immediate deletion.',
|
|
383
|
+
safetyImprovement: 70,
|
|
384
|
+
reversible: true,
|
|
385
|
+
category: 'trash',
|
|
386
|
+
riskLevel: 'write',
|
|
387
|
+
},
|
|
388
|
+
];
|
|
389
|
+
},
|
|
390
|
+
},
|
|
391
|
+
// ============================================================================
|
|
392
|
+
// Find with Delete
|
|
393
|
+
// ============================================================================
|
|
394
|
+
{
|
|
395
|
+
pattern: /^find\s+(.+?)\s+.*-delete/,
|
|
396
|
+
description: 'find with -delete',
|
|
397
|
+
priority: 95,
|
|
398
|
+
suggest: ({ match }) => {
|
|
399
|
+
const cmdWithoutDelete = match[0].replace(/-delete/, '-print');
|
|
400
|
+
return [
|
|
401
|
+
{
|
|
402
|
+
command: cmdWithoutDelete,
|
|
403
|
+
reason: 'Preview: show files that would be deleted.',
|
|
404
|
+
safetyImprovement: 100,
|
|
405
|
+
reversible: true,
|
|
406
|
+
category: 'preview',
|
|
407
|
+
riskLevel: 'safe',
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
command: `${cmdWithoutDelete} | head -20`,
|
|
411
|
+
reason: 'Preview first 20 files that would be deleted.',
|
|
412
|
+
safetyImprovement: 100,
|
|
413
|
+
reversible: true,
|
|
414
|
+
category: 'preview',
|
|
415
|
+
riskLevel: 'safe',
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
command: match[0].replace(/-delete/, '-ok rm {} \\;'),
|
|
419
|
+
reason: 'Prompt for confirmation for each file.',
|
|
420
|
+
safetyImprovement: 60,
|
|
421
|
+
reversible: false,
|
|
422
|
+
category: 'interactive',
|
|
423
|
+
riskLevel: 'write',
|
|
424
|
+
},
|
|
425
|
+
];
|
|
426
|
+
},
|
|
427
|
+
},
|
|
428
|
+
{
|
|
429
|
+
pattern: /^find\s+(.+?)\s+.*-exec\s+rm/,
|
|
430
|
+
description: 'find with -exec rm',
|
|
431
|
+
priority: 95,
|
|
432
|
+
suggest: ({ match }) => {
|
|
433
|
+
const cmd = match[0];
|
|
434
|
+
const previewCmd = cmd.replace(/-exec\s+rm\s+.*$/, '-print');
|
|
435
|
+
return [
|
|
436
|
+
{
|
|
437
|
+
command: previewCmd,
|
|
438
|
+
reason: 'Preview: show files that would be affected.',
|
|
439
|
+
safetyImprovement: 100,
|
|
440
|
+
reversible: true,
|
|
441
|
+
category: 'preview',
|
|
442
|
+
riskLevel: 'safe',
|
|
443
|
+
},
|
|
444
|
+
{
|
|
445
|
+
command: cmd.replace(/-exec/, '-ok'),
|
|
446
|
+
reason: 'Use -ok instead of -exec to prompt for each file.',
|
|
447
|
+
safetyImprovement: 60,
|
|
448
|
+
reversible: false,
|
|
449
|
+
category: 'interactive',
|
|
450
|
+
riskLevel: 'write',
|
|
451
|
+
},
|
|
452
|
+
];
|
|
453
|
+
},
|
|
454
|
+
},
|
|
455
|
+
// ============================================================================
|
|
456
|
+
// Kill/Shutdown Operations
|
|
457
|
+
// ============================================================================
|
|
458
|
+
{
|
|
459
|
+
pattern: /^(sudo\s+)?kill\s+-9\s+(.+)$/,
|
|
460
|
+
description: 'kill -9 (SIGKILL)',
|
|
461
|
+
priority: 80,
|
|
462
|
+
suggest: ({ match }) => {
|
|
463
|
+
const sudo = match[1] || '';
|
|
464
|
+
const target = match[2];
|
|
465
|
+
return [
|
|
466
|
+
{
|
|
467
|
+
command: `${sudo}kill -15 ${target}`,
|
|
468
|
+
reason: 'SIGTERM allows graceful shutdown instead of immediate kill.',
|
|
469
|
+
safetyImprovement: 40,
|
|
470
|
+
reversible: false,
|
|
471
|
+
category: 'safer-flags',
|
|
472
|
+
riskLevel: 'write',
|
|
473
|
+
},
|
|
474
|
+
{
|
|
475
|
+
command: `ps aux | grep ${target}`,
|
|
476
|
+
reason: 'Verify the process before killing.',
|
|
477
|
+
safetyImprovement: 100,
|
|
478
|
+
reversible: true,
|
|
479
|
+
category: 'preview',
|
|
480
|
+
riskLevel: 'safe',
|
|
481
|
+
},
|
|
482
|
+
];
|
|
483
|
+
},
|
|
484
|
+
},
|
|
485
|
+
{
|
|
486
|
+
pattern: /^killall\s+(.+)$/,
|
|
487
|
+
description: 'killall command',
|
|
488
|
+
priority: 80,
|
|
489
|
+
suggest: ({ match }) => {
|
|
490
|
+
const processName = match[1];
|
|
491
|
+
return [
|
|
492
|
+
{
|
|
493
|
+
command: `pgrep -l ${processName}`,
|
|
494
|
+
reason: 'List matching processes before killing them.',
|
|
495
|
+
safetyImprovement: 100,
|
|
496
|
+
reversible: true,
|
|
497
|
+
category: 'preview',
|
|
498
|
+
riskLevel: 'safe',
|
|
499
|
+
},
|
|
500
|
+
{
|
|
501
|
+
command: `killall -i ${processName}`,
|
|
502
|
+
reason: 'Interactive mode: confirm each process.',
|
|
503
|
+
safetyImprovement: 60,
|
|
504
|
+
reversible: false,
|
|
505
|
+
category: 'interactive',
|
|
506
|
+
riskLevel: 'write',
|
|
507
|
+
},
|
|
508
|
+
];
|
|
509
|
+
},
|
|
510
|
+
},
|
|
511
|
+
];
|
|
512
|
+
/**
|
|
513
|
+
* Get all alternative mappings sorted by priority.
|
|
514
|
+
*/
|
|
515
|
+
export function getAlternativeMappings() {
|
|
516
|
+
return [...ALTERNATIVE_MAPPINGS].sort((a, b) => (b.priority || 0) - (a.priority || 0));
|
|
517
|
+
}
|
|
518
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/guard/alternatives/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for Safer Alternatives Engine
|
|
3
|
+
*/
|
|
4
|
+
import type { RiskLevel } from '../../analyzers/types.js';
|
|
5
|
+
import type { EnhancedGuardContext } from '../context/types.js';
|
|
6
|
+
/**
|
|
7
|
+
* A safer alternative to a risky command.
|
|
8
|
+
*/
|
|
9
|
+
export interface SaferAlternative {
|
|
10
|
+
/** The safer command to run instead */
|
|
11
|
+
command: string;
|
|
12
|
+
/** Why this is safer */
|
|
13
|
+
reason: string;
|
|
14
|
+
/** How much safer on a scale of 0-100 */
|
|
15
|
+
safetyImprovement: number;
|
|
16
|
+
/** Does this require an additional tool to be installed? */
|
|
17
|
+
requiresTool?: string;
|
|
18
|
+
/** Instructions to install the required tool */
|
|
19
|
+
installInstructions?: string;
|
|
20
|
+
/** Is this alternative reversible? */
|
|
21
|
+
reversible: boolean;
|
|
22
|
+
/** Category of alternative */
|
|
23
|
+
category: AlternativeCategory;
|
|
24
|
+
/** Risk level of the alternative */
|
|
25
|
+
riskLevel: RiskLevel;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Categories of alternatives.
|
|
29
|
+
*/
|
|
30
|
+
export type AlternativeCategory = 'trash' | 'interactive' | 'preview' | 'incremental' | 'version-control' | 'safer-flags' | 'different-tool' | 'split-operation';
|
|
31
|
+
/**
|
|
32
|
+
* Result of finding alternatives.
|
|
33
|
+
*/
|
|
34
|
+
export interface AlternativeResult {
|
|
35
|
+
/** The original command */
|
|
36
|
+
originalCommand: string;
|
|
37
|
+
/** Risk level of the original command */
|
|
38
|
+
originalRisk: RiskLevel;
|
|
39
|
+
/** Available alternatives sorted by safety improvement */
|
|
40
|
+
alternatives: SaferAlternative[];
|
|
41
|
+
/** If no alternatives found, why */
|
|
42
|
+
noAlternativesReason?: string;
|
|
43
|
+
/** Metadata about the analysis */
|
|
44
|
+
metadata?: {
|
|
45
|
+
/** Which patterns matched */
|
|
46
|
+
matchedPatterns: string[];
|
|
47
|
+
/** Context factors considered */
|
|
48
|
+
contextFactors: string[];
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Context passed to alternative generators.
|
|
53
|
+
*/
|
|
54
|
+
export interface AlternativeGeneratorContext {
|
|
55
|
+
/** The full enhanced context */
|
|
56
|
+
context: EnhancedGuardContext;
|
|
57
|
+
/** Regex match groups from the pattern */
|
|
58
|
+
match: RegExpMatchArray;
|
|
59
|
+
/** The original command */
|
|
60
|
+
command: string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Alternative mapping definition.
|
|
64
|
+
*/
|
|
65
|
+
export interface AlternativeMapping {
|
|
66
|
+
/** Pattern to match commands */
|
|
67
|
+
pattern: RegExp;
|
|
68
|
+
/** Description of what this mapping handles */
|
|
69
|
+
description: string;
|
|
70
|
+
/** Function to generate alternatives */
|
|
71
|
+
suggest: (ctx: AlternativeGeneratorContext) => SaferAlternative[];
|
|
72
|
+
/** Priority (higher = checked first) */
|
|
73
|
+
priority?: number;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Options for the alternatives finder.
|
|
77
|
+
*/
|
|
78
|
+
export interface AlternativesFinderOptions {
|
|
79
|
+
/** Maximum alternatives to return */
|
|
80
|
+
maxAlternatives?: number;
|
|
81
|
+
/** Minimum safety improvement to include */
|
|
82
|
+
minSafetyImprovement?: number;
|
|
83
|
+
/** Whether to check if required tools are installed */
|
|
84
|
+
checkToolAvailability?: boolean;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/guard/alternatives/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sCAAsC;IACtC,UAAU,EAAE,OAAO,CAAC;IACpB,8BAA8B;IAC9B,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,oCAAoC;IACpC,SAAS,EAAE,SAAS,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAC3B,OAAO,GACP,aAAa,GACb,SAAS,GACT,aAAa,GACb,iBAAiB,GACjB,aAAa,GACb,gBAAgB,GAChB,iBAAiB,CAClB;AAEH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,2BAA2B;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,YAAY,EAAE,SAAS,CAAC;IACxB,0DAA0D;IAC1D,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,oCAAoC;IACpC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kCAAkC;IAClC,QAAQ,CAAC,EAAE;QACT,6BAA6B;QAC7B,eAAe,EAAE,MAAM,EAAE,CAAC;QAC1B,iCAAiC;QACjC,cAAc,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,gCAAgC;IAChC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,0CAA0C;IAC1C,KAAK,EAAE,gBAAgB,CAAC;IACxB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,OAAO,EAAE,CAAC,GAAG,EAAE,2BAA2B,KAAK,gBAAgB,EAAE,CAAC;IAClE,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,qCAAqC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,uDAAuD;IACvD,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/guard/alternatives/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|