ai-fs-permissions 0.1.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 +223 -0
- package/dist/checker.d.ts +6 -0
- package/dist/checker.d.ts.map +1 -0
- package/dist/checker.js +86 -0
- package/dist/checker.js.map +1 -0
- package/dist/cli-args.d.ts +25 -0
- package/dist/cli-args.d.ts.map +1 -0
- package/dist/cli-args.js +79 -0
- package/dist/cli-args.js.map +1 -0
- package/dist/cli-help.d.ts +2 -0
- package/dist/cli-help.d.ts.map +1 -0
- package/dist/cli-help.js +54 -0
- package/dist/cli-help.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +83 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/loader.d.ts +22 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +133 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +102 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +24 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/exit-codes.d.ts +12 -0
- package/dist/exit-codes.d.ts.map +1 -0
- package/dist/exit-codes.js +12 -0
- package/dist/exit-codes.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/matcher/glob.d.ts +5 -0
- package/dist/matcher/glob.d.ts.map +1 -0
- package/dist/matcher/glob.js +18 -0
- package/dist/matcher/glob.js.map +1 -0
- package/dist/matcher/index.d.ts +8 -0
- package/dist/matcher/index.d.ts.map +1 -0
- package/dist/matcher/index.js +14 -0
- package/dist/matcher/index.js.map +1 -0
- package/dist/matcher/regex.d.ts +5 -0
- package/dist/matcher/regex.d.ts.map +1 -0
- package/dist/matcher/regex.js +16 -0
- package/dist/matcher/regex.js.map +1 -0
- package/dist/output.d.ts +18 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +44 -0
- package/dist/output.js.map +1 -0
- package/dist/stdin.d.ts +21 -0
- package/dist/stdin.d.ts.map +1 -0
- package/dist/stdin.js +127 -0
- package/dist/stdin.js.map +1 -0
- package/dist/types.d.ts +60 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/package.json +75 -0
package/dist/stdin.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { TOOL_OPERATIONS } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Type-safe property check
|
|
4
|
+
*/
|
|
5
|
+
function hasProperty(obj, key) {
|
|
6
|
+
return Object.prototype.hasOwnProperty.call(obj, key);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Type-safe property access
|
|
10
|
+
*/
|
|
11
|
+
function getProperty(obj, key) {
|
|
12
|
+
const entries = Object.entries(obj);
|
|
13
|
+
for (const entry of entries) {
|
|
14
|
+
if (entry[0] === key) {
|
|
15
|
+
return entry[1];
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Extracts file path from various JSON structures
|
|
22
|
+
*/
|
|
23
|
+
function extractPathFromJson(parsed) {
|
|
24
|
+
// Claude Code format: { tool_input: { file_path: "..." } }
|
|
25
|
+
if (hasProperty(parsed, 'tool_input')) {
|
|
26
|
+
const toolInput = getProperty(parsed, 'tool_input');
|
|
27
|
+
if (typeof toolInput === 'object' && toolInput !== null) {
|
|
28
|
+
// Check for file_path (Read, Write, Edit tools)
|
|
29
|
+
if (hasProperty(toolInput, 'file_path')) {
|
|
30
|
+
const filePath = getProperty(toolInput, 'file_path');
|
|
31
|
+
if (typeof filePath === 'string') {
|
|
32
|
+
return filePath;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Check for path (Glob tool)
|
|
36
|
+
if (hasProperty(toolInput, 'path')) {
|
|
37
|
+
const path = getProperty(toolInput, 'path');
|
|
38
|
+
if (typeof path === 'string') {
|
|
39
|
+
return path;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Check for notebook_path (NotebookEdit tool)
|
|
43
|
+
if (hasProperty(toolInput, 'notebook_path')) {
|
|
44
|
+
const notebookPath = getProperty(toolInput, 'notebook_path');
|
|
45
|
+
if (typeof notebookPath === 'string') {
|
|
46
|
+
return notebookPath;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Generic JSON formats
|
|
52
|
+
const pathKeys = ['file_path', 'path', 'filePath', 'file', 'notebook_path'];
|
|
53
|
+
for (const key of pathKeys) {
|
|
54
|
+
if (hasProperty(parsed, key)) {
|
|
55
|
+
const value = getProperty(parsed, key);
|
|
56
|
+
if (typeof value === 'string') {
|
|
57
|
+
return value;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Extracts tool name from JSON input
|
|
65
|
+
*/
|
|
66
|
+
function extractToolFromJson(parsed) {
|
|
67
|
+
// Check for tool_name field
|
|
68
|
+
if (hasProperty(parsed, 'tool_name')) {
|
|
69
|
+
const toolName = getProperty(parsed, 'tool_name');
|
|
70
|
+
if (typeof toolName === 'string') {
|
|
71
|
+
return toolName;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Check for tool field
|
|
75
|
+
if (hasProperty(parsed, 'tool')) {
|
|
76
|
+
const tool = getProperty(parsed, 'tool');
|
|
77
|
+
if (typeof tool === 'string') {
|
|
78
|
+
return tool;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Parses stdin input and extracts file path
|
|
85
|
+
*/
|
|
86
|
+
export function parseStdin(input) {
|
|
87
|
+
const trimmed = input.trim();
|
|
88
|
+
// Try JSON parsing first
|
|
89
|
+
if (trimmed.startsWith('{')) {
|
|
90
|
+
try {
|
|
91
|
+
const parsed = JSON.parse(trimmed);
|
|
92
|
+
if (typeof parsed === 'object' && parsed !== null) {
|
|
93
|
+
const path = extractPathFromJson(parsed);
|
|
94
|
+
const tool = extractToolFromJson(parsed);
|
|
95
|
+
const inferredOperation = tool ? TOOL_OPERATIONS[tool] : undefined;
|
|
96
|
+
return { path, tool: tool ?? undefined, inferredOperation };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// Not valid JSON, fall through to plain text
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Plain text - treat as file path
|
|
104
|
+
return { path: trimmed || null };
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Reads stdin asynchronously
|
|
108
|
+
*/
|
|
109
|
+
export async function readStdin() {
|
|
110
|
+
return new Promise((resolve, reject) => {
|
|
111
|
+
let data = '';
|
|
112
|
+
process.stdin.setEncoding('utf8');
|
|
113
|
+
process.stdin.on('data', chunk => {
|
|
114
|
+
data += chunk;
|
|
115
|
+
});
|
|
116
|
+
process.stdin.on('end', () => {
|
|
117
|
+
resolve(data);
|
|
118
|
+
});
|
|
119
|
+
process.stdin.on('error', err => {
|
|
120
|
+
reject(err);
|
|
121
|
+
});
|
|
122
|
+
if (process.stdin.isTTY) {
|
|
123
|
+
resolve('');
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=stdin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdin.js","sourceRoot":"","sources":["../src/stdin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkB,MAAM,YAAY,CAAA;AAc5D;;GAEG;AACH,SAAS,WAAW,CAAC,GAAW,EAAE,GAAW;IAC3C,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;AACvD,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,GAAW,EAAE,GAAW;IAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACnC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,MAAc;IACzC,2DAA2D;IAC3D,IAAI,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;QACnD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACxD,gDAAgD;YAChD,IAAI,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC;gBACxC,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;gBACpD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBACjC,OAAO,QAAQ,CAAA;gBACjB,CAAC;YACH,CAAC;YACD,6BAA6B;YAC7B,IAAI,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;gBAC3C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC7B,OAAO,IAAI,CAAA;gBACb,CAAC;YACH,CAAC;YACD,8CAA8C;YAC9C,IAAI,WAAW,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC;gBAC5C,MAAM,YAAY,GAAG,WAAW,CAAC,SAAS,EAAE,eAAe,CAAC,CAAA;gBAC5D,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;oBACrC,OAAO,YAAY,CAAA;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,MAAM,QAAQ,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,CAAC,CAAA;IAC3E,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;YACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,OAAO,KAAK,CAAA;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,MAAc;IACzC,4BAA4B;IAC5B,IAAI,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;QACjD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,QAAQ,CAAA;QACjB,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QACxC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAE5B,yBAAyB;IACzB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAC3C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAClD,MAAM,IAAI,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAA;gBACxC,MAAM,IAAI,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAA;gBACxC,MAAM,iBAAiB,GAAG,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;gBAElE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,SAAS,EAAE,iBAAiB,EAAE,CAAA;YAC7D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,6CAA6C;QAC/C,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,CAAA;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,IAAI,GAAG,EAAE,CAAA;QAEb,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;QAEjC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;YAC/B,IAAI,IAAI,KAAK,CAAA;QACf,CAAC,CAAC,CAAA;QAEF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YAC3B,OAAO,CAAC,IAAI,CAAC,CAAA;QACf,CAAC,CAAC,CAAA;QAEF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE;YAC9B,MAAM,CAAC,GAAG,CAAC,CAAA;QACb,CAAC,CAAC,CAAA;QAEF,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO,CAAC,EAAE,CAAC,CAAA;QACb,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Access levels for file permissions
|
|
3
|
+
*/
|
|
4
|
+
export type AccessLevel = 'none' | 'read' | 'write' | 'readwrite';
|
|
5
|
+
/**
|
|
6
|
+
* Operation types that can be checked
|
|
7
|
+
*/
|
|
8
|
+
export type Operation = 'read' | 'write';
|
|
9
|
+
/**
|
|
10
|
+
* Pattern type for matching paths
|
|
11
|
+
*/
|
|
12
|
+
export type PatternType = 'glob' | 'regex';
|
|
13
|
+
/**
|
|
14
|
+
* A single permission rule
|
|
15
|
+
*/
|
|
16
|
+
export interface Rule {
|
|
17
|
+
/** Path pattern to match */
|
|
18
|
+
path: string;
|
|
19
|
+
/** Pattern type (default: glob) */
|
|
20
|
+
type: PatternType;
|
|
21
|
+
/** Access level for this path */
|
|
22
|
+
access: AccessLevel;
|
|
23
|
+
/** Human-readable reason for this rule */
|
|
24
|
+
reason?: string;
|
|
25
|
+
/** Whether this is a negation rule (starts with !) */
|
|
26
|
+
negated: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Configuration file structure
|
|
30
|
+
*/
|
|
31
|
+
export interface Config {
|
|
32
|
+
/** Config version */
|
|
33
|
+
version: number;
|
|
34
|
+
/** Whether to extend user config (default: true) */
|
|
35
|
+
extends: boolean;
|
|
36
|
+
/** Permission rules */
|
|
37
|
+
rules: Rule[];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Result of a permission check
|
|
41
|
+
*/
|
|
42
|
+
export interface CheckResult {
|
|
43
|
+
/** Whether the operation is allowed */
|
|
44
|
+
allowed: boolean;
|
|
45
|
+
/** The path that was checked */
|
|
46
|
+
path: string;
|
|
47
|
+
/** The operation that was checked */
|
|
48
|
+
operation: Operation;
|
|
49
|
+
/** The rule that matched (if any) */
|
|
50
|
+
rule?: string;
|
|
51
|
+
/** The access level of the matching rule */
|
|
52
|
+
access?: AccessLevel;
|
|
53
|
+
/** Human-readable message */
|
|
54
|
+
message: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Tool name to operation mapping
|
|
58
|
+
*/
|
|
59
|
+
export declare const TOOL_OPERATIONS: Record<string, Operation>;
|
|
60
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,CAAA;AAEjE;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,CAAA;AAExC;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,CAAA;AAE1C;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,mCAAmC;IACnC,IAAI,EAAE,WAAW,CAAA;IACjB,iCAAiC;IACjC,MAAM,EAAE,WAAW,CAAA;IACnB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,sDAAsD;IACtD,OAAO,EAAE,OAAO,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,oDAAoD;IACpD,OAAO,EAAE,OAAO,CAAA;IAChB,uBAAuB;IACvB,KAAK,EAAE,IAAI,EAAE,CAAA;CACd;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAA;IAChB,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,qCAAqC;IACrC,SAAS,EAAE,SAAS,CAAA;IACpB,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,4CAA4C;IAC5C,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAOrD,CAAA"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA6DA;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAA8B;IACxD,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,OAAO;IACd,YAAY,EAAE,OAAO;CACtB,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ai-fs-permissions",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI tool to enforce file system permissions for AI agents. Protects sensitive files and folders from unauthorized access.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"ai-fs-permissions": "./dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"keywords": [
|
|
21
|
+
"file-permissions",
|
|
22
|
+
"ai-safety",
|
|
23
|
+
"claude-code",
|
|
24
|
+
"gemini-cli",
|
|
25
|
+
"cursor",
|
|
26
|
+
"agent-governance",
|
|
27
|
+
"security",
|
|
28
|
+
"cli"
|
|
29
|
+
],
|
|
30
|
+
"author": "",
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=20.0.0"
|
|
34
|
+
},
|
|
35
|
+
"publishConfig": {
|
|
36
|
+
"access": "public"
|
|
37
|
+
},
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "https://github.com/tupe12334/ai-fs-permissions.git"
|
|
41
|
+
},
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/tupe12334/ai-fs-permissions/issues"
|
|
44
|
+
},
|
|
45
|
+
"homepage": "https://github.com/tupe12334/ai-fs-permissions#readme",
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"minimatch": "^10.0.0",
|
|
48
|
+
"picomatch": "^4.0.0",
|
|
49
|
+
"yaml": "^2.7.0",
|
|
50
|
+
"zod": "^3.24.0"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@eslint/js": "^9.39.2",
|
|
54
|
+
"@types/node": "^22.0.0",
|
|
55
|
+
"@types/picomatch": "^3.0.0",
|
|
56
|
+
"@vitest/coverage-v8": "^3.0.0",
|
|
57
|
+
"eslint": "^9.0.0",
|
|
58
|
+
"husky": "^9.0.0",
|
|
59
|
+
"prettier": "^3.0.0",
|
|
60
|
+
"typescript": "^5.0.0",
|
|
61
|
+
"typescript-eslint": "^8.53.1",
|
|
62
|
+
"vitest": "^3.0.0"
|
|
63
|
+
},
|
|
64
|
+
"scripts": {
|
|
65
|
+
"build": "tsc",
|
|
66
|
+
"dev": "tsc --watch",
|
|
67
|
+
"test": "vitest",
|
|
68
|
+
"test:watch": "vitest --watch",
|
|
69
|
+
"test:coverage": "vitest --coverage",
|
|
70
|
+
"lint": "eslint .",
|
|
71
|
+
"lint:fix": "eslint . --fix",
|
|
72
|
+
"format": "prettier --write \"src/**/*.{ts,tsx,js,jsx,json,md}\"",
|
|
73
|
+
"format:check": "prettier --check \"src/**/*.{ts,tsx,js,jsx,json,md}\""
|
|
74
|
+
}
|
|
75
|
+
}
|