@dotsetlabs/tollgate 0.2.2 → 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.
Files changed (194) hide show
  1. package/README.md +138 -0
  2. package/dist/analyzers/filesystem.d.ts +5 -0
  3. package/dist/analyzers/filesystem.d.ts.map +1 -1
  4. package/dist/analyzers/filesystem.js +61 -7
  5. package/dist/analyzers/filesystem.js.map +1 -1
  6. package/dist/analyzers/loader.d.ts +5 -0
  7. package/dist/analyzers/loader.d.ts.map +1 -1
  8. package/dist/analyzers/loader.js +112 -6
  9. package/dist/analyzers/loader.js.map +1 -1
  10. package/dist/analyzers/prompt-injection.d.ts +1 -0
  11. package/dist/analyzers/prompt-injection.d.ts.map +1 -1
  12. package/dist/analyzers/prompt-injection.js +48 -2
  13. package/dist/analyzers/prompt-injection.js.map +1 -1
  14. package/dist/analyzers/shell.d.ts +8 -0
  15. package/dist/analyzers/shell.d.ts.map +1 -1
  16. package/dist/analyzers/shell.js +109 -8
  17. package/dist/analyzers/shell.js.map +1 -1
  18. package/dist/analyzers/sql.d.ts.map +1 -1
  19. package/dist/analyzers/sql.js +8 -7
  20. package/dist/analyzers/sql.js.map +1 -1
  21. package/dist/approval/interactive.d.ts +1 -1
  22. package/dist/approval/interactive.d.ts.map +1 -1
  23. package/dist/approval/interactive.js +13 -1
  24. package/dist/approval/interactive.js.map +1 -1
  25. package/dist/approval/rate-limiter.d.ts +115 -0
  26. package/dist/approval/rate-limiter.d.ts.map +1 -0
  27. package/dist/approval/rate-limiter.js +200 -0
  28. package/dist/approval/rate-limiter.js.map +1 -0
  29. package/dist/approval/url-validator.d.ts +51 -0
  30. package/dist/approval/url-validator.d.ts.map +1 -0
  31. package/dist/approval/url-validator.js +184 -0
  32. package/dist/approval/url-validator.js.map +1 -0
  33. package/dist/approval/webhook.d.ts +48 -0
  34. package/dist/approval/webhook.d.ts.map +1 -1
  35. package/dist/approval/webhook.js +89 -0
  36. package/dist/approval/webhook.js.map +1 -1
  37. package/dist/audit/integrity.d.ts +107 -0
  38. package/dist/audit/integrity.d.ts.map +1 -0
  39. package/dist/audit/integrity.js +191 -0
  40. package/dist/audit/integrity.js.map +1 -0
  41. package/dist/audit/logger.d.ts.map +1 -1
  42. package/dist/audit/logger.js +6 -5
  43. package/dist/audit/logger.js.map +1 -1
  44. package/dist/audit/redaction.js +6 -4
  45. package/dist/audit/redaction.js.map +1 -1
  46. package/dist/cli/commands/guard.d.ts +97 -0
  47. package/dist/cli/commands/guard.d.ts.map +1 -0
  48. package/dist/cli/commands/guard.js +456 -0
  49. package/dist/cli/commands/guard.js.map +1 -0
  50. package/dist/cli/commands/serve.js +1 -1
  51. package/dist/cli/commands/serve.js.map +1 -1
  52. package/dist/cli/index.js +3 -0
  53. package/dist/cli/index.js.map +1 -1
  54. package/dist/cli/input-validation.d.ts +83 -0
  55. package/dist/cli/input-validation.d.ts.map +1 -0
  56. package/dist/cli/input-validation.js +237 -0
  57. package/dist/cli/input-validation.js.map +1 -0
  58. package/dist/cli/ui.js +2 -2
  59. package/dist/cli/ui.js.map +1 -1
  60. package/dist/guard/alternatives/index.d.ts +68 -0
  61. package/dist/guard/alternatives/index.d.ts.map +1 -0
  62. package/dist/guard/alternatives/index.js +224 -0
  63. package/dist/guard/alternatives/index.js.map +1 -0
  64. package/dist/guard/alternatives/registry.d.ts +16 -0
  65. package/dist/guard/alternatives/registry.d.ts.map +1 -0
  66. package/dist/guard/alternatives/registry.js +518 -0
  67. package/dist/guard/alternatives/registry.js.map +1 -0
  68. package/dist/guard/alternatives/types.d.ts +86 -0
  69. package/dist/guard/alternatives/types.d.ts.map +1 -0
  70. package/dist/guard/alternatives/types.js +5 -0
  71. package/dist/guard/alternatives/types.js.map +1 -0
  72. package/dist/guard/approval/enhanced-terminal.d.ts +110 -0
  73. package/dist/guard/approval/enhanced-terminal.d.ts.map +1 -0
  74. package/dist/guard/approval/enhanced-terminal.js +387 -0
  75. package/dist/guard/approval/enhanced-terminal.js.map +1 -0
  76. package/dist/guard/config.d.ts +80 -0
  77. package/dist/guard/config.d.ts.map +1 -0
  78. package/dist/guard/config.js +260 -0
  79. package/dist/guard/config.js.map +1 -0
  80. package/dist/guard/context/directory.d.ts +35 -0
  81. package/dist/guard/context/directory.d.ts.map +1 -0
  82. package/dist/guard/context/directory.js +243 -0
  83. package/dist/guard/context/directory.js.map +1 -0
  84. package/dist/guard/context/environment.d.ts +31 -0
  85. package/dist/guard/context/environment.d.ts.map +1 -0
  86. package/dist/guard/context/environment.js +204 -0
  87. package/dist/guard/context/environment.js.map +1 -0
  88. package/dist/guard/context/git.d.ts +52 -0
  89. package/dist/guard/context/git.d.ts.map +1 -0
  90. package/dist/guard/context/git.js +278 -0
  91. package/dist/guard/context/git.js.map +1 -0
  92. package/dist/guard/context/index.d.ts +64 -0
  93. package/dist/guard/context/index.d.ts.map +1 -0
  94. package/dist/guard/context/index.js +227 -0
  95. package/dist/guard/context/index.js.map +1 -0
  96. package/dist/guard/context/project.d.ts +47 -0
  97. package/dist/guard/context/project.d.ts.map +1 -0
  98. package/dist/guard/context/project.js +281 -0
  99. package/dist/guard/context/project.js.map +1 -0
  100. package/dist/guard/context/types.d.ts +152 -0
  101. package/dist/guard/context/types.d.ts.map +1 -0
  102. package/dist/guard/context/types.js +7 -0
  103. package/dist/guard/context/types.js.map +1 -0
  104. package/dist/guard/engine.d.ts +107 -0
  105. package/dist/guard/engine.d.ts.map +1 -0
  106. package/dist/guard/engine.js +430 -0
  107. package/dist/guard/engine.js.map +1 -0
  108. package/dist/guard/enhanced-engine.d.ts +151 -0
  109. package/dist/guard/enhanced-engine.d.ts.map +1 -0
  110. package/dist/guard/enhanced-engine.js +622 -0
  111. package/dist/guard/enhanced-engine.js.map +1 -0
  112. package/dist/guard/hooks/index.d.ts +50 -0
  113. package/dist/guard/hooks/index.d.ts.map +1 -0
  114. package/dist/guard/hooks/index.js +325 -0
  115. package/dist/guard/hooks/index.js.map +1 -0
  116. package/dist/guard/index.d.ts +29 -0
  117. package/dist/guard/index.d.ts.map +1 -0
  118. package/dist/guard/index.js +31 -0
  119. package/dist/guard/index.js.map +1 -0
  120. package/dist/guard/learning/index.d.ts +136 -0
  121. package/dist/guard/learning/index.d.ts.map +1 -0
  122. package/dist/guard/learning/index.js +314 -0
  123. package/dist/guard/learning/index.js.map +1 -0
  124. package/dist/guard/learning/pattern-extractor.d.ts +50 -0
  125. package/dist/guard/learning/pattern-extractor.d.ts.map +1 -0
  126. package/dist/guard/learning/pattern-extractor.js +372 -0
  127. package/dist/guard/learning/pattern-extractor.js.map +1 -0
  128. package/dist/guard/learning/rule-suggester.d.ts +67 -0
  129. package/dist/guard/learning/rule-suggester.d.ts.map +1 -0
  130. package/dist/guard/learning/rule-suggester.js +345 -0
  131. package/dist/guard/learning/rule-suggester.js.map +1 -0
  132. package/dist/guard/learning/types.d.ts +211 -0
  133. package/dist/guard/learning/types.d.ts.map +1 -0
  134. package/dist/guard/learning/types.js +18 -0
  135. package/dist/guard/learning/types.js.map +1 -0
  136. package/dist/guard/preview/effects.d.ts +15 -0
  137. package/dist/guard/preview/effects.d.ts.map +1 -0
  138. package/dist/guard/preview/effects.js +413 -0
  139. package/dist/guard/preview/effects.js.map +1 -0
  140. package/dist/guard/preview/index.d.ts +49 -0
  141. package/dist/guard/preview/index.d.ts.map +1 -0
  142. package/dist/guard/preview/index.js +196 -0
  143. package/dist/guard/preview/index.js.map +1 -0
  144. package/dist/guard/preview/parser.d.ts +34 -0
  145. package/dist/guard/preview/parser.d.ts.map +1 -0
  146. package/dist/guard/preview/parser.js +292 -0
  147. package/dist/guard/preview/parser.js.map +1 -0
  148. package/dist/guard/preview/types.d.ts +140 -0
  149. package/dist/guard/preview/types.d.ts.map +1 -0
  150. package/dist/guard/preview/types.js +5 -0
  151. package/dist/guard/preview/types.js.map +1 -0
  152. package/dist/guard/reversibility/index.d.ts +88 -0
  153. package/dist/guard/reversibility/index.d.ts.map +1 -0
  154. package/dist/guard/reversibility/index.js +310 -0
  155. package/dist/guard/reversibility/index.js.map +1 -0
  156. package/dist/guard/types.d.ts +192 -0
  157. package/dist/guard/types.d.ts.map +1 -0
  158. package/dist/guard/types.js +8 -0
  159. package/dist/guard/types.js.map +1 -0
  160. package/dist/index.d.ts +10 -0
  161. package/dist/index.d.ts.map +1 -1
  162. package/dist/index.js +24 -0
  163. package/dist/index.js.map +1 -1
  164. package/dist/orchestrator/manager.d.ts.map +1 -1
  165. package/dist/orchestrator/manager.js +6 -1
  166. package/dist/orchestrator/manager.js.map +1 -1
  167. package/dist/policy/engine.d.ts.map +1 -1
  168. package/dist/policy/engine.js +11 -3
  169. package/dist/policy/engine.js.map +1 -1
  170. package/dist/policy/parser.d.ts.map +1 -1
  171. package/dist/policy/parser.js +3 -0
  172. package/dist/policy/parser.js.map +1 -1
  173. package/dist/proxy/server.d.ts.map +1 -1
  174. package/dist/proxy/server.js +8 -6
  175. package/dist/proxy/server.js.map +1 -1
  176. package/dist/session/manager.d.ts +2 -2
  177. package/dist/session/manager.d.ts.map +1 -1
  178. package/dist/session/manager.js +106 -88
  179. package/dist/session/manager.js.map +1 -1
  180. package/dist/session/signing.d.ts +88 -0
  181. package/dist/session/signing.d.ts.map +1 -0
  182. package/dist/session/signing.js +166 -0
  183. package/dist/session/signing.js.map +1 -0
  184. package/dist/session/types.d.ts +2 -0
  185. package/dist/session/types.d.ts.map +1 -1
  186. package/dist/session/types.js.map +1 -1
  187. package/dist/utils/security-logger.d.ts +146 -0
  188. package/dist/utils/security-logger.d.ts.map +1 -0
  189. package/dist/utils/security-logger.js +222 -0
  190. package/dist/utils/security-logger.js.map +1 -0
  191. package/dist/wizard.d.ts.map +1 -1
  192. package/dist/wizard.js +7 -1
  193. package/dist/wizard.js.map +1 -1
  194. package/package.json +3 -2
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Guard Configuration
3
+ *
4
+ * Handles loading and validation of guard configuration from:
5
+ * 1. ~/.config/tollgate/guard.yaml (user config)
6
+ * 2. ./tollgate.yaml (project config)
7
+ * 3. CLI options (highest priority)
8
+ */
9
+ import { readFileSync, existsSync } from 'node:fs';
10
+ import { join } from 'node:path';
11
+ import { homedir } from 'node:os';
12
+ import { parse as parseYaml } from 'yaml';
13
+ /**
14
+ * Default risk action mapping.
15
+ *
16
+ * - safe/read: Allow without prompt (common dev commands)
17
+ * - write: Prompt for approval (file modifications)
18
+ * - destructive: Prompt for approval (deletions, overwrites)
19
+ * - dangerous: Always deny (system damage potential)
20
+ */
21
+ export const DEFAULT_RISK_ACTIONS = {
22
+ safe: 'allow',
23
+ read: 'allow',
24
+ write: 'prompt',
25
+ destructive: 'prompt',
26
+ dangerous: 'deny',
27
+ };
28
+ /**
29
+ * Default session configuration.
30
+ */
31
+ export const DEFAULT_SESSION_CONFIG = {
32
+ allowRemember: true,
33
+ defaultScope: 'tool',
34
+ allowedDurations: ['once', '5min', '15min', 'session'],
35
+ persistSessions: false,
36
+ };
37
+ /**
38
+ * Default fast path configuration.
39
+ *
40
+ * These command prefixes skip analysis entirely for performance.
41
+ * Only truly safe, read-only commands should be included.
42
+ */
43
+ export const DEFAULT_FAST_PATH_CONFIG = {
44
+ enabled: true,
45
+ safePrefixes: [
46
+ // Navigation & listing
47
+ 'ls', 'cd', 'pwd', 'tree',
48
+ // Reading
49
+ 'cat', 'less', 'more', 'head', 'tail', 'bat',
50
+ // Searching (read-only)
51
+ 'grep', 'rg', 'ag', 'find', 'fd', 'which', 'whereis', 'type', 'file',
52
+ // Help & info
53
+ 'man', 'help', 'info', 'tldr',
54
+ // History & shell builtins
55
+ 'history', 'alias', 'echo', 'printf',
56
+ // Version checking
57
+ 'node --version', 'npm --version', 'python --version', 'go version',
58
+ 'git --version', 'rustc --version', 'cargo --version',
59
+ // Git read-only
60
+ 'git status', 'git diff', 'git log', 'git branch', 'git show',
61
+ 'git remote -v', 'git stash list',
62
+ // Package info (read-only)
63
+ 'npm list', 'npm ls', 'npm outdated', 'pip list', 'pip show',
64
+ // Environment
65
+ 'env', 'printenv', 'whoami', 'id', 'hostname', 'uname',
66
+ // Date/time
67
+ 'date', 'cal', 'uptime',
68
+ ],
69
+ };
70
+ /**
71
+ * Default audit configuration.
72
+ */
73
+ export const DEFAULT_AUDIT_CONFIG = {
74
+ enabled: true,
75
+ logAllCommands: false, // Only log prompted/denied by default
76
+ redactSecrets: true,
77
+ };
78
+ /**
79
+ * Default UI configuration.
80
+ */
81
+ export const DEFAULT_UI_CONFIG = {
82
+ showRiskLevel: true,
83
+ showPattern: false, // Can be noisy
84
+ showCategory: true,
85
+ colors: true,
86
+ timeout: 60, // 60 seconds
87
+ };
88
+ /**
89
+ * Complete default guard configuration.
90
+ */
91
+ export const DEFAULT_GUARD_CONFIG = {
92
+ enabled: true,
93
+ risks: DEFAULT_RISK_ACTIONS,
94
+ session: DEFAULT_SESSION_CONFIG,
95
+ rules: [],
96
+ allowlist: [],
97
+ denylist: [],
98
+ fastPath: DEFAULT_FAST_PATH_CONFIG,
99
+ audit: DEFAULT_AUDIT_CONFIG,
100
+ ui: DEFAULT_UI_CONFIG,
101
+ };
102
+ /**
103
+ * Configuration file paths in order of precedence (lowest to highest).
104
+ */
105
+ export function getConfigPaths() {
106
+ const paths = [];
107
+ // User-level config
108
+ const userConfig = join(homedir(), '.config', 'tollgate', 'guard.yaml');
109
+ if (existsSync(userConfig)) {
110
+ paths.push(userConfig);
111
+ }
112
+ // Project-level config (tollgate.yaml with guard section)
113
+ const projectConfig = join(process.cwd(), 'tollgate.yaml');
114
+ if (existsSync(projectConfig)) {
115
+ paths.push(projectConfig);
116
+ }
117
+ return paths;
118
+ }
119
+ /**
120
+ * Load guard configuration from a YAML file.
121
+ */
122
+ export function loadConfigFromFile(path) {
123
+ try {
124
+ const content = readFileSync(path, 'utf8');
125
+ const parsed = parseYaml(content);
126
+ // Config might be at root or under 'guard' key
127
+ if (parsed?.guard) {
128
+ return parsed.guard;
129
+ }
130
+ // If it looks like a guard config at root level
131
+ if (parsed?.risks || parsed?.rules || parsed?.allowlist) {
132
+ return parsed;
133
+ }
134
+ return null;
135
+ }
136
+ catch {
137
+ return null;
138
+ }
139
+ }
140
+ /**
141
+ * Deep merge two objects, with source taking precedence.
142
+ */
143
+ function deepMerge(target, source) {
144
+ const result = { ...target };
145
+ for (const key of Object.keys(source)) {
146
+ const sourceValue = source[key];
147
+ const targetValue = target[key];
148
+ if (sourceValue !== undefined &&
149
+ typeof sourceValue === 'object' &&
150
+ sourceValue !== null &&
151
+ !Array.isArray(sourceValue) &&
152
+ typeof targetValue === 'object' &&
153
+ targetValue !== null &&
154
+ !Array.isArray(targetValue)) {
155
+ // Recursively merge objects
156
+ result[key] = deepMerge(targetValue, sourceValue);
157
+ }
158
+ else if (sourceValue !== undefined) {
159
+ // Override with source value
160
+ result[key] = sourceValue;
161
+ }
162
+ }
163
+ return result;
164
+ }
165
+ /**
166
+ * Load and merge guard configuration from all sources.
167
+ *
168
+ * Priority (lowest to highest):
169
+ * 1. Default configuration
170
+ * 2. User config (~/.config/tollgate/guard.yaml)
171
+ * 3. Project config (./tollgate.yaml)
172
+ * 4. CLI options (passed via overrides)
173
+ */
174
+ export function loadGuardConfig(overrides) {
175
+ let config = { ...DEFAULT_GUARD_CONFIG };
176
+ // Load from config files
177
+ const configPaths = getConfigPaths();
178
+ for (const path of configPaths) {
179
+ const fileConfig = loadConfigFromFile(path);
180
+ if (fileConfig) {
181
+ config = deepMerge(config, fileConfig);
182
+ }
183
+ }
184
+ // Apply CLI overrides
185
+ if (overrides) {
186
+ config = deepMerge(config, overrides);
187
+ }
188
+ return config;
189
+ }
190
+ /**
191
+ * Validate guard configuration.
192
+ */
193
+ export function validateGuardConfig(config) {
194
+ const errors = [];
195
+ // Validate risk mapping
196
+ const validRisks = ['safe', 'read', 'write', 'destructive', 'dangerous'];
197
+ const validActions = ['allow', 'prompt', 'deny'];
198
+ for (const [risk, action] of Object.entries(config.risks)) {
199
+ if (!validRisks.includes(risk)) {
200
+ errors.push(`Invalid risk level: ${risk}`);
201
+ }
202
+ if (!validActions.includes(action)) {
203
+ errors.push(`Invalid action for ${risk}: ${action}`);
204
+ }
205
+ }
206
+ // Validate rules
207
+ for (const rule of config.rules) {
208
+ try {
209
+ new RegExp(rule.pattern);
210
+ }
211
+ catch {
212
+ errors.push(`Invalid regex pattern in rule: ${rule.pattern}`);
213
+ }
214
+ if (!validActions.includes(rule.action)) {
215
+ errors.push(`Invalid action in rule: ${rule.action}`);
216
+ }
217
+ }
218
+ // Validate denylist patterns
219
+ for (const deny of config.denylist) {
220
+ try {
221
+ new RegExp(deny.pattern);
222
+ }
223
+ catch {
224
+ errors.push(`Invalid regex pattern in denylist: ${deny.pattern}`);
225
+ }
226
+ }
227
+ // Validate session config
228
+ const validScopes = ['exact', 'tool', 'server', 'pattern'];
229
+ if (!validScopes.includes(config.session.defaultScope)) {
230
+ errors.push(`Invalid default scope: ${config.session.defaultScope}`);
231
+ }
232
+ const validDurations = ['once', '5min', '15min', '30min', 'session'];
233
+ for (const duration of config.session.allowedDurations) {
234
+ if (!validDurations.includes(duration)) {
235
+ errors.push(`Invalid duration: ${duration}`);
236
+ }
237
+ }
238
+ // Validate UI timeout
239
+ if (config.ui.timeout < 1 || config.ui.timeout > 300) {
240
+ errors.push(`Timeout must be between 1 and 300 seconds, got: ${config.ui.timeout}`);
241
+ }
242
+ return errors;
243
+ }
244
+ export function compileRules(rules) {
245
+ return rules
246
+ .map((rule) => ({
247
+ ...rule,
248
+ pattern: new RegExp(rule.pattern, 'i'),
249
+ originalPattern: rule.pattern,
250
+ }))
251
+ .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)); // Higher priority first
252
+ }
253
+ export function compileDenylist(denylist) {
254
+ return denylist.map((deny) => ({
255
+ ...deny,
256
+ pattern: new RegExp(deny.pattern, 'i'),
257
+ originalPattern: deny.pattern,
258
+ }));
259
+ }
260
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/guard/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Directory Sensitivity Scoring for Shell Guardian
3
+ *
4
+ * Evaluates how sensitive a directory is to help with risk assessment.
5
+ */
6
+ import type { DirectoryContext, ProjectContext } from './types.js';
7
+ /**
8
+ * Score directory sensitivity.
9
+ *
10
+ * @param targetPath - Path to evaluate
11
+ * @param project - Optional project context
12
+ * @returns Directory context with sensitivity information
13
+ */
14
+ export declare function scoreSensitivity(targetPath: string, project?: ProjectContext): DirectoryContext;
15
+ /**
16
+ * Get sensitive paths that would be affected by operating on a directory.
17
+ *
18
+ * @param targetPath - Path to check
19
+ * @returns List of sensitive paths that would be affected
20
+ */
21
+ export declare function getSensitivePathsAffected(targetPath: string): string[];
22
+ /**
23
+ * Get a human-readable description of why a path is sensitive.
24
+ */
25
+ export declare function getSensitivityDescription(context: DirectoryContext): string;
26
+ /**
27
+ * Check if a path should trigger extra confirmation.
28
+ */
29
+ export declare function requiresExtraConfirmation(context: DirectoryContext): boolean;
30
+ /**
31
+ * Get the relative risk modifier based on sensitivity.
32
+ * Returns a multiplier for risk scoring.
33
+ */
34
+ export declare function getSensitivityRiskModifier(context: DirectoryContext): number;
35
+ //# sourceMappingURL=directory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory.d.ts","sourceRoot":"","sources":["../../../src/guard/context/directory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAmFnE;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,gBAAgB,CAiFlB;AAwBD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBtE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAc3E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAE5E;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAM5E"}
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Directory Sensitivity Scoring for Shell Guardian
3
+ *
4
+ * Evaluates how sensitive a directory is to help with risk assessment.
5
+ */
6
+ import { resolve } from 'node:path';
7
+ import { homedir } from 'node:os';
8
+ /**
9
+ * Sensitive paths categorized by severity.
10
+ */
11
+ const SENSITIVE_PATHS = {
12
+ /** Critical system paths - never modify */
13
+ critical: [
14
+ '/',
15
+ '/etc',
16
+ '/usr',
17
+ '/bin',
18
+ '/sbin',
19
+ '/boot',
20
+ '/var',
21
+ '/root',
22
+ '/lib',
23
+ '/lib64',
24
+ '/opt',
25
+ '/srv',
26
+ '/sys',
27
+ '/proc',
28
+ '/dev',
29
+ ],
30
+ /** High sensitivity - user config and security */
31
+ high: [
32
+ '~/.ssh',
33
+ '~/.gnupg',
34
+ '~/.gpg',
35
+ '~/.config',
36
+ '~/.local/share',
37
+ '~/.aws',
38
+ '~/.azure',
39
+ '~/.gcloud',
40
+ '~/.kube',
41
+ '~/.docker',
42
+ '~/.npmrc',
43
+ '~/.pypirc',
44
+ '~/.netrc',
45
+ '~/.gitconfig',
46
+ '~/.git-credentials',
47
+ '~/.bash_history',
48
+ '~/.zsh_history',
49
+ '~/.password-store',
50
+ '~/.vault-token',
51
+ ],
52
+ /** Medium sensitivity - user data */
53
+ medium: [
54
+ '~',
55
+ '~/Documents',
56
+ '~/Desktop',
57
+ '~/Pictures',
58
+ '~/Music',
59
+ '~/Videos',
60
+ '~/Downloads',
61
+ '~/Library', // macOS
62
+ ],
63
+ /** Low sensitivity - temp/cache */
64
+ low: [
65
+ '/tmp',
66
+ '/var/tmp',
67
+ '~/.cache',
68
+ '~/.local/cache',
69
+ ],
70
+ };
71
+ /**
72
+ * Expand ~ to home directory.
73
+ */
74
+ function expandPath(path) {
75
+ const home = homedir();
76
+ if (path.startsWith('~/')) {
77
+ return resolve(home, path.slice(2));
78
+ }
79
+ if (path === '~') {
80
+ return home;
81
+ }
82
+ return resolve(path);
83
+ }
84
+ /**
85
+ * Score directory sensitivity.
86
+ *
87
+ * @param targetPath - Path to evaluate
88
+ * @param project - Optional project context
89
+ * @returns Directory context with sensitivity information
90
+ */
91
+ export function scoreSensitivity(targetPath, project) {
92
+ const resolvedTarget = resolve(targetPath);
93
+ const home = homedir();
94
+ const reasons = [];
95
+ let sensitivity = 0;
96
+ // Check critical paths (100 sensitivity)
97
+ for (const criticalPath of SENSITIVE_PATHS.critical) {
98
+ const expanded = expandPath(criticalPath);
99
+ if (isPathMatch(resolvedTarget, expanded)) {
100
+ sensitivity = Math.max(sensitivity, 100);
101
+ reasons.push(`Critical system path: ${criticalPath}`);
102
+ }
103
+ }
104
+ // Check high sensitivity paths (80 sensitivity)
105
+ for (const highPath of SENSITIVE_PATHS.high) {
106
+ const expanded = expandPath(highPath);
107
+ if (isPathMatch(resolvedTarget, expanded)) {
108
+ sensitivity = Math.max(sensitivity, 80);
109
+ reasons.push(`Sensitive config/credentials: ${highPath}`);
110
+ }
111
+ }
112
+ // Check medium sensitivity paths (50 sensitivity)
113
+ for (const mediumPath of SENSITIVE_PATHS.medium) {
114
+ const expanded = expandPath(mediumPath);
115
+ if (isPathMatch(resolvedTarget, expanded)) {
116
+ sensitivity = Math.max(sensitivity, 50);
117
+ reasons.push(`User data directory: ${mediumPath}`);
118
+ }
119
+ }
120
+ // Check low sensitivity paths (10 sensitivity)
121
+ for (const lowPath of SENSITIVE_PATHS.low) {
122
+ const expanded = expandPath(lowPath);
123
+ if (isPathMatch(resolvedTarget, expanded)) {
124
+ sensitivity = Math.min(sensitivity, 10); // Lower if in temp
125
+ reasons.push(`Temporary/cache directory: ${lowPath}`);
126
+ }
127
+ }
128
+ // Check if in project
129
+ const isInProject = project
130
+ ? isPathMatch(resolvedTarget, project.root) || resolvedTarget.startsWith(project.root + '/')
131
+ : false;
132
+ if (isInProject && project) {
133
+ // Reduce sensitivity for project directories
134
+ if (sensitivity > 30) {
135
+ sensitivity = 30;
136
+ reasons.push(`Inside project: ${project.name || project.root}`);
137
+ }
138
+ // Further reduce for regenerable directories
139
+ const { isRegenerablePath } = require('./project.js');
140
+ if (isRegenerablePath(resolvedTarget, project)) {
141
+ sensitivity = Math.min(sensitivity, 10);
142
+ reasons.push('Regenerable directory (can be recreated by package manager)');
143
+ }
144
+ }
145
+ // Default sensitivity for unknown paths
146
+ if (sensitivity === 0 && reasons.length === 0) {
147
+ sensitivity = 20;
148
+ reasons.push('Standard directory');
149
+ }
150
+ // Determine path characteristics
151
+ const isHome = resolvedTarget === home || resolvedTarget.startsWith(home + '/');
152
+ const isSystem = SENSITIVE_PATHS.critical.some(p => isPathMatch(resolvedTarget, expandPath(p)));
153
+ const isTemp = SENSITIVE_PATHS.low.some(p => isPathMatch(resolvedTarget, expandPath(p)));
154
+ return {
155
+ sensitivity,
156
+ sensitivityReasons: reasons,
157
+ isHome,
158
+ isSystem,
159
+ isInProject,
160
+ isTemp,
161
+ };
162
+ }
163
+ /**
164
+ * Check if target path matches or is within a sensitive path.
165
+ */
166
+ function isPathMatch(target, sensitivePath) {
167
+ // Exact match
168
+ if (target === sensitivePath) {
169
+ return true;
170
+ }
171
+ // Target is inside sensitive path
172
+ if (target.startsWith(sensitivePath + '/')) {
173
+ return true;
174
+ }
175
+ // Target is a parent of sensitive path (e.g., rm -rf ~ would affect ~/.ssh)
176
+ if (sensitivePath.startsWith(target + '/')) {
177
+ return true;
178
+ }
179
+ return false;
180
+ }
181
+ /**
182
+ * Get sensitive paths that would be affected by operating on a directory.
183
+ *
184
+ * @param targetPath - Path to check
185
+ * @returns List of sensitive paths that would be affected
186
+ */
187
+ export function getSensitivePathsAffected(targetPath) {
188
+ const resolvedTarget = resolve(targetPath);
189
+ const affected = [];
190
+ const allPaths = [
191
+ ...SENSITIVE_PATHS.critical,
192
+ ...SENSITIVE_PATHS.high,
193
+ ...SENSITIVE_PATHS.medium,
194
+ ];
195
+ for (const sensitivePath of allPaths) {
196
+ const expanded = expandPath(sensitivePath);
197
+ // Check if sensitive path is inside target
198
+ if (expanded.startsWith(resolvedTarget + '/') || expanded === resolvedTarget) {
199
+ affected.push(sensitivePath);
200
+ }
201
+ }
202
+ return affected;
203
+ }
204
+ /**
205
+ * Get a human-readable description of why a path is sensitive.
206
+ */
207
+ export function getSensitivityDescription(context) {
208
+ if (context.sensitivity >= 100) {
209
+ return 'CRITICAL: System-level directory that should never be modified directly';
210
+ }
211
+ if (context.sensitivity >= 80) {
212
+ return 'HIGH: Contains sensitive credentials or security configuration';
213
+ }
214
+ if (context.sensitivity >= 50) {
215
+ return 'MEDIUM: User data directory with potentially important files';
216
+ }
217
+ if (context.sensitivity >= 20) {
218
+ return 'LOW: Standard directory with normal risk level';
219
+ }
220
+ return 'MINIMAL: Temporary or regenerable directory';
221
+ }
222
+ /**
223
+ * Check if a path should trigger extra confirmation.
224
+ */
225
+ export function requiresExtraConfirmation(context) {
226
+ return context.sensitivity >= 50;
227
+ }
228
+ /**
229
+ * Get the relative risk modifier based on sensitivity.
230
+ * Returns a multiplier for risk scoring.
231
+ */
232
+ export function getSensitivityRiskModifier(context) {
233
+ if (context.sensitivity >= 100)
234
+ return 2.0; // Double risk
235
+ if (context.sensitivity >= 80)
236
+ return 1.5; // 50% more risk
237
+ if (context.sensitivity >= 50)
238
+ return 1.2; // 20% more risk
239
+ if (context.sensitivity >= 20)
240
+ return 1.0; // Normal risk
241
+ return 0.5; // Half risk (temp/regenerable)
242
+ }
243
+ //# sourceMappingURL=directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory.js","sourceRoot":"","sources":["../../../src/guard/context/directory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Environment Detection for Shell Guardian
3
+ *
4
+ * Detects the execution environment (development, CI, production)
5
+ * to adjust risk assessment accordingly.
6
+ */
7
+ import type { EnvironmentContext } from './types.js';
8
+ /**
9
+ * Detect execution environment.
10
+ *
11
+ * @returns Environment context
12
+ */
13
+ export declare function detectEnvironment(): EnvironmentContext;
14
+ /**
15
+ * Get risk modifier based on environment.
16
+ * Production and CI environments should have stricter controls.
17
+ */
18
+ export declare function getEnvironmentRiskModifier(env: EnvironmentContext): number;
19
+ /**
20
+ * Check if environment requires extra caution.
21
+ */
22
+ export declare function requiresExtraCaution(env: EnvironmentContext): boolean;
23
+ /**
24
+ * Get warning message for risky environment.
25
+ */
26
+ export declare function getEnvironmentWarning(env: EnvironmentContext): string | undefined;
27
+ /**
28
+ * Check if destructive operations should be blocked.
29
+ */
30
+ export declare function shouldBlockDestructive(env: EnvironmentContext): boolean;
31
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../../src/guard/context/environment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA+DrD;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,kBAAkB,CAuEtD;AAiBD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,CAuB1E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAIrE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,GAAG,SAAS,CAoBjF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAGvE"}