@saferun/cli 0.6.5 ā 0.6.7
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/agent.d.ts +4 -6
- package/dist/commands/agent.js +10 -32
- package/dist/commands/agent.js.map +1 -1
- package/dist/register-commands.js +6 -69
- package/dist/register-commands.js.map +1 -1
- package/package.json +1 -1
- package/dist/commands/allow.d.ts +0 -12
- package/dist/commands/allow.js +0 -122
- package/dist/commands/allow.js.map +0 -1
- package/dist/commands/feedback.d.ts +0 -9
- package/dist/commands/feedback.js +0 -98
- package/dist/commands/feedback.js.map +0 -1
package/dist/commands/agent.d.ts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Command: saferun agent
|
|
3
|
-
*
|
|
3
|
+
* View AI agent detection status (read-only)
|
|
4
|
+
*
|
|
5
|
+
* NOTE: register/unregister commands were removed for security.
|
|
6
|
+
* Agents should not be able to self-register to bypass protection.
|
|
4
7
|
*/
|
|
5
8
|
export declare class AgentCommand {
|
|
6
|
-
register(type: string, options: {
|
|
7
|
-
id?: string;
|
|
8
|
-
version?: string;
|
|
9
|
-
}): Promise<void>;
|
|
10
|
-
unregister(): Promise<void>;
|
|
11
9
|
status(): Promise<void>;
|
|
12
10
|
}
|
package/dist/commands/agent.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* Command: saferun agent
|
|
4
|
-
*
|
|
4
|
+
* View AI agent detection status (read-only)
|
|
5
|
+
*
|
|
6
|
+
* NOTE: register/unregister commands were removed for security.
|
|
7
|
+
* Agents should not be able to self-register to bypass protection.
|
|
5
8
|
*/
|
|
6
9
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
10
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -12,32 +15,6 @@ const chalk_1 = __importDefault(require("chalk"));
|
|
|
12
15
|
const git_1 = require("../utils/git");
|
|
13
16
|
const agent_handshake_1 = require("../utils/agent-handshake");
|
|
14
17
|
class AgentCommand {
|
|
15
|
-
async register(type, options) {
|
|
16
|
-
const gitInfo = await (0, git_1.getGitInfo)();
|
|
17
|
-
if (!gitInfo) {
|
|
18
|
-
console.error(chalk_1.default.red('Error: Not a git repository'));
|
|
19
|
-
process.exit(1);
|
|
20
|
-
}
|
|
21
|
-
const handshake = (0, agent_handshake_1.createHandshake)(type, {
|
|
22
|
-
agentId: options.id,
|
|
23
|
-
version: options.version,
|
|
24
|
-
});
|
|
25
|
-
(0, agent_handshake_1.registerAgent)(handshake, gitInfo.repoRoot);
|
|
26
|
-
console.log(chalk_1.default.green('ā
Agent registered successfully'));
|
|
27
|
-
console.log(chalk_1.default.gray(`\nAgent ID: ${handshake.agent_id}`));
|
|
28
|
-
console.log(chalk_1.default.gray(`Agent Type: ${handshake.agent_type}`));
|
|
29
|
-
console.log(chalk_1.default.gray(`Session Start: ${handshake.session_start}`));
|
|
30
|
-
console.log(chalk_1.default.bold('\nš” This agent will now be detected with 100% confidence'));
|
|
31
|
-
}
|
|
32
|
-
async unregister() {
|
|
33
|
-
const gitInfo = await (0, git_1.getGitInfo)();
|
|
34
|
-
if (!gitInfo) {
|
|
35
|
-
console.error(chalk_1.default.red('Error: Not a git repository'));
|
|
36
|
-
process.exit(1);
|
|
37
|
-
}
|
|
38
|
-
(0, agent_handshake_1.unregisterAgent)(gitInfo.repoRoot);
|
|
39
|
-
console.log(chalk_1.default.green('ā
Agent unregistered'));
|
|
40
|
-
}
|
|
41
18
|
async status() {
|
|
42
19
|
const gitInfo = await (0, git_1.getGitInfo)();
|
|
43
20
|
if (!gitInfo) {
|
|
@@ -46,13 +23,14 @@ class AgentCommand {
|
|
|
46
23
|
}
|
|
47
24
|
const handshake = (0, agent_handshake_1.getAgentHandshake)(gitInfo.repoRoot);
|
|
48
25
|
if (!handshake) {
|
|
49
|
-
console.log(chalk_1.default.
|
|
50
|
-
console.log(chalk_1.default.gray('\
|
|
51
|
-
console.log(chalk_1.default.gray('
|
|
52
|
-
console.log(chalk_1.default.gray('
|
|
26
|
+
console.log(chalk_1.default.green('ā
No AI agent currently detected'));
|
|
27
|
+
console.log(chalk_1.default.gray('\nSafeRun automatically detects AI agents based on:'));
|
|
28
|
+
console.log(chalk_1.default.gray(' ⢠Environment variables (CURSOR_*, CLAUDE_*, etc.)'));
|
|
29
|
+
console.log(chalk_1.default.gray(' ⢠Process tree analysis'));
|
|
30
|
+
console.log(chalk_1.default.gray(' ⢠Terminal session context'));
|
|
53
31
|
return;
|
|
54
32
|
}
|
|
55
|
-
console.log(chalk_1.default.bold('\nš¤
|
|
33
|
+
console.log(chalk_1.default.bold('\nš¤ Detected Agent\n'));
|
|
56
34
|
console.log(chalk_1.default.gray('Agent ID: ') + chalk_1.default.white(handshake.agent_id));
|
|
57
35
|
console.log(chalk_1.default.gray('Agent Type: ') + chalk_1.default.white(handshake.agent_type));
|
|
58
36
|
console.log(chalk_1.default.gray('Session Start:') + chalk_1.default.white(new Date(handshake.session_start).toLocaleString()));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;AAEH,kDAA0B;AAC1B,sCAA0C;AAC1C,8DAA6D;AAE7D,MAAa,YAAY;IACvB,KAAK,CAAC,MAAM;QACV,MAAM,OAAO,GAAG,MAAM,IAAA,gBAAU,GAAE,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,SAAS,GAAG,IAAA,mCAAiB,EAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEtD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC,CAAC;YAC/E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC,CAAC;YAChF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,eAAK,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,eAAK,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,eAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QAE5G,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,eAAK,CAAC,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;QACnF,CAAC;QAED,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;CACF;AAjCD,oCAiCC"}
|
|
@@ -155,61 +155,6 @@ function registerCommands(program) {
|
|
|
155
155
|
const { ConfigCommand } = await Promise.resolve().then(() => __importStar(require('./commands/config')));
|
|
156
156
|
await new ConfigCommand().slack(options);
|
|
157
157
|
});
|
|
158
|
-
// saferun allow - whitelist management
|
|
159
|
-
program
|
|
160
|
-
.command('allow')
|
|
161
|
-
.description('Manage whitelist for bots and automation')
|
|
162
|
-
.argument('[subcommand]', 'Subcommand: ci, bot, automation, agent, list, remove')
|
|
163
|
-
.argument('[args...]', 'Additional arguments')
|
|
164
|
-
.allowUnknownOption(true)
|
|
165
|
-
.action(async (subcommand, args, options) => {
|
|
166
|
-
const { AllowCommand } = await Promise.resolve().then(() => __importStar(require('./commands/allow')));
|
|
167
|
-
const cmd = new AllowCommand();
|
|
168
|
-
switch (subcommand) {
|
|
169
|
-
case 'ci':
|
|
170
|
-
await cmd.addCI(options.scope || args[0] || 'ci', options.reason);
|
|
171
|
-
break;
|
|
172
|
-
case 'bot':
|
|
173
|
-
await cmd.addBot(options.name || options.email || args[0], options.reason);
|
|
174
|
-
break;
|
|
175
|
-
case 'automation':
|
|
176
|
-
await cmd.addAutomation(options.context || args[0], options.reason);
|
|
177
|
-
break;
|
|
178
|
-
case 'agent':
|
|
179
|
-
await cmd.addAgent(options.id || args[0], options.type, options.reason);
|
|
180
|
-
break;
|
|
181
|
-
case 'list':
|
|
182
|
-
await cmd.list();
|
|
183
|
-
break;
|
|
184
|
-
case 'remove':
|
|
185
|
-
await cmd.remove(args[0]);
|
|
186
|
-
break;
|
|
187
|
-
default:
|
|
188
|
-
console.log('Usage: saferun allow <ci|bot|automation|agent|list|remove>');
|
|
189
|
-
}
|
|
190
|
-
});
|
|
191
|
-
// saferun feedback - view detection feedback
|
|
192
|
-
program
|
|
193
|
-
.command('feedback')
|
|
194
|
-
.description('View AI detection feedback and statistics')
|
|
195
|
-
.argument('[subcommand]', 'Subcommand: stats, list, sync')
|
|
196
|
-
.action(async (subcommand) => {
|
|
197
|
-
const { FeedbackCommand } = await Promise.resolve().then(() => __importStar(require('./commands/feedback')));
|
|
198
|
-
const cmd = new FeedbackCommand();
|
|
199
|
-
switch (subcommand) {
|
|
200
|
-
case 'stats':
|
|
201
|
-
await cmd.stats();
|
|
202
|
-
break;
|
|
203
|
-
case 'list':
|
|
204
|
-
await cmd.list();
|
|
205
|
-
break;
|
|
206
|
-
case 'sync':
|
|
207
|
-
await cmd.sync();
|
|
208
|
-
break;
|
|
209
|
-
default:
|
|
210
|
-
await cmd.stats(); // Default to stats
|
|
211
|
-
}
|
|
212
|
-
});
|
|
213
158
|
// saferun shell-init - setup shell integration
|
|
214
159
|
program
|
|
215
160
|
.command('shell-init')
|
|
@@ -220,26 +165,18 @@ function registerCommands(program) {
|
|
|
220
165
|
const { ShellInitCommand } = await Promise.resolve().then(() => __importStar(require('./commands/shell-init')));
|
|
221
166
|
await new ShellInitCommand().run({ auto: options.auto, shell: options.shell });
|
|
222
167
|
});
|
|
223
|
-
// saferun agent - agent
|
|
168
|
+
// saferun agent - agent status (read-only)
|
|
224
169
|
program
|
|
225
170
|
.command('agent')
|
|
226
|
-
.description('
|
|
227
|
-
.argument('[subcommand]', 'Subcommand:
|
|
171
|
+
.description('View AI agent detection status')
|
|
172
|
+
.argument('[subcommand]', 'Subcommand: status')
|
|
228
173
|
.argument('[args...]', 'Additional arguments')
|
|
229
174
|
.action(async (subcommand, args, options) => {
|
|
230
175
|
const { AgentCommand } = await Promise.resolve().then(() => __importStar(require('./commands/agent')));
|
|
231
176
|
const cmd = new AgentCommand();
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
break;
|
|
236
|
-
case 'unregister':
|
|
237
|
-
await cmd.unregister();
|
|
238
|
-
break;
|
|
239
|
-
case 'status':
|
|
240
|
-
default:
|
|
241
|
-
await cmd.status();
|
|
242
|
-
}
|
|
177
|
+
// Only allow status command (read-only)
|
|
178
|
+
// register/unregister removed for security - agents should not self-register
|
|
179
|
+
await cmd.status();
|
|
243
180
|
});
|
|
244
181
|
program
|
|
245
182
|
.command('hook')
|
|
@@ -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/package.json
CHANGED
package/dist/commands/allow.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Command: saferun allow
|
|
3
|
-
* Add entries to whitelist to reduce false positives
|
|
4
|
-
*/
|
|
5
|
-
export declare class AllowCommand {
|
|
6
|
-
addCI(scope: string, reason?: string): Promise<void>;
|
|
7
|
-
addBot(name: string, reason?: string): Promise<void>;
|
|
8
|
-
addAutomation(context: string, reason?: string): Promise<void>;
|
|
9
|
-
addAgent(id: string, type?: string, reason?: string): Promise<void>;
|
|
10
|
-
list(): Promise<void>;
|
|
11
|
-
remove(identifier: string): Promise<void>;
|
|
12
|
-
}
|
package/dist/commands/allow.js
DELETED
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Command: saferun allow
|
|
4
|
-
* Add entries to whitelist to reduce false positives
|
|
5
|
-
*/
|
|
6
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
-
};
|
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.AllowCommand = void 0;
|
|
11
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
12
|
-
const git_1 = require("../utils/git");
|
|
13
|
-
const whitelist_1 = require("../utils/whitelist");
|
|
14
|
-
const cli_table3_1 = __importDefault(require("cli-table3"));
|
|
15
|
-
class AllowCommand {
|
|
16
|
-
async addCI(scope, reason) {
|
|
17
|
-
const gitInfo = await (0, git_1.getGitInfo)();
|
|
18
|
-
if (!gitInfo) {
|
|
19
|
-
console.error(chalk_1.default.red('Error: Not a git repository'));
|
|
20
|
-
process.exit(1);
|
|
21
|
-
}
|
|
22
|
-
await (0, whitelist_1.addToWhitelist)(gitInfo.repoRoot, {
|
|
23
|
-
type: 'ci',
|
|
24
|
-
identifier: scope,
|
|
25
|
-
reason: reason || `CI/CD system: ${scope}`,
|
|
26
|
-
});
|
|
27
|
-
console.log(chalk_1.default.green(`ā Added CI system "${scope}" to whitelist`));
|
|
28
|
-
console.log(chalk_1.default.gray(` Operations from ${scope} will be allowed automatically`));
|
|
29
|
-
}
|
|
30
|
-
async addBot(name, reason) {
|
|
31
|
-
const gitInfo = await (0, git_1.getGitInfo)();
|
|
32
|
-
if (!gitInfo) {
|
|
33
|
-
console.error(chalk_1.default.red('Error: Not a git repository'));
|
|
34
|
-
process.exit(1);
|
|
35
|
-
}
|
|
36
|
-
await (0, whitelist_1.addToWhitelist)(gitInfo.repoRoot, {
|
|
37
|
-
type: 'bot',
|
|
38
|
-
identifier: name,
|
|
39
|
-
reason: reason || `Bot: ${name}`,
|
|
40
|
-
});
|
|
41
|
-
console.log(chalk_1.default.green(`ā Added bot "${name}" to whitelist`));
|
|
42
|
-
console.log(chalk_1.default.gray(` Git operations by this bot will be allowed`));
|
|
43
|
-
}
|
|
44
|
-
async addAutomation(context, reason) {
|
|
45
|
-
const gitInfo = await (0, git_1.getGitInfo)();
|
|
46
|
-
if (!gitInfo) {
|
|
47
|
-
console.error(chalk_1.default.red('Error: Not a git repository'));
|
|
48
|
-
process.exit(1);
|
|
49
|
-
}
|
|
50
|
-
await (0, whitelist_1.addToWhitelist)(gitInfo.repoRoot, {
|
|
51
|
-
type: 'automation',
|
|
52
|
-
identifier: context,
|
|
53
|
-
reason: reason || `Automation: ${context}`,
|
|
54
|
-
});
|
|
55
|
-
console.log(chalk_1.default.green(`ā Added automation "${context}" to whitelist`));
|
|
56
|
-
console.log(chalk_1.default.gray(` This automation context will be allowed`));
|
|
57
|
-
}
|
|
58
|
-
async addAgent(id, type, reason) {
|
|
59
|
-
const gitInfo = await (0, git_1.getGitInfo)();
|
|
60
|
-
if (!gitInfo) {
|
|
61
|
-
console.error(chalk_1.default.red('Error: Not a git repository'));
|
|
62
|
-
process.exit(1);
|
|
63
|
-
}
|
|
64
|
-
await (0, whitelist_1.addToWhitelist)(gitInfo.repoRoot, {
|
|
65
|
-
type: 'agent',
|
|
66
|
-
identifier: id,
|
|
67
|
-
scope: type ? `type:${type}` : undefined,
|
|
68
|
-
reason: reason || `AI Agent: ${id}`,
|
|
69
|
-
});
|
|
70
|
-
console.log(chalk_1.default.green(`ā Added agent "${id}" to whitelist`));
|
|
71
|
-
if (type) {
|
|
72
|
-
console.log(chalk_1.default.gray(` Type: ${type}`));
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
async list() {
|
|
76
|
-
const gitInfo = await (0, git_1.getGitInfo)();
|
|
77
|
-
if (!gitInfo) {
|
|
78
|
-
console.error(chalk_1.default.red('Error: Not a git repository'));
|
|
79
|
-
process.exit(1);
|
|
80
|
-
}
|
|
81
|
-
const entries = await (0, whitelist_1.listWhitelist)(gitInfo.repoRoot);
|
|
82
|
-
if (entries.length === 0) {
|
|
83
|
-
console.log(chalk_1.default.yellow('No whitelist entries'));
|
|
84
|
-
console.log(chalk_1.default.gray('\nAdd entries with:'));
|
|
85
|
-
console.log(chalk_1.default.gray(' saferun allow ci --scope jenkins'));
|
|
86
|
-
console.log(chalk_1.default.gray(' saferun allow bot --name "renovate[bot]"'));
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
console.log(chalk_1.default.bold('\nš¤ Whitelist Entries\n'));
|
|
90
|
-
const table = new cli_table3_1.default({
|
|
91
|
-
head: ['Type', 'Identifier', 'Scope', 'Added', 'Reason'],
|
|
92
|
-
style: { head: ['cyan'] },
|
|
93
|
-
});
|
|
94
|
-
entries.forEach((entry) => {
|
|
95
|
-
table.push([
|
|
96
|
-
entry.type.toUpperCase(),
|
|
97
|
-
entry.identifier,
|
|
98
|
-
entry.scope || '-',
|
|
99
|
-
new Date(entry.added_at).toLocaleDateString(),
|
|
100
|
-
entry.reason || '-',
|
|
101
|
-
]);
|
|
102
|
-
});
|
|
103
|
-
console.log(table.toString());
|
|
104
|
-
console.log(chalk_1.default.gray(`\nTotal: ${entries.length} entries`));
|
|
105
|
-
}
|
|
106
|
-
async remove(identifier) {
|
|
107
|
-
const gitInfo = await (0, git_1.getGitInfo)();
|
|
108
|
-
if (!gitInfo) {
|
|
109
|
-
console.error(chalk_1.default.red('Error: Not a git repository'));
|
|
110
|
-
process.exit(1);
|
|
111
|
-
}
|
|
112
|
-
const removed = await (0, whitelist_1.removeFromWhitelist)(gitInfo.repoRoot, identifier);
|
|
113
|
-
if (removed) {
|
|
114
|
-
console.log(chalk_1.default.green(`ā Removed "${identifier}" from whitelist`));
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
console.log(chalk_1.default.yellow(`Entry "${identifier}" not found in whitelist`));
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
exports.AllowCommand = AllowCommand;
|
|
122
|
-
//# sourceMappingURL=allow.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"allow.js","sourceRoot":"","sources":["../../src/commands/allow.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Command: saferun feedback
|
|
4
|
-
* View and manage detection feedback
|
|
5
|
-
*/
|
|
6
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
-
};
|
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.FeedbackCommand = void 0;
|
|
11
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
12
|
-
const git_1 = require("../utils/git");
|
|
13
|
-
const feedback_1 = require("../utils/feedback");
|
|
14
|
-
const cli_table3_1 = __importDefault(require("cli-table3"));
|
|
15
|
-
class FeedbackCommand {
|
|
16
|
-
async stats() {
|
|
17
|
-
const gitInfo = await (0, git_1.getGitInfo)();
|
|
18
|
-
if (!gitInfo) {
|
|
19
|
-
console.error(chalk_1.default.red('Error: Not a git repository'));
|
|
20
|
-
process.exit(1);
|
|
21
|
-
}
|
|
22
|
-
const stats = await (0, feedback_1.getFeedbackStats)(gitInfo.repoRoot);
|
|
23
|
-
console.log(chalk_1.default.bold('\nš AI Detection Feedback Statistics\n'));
|
|
24
|
-
const table = new cli_table3_1.default({
|
|
25
|
-
head: ['Metric', 'Count', 'Percentage'],
|
|
26
|
-
style: { head: ['cyan'] },
|
|
27
|
-
});
|
|
28
|
-
const total = stats.total || 1;
|
|
29
|
-
table.push(['Total feedback', stats.total.toString(), '100%'], [
|
|
30
|
-
chalk_1.default.green('Correct detections'),
|
|
31
|
-
stats.correct.toString(),
|
|
32
|
-
`${((stats.correct / total) * 100).toFixed(1)}%`,
|
|
33
|
-
], [
|
|
34
|
-
chalk_1.default.yellow('False positives'),
|
|
35
|
-
stats.false_positives.toString(),
|
|
36
|
-
`${((stats.false_positives / total) * 100).toFixed(1)}%`,
|
|
37
|
-
], [
|
|
38
|
-
chalk_1.default.red('False negatives'),
|
|
39
|
-
stats.false_negatives.toString(),
|
|
40
|
-
`${((stats.false_negatives / total) * 100).toFixed(1)}%`,
|
|
41
|
-
]);
|
|
42
|
-
console.log(table.toString());
|
|
43
|
-
if (stats.total === 0) {
|
|
44
|
-
console.log(chalk_1.default.gray('\nNo feedback collected yet'));
|
|
45
|
-
console.log(chalk_1.default.gray('Feedback is requested after AI-detected operations'));
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
const accuracy = ((stats.correct / total) * 100).toFixed(1);
|
|
49
|
-
console.log(chalk_1.default.bold(`\nDetection Accuracy: ${accuracy}%`));
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
async list() {
|
|
53
|
-
const gitInfo = await (0, git_1.getGitInfo)();
|
|
54
|
-
if (!gitInfo) {
|
|
55
|
-
console.error(chalk_1.default.red('Error: Not a git repository'));
|
|
56
|
-
process.exit(1);
|
|
57
|
-
}
|
|
58
|
-
const entries = await (0, feedback_1.readFeedback)(gitInfo.repoRoot);
|
|
59
|
-
if (entries.length === 0) {
|
|
60
|
-
console.log(chalk_1.default.yellow('No feedback entries'));
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
console.log(chalk_1.default.bold('\nš Feedback Entries\n'));
|
|
64
|
-
const table = new cli_table3_1.default({
|
|
65
|
-
head: ['Date', 'Operation', 'Score', 'Action', 'Feedback'],
|
|
66
|
-
style: { head: ['cyan'] },
|
|
67
|
-
});
|
|
68
|
-
entries.slice(-10).forEach((entry) => {
|
|
69
|
-
const feedbackColor = entry.user_feedback === 'correct'
|
|
70
|
-
? chalk_1.default.green
|
|
71
|
-
: entry.user_feedback === 'false_positive'
|
|
72
|
-
? chalk_1.default.yellow
|
|
73
|
-
: chalk_1.default.red;
|
|
74
|
-
table.push([
|
|
75
|
-
new Date(entry.timestamp).toLocaleString(),
|
|
76
|
-
entry.operation_type || 'unknown',
|
|
77
|
-
entry.total_score.toFixed(2),
|
|
78
|
-
entry.action_taken,
|
|
79
|
-
feedbackColor(entry.user_feedback || 'pending'),
|
|
80
|
-
]);
|
|
81
|
-
});
|
|
82
|
-
console.log(table.toString());
|
|
83
|
-
console.log(chalk_1.default.gray(`\nShowing last 10 of ${entries.length} entries`));
|
|
84
|
-
}
|
|
85
|
-
async sync() {
|
|
86
|
-
const gitInfo = await (0, git_1.getGitInfo)();
|
|
87
|
-
if (!gitInfo) {
|
|
88
|
-
console.error(chalk_1.default.red('Error: Not a git repository'));
|
|
89
|
-
process.exit(1);
|
|
90
|
-
}
|
|
91
|
-
console.log(chalk_1.default.cyan('Syncing feedback to SafeRun backend...'));
|
|
92
|
-
// TODO: Implement actual sync with API client
|
|
93
|
-
console.log(chalk_1.default.yellow('ā ļø Sync not yet implemented'));
|
|
94
|
-
console.log(chalk_1.default.gray('Feedback is stored locally in .saferun/feedback.queue'));
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
exports.FeedbackCommand = FeedbackCommand;
|
|
98
|
-
//# sourceMappingURL=feedback.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/commands/feedback.ts"],"names":[],"mappings":"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"}
|