@saferun/cli 0.5.22 → 0.5.23
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.
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Command: saferun shell-init
|
|
3
|
-
* Setup shell integration for AI session detection
|
|
3
|
+
* Setup shell integration for AI session detection and git command interception
|
|
4
4
|
*/
|
|
5
5
|
export declare class ShellInitCommand {
|
|
6
6
|
run(options: {
|
|
@@ -9,6 +9,7 @@ export declare class ShellInitCommand {
|
|
|
9
9
|
}): Promise<void>;
|
|
10
10
|
private detectShell;
|
|
11
11
|
private generateSnippet;
|
|
12
|
+
private generateFishSnippet;
|
|
12
13
|
private autoInstall;
|
|
13
14
|
private showManualInstructions;
|
|
14
15
|
private getRCFile;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* Command: saferun shell-init
|
|
4
|
-
* Setup shell integration for AI session detection
|
|
4
|
+
* Setup shell integration for AI session detection and git command interception
|
|
5
5
|
*/
|
|
6
6
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
7
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -36,24 +36,153 @@ class ShellInitCommand {
|
|
|
36
36
|
return 'bash'; // Default
|
|
37
37
|
}
|
|
38
38
|
generateSnippet(shell) {
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
if (shell === 'fish') {
|
|
40
|
+
return this.generateFishSnippet();
|
|
41
|
+
}
|
|
42
|
+
// Bash/Zsh snippet
|
|
43
|
+
return `
|
|
44
|
+
# ============================================
|
|
45
|
+
# SafeRun Shell Integration
|
|
46
|
+
# Protects against dangerous git operations
|
|
47
|
+
# ============================================
|
|
48
|
+
|
|
49
|
+
# AI Session Detection
|
|
41
50
|
export SAFERUN_AI_SESSION="conversational"
|
|
42
51
|
export SAFERUN_AGENT_ID="\${USER}-\$(date +%s)"
|
|
43
52
|
|
|
44
|
-
#
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
53
|
+
# Git Command Interceptor
|
|
54
|
+
# Catches dangerous operations in SafeRun-protected repos
|
|
55
|
+
git() {
|
|
56
|
+
# Check if we're in a SafeRun protected repo
|
|
57
|
+
if [[ -d ".saferun" ]] || [[ -f ".saferun/config.yml" ]]; then
|
|
58
|
+
local cmd="\$1"
|
|
59
|
+
local all_args="\$*"
|
|
60
|
+
|
|
61
|
+
case "\$cmd" in
|
|
62
|
+
commit)
|
|
63
|
+
# Block --no-verify (bypasses pre-commit hooks)
|
|
64
|
+
if [[ "\$all_args" == *"--no-verify"* ]] || [[ "\$all_args" == *" -n "* ]] || [[ "\$all_args" == *" -n\$"* ]]; then
|
|
65
|
+
echo -e "\\033[33m⚠️ SafeRun: git commit --no-verify detected\\033[0m"
|
|
66
|
+
echo -e "\\033[90m This bypasses pre-commit security hooks.\\033[0m"
|
|
67
|
+
saferun hook git-commit "\${@:2}"
|
|
68
|
+
return \$?
|
|
69
|
+
fi
|
|
70
|
+
;;
|
|
71
|
+
push)
|
|
72
|
+
# Intercept --force and --no-verify
|
|
73
|
+
if [[ "\$all_args" == *"--force"* ]] || [[ "\$all_args" == *" -f "* ]] || [[ "\$all_args" == *" -f\$"* ]]; then
|
|
74
|
+
saferun hook git-push "\${@:2}"
|
|
75
|
+
return \$?
|
|
76
|
+
fi
|
|
77
|
+
if [[ "\$all_args" == *"--no-verify"* ]]; then
|
|
78
|
+
echo -e "\\033[33m⚠️ SafeRun: git push --no-verify detected\\033[0m"
|
|
79
|
+
saferun hook git-push "\${@:2}"
|
|
80
|
+
return \$?
|
|
81
|
+
fi
|
|
82
|
+
;;
|
|
83
|
+
branch)
|
|
84
|
+
# Intercept branch deletion
|
|
85
|
+
if [[ "\$all_args" == *"-D"* ]] || [[ "\$all_args" == *"--delete"* ]]; then
|
|
86
|
+
saferun hook git-branch "\${@:2}"
|
|
87
|
+
return \$?
|
|
88
|
+
fi
|
|
89
|
+
;;
|
|
90
|
+
reset)
|
|
91
|
+
# Intercept hard reset
|
|
92
|
+
if [[ "\$all_args" == *"--hard"* ]]; then
|
|
93
|
+
saferun hook git-reset "\${@:2}"
|
|
94
|
+
return \$?
|
|
95
|
+
fi
|
|
96
|
+
;;
|
|
97
|
+
clean)
|
|
98
|
+
# Intercept force clean
|
|
99
|
+
if [[ "\$all_args" == *"-f"* ]]; then
|
|
100
|
+
saferun hook git-clean "\${@:2}"
|
|
101
|
+
return \$?
|
|
102
|
+
fi
|
|
103
|
+
;;
|
|
104
|
+
config)
|
|
105
|
+
# Block attempts to disable hooks
|
|
106
|
+
if [[ "\$all_args" == *"core.hooksPath"* ]]; then
|
|
107
|
+
echo -e "\\033[31m🛑 SafeRun: Blocked attempt to modify hooks path\\033[0m"
|
|
108
|
+
echo -e "\\033[90m Changing core.hooksPath can disable SafeRun protection.\\033[0m"
|
|
109
|
+
return 1
|
|
110
|
+
fi
|
|
111
|
+
;;
|
|
112
|
+
esac
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
# Pass through to real git
|
|
116
|
+
command git "\$@"
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
# Protect against direct hook deletion
|
|
120
|
+
rm() {
|
|
121
|
+
if [[ "\$*" == *".git/hooks"* ]]; then
|
|
122
|
+
echo -e "\\033[31m🛑 SafeRun: Blocked deletion of git hooks\\033[0m"
|
|
123
|
+
return 1
|
|
124
|
+
fi
|
|
125
|
+
command rm "\$@"
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
# End SafeRun Shell Integration
|
|
48
129
|
`;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
130
|
+
}
|
|
131
|
+
generateFishSnippet() {
|
|
132
|
+
return `
|
|
133
|
+
# ============================================
|
|
134
|
+
# SafeRun Shell Integration (Fish)
|
|
135
|
+
# Protects against dangerous git operations
|
|
136
|
+
# ============================================
|
|
137
|
+
|
|
52
138
|
set -x SAFERUN_AI_SESSION "conversational"
|
|
53
139
|
set -x SAFERUN_AGENT_ID "$USER-"(date +%s)
|
|
140
|
+
|
|
141
|
+
function git --wraps git
|
|
142
|
+
if test -d ".saferun"; or test -f ".saferun/config.yml"
|
|
143
|
+
set -l cmd $argv[1]
|
|
144
|
+
set -l all_args "$argv"
|
|
145
|
+
|
|
146
|
+
switch $cmd
|
|
147
|
+
case commit
|
|
148
|
+
if string match -q "*--no-verify*" $all_args; or string match -q "* -n *" $all_args
|
|
149
|
+
echo "⚠️ SafeRun: git commit --no-verify detected"
|
|
150
|
+
saferun hook git-commit $argv[2..-1]
|
|
151
|
+
return $status
|
|
152
|
+
end
|
|
153
|
+
case push
|
|
154
|
+
if string match -q "*--force*" $all_args; or string match -q "* -f *" $all_args
|
|
155
|
+
saferun hook git-push $argv[2..-1]
|
|
156
|
+
return $status
|
|
157
|
+
end
|
|
158
|
+
case branch
|
|
159
|
+
if string match -q "*-D*" $all_args; or string match -q "*--delete*" $all_args
|
|
160
|
+
saferun hook git-branch $argv[2..-1]
|
|
161
|
+
return $status
|
|
162
|
+
end
|
|
163
|
+
case reset
|
|
164
|
+
if string match -q "*--hard*" $all_args
|
|
165
|
+
saferun hook git-reset $argv[2..-1]
|
|
166
|
+
return $status
|
|
167
|
+
end
|
|
168
|
+
case clean
|
|
169
|
+
if string match -q "*-f*" $all_args
|
|
170
|
+
saferun hook git-clean $argv[2..-1]
|
|
171
|
+
return $status
|
|
172
|
+
end
|
|
173
|
+
case config
|
|
174
|
+
if string match -q "*core.hooksPath*" $all_args
|
|
175
|
+
echo "🛑 SafeRun: Blocked attempt to modify hooks path"
|
|
176
|
+
return 1
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
command git $argv
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
# End SafeRun Shell Integration
|
|
54
185
|
`;
|
|
55
|
-
}
|
|
56
|
-
return baseSnippet;
|
|
57
186
|
}
|
|
58
187
|
async autoInstall(shell, snippet) {
|
|
59
188
|
const rcFile = this.getRCFile(shell);
|
|
@@ -66,27 +195,37 @@ set -x SAFERUN_AGENT_ID "$USER-"(date +%s)
|
|
|
66
195
|
// Check if already installed
|
|
67
196
|
if (fs_1.default.existsSync(rcFile)) {
|
|
68
197
|
const content = fs_1.default.readFileSync(rcFile, 'utf-8');
|
|
69
|
-
if (content.includes('SafeRun
|
|
198
|
+
if (content.includes('SafeRun Shell Integration')) {
|
|
70
199
|
console.log(chalk_1.default.yellow('⚠️ SafeRun shell integration already installed'));
|
|
200
|
+
console.log(chalk_1.default.gray(' To reinstall, remove the SafeRun section from ' + rcFile));
|
|
71
201
|
return;
|
|
72
202
|
}
|
|
73
203
|
}
|
|
74
204
|
// Append snippet
|
|
75
205
|
fs_1.default.appendFileSync(rcFile, '\n' + snippet, 'utf-8');
|
|
76
206
|
console.log(chalk_1.default.green('✅ SafeRun shell integration installed'));
|
|
77
|
-
console.log(chalk_1.default.bold('\n📝
|
|
207
|
+
console.log(chalk_1.default.bold('\n📝 What was added:'));
|
|
208
|
+
console.log(chalk_1.default.gray(' • Git command interceptor (catches --no-verify, --force, -D)'));
|
|
209
|
+
console.log(chalk_1.default.gray(' • Hook deletion protection'));
|
|
210
|
+
console.log(chalk_1.default.gray(' • AI session detection'));
|
|
211
|
+
console.log(chalk_1.default.bold('\n🔄 Next steps:'));
|
|
78
212
|
console.log(chalk_1.default.gray(` 1. Restart your terminal, or run:`));
|
|
79
213
|
console.log(chalk_1.default.cyan(` source ${rcFile}`));
|
|
80
|
-
console.log(chalk_1.default.gray(` 2.
|
|
81
|
-
console.log(chalk_1.default.
|
|
214
|
+
console.log(chalk_1.default.gray(` 2. Test it:`));
|
|
215
|
+
console.log(chalk_1.default.cyan(` cd <your-saferun-repo> && git commit --no-verify -m "test"`));
|
|
216
|
+
console.log(chalk_1.default.gray(` 3. SafeRun should intercept the command`));
|
|
82
217
|
}
|
|
83
218
|
showManualInstructions(shell, snippet) {
|
|
84
219
|
const rcFile = this.getRCFile(shell) || `~/.${shell}rc`;
|
|
85
220
|
console.log(chalk_1.default.bold('\n📋 Manual Installation\n'));
|
|
86
221
|
console.log(chalk_1.default.gray(`Add the following to ${rcFile}:`));
|
|
87
|
-
console.log(chalk_1.default.cyan(
|
|
222
|
+
console.log(chalk_1.default.cyan('─'.repeat(50)));
|
|
223
|
+
console.log(snippet);
|
|
224
|
+
console.log(chalk_1.default.cyan('─'.repeat(50)));
|
|
88
225
|
console.log(chalk_1.default.gray('\nThen restart your terminal or run:'));
|
|
89
226
|
console.log(chalk_1.default.cyan(` source ${rcFile}`));
|
|
227
|
+
console.log(chalk_1.default.bold('\n💡 Or install automatically:'));
|
|
228
|
+
console.log(chalk_1.default.cyan(' saferun shell-init --auto'));
|
|
90
229
|
}
|
|
91
230
|
getRCFile(shell) {
|
|
92
231
|
const home = os_1.default.homedir();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-init.js","sourceRoot":"","sources":["../../src/commands/shell-init.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AAEH,kDAA0B;AAC1B,4CAAoB;AACpB,4CAAoB;AACpB,gDAAwB;AAExB,MAAa,gBAAgB;IAC3B,KAAK,CAAC,GAAG,CAAC,OAA2C;QACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QAElD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mBAAmB,KAAK,EAAE,CAAC,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAE5C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAEO,WAAW;QACjB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QAE1C,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC5C,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;QAC9C,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;QAE9C,OAAO,MAAM,CAAC,CAAC,UAAU;IAC3B,CAAC;IAEO,eAAe,CAAC,KAAa;QACnC,
|
|
1
|
+
{"version":3,"file":"shell-init.js","sourceRoot":"","sources":["../../src/commands/shell-init.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,7 +32,8 @@ async function interceptCommit(context) {
|
|
|
32
32
|
let riskScore = (rule === null || rule === void 0 ? void 0 : rule.risk_score) != null ? rule.risk_score : 7.0;
|
|
33
33
|
riskScore = clampRisk(riskScore);
|
|
34
34
|
const humanPreview = 'Committing with --no-verify bypasses pre-commit and commit-msg hooks.';
|
|
35
|
-
|
|
35
|
+
// SECURITY: Default to 'block' for --no-verify as it bypasses security hooks
|
|
36
|
+
const enforcement = resolveEnforcement(context.modeSettings, rule === null || rule === void 0 ? void 0 : rule.action, 'block');
|
|
36
37
|
// Log the attempt
|
|
37
38
|
console.log(chalk_1.default.yellow('\n⚠️ SafeRun detected: git commit --no-verify'));
|
|
38
39
|
console.log(chalk_1.default.gray(' This bypasses pre-commit hooks including security checks.\n'));
|
|
@@ -54,13 +55,14 @@ async function interceptCommit(context) {
|
|
|
54
55
|
const approvals = [];
|
|
55
56
|
try {
|
|
56
57
|
const dryRun = await context.client.gitOperation({
|
|
57
|
-
operationType: '
|
|
58
|
+
operationType: 'custom', // API doesn't have commit_no_verify yet
|
|
58
59
|
target: `${repoSlug}@workspace`,
|
|
59
60
|
command,
|
|
60
61
|
metadata: {
|
|
61
62
|
repo: repoSlug,
|
|
62
63
|
args: context.args,
|
|
63
64
|
bypassed_hooks: ['pre-commit', 'commit-msg'],
|
|
65
|
+
custom_type: 'commit_no_verify',
|
|
64
66
|
},
|
|
65
67
|
riskScore: riskScore / 10,
|
|
66
68
|
humanPreview,
|
|
@@ -137,7 +139,25 @@ async function interceptCommit(context) {
|
|
|
137
139
|
catch (error) {
|
|
138
140
|
const message = error instanceof Error ? error.message : String(error);
|
|
139
141
|
console.error(chalk_1.default.red(`SafeRun error: ${message}`));
|
|
140
|
-
|
|
142
|
+
// If enforcement requires blocking, do NOT proceed on API error
|
|
143
|
+
if (enforcement.shouldBlock || enforcement.action === 'block') {
|
|
144
|
+
console.error(chalk_1.default.red('🛑 SafeRun blocks commit --no-verify even when API fails.'));
|
|
145
|
+
context.metrics.track('operation_blocked', {
|
|
146
|
+
hook: 'alias:commit',
|
|
147
|
+
operation_type: 'commit_no_verify',
|
|
148
|
+
repo: repoSlug,
|
|
149
|
+
reason: 'api_error_with_block_policy',
|
|
150
|
+
}).catch(() => undefined);
|
|
151
|
+
await (0, logger_1.logOperation)(context.gitInfo.repoRoot, {
|
|
152
|
+
event: 'commit_no_verify',
|
|
153
|
+
operation: 'commit',
|
|
154
|
+
repo: repoSlug,
|
|
155
|
+
outcome: 'blocked_api_error',
|
|
156
|
+
error: message,
|
|
157
|
+
});
|
|
158
|
+
return 1;
|
|
159
|
+
}
|
|
160
|
+
console.warn(chalk_1.default.yellow('Proceeding without SafeRun approval (non-blocking mode).'));
|
|
141
161
|
context.metrics.track('operation_allowed', {
|
|
142
162
|
hook: 'alias:commit',
|
|
143
163
|
operation_type: 'commit_no_verify',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/interceptors/commit.ts"],"names":[],"mappings":";;;;;AAgBA,
|
|
1
|
+
{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/interceptors/commit.ts"],"names":[],"mappings":"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"}
|