@saferun/cli 0.5.12 → 0.5.13
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 +0 -5
- package/dist/commands/config.d.ts +11 -0
- package/dist/commands/config.js +154 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/register-commands.js +12 -0
- package/dist/register-commands.js.map +1 -1
- package/examples/basic-setup.md +0 -6
- package/examples/ci-cd-setup.md +0 -5
- package/examples/team-setup.md +0 -6
- package/hooks/post-checkout +2 -2
- package/hooks/pre-commit +2 -2
- package/hooks/pre-push +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -663,11 +663,6 @@ saferun config set api.url https://your-server.com
|
|
|
663
663
|
|
|
664
664
|
### Bypass SafeRun temporarily
|
|
665
665
|
|
|
666
|
-
**Disable for single operation:**
|
|
667
|
-
```bash
|
|
668
|
-
SAFERUN_DISABLE=1 git push --force origin main
|
|
669
|
-
```
|
|
670
|
-
|
|
671
666
|
**Disable globally:**
|
|
672
667
|
```bash
|
|
673
668
|
saferun config set mode lenient
|
|
@@ -1,5 +1,16 @@
|
|
|
1
|
+
interface SlackConfigOptions {
|
|
2
|
+
channel?: string;
|
|
3
|
+
webhookUrl?: string;
|
|
4
|
+
botToken?: string;
|
|
5
|
+
disable?: boolean;
|
|
6
|
+
test?: boolean;
|
|
7
|
+
}
|
|
1
8
|
export declare class ConfigCommand {
|
|
2
9
|
show(): Promise<void>;
|
|
3
10
|
set(path: string, value: string): Promise<void>;
|
|
11
|
+
slack(options: SlackConfigOptions): Promise<void>;
|
|
12
|
+
private configureSlack;
|
|
13
|
+
private testSlack;
|
|
4
14
|
private load;
|
|
5
15
|
}
|
|
16
|
+
export {};
|
package/dist/commands/config.js
CHANGED
|
@@ -6,8 +6,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.ConfigCommand = void 0;
|
|
7
7
|
const chalk_1 = __importDefault(require("chalk"));
|
|
8
8
|
const js_yaml_1 = require("js-yaml");
|
|
9
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
9
10
|
const git_1 = require("../utils/git");
|
|
10
11
|
const config_1 = require("../utils/config");
|
|
12
|
+
const api_client_1 = require("../utils/api-client");
|
|
11
13
|
class ConfigCommand {
|
|
12
14
|
async show() {
|
|
13
15
|
const config = await this.load();
|
|
@@ -37,6 +39,158 @@ class ConfigCommand {
|
|
|
37
39
|
await (0, config_1.saveConfig)(config, gitInfo.repoRoot);
|
|
38
40
|
console.log(chalk_1.default.green(`✓ Updated ${path}`));
|
|
39
41
|
}
|
|
42
|
+
async slack(options) {
|
|
43
|
+
const isRepo = await (0, git_1.isGitRepository)();
|
|
44
|
+
if (!isRepo) {
|
|
45
|
+
console.error(chalk_1.default.red('❌ Not inside a git repository.'));
|
|
46
|
+
process.exitCode = 1;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const gitInfo = await (0, git_1.getGitInfo)();
|
|
50
|
+
if (!gitInfo) {
|
|
51
|
+
console.error(chalk_1.default.red('❌ Unable to determine git repository information.'));
|
|
52
|
+
process.exitCode = 1;
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const config = await (0, config_1.loadConfig)(gitInfo.repoRoot, { allowCreate: true });
|
|
56
|
+
const apiKey = (0, api_client_1.resolveApiKey)(config);
|
|
57
|
+
if (!apiKey) {
|
|
58
|
+
console.error(chalk_1.default.red('❌ No API key configured.'));
|
|
59
|
+
console.error(chalk_1.default.yellow(' Set SAFERUN_API_KEY env or run: saferun init'));
|
|
60
|
+
process.exitCode = 1;
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
console.log(chalk_1.default.cyan('\n🔔 SafeRun Slack Configuration\n'));
|
|
64
|
+
// Test mode - send test notification
|
|
65
|
+
if (options.test) {
|
|
66
|
+
await this.testSlack(apiKey, config.api.url);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// Disable slack
|
|
70
|
+
if (options.disable) {
|
|
71
|
+
await this.configureSlack(apiKey, config.api.url, {
|
|
72
|
+
slack_enabled: false,
|
|
73
|
+
slack_channel: '#saferun-alerts',
|
|
74
|
+
notification_channels: ['slack'],
|
|
75
|
+
});
|
|
76
|
+
console.log(chalk_1.default.green('✅ Slack notifications disabled'));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Interactive mode if no options provided
|
|
80
|
+
if (!options.channel && !options.webhookUrl && !options.botToken) {
|
|
81
|
+
const answers = await inquirer_1.default.prompt([
|
|
82
|
+
{
|
|
83
|
+
type: 'list',
|
|
84
|
+
name: 'method',
|
|
85
|
+
message: 'Choose Slack integration method:',
|
|
86
|
+
choices: [
|
|
87
|
+
{ name: 'Webhook URL (recommended, easier setup)', value: 'webhook' },
|
|
88
|
+
{ name: 'Bot Token (advanced, more features)', value: 'bot' },
|
|
89
|
+
],
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
type: 'input',
|
|
93
|
+
name: 'webhookUrl',
|
|
94
|
+
message: 'Slack Webhook URL:',
|
|
95
|
+
when: (answers) => answers.method === 'webhook',
|
|
96
|
+
validate: (value) => {
|
|
97
|
+
if (!value)
|
|
98
|
+
return 'Webhook URL is required';
|
|
99
|
+
if (!value.startsWith('https://hooks.slack.com/')) {
|
|
100
|
+
return 'Invalid webhook URL. Should start with https://hooks.slack.com/';
|
|
101
|
+
}
|
|
102
|
+
return true;
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
type: 'input',
|
|
107
|
+
name: 'botToken',
|
|
108
|
+
message: 'Slack Bot Token (xoxb-...):',
|
|
109
|
+
when: (answers) => answers.method === 'bot',
|
|
110
|
+
validate: (value) => {
|
|
111
|
+
if (!value)
|
|
112
|
+
return 'Bot token is required';
|
|
113
|
+
if (!value.startsWith('xoxb-')) {
|
|
114
|
+
return 'Invalid bot token. Should start with xoxb-';
|
|
115
|
+
}
|
|
116
|
+
return true;
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
type: 'input',
|
|
121
|
+
name: 'channel',
|
|
122
|
+
message: 'Slack Channel:',
|
|
123
|
+
default: '#saferun-alerts',
|
|
124
|
+
validate: (value) => {
|
|
125
|
+
if (!value.startsWith('#') && !value.startsWith('@')) {
|
|
126
|
+
return 'Channel should start with # or @';
|
|
127
|
+
}
|
|
128
|
+
return true;
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
]);
|
|
132
|
+
options.webhookUrl = answers.webhookUrl || undefined;
|
|
133
|
+
options.botToken = answers.botToken || undefined;
|
|
134
|
+
options.channel = answers.channel;
|
|
135
|
+
}
|
|
136
|
+
// Configure slack
|
|
137
|
+
if (!options.webhookUrl && !options.botToken) {
|
|
138
|
+
console.error(chalk_1.default.red('❌ Either --webhook-url or --bot-token required'));
|
|
139
|
+
process.exitCode = 1;
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
await this.configureSlack(apiKey, config.api.url, {
|
|
143
|
+
slack_webhook_url: options.webhookUrl,
|
|
144
|
+
slack_bot_token: options.botToken,
|
|
145
|
+
slack_channel: options.channel || '#saferun-alerts',
|
|
146
|
+
slack_enabled: true,
|
|
147
|
+
notification_channels: ['slack'],
|
|
148
|
+
});
|
|
149
|
+
console.log(chalk_1.default.green('\n✅ Slack notifications configured!'));
|
|
150
|
+
console.log(chalk_1.default.gray(` Channel: ${options.channel || '#saferun-alerts'}`));
|
|
151
|
+
console.log(chalk_1.default.gray('\n💡 Test with: saferun config slack --test'));
|
|
152
|
+
console.log(chalk_1.default.gray(' Or trigger a SafeRun operation (e.g., git push --force)'));
|
|
153
|
+
}
|
|
154
|
+
async configureSlack(apiKey, apiUrl, config) {
|
|
155
|
+
const url = `${apiUrl}/v1/settings/notifications`;
|
|
156
|
+
const response = await fetch(url, {
|
|
157
|
+
method: 'PUT',
|
|
158
|
+
headers: {
|
|
159
|
+
'Content-Type': 'application/json',
|
|
160
|
+
'X-API-Key': apiKey,
|
|
161
|
+
},
|
|
162
|
+
body: JSON.stringify(config),
|
|
163
|
+
});
|
|
164
|
+
if (!response.ok) {
|
|
165
|
+
const error = await response.text();
|
|
166
|
+
throw new Error(`Failed to configure Slack: ${error}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
async testSlack(apiKey, apiUrl) {
|
|
170
|
+
console.log(chalk_1.default.gray('Sending test notification...\n'));
|
|
171
|
+
const url = `${apiUrl}/v1/settings/notifications/test/slack`;
|
|
172
|
+
try {
|
|
173
|
+
const response = await fetch(url, {
|
|
174
|
+
method: 'POST',
|
|
175
|
+
headers: {
|
|
176
|
+
'X-API-Key': apiKey,
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
if (!response.ok) {
|
|
180
|
+
const error = await response.text();
|
|
181
|
+
console.error(chalk_1.default.red(`❌ Failed to send test notification: ${error}`));
|
|
182
|
+
process.exitCode = 1;
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const result = await response.json();
|
|
186
|
+
console.log(chalk_1.default.green('✅ ' + result.message));
|
|
187
|
+
console.log(chalk_1.default.gray('\n💡 Check your Slack channel for the test message'));
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
console.error(chalk_1.default.red(`❌ Error: ${error.message}`));
|
|
191
|
+
process.exitCode = 1;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
40
194
|
async load() {
|
|
41
195
|
const isRepo = await (0, git_1.isGitRepository)();
|
|
42
196
|
if (!isRepo) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,qCAA2C;AAC3C,sCAA2D;AAC3D,4CAAwF;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -105,6 +105,18 @@ function registerCommands(program) {
|
|
|
105
105
|
const { ConfigCommand } = await Promise.resolve().then(() => __importStar(require('./commands/config')));
|
|
106
106
|
await new ConfigCommand().set('mode', mode);
|
|
107
107
|
});
|
|
108
|
+
config
|
|
109
|
+
.command('slack')
|
|
110
|
+
.description('Configure Slack notifications')
|
|
111
|
+
.option('--channel <channel>', 'Slack channel (e.g., #my-team)')
|
|
112
|
+
.option('--webhook-url <url>', 'Slack webhook URL')
|
|
113
|
+
.option('--bot-token <token>', 'Slack bot token (xoxb-...)')
|
|
114
|
+
.option('--disable', 'Disable Slack notifications')
|
|
115
|
+
.option('--test', 'Send test notification')
|
|
116
|
+
.action(async (options) => {
|
|
117
|
+
const { ConfigCommand } = await Promise.resolve().then(() => __importStar(require('./commands/config')));
|
|
118
|
+
await new ConfigCommand().slack(options);
|
|
119
|
+
});
|
|
108
120
|
// saferun allow - whitelist management
|
|
109
121
|
program
|
|
110
122
|
.command('allow')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-commands.js","sourceRoot":"","sources":["../src/register-commands.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,
|
|
1
|
+
{"version":3,"file":"register-commands.js","sourceRoot":"","sources":["../src/register-commands.ts"],"names":[],"mappings":"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"}
|
package/examples/basic-setup.md
CHANGED
|
@@ -131,12 +131,6 @@ Shows if AI agent is detected and confidence level.
|
|
|
131
131
|
saferun init --force
|
|
132
132
|
```
|
|
133
133
|
|
|
134
|
-
### Temporarily disable SafeRun
|
|
135
|
-
|
|
136
|
-
```bash
|
|
137
|
-
SAFERUN_DISABLE=1 git push --force origin main
|
|
138
|
-
```
|
|
139
|
-
|
|
140
134
|
### Switch to offline mode
|
|
141
135
|
|
|
142
136
|
If API is unreachable:
|
package/examples/ci-cd-setup.md
CHANGED
package/examples/team-setup.md
CHANGED
|
@@ -170,12 +170,6 @@ git push origin staging
|
|
|
170
170
|
|
|
171
171
|
**1. Always use SafeRun**
|
|
172
172
|
|
|
173
|
-
Never disable SafeRun without team approval:
|
|
174
|
-
```bash
|
|
175
|
-
# DON'T DO THIS without permission:
|
|
176
|
-
SAFERUN_DISABLE=1 git push --force
|
|
177
|
-
```
|
|
178
|
-
|
|
179
173
|
**2. Request approval for protected branches**
|
|
180
174
|
|
|
181
175
|
If you need to force push to main:
|
package/hooks/post-checkout
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
# SafeRun post-checkout hook
|
|
3
3
|
# Protects against dangerous AI agent operations
|
|
4
4
|
|
|
5
|
-
#
|
|
6
|
-
if [ "$
|
|
5
|
+
# Allow bypass for CI environments only
|
|
6
|
+
if [ "$CI" = "true" ] || [ "$CI" = "1" ]; then
|
|
7
7
|
exit 0
|
|
8
8
|
fi
|
|
9
9
|
|
package/hooks/pre-commit
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
# SafeRun pre-commit hook
|
|
3
3
|
# Protects against dangerous AI agent operations
|
|
4
4
|
|
|
5
|
-
#
|
|
6
|
-
if [ "$
|
|
5
|
+
# Allow bypass for CI environments only
|
|
6
|
+
if [ "$CI" = "true" ] || [ "$CI" = "1" ]; then
|
|
7
7
|
exit 0
|
|
8
8
|
fi
|
|
9
9
|
|
package/hooks/pre-push
CHANGED
|
@@ -6,8 +6,8 @@ REMOTE_NAME="$1"
|
|
|
6
6
|
REMOTE_URL="$2"
|
|
7
7
|
shift 2 >/dev/null 2>&1 || true
|
|
8
8
|
|
|
9
|
-
# Allow bypass for CI
|
|
10
|
-
if [ "$
|
|
9
|
+
# Allow bypass for CI environments only
|
|
10
|
+
if [ "$CI" = "true" ] || [ "$CI" = "1" ]; then
|
|
11
11
|
exit 0
|
|
12
12
|
fi
|
|
13
13
|
|