@det-acp/core 0.2.0 → 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 +332 -213
- package/dist/engine/action-registry.d.ts.map +1 -1
- package/dist/engine/action-registry.js +20 -0
- package/dist/engine/action-registry.js.map +1 -1
- package/dist/index.d.ts +11 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/archive-extract.d.ts +45 -0
- package/dist/tools/archive-extract.d.ts.map +1 -0
- package/dist/tools/archive-extract.js +246 -0
- package/dist/tools/archive-extract.js.map +1 -0
- package/dist/tools/directory-create.d.ts +33 -0
- package/dist/tools/directory-create.d.ts.map +1 -0
- package/dist/tools/directory-create.js +145 -0
- package/dist/tools/directory-create.js.map +1 -0
- package/dist/tools/directory-list.d.ts +32 -0
- package/dist/tools/directory-list.d.ts.map +1 -0
- package/dist/tools/directory-list.js +114 -0
- package/dist/tools/directory-list.js.map +1 -0
- package/dist/tools/env-read.d.ts +31 -0
- package/dist/tools/env-read.d.ts.map +1 -0
- package/dist/tools/env-read.js +108 -0
- package/dist/tools/env-read.js.map +1 -0
- package/dist/tools/file-copy.d.ts +30 -0
- package/dist/tools/file-copy.d.ts.map +1 -0
- package/dist/tools/file-copy.js +170 -0
- package/dist/tools/file-copy.js.map +1 -0
- package/dist/tools/file-delete.d.ts +27 -0
- package/dist/tools/file-delete.d.ts.map +1 -0
- package/dist/tools/file-delete.js +143 -0
- package/dist/tools/file-delete.js.map +1 -0
- package/dist/tools/file-move.d.ts +30 -0
- package/dist/tools/file-move.d.ts.map +1 -0
- package/dist/tools/file-move.js +167 -0
- package/dist/tools/file-move.js.map +1 -0
- package/dist/tools/git-commit.d.ts +33 -0
- package/dist/tools/git-commit.d.ts.map +1 -0
- package/dist/tools/git-commit.js +176 -0
- package/dist/tools/git-commit.js.map +1 -0
- package/dist/tools/git-status.d.ts +29 -0
- package/dist/tools/git-status.d.ts.map +1 -0
- package/dist/tools/git-status.js +159 -0
- package/dist/tools/git-status.js.map +1 -0
- package/dist/tools/network-dns.d.ts +50 -0
- package/dist/tools/network-dns.d.ts.map +1 -0
- package/dist/tools/network-dns.js +122 -0
- package/dist/tools/network-dns.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/examples/coding-agent.policy.yaml +44 -0
- package/examples/data-analyst.policy.yaml +160 -0
- package/examples/devops-deploy.policy.yaml +68 -0
- package/examples/infrastructure-manager.policy.yaml +209 -0
- package/examples/security-audit.policy.yaml +152 -0
- package/examples/video-upscaler.policy.yaml +45 -0
- package/package.json +4 -4
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* file:delete — Scoped file deletion tool adapter.
|
|
3
|
+
*
|
|
4
|
+
* Deletes files within allowed path scopes, enforcing policy constraints.
|
|
5
|
+
* Creates a full backup of file contents for rollback support.
|
|
6
|
+
*/
|
|
7
|
+
import fs from 'node:fs';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import crypto from 'node:crypto';
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
import { ToolAdapter } from './base.js';
|
|
12
|
+
import { evaluateAction } from '../policy/evaluator.js';
|
|
13
|
+
export const FileDeleteInputSchema = z.object({
|
|
14
|
+
path: z.string().min(1, 'File path is required'),
|
|
15
|
+
/** If true, do not error when the file does not exist */
|
|
16
|
+
force: z.boolean().default(false),
|
|
17
|
+
});
|
|
18
|
+
export class FileDeleteAdapter extends ToolAdapter {
|
|
19
|
+
name = 'file:delete';
|
|
20
|
+
description = 'Delete a file within allowed path scopes (with backup for rollback)';
|
|
21
|
+
inputSchema = FileDeleteInputSchema;
|
|
22
|
+
validate(input, policy) {
|
|
23
|
+
const parsed = FileDeleteInputSchema.safeParse(input);
|
|
24
|
+
if (!parsed.success) {
|
|
25
|
+
return {
|
|
26
|
+
verdict: 'deny',
|
|
27
|
+
tool: this.name,
|
|
28
|
+
reasons: parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
return evaluateAction({ tool: this.name, input: parsed.data }, policy);
|
|
32
|
+
}
|
|
33
|
+
async dryRun(input, _ctx) {
|
|
34
|
+
const { path: filePath, force } = input;
|
|
35
|
+
const absPath = path.resolve(filePath);
|
|
36
|
+
const exists = fs.existsSync(absPath);
|
|
37
|
+
const warnings = [];
|
|
38
|
+
if (!exists && !force) {
|
|
39
|
+
warnings.push(`File does not exist: ${absPath}`);
|
|
40
|
+
}
|
|
41
|
+
let size = 0;
|
|
42
|
+
if (exists) {
|
|
43
|
+
try {
|
|
44
|
+
const stat = fs.statSync(absPath);
|
|
45
|
+
size = stat.size;
|
|
46
|
+
if (stat.isDirectory()) {
|
|
47
|
+
warnings.push(`Path is a directory, not a file: ${absPath}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
warnings.push(`Cannot stat file: ${absPath}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
tool: this.name,
|
|
56
|
+
wouldDo: exists
|
|
57
|
+
? `Delete file: ${absPath} (${size} bytes)`
|
|
58
|
+
: `No-op: file does not exist: ${absPath}`,
|
|
59
|
+
estimatedChanges: exists ? [absPath] : [],
|
|
60
|
+
warnings,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
async execute(input, ctx) {
|
|
64
|
+
const start = Date.now();
|
|
65
|
+
const { path: filePath, force } = input;
|
|
66
|
+
const absPath = path.resolve(filePath);
|
|
67
|
+
const artifacts = [];
|
|
68
|
+
try {
|
|
69
|
+
const exists = fs.existsSync(absPath);
|
|
70
|
+
if (!exists) {
|
|
71
|
+
if (force) {
|
|
72
|
+
return this.success({ path: absPath, deleted: false, reason: 'File did not exist' }, Date.now() - start);
|
|
73
|
+
}
|
|
74
|
+
return this.failure(`File does not exist: ${absPath}`, Date.now() - start);
|
|
75
|
+
}
|
|
76
|
+
// Verify it's a file, not a directory
|
|
77
|
+
const stat = fs.statSync(absPath);
|
|
78
|
+
if (stat.isDirectory()) {
|
|
79
|
+
return this.failure(`Path is a directory, not a file: ${absPath}`, Date.now() - start);
|
|
80
|
+
}
|
|
81
|
+
// Backup file content for rollback
|
|
82
|
+
const content = fs.readFileSync(absPath);
|
|
83
|
+
const checksum = crypto.createHash('sha256').update(content).digest('hex');
|
|
84
|
+
artifacts.push({
|
|
85
|
+
type: 'checksum',
|
|
86
|
+
value: `sha256:${checksum}`,
|
|
87
|
+
description: `Checksum of deleted file: ${absPath}`,
|
|
88
|
+
});
|
|
89
|
+
artifacts.push({
|
|
90
|
+
type: 'log',
|
|
91
|
+
value: `Deleted: ${absPath} (${stat.size} bytes)`,
|
|
92
|
+
description: 'Deletion record',
|
|
93
|
+
});
|
|
94
|
+
// Store rollback data (full content backup)
|
|
95
|
+
const rollbackKey = `file:delete:${absPath}`;
|
|
96
|
+
ctx.rollbackData[rollbackKey] = {
|
|
97
|
+
path: absPath,
|
|
98
|
+
content: content.toString('base64'),
|
|
99
|
+
mode: stat.mode,
|
|
100
|
+
};
|
|
101
|
+
// Delete the file
|
|
102
|
+
fs.unlinkSync(absPath);
|
|
103
|
+
ctx.budget.filesChanged++;
|
|
104
|
+
return this.success({ path: absPath, deleted: true, size: stat.size }, Date.now() - start, artifacts);
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
return this.failure(err.message, Date.now() - start);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async rollback(input, ctx) {
|
|
111
|
+
const { path: filePath } = input;
|
|
112
|
+
const absPath = path.resolve(filePath);
|
|
113
|
+
const rollbackKey = `file:delete:${absPath}`;
|
|
114
|
+
const rollbackData = ctx.rollbackData[rollbackKey];
|
|
115
|
+
if (!rollbackData) {
|
|
116
|
+
return {
|
|
117
|
+
tool: this.name,
|
|
118
|
+
success: false,
|
|
119
|
+
description: 'No rollback data available',
|
|
120
|
+
error: 'Rollback data not found — execute() may not have been called',
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
// Restore the file from the base64-encoded backup
|
|
125
|
+
const content = Buffer.from(rollbackData.content, 'base64');
|
|
126
|
+
fs.writeFileSync(rollbackData.path, content, { mode: rollbackData.mode });
|
|
127
|
+
return {
|
|
128
|
+
tool: this.name,
|
|
129
|
+
success: true,
|
|
130
|
+
description: `Restored deleted file: ${rollbackData.path}`,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
return {
|
|
135
|
+
tool: this.name,
|
|
136
|
+
success: false,
|
|
137
|
+
description: `Failed to restore deleted file: ${rollbackData.path}`,
|
|
138
|
+
error: err.message,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=file-delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-delete.js","sourceRoot":"","sources":["../../src/tools/file-delete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* file:move — Scoped file move/rename tool adapter.
|
|
3
|
+
*
|
|
4
|
+
* Moves or renames files within allowed path scopes.
|
|
5
|
+
* Both source and destination must be within policy scope.
|
|
6
|
+
* Full rollback support: moves the file back to original location.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
import { ToolAdapter } from './base.js';
|
|
10
|
+
import type { DryRunResult, ExecutionContext, ExecutionResult, Policy, RollbackResult, ValidationResult } from '../types.js';
|
|
11
|
+
export declare const FileMoveInputSchema: z.ZodObject<{
|
|
12
|
+
source: z.ZodString;
|
|
13
|
+
destination: z.ZodString;
|
|
14
|
+
overwrite: z.ZodDefault<z.ZodBoolean>;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
export type FileMoveInput = z.infer<typeof FileMoveInputSchema>;
|
|
17
|
+
export declare class FileMoveAdapter extends ToolAdapter {
|
|
18
|
+
readonly name = "file:move";
|
|
19
|
+
readonly description = "Move or rename a file within allowed path scopes";
|
|
20
|
+
readonly inputSchema: z.ZodObject<{
|
|
21
|
+
source: z.ZodString;
|
|
22
|
+
destination: z.ZodString;
|
|
23
|
+
overwrite: z.ZodDefault<z.ZodBoolean>;
|
|
24
|
+
}, z.core.$strip>;
|
|
25
|
+
validate(input: unknown, policy: Policy): ValidationResult;
|
|
26
|
+
dryRun(input: Record<string, unknown>, _ctx: ExecutionContext): Promise<DryRunResult>;
|
|
27
|
+
execute(input: Record<string, unknown>, ctx: ExecutionContext): Promise<ExecutionResult>;
|
|
28
|
+
rollback(input: Record<string, unknown>, ctx: ExecutionContext): Promise<RollbackResult>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=file-move.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-move.d.ts","sourceRoot":"","sources":["../../src/tools/file-move.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,eAAe,EAEf,MAAM,EACN,cAAc,EACd,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,mBAAmB;;;;iBAK9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,WAAW,sDAAsD;IAC1E,QAAQ,CAAC,WAAW;;;;sBAAuB;IAE3C,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB;IAyCpD,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;IA2BrF,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAmExF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;CA+C/F"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* file:move — Scoped file move/rename tool adapter.
|
|
3
|
+
*
|
|
4
|
+
* Moves or renames files within allowed path scopes.
|
|
5
|
+
* Both source and destination must be within policy scope.
|
|
6
|
+
* Full rollback support: moves the file back to original location.
|
|
7
|
+
*/
|
|
8
|
+
import fs from 'node:fs';
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
import crypto from 'node:crypto';
|
|
11
|
+
import { z } from 'zod';
|
|
12
|
+
import { ToolAdapter } from './base.js';
|
|
13
|
+
import { evaluateAction } from '../policy/evaluator.js';
|
|
14
|
+
export const FileMoveInputSchema = z.object({
|
|
15
|
+
source: z.string().min(1, 'Source path is required'),
|
|
16
|
+
destination: z.string().min(1, 'Destination path is required'),
|
|
17
|
+
/** Overwrite destination if it exists */
|
|
18
|
+
overwrite: z.boolean().default(false),
|
|
19
|
+
});
|
|
20
|
+
export class FileMoveAdapter extends ToolAdapter {
|
|
21
|
+
name = 'file:move';
|
|
22
|
+
description = 'Move or rename a file within allowed path scopes';
|
|
23
|
+
inputSchema = FileMoveInputSchema;
|
|
24
|
+
validate(input, policy) {
|
|
25
|
+
const parsed = FileMoveInputSchema.safeParse(input);
|
|
26
|
+
if (!parsed.success) {
|
|
27
|
+
return {
|
|
28
|
+
verdict: 'deny',
|
|
29
|
+
tool: this.name,
|
|
30
|
+
reasons: parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
// Validate both source and destination paths against the policy
|
|
34
|
+
const sourceResult = evaluateAction({ tool: this.name, input: { ...parsed.data, path: parsed.data.source } }, policy);
|
|
35
|
+
if (sourceResult.verdict === 'deny') {
|
|
36
|
+
return {
|
|
37
|
+
...sourceResult,
|
|
38
|
+
reasons: sourceResult.reasons.map((r) => `Source: ${r}`),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const destResult = evaluateAction({ tool: this.name, input: { ...parsed.data, path: parsed.data.destination } }, policy);
|
|
42
|
+
if (destResult.verdict === 'deny') {
|
|
43
|
+
return {
|
|
44
|
+
...destResult,
|
|
45
|
+
reasons: destResult.reasons.map((r) => `Destination: ${r}`),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// Return the more restrictive result (gate > allow)
|
|
49
|
+
if (sourceResult.verdict === 'gate' || destResult.verdict === 'gate') {
|
|
50
|
+
return sourceResult.verdict === 'gate' ? sourceResult : destResult;
|
|
51
|
+
}
|
|
52
|
+
return sourceResult;
|
|
53
|
+
}
|
|
54
|
+
async dryRun(input, _ctx) {
|
|
55
|
+
const { source, destination, overwrite } = input;
|
|
56
|
+
const absSrc = path.resolve(source);
|
|
57
|
+
const absDest = path.resolve(destination);
|
|
58
|
+
const warnings = [];
|
|
59
|
+
if (!fs.existsSync(absSrc)) {
|
|
60
|
+
warnings.push(`Source file does not exist: ${absSrc}`);
|
|
61
|
+
}
|
|
62
|
+
if (fs.existsSync(absDest) && !overwrite) {
|
|
63
|
+
warnings.push(`Destination already exists and overwrite is false: ${absDest}`);
|
|
64
|
+
}
|
|
65
|
+
const destDir = path.dirname(absDest);
|
|
66
|
+
if (!fs.existsSync(destDir)) {
|
|
67
|
+
warnings.push(`Destination directory does not exist: ${destDir}`);
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
tool: this.name,
|
|
71
|
+
wouldDo: `Move ${absSrc} → ${absDest}`,
|
|
72
|
+
estimatedChanges: [absSrc, absDest],
|
|
73
|
+
warnings,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async execute(input, ctx) {
|
|
77
|
+
const start = Date.now();
|
|
78
|
+
const { source, destination, overwrite } = input;
|
|
79
|
+
const absSrc = path.resolve(source);
|
|
80
|
+
const absDest = path.resolve(destination);
|
|
81
|
+
const artifacts = [];
|
|
82
|
+
try {
|
|
83
|
+
// Check source exists
|
|
84
|
+
if (!fs.existsSync(absSrc)) {
|
|
85
|
+
return this.failure(`Source file does not exist: ${absSrc}`, Date.now() - start);
|
|
86
|
+
}
|
|
87
|
+
// Check destination doesn't exist (unless overwrite)
|
|
88
|
+
let destExisted = false;
|
|
89
|
+
let destPreviousContent = null;
|
|
90
|
+
if (fs.existsSync(absDest)) {
|
|
91
|
+
if (!overwrite) {
|
|
92
|
+
return this.failure(`Destination already exists: ${absDest}. Set overwrite: true to replace.`, Date.now() - start);
|
|
93
|
+
}
|
|
94
|
+
destExisted = true;
|
|
95
|
+
destPreviousContent = fs.readFileSync(absDest, 'base64');
|
|
96
|
+
}
|
|
97
|
+
// Checksum source before move
|
|
98
|
+
const srcContent = fs.readFileSync(absSrc);
|
|
99
|
+
const srcChecksum = crypto.createHash('sha256').update(srcContent).digest('hex');
|
|
100
|
+
artifacts.push({
|
|
101
|
+
type: 'checksum',
|
|
102
|
+
value: `sha256:${srcChecksum}`,
|
|
103
|
+
description: `Checksum of moved file (source: ${absSrc})`,
|
|
104
|
+
});
|
|
105
|
+
artifacts.push({
|
|
106
|
+
type: 'log',
|
|
107
|
+
value: `Moved: ${absSrc} → ${absDest}`,
|
|
108
|
+
description: 'Move record',
|
|
109
|
+
});
|
|
110
|
+
// Store rollback data
|
|
111
|
+
const rollbackKey = `file:move:${absSrc}:${absDest}`;
|
|
112
|
+
ctx.rollbackData[rollbackKey] = {
|
|
113
|
+
source: absSrc,
|
|
114
|
+
destination: absDest,
|
|
115
|
+
destExisted,
|
|
116
|
+
destPreviousContent,
|
|
117
|
+
};
|
|
118
|
+
// Execute the move
|
|
119
|
+
fs.renameSync(absSrc, absDest);
|
|
120
|
+
ctx.budget.filesChanged++;
|
|
121
|
+
return this.success({ source: absSrc, destination: absDest, size: srcContent.length }, Date.now() - start, artifacts);
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
return this.failure(err.message, Date.now() - start);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async rollback(input, ctx) {
|
|
128
|
+
const { source, destination } = input;
|
|
129
|
+
const absSrc = path.resolve(source);
|
|
130
|
+
const absDest = path.resolve(destination);
|
|
131
|
+
const rollbackKey = `file:move:${absSrc}:${absDest}`;
|
|
132
|
+
const rollbackData = ctx.rollbackData[rollbackKey];
|
|
133
|
+
if (!rollbackData) {
|
|
134
|
+
return {
|
|
135
|
+
tool: this.name,
|
|
136
|
+
success: false,
|
|
137
|
+
description: 'No rollback data available',
|
|
138
|
+
error: 'Rollback data not found — execute() may not have been called',
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
// Move file back to original location
|
|
143
|
+
if (fs.existsSync(rollbackData.destination)) {
|
|
144
|
+
fs.renameSync(rollbackData.destination, rollbackData.source);
|
|
145
|
+
}
|
|
146
|
+
// Restore overwritten destination if applicable
|
|
147
|
+
if (rollbackData.destExisted && rollbackData.destPreviousContent !== null) {
|
|
148
|
+
const content = Buffer.from(rollbackData.destPreviousContent, 'base64');
|
|
149
|
+
fs.writeFileSync(rollbackData.destination, content);
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
tool: this.name,
|
|
153
|
+
success: true,
|
|
154
|
+
description: `Moved ${rollbackData.destination} back to ${rollbackData.source}`,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
return {
|
|
159
|
+
tool: this.name,
|
|
160
|
+
success: false,
|
|
161
|
+
description: `Failed to rollback file move`,
|
|
162
|
+
error: err.message,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=file-move.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-move.js","sourceRoot":"","sources":["../../src/tools/file-move.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* git:commit — Scoped git commit tool adapter.
|
|
3
|
+
*
|
|
4
|
+
* Stages and commits changes in a repository.
|
|
5
|
+
* Rollback support via git revert.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { ToolAdapter } from './base.js';
|
|
9
|
+
import type { DryRunResult, ExecutionContext, ExecutionResult, Policy, RollbackResult, ValidationResult } from '../types.js';
|
|
10
|
+
export declare const GitCommitInputSchema: z.ZodObject<{
|
|
11
|
+
repo: z.ZodString;
|
|
12
|
+
message: z.ZodString;
|
|
13
|
+
paths: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
14
|
+
stageAll: z.ZodDefault<z.ZodBoolean>;
|
|
15
|
+
author: z.ZodOptional<z.ZodString>;
|
|
16
|
+
}, z.core.$strip>;
|
|
17
|
+
export type GitCommitInput = z.infer<typeof GitCommitInputSchema>;
|
|
18
|
+
export declare class GitCommitAdapter extends ToolAdapter {
|
|
19
|
+
readonly name = "git:commit";
|
|
20
|
+
readonly description = "Stage and commit changes in a git repository";
|
|
21
|
+
readonly inputSchema: z.ZodObject<{
|
|
22
|
+
repo: z.ZodString;
|
|
23
|
+
message: z.ZodString;
|
|
24
|
+
paths: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
25
|
+
stageAll: z.ZodDefault<z.ZodBoolean>;
|
|
26
|
+
author: z.ZodOptional<z.ZodString>;
|
|
27
|
+
}, z.core.$strip>;
|
|
28
|
+
validate(input: unknown, policy: Policy): ValidationResult;
|
|
29
|
+
dryRun(input: Record<string, unknown>, _ctx: ExecutionContext): Promise<DryRunResult>;
|
|
30
|
+
execute(input: Record<string, unknown>, ctx: ExecutionContext): Promise<ExecutionResult>;
|
|
31
|
+
rollback(input: Record<string, unknown>, ctx: ExecutionContext): Promise<RollbackResult>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=git-commit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-commit.d.ts","sourceRoot":"","sources":["../../src/tools/git-commit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,eAAe,EAEf,MAAM,EACN,cAAc,EACd,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,oBAAoB;;;;;;iBAS/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,WAAW,kDAAkD;IACtE,QAAQ,CAAC,WAAW;;;;;;sBAAwB;IAE5C,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB;IAgBpD,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;IA2BrF,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IA8ExF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;CA4D/F"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* git:commit — Scoped git commit tool adapter.
|
|
3
|
+
*
|
|
4
|
+
* Stages and commits changes in a repository.
|
|
5
|
+
* Rollback support via git revert.
|
|
6
|
+
*/
|
|
7
|
+
import { execSync } from 'node:child_process';
|
|
8
|
+
import crypto from 'node:crypto';
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { ToolAdapter } from './base.js';
|
|
11
|
+
import { evaluateAction } from '../policy/evaluator.js';
|
|
12
|
+
export const GitCommitInputSchema = z.object({
|
|
13
|
+
repo: z.string().min(1, 'Repository path is required'),
|
|
14
|
+
message: z.string().min(1, 'Commit message is required'),
|
|
15
|
+
/** Paths to stage before committing. If empty, commits currently staged changes. */
|
|
16
|
+
paths: z.array(z.string()).optional(),
|
|
17
|
+
/** Stage all tracked changes (git add -u) before committing */
|
|
18
|
+
stageAll: z.boolean().default(false),
|
|
19
|
+
/** Author override in "Name <email>" format */
|
|
20
|
+
author: z.string().optional(),
|
|
21
|
+
});
|
|
22
|
+
export class GitCommitAdapter extends ToolAdapter {
|
|
23
|
+
name = 'git:commit';
|
|
24
|
+
description = 'Stage and commit changes in a git repository';
|
|
25
|
+
inputSchema = GitCommitInputSchema;
|
|
26
|
+
validate(input, policy) {
|
|
27
|
+
const parsed = GitCommitInputSchema.safeParse(input);
|
|
28
|
+
if (!parsed.success) {
|
|
29
|
+
return {
|
|
30
|
+
verdict: 'deny',
|
|
31
|
+
tool: this.name,
|
|
32
|
+
reasons: parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return evaluateAction({ tool: this.name, input: parsed.data }, policy);
|
|
36
|
+
}
|
|
37
|
+
async dryRun(input, _ctx) {
|
|
38
|
+
const { repo, message, paths, stageAll } = input;
|
|
39
|
+
const warnings = [];
|
|
40
|
+
try {
|
|
41
|
+
// Check if there are changes to commit
|
|
42
|
+
const status = execSync('git status --porcelain', {
|
|
43
|
+
cwd: repo,
|
|
44
|
+
encoding: 'utf-8',
|
|
45
|
+
timeout: 10000,
|
|
46
|
+
}).trim();
|
|
47
|
+
if (!status && !paths?.length && !stageAll) {
|
|
48
|
+
warnings.push('No changes detected to commit');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
warnings.push(`Cannot check git status: ${err.message}`);
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
tool: this.name,
|
|
56
|
+
wouldDo: `Commit to ${repo}: "${message.slice(0, 72)}"${stageAll ? ' (staging all)' : ''}`,
|
|
57
|
+
estimatedChanges: [`Git commit in ${repo}`],
|
|
58
|
+
warnings,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
async execute(input, ctx) {
|
|
62
|
+
const start = Date.now();
|
|
63
|
+
const { repo, message, paths, stageAll, author } = input;
|
|
64
|
+
const artifacts = [];
|
|
65
|
+
try {
|
|
66
|
+
// Stage changes
|
|
67
|
+
if (paths && paths.length > 0) {
|
|
68
|
+
const sanitizedPaths = paths.map((p) => `"${p}"`).join(' ');
|
|
69
|
+
execSync(`git add ${sanitizedPaths}`, {
|
|
70
|
+
cwd: repo,
|
|
71
|
+
encoding: 'utf-8',
|
|
72
|
+
timeout: 10000,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
else if (stageAll) {
|
|
76
|
+
execSync('git add -u', {
|
|
77
|
+
cwd: repo,
|
|
78
|
+
encoding: 'utf-8',
|
|
79
|
+
timeout: 10000,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
// Build commit command
|
|
83
|
+
let commitCmd = `git commit -m "${message.replace(/"/g, '\\"')}"`;
|
|
84
|
+
if (author) {
|
|
85
|
+
commitCmd += ` --author="${author.replace(/"/g, '\\"')}"`;
|
|
86
|
+
}
|
|
87
|
+
const output = execSync(commitCmd, {
|
|
88
|
+
cwd: repo,
|
|
89
|
+
encoding: 'utf-8',
|
|
90
|
+
timeout: 30000,
|
|
91
|
+
});
|
|
92
|
+
// Get the commit hash
|
|
93
|
+
const commitHash = execSync('git rev-parse HEAD', {
|
|
94
|
+
cwd: repo,
|
|
95
|
+
encoding: 'utf-8',
|
|
96
|
+
timeout: 5000,
|
|
97
|
+
}).trim();
|
|
98
|
+
const messageHash = crypto.createHash('sha256').update(message).digest('hex');
|
|
99
|
+
artifacts.push({
|
|
100
|
+
type: 'checksum',
|
|
101
|
+
value: `commit:${commitHash}`,
|
|
102
|
+
description: `Commit hash`,
|
|
103
|
+
});
|
|
104
|
+
artifacts.push({
|
|
105
|
+
type: 'checksum',
|
|
106
|
+
value: `message:sha256:${messageHash}`,
|
|
107
|
+
description: 'Commit message hash',
|
|
108
|
+
});
|
|
109
|
+
artifacts.push({
|
|
110
|
+
type: 'log',
|
|
111
|
+
value: output.trim().slice(0, 4096),
|
|
112
|
+
description: 'Git commit output',
|
|
113
|
+
});
|
|
114
|
+
// Store rollback data
|
|
115
|
+
const rollbackKey = `git:commit:${repo}:${commitHash}`;
|
|
116
|
+
ctx.rollbackData[rollbackKey] = {
|
|
117
|
+
repo,
|
|
118
|
+
commitHash,
|
|
119
|
+
};
|
|
120
|
+
return this.success({ commitHash, message, repo }, Date.now() - start, artifacts);
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
return this.failure(err.message, Date.now() - start);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
async rollback(input, ctx) {
|
|
127
|
+
const { repo } = input;
|
|
128
|
+
// Find the rollback data by searching for the repo key prefix
|
|
129
|
+
const rollbackKey = Object.keys(ctx.rollbackData).find((k) => k.startsWith(`git:commit:${repo}:`));
|
|
130
|
+
if (!rollbackKey) {
|
|
131
|
+
return {
|
|
132
|
+
tool: this.name,
|
|
133
|
+
success: false,
|
|
134
|
+
description: 'No rollback data available',
|
|
135
|
+
error: 'Rollback data not found — execute() may not have been called',
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
const rollbackData = ctx.rollbackData[rollbackKey];
|
|
139
|
+
try {
|
|
140
|
+
// Verify HEAD is still the commit we made
|
|
141
|
+
const currentHead = execSync('git rev-parse HEAD', {
|
|
142
|
+
cwd: rollbackData.repo,
|
|
143
|
+
encoding: 'utf-8',
|
|
144
|
+
timeout: 5000,
|
|
145
|
+
}).trim();
|
|
146
|
+
if (currentHead !== rollbackData.commitHash) {
|
|
147
|
+
return {
|
|
148
|
+
tool: this.name,
|
|
149
|
+
success: false,
|
|
150
|
+
description: 'Cannot rollback — HEAD has moved since the commit was made',
|
|
151
|
+
error: `Expected HEAD ${rollbackData.commitHash}, found ${currentHead}`,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
// Soft reset to undo the commit while keeping changes staged
|
|
155
|
+
execSync('git reset --soft HEAD~1', {
|
|
156
|
+
cwd: rollbackData.repo,
|
|
157
|
+
encoding: 'utf-8',
|
|
158
|
+
timeout: 10000,
|
|
159
|
+
});
|
|
160
|
+
return {
|
|
161
|
+
tool: this.name,
|
|
162
|
+
success: true,
|
|
163
|
+
description: `Rolled back commit ${rollbackData.commitHash} (changes are staged)`,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
return {
|
|
168
|
+
tool: this.name,
|
|
169
|
+
success: false,
|
|
170
|
+
description: `Failed to rollback git commit`,
|
|
171
|
+
error: err.message,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=git-commit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-commit.js","sourceRoot":"","sources":["../../src/tools/git-commit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* git:status — Read-only git status tool adapter.
|
|
3
|
+
*
|
|
4
|
+
* Reports the working tree status of a git repository.
|
|
5
|
+
* Read-only operation — no rollback needed.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { ToolAdapter } from './base.js';
|
|
9
|
+
import type { DryRunResult, ExecutionContext, ExecutionResult, Policy, RollbackResult, ValidationResult } from '../types.js';
|
|
10
|
+
export declare const GitStatusInputSchema: z.ZodObject<{
|
|
11
|
+
repo: z.ZodString;
|
|
12
|
+
short: z.ZodDefault<z.ZodBoolean>;
|
|
13
|
+
branch: z.ZodDefault<z.ZodBoolean>;
|
|
14
|
+
}, z.core.$strip>;
|
|
15
|
+
export type GitStatusInput = z.infer<typeof GitStatusInputSchema>;
|
|
16
|
+
export declare class GitStatusAdapter extends ToolAdapter {
|
|
17
|
+
readonly name = "git:status";
|
|
18
|
+
readonly description = "Get git working tree status for a repository";
|
|
19
|
+
readonly inputSchema: z.ZodObject<{
|
|
20
|
+
repo: z.ZodString;
|
|
21
|
+
short: z.ZodDefault<z.ZodBoolean>;
|
|
22
|
+
branch: z.ZodDefault<z.ZodBoolean>;
|
|
23
|
+
}, z.core.$strip>;
|
|
24
|
+
validate(input: unknown, policy: Policy): ValidationResult;
|
|
25
|
+
dryRun(input: Record<string, unknown>, _ctx: ExecutionContext): Promise<DryRunResult>;
|
|
26
|
+
execute(input: Record<string, unknown>, _ctx: ExecutionContext): Promise<ExecutionResult>;
|
|
27
|
+
rollback(_input: Record<string, unknown>, _ctx: ExecutionContext): Promise<RollbackResult>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=git-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-status.d.ts","sourceRoot":"","sources":["../../src/tools/git-status.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,MAAM,EACN,cAAc,EACd,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,oBAAoB;;;;iBAM/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAQlE,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,WAAW,kDAAkD;IACtE,QAAQ,CAAC,WAAW;;;;sBAAwB;IAE5C,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB;IAgBpD,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;IAUrF,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAoHzF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;CAOjG"}
|