jorgex-stack 1.9.40 → 1.9.41

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/cli.js CHANGED
@@ -830,19 +830,6 @@ function upsertNativeHooks(existing, canonical, scriptsDir, mapMatcher = (m) =>
830
830
  });
831
831
  }
832
832
 
833
- // src/lib/git-guard.ts
834
- var DESTRUCTIVE_GIT_DENY = [
835
- "git reset*",
836
- "git clean*",
837
- "git checkout -- *",
838
- "git restore*",
839
- "git push*--force*",
840
- // posición libre: caza "git push origin main --force[-with-lease]"
841
- "git push -f*",
842
- "git switch*--discard-changes*"
843
- ];
844
- var GIT_GUARD_SCRIPT = "block-destructive-git.cjs";
845
-
846
833
  // src/lib/quality-capabilities.ts
847
834
  var QUALITY_CAPABILITY_NAMESPACE = "jorgex.quality.capabilities";
848
835
  var QUALITY_CAPABILITY_VERSION = 1;
@@ -917,6 +904,15 @@ function localQualityStatus(profile, status) {
917
904
  }
918
905
 
919
906
  // src/adapters/opencode.ts
907
+ var gitReadPrefix = "git --no-pager -c core.fsmonitor=false -c log.showSignature=false";
908
+ var gitReadCommands = [
909
+ "diff",
910
+ "diff --stat",
911
+ "diff --name-only",
912
+ "diff --cached",
913
+ "log",
914
+ "log --oneline -10"
915
+ ].map((action) => `${gitReadPrefix} ${action} --no-ext-diff --no-textconv --end-of-options`);
920
916
  function yamlString(value) {
921
917
  return JSON.stringify(value);
922
918
  }
@@ -1015,15 +1011,20 @@ var opencodeAdapter = {
1015
1011
  const tierModel = resolveAgentModel(models, agent.name, agent.tier);
1016
1012
  lines.push(`model: ${tierModel.model}`);
1017
1013
  if (tierModel.variant) lines.push(`variant: ${tierModel.variant}`);
1018
- lines.push("permission:");
1019
- lines.push(` edit: ${agent.readonly ? "deny" : "allow"}`);
1014
+ if (agent.readonly || agent.bash !== "full" || !agent.spawn) lines.push("permission:");
1015
+ if (agent.readonly) lines.push(" edit: deny");
1020
1016
  if (agent.bash === "none") lines.push(" bash: deny");
1021
- else if (agent.bash === "git-read") lines.push(' bash:\n "git diff*": allow\n "git log*": allow');
1022
- else {
1023
- const deny = DESTRUCTIVE_GIT_DENY.map((p7) => ` ${yamlString(p7)}: deny`).join("\n");
1024
- lines.push(` bash:
1025
- "*": allow
1026
- ${deny}`);
1017
+ else if (agent.bash === "git-read") {
1018
+ lines.push(' bash:\n "*": deny');
1019
+ for (const command of gitReadCommands) {
1020
+ lines.push(` ${yamlString(command)}: allow`, ` ${yamlString(`${command} *`)}: allow`);
1021
+ }
1022
+ const permission = objectValue(loadCanonicalDefaults(stackRoot())["opencode"]?.permission);
1023
+ const bash = objectValue(permission?.bash);
1024
+ if (bash === null) throw new Error("OpenCode: canonical Bash policy is required for git-read agents.");
1025
+ for (const [pattern, decision] of Object.entries(bash)) {
1026
+ if (decision === "deny") lines.push(` ${yamlString(pattern)}: deny`);
1027
+ }
1027
1028
  }
1028
1029
  if (!agent.spawn) lines.push(" task: deny");
1029
1030
  }
@@ -1033,7 +1034,11 @@ ${deny}`);
1033
1034
  content: `---
1034
1035
  ${lines.join("\n")}
1035
1036
  ---
1036
- ${agent.body}`,
1037
+ ${agent.body}${agent.bash === "git-read" ? `
1038
+
1039
+ Use only these read-only Git command prefixes; put refs and paths after --end-of-options:
1040
+ ${gitReadCommands.map((command) => `- \`${command}\``).join("\n")}
1041
+ ` : ""}`,
1037
1042
  kind: "agent"
1038
1043
  }
1039
1044
  ];
@@ -1145,7 +1150,7 @@ ${agent.body}`,
1145
1150
  if (isFreshConfig && defaults?.["permission"] !== void 0) {
1146
1151
  root["permission"] = defaults["permission"];
1147
1152
  ctx.warnings.push(
1148
- "OpenCode: fresh config enables read-anywhere via external_directory:*; edits, web egress and arbitrary bash remain approval-gated, but broad local reads can expose secrets not covered by deny rules."
1153
+ "OpenCode: fresh config allows ordinary reads, edits, web access and Bash; sensitive operations ask, while protected paths and obvious destruction are denied. Native matching is not a universal filesystem sandbox."
1149
1154
  );
1150
1155
  }
1151
1156
  const mcp = root["mcp"] ??= {};
@@ -1318,6 +1323,11 @@ ${agent.body}`,
1318
1323
  import path10 from "path";
1319
1324
  import fs7 from "fs";
1320
1325
  import { isDeepStrictEqual as isDeepStrictEqual2 } from "util";
1326
+
1327
+ // src/lib/git-guard.ts
1328
+ var GIT_GUARD_SCRIPT = "block-destructive-git.cjs";
1329
+
1330
+ // src/adapters/claude-code.ts
1321
1331
  function yamlString2(value) {
1322
1332
  return JSON.stringify(value);
1323
1333
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jorgex-stack",
3
- "version": "1.9.40",
3
+ "version": "1.9.41",
4
4
  "description": "Harness multi-agente portable: instala la config JorgeX (agentes, skills, hooks, Engram, MCPs) en Claude Code, Codex CLI, OpenCode y Pi",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -13,7 +13,7 @@ Una sola fuente por agente. El instalador los traduce al formato de cada runtime
13
13
  | `mode` | `primary` \| `subagent` | Agente principal o subagente delegable |
14
14
  | `tier` | `strong` \| `standard` \| `cheap` | Se resuelve a un modelo concreto por runtime vía model-map (PRD §6.1) |
15
15
  | `readonly` | `true` \| `false` | `true` → sin edición ni escritura de archivos |
16
- | `bash` | `none` \| `git-read` \| `full` | `none`: sin shell · `git-read`: solo `git diff*`/`git log*` · `full`: shell completo |
16
+ | `bash` | `none` \| `git-read` \| `full` | `none`: sin shell · `git-read`: solo los prefijos Git de lectura validados · `full`: Bash sujeto a la política general |
17
17
  | `spawn` | `false` (opcional) | `false` → no puede lanzar subagentes (default: puede) |
18
18
 
19
19
  ## Traducción por adapter (en install)
@@ -22,11 +22,11 @@ Una sola fuente por agente. El instalador los traduce al formato de cada runtime
22
22
  |---|---|---|---|
23
23
  | `tier` | alias `fable`/`opus`/`sonnet`/`haiku` según model-map | `model` + `model_reasoning_effort` | `provider/model` del model-map |
24
24
  | `readonly: true` | `tools: Read, Grep, Glob` (+Bash si aplica) | `sandbox_mode = "read-only"` | `permission: { edit: deny }` |
25
- | `bash: git-read` | `Bash` completo en tools — la restricción a git read es solo de prompt (el frontmatter de Claude Code no tiene esa granularidad) | con `readonly: true` el sandbox read-only impide escrituras; con `readonly: false` la restricción es solo de prompt | `permission.bash: { "git diff*": allow, "git log*": allow }` (única aplicación real) |
25
+ | `bash: git-read` | `Bash` completo en tools — la restricción a Git read es un contrato de prompt en Claude Code | con `readonly: true` el sandbox read-only impide escrituras; con `readonly: false` la restricción es solo de prompt | catch-all `deny` y allow solo para `diff`, `diff --stat`, `diff --name-only`, `diff --cached`, `log` y `log --oneline -10`, con prefijos que desactivan pager, fsmonitor, firmas, ext-diff y textconv y colocan `--end-of-options` antes de refs/rutas |
26
26
  | `bash: none` | sin `Bash` en tools | sandbox read-only | `permission: { bash: deny }` |
27
27
  | `spawn: false` | sin tool `Agent`/`Task` | n/a | `permission: { task: deny }` |
28
28
 
29
- > Ojo: solo OpenCode aplica `git-read` de verdad. En Claude Code y Codex la combinación `readonly: false` + `bash: git-read` (p.ej. `docs-maintainer`) se degrada a shell completo guiado por prompt.
29
+ > Ojo: entre estos tres adapters, solo OpenCode aplica `git-read` de verdad. En Claude Code y Codex la combinación `readonly: false` + `bash: git-read` (p.ej. `docs-maintainer`) se degrada a shell completo guiado por prompt. En OpenCode, `full` hereda la política global y `none` deniega Bash. Pi mantiene su propia proyección validada.
30
30
 
31
31
  ## Convenciones de contenido
32
32
 
@@ -1,8 +1,22 @@
1
1
  {
2
- "$comment": "Permisos por defecto del stack: cada bloque se escribe SOLO en config fresca o vacía; una config existente no se auto-expande jamás. OpenCode fresh default permite leer fuera del cwd, pero deja edit/bash en ask salvo allow explícito para lecturas seguras.",
2
+ "$comment": "Permisos por defecto del stack: cada bloque se escribe SOLO en config fresca o vacía; una config existente no se auto-expande jamás. OpenCode fresco permite trabajo ordinario; pide permiso para operaciones sensibles, deniega rutas protegidas y destrucción evidente, y conserva configuraciones existentes.",
3
3
  "opencode": {
4
4
  "permission": {
5
- "edit": "ask",
5
+ "*": "ask",
6
+ "edit": {
7
+ "*": "allow",
8
+ "*.env": "deny",
9
+ "*.env.*": "deny",
10
+ "*.env.example": "allow",
11
+ "*/.ssh/*": "deny",
12
+ "*/.aws/credentials": "deny",
13
+ "*/.npmrc": "deny",
14
+ "*/.git-credentials": "deny",
15
+ "*/id_rsa": "deny",
16
+ "*/id_ed25519": "deny",
17
+ "*.pem": "deny",
18
+ "*.key": "deny"
19
+ },
6
20
  "read": {
7
21
  "*": "allow",
8
22
  "*.env": "deny",
@@ -24,22 +38,614 @@
24
38
  "grep": "allow",
25
39
  "list": "allow",
26
40
  "lsp": "allow",
27
- "webfetch": "ask",
28
- "websearch": "ask",
41
+ "webfetch": "allow",
42
+ "websearch": "allow",
43
+ "task": "allow",
44
+ "skill": "allow",
45
+ "todowrite": "allow",
46
+ "todoread": "allow",
47
+ "question": "allow",
29
48
  "bash": {
30
- "*": "ask",
31
- "git diff*": "ask",
32
- "git log*": "allow",
33
- "git status*": "allow",
49
+ "*": "allow",
50
+ "rm": "ask",
34
51
  "rm *": "ask",
35
- "del *": "ask",
52
+ "*/rm": "ask",
53
+ "*/rm *": "ask",
54
+ "rmdir": "ask",
36
55
  "rmdir *": "ask",
37
- "git push --force*": "ask",
56
+ "*/rmdir": "ask",
57
+ "*/rmdir *": "ask",
58
+ "del": "ask",
59
+ "del *": "ask",
60
+ "*/del": "ask",
61
+ "*/del *": "ask",
62
+ "unlink": "ask",
63
+ "unlink *": "ask",
64
+ "*/unlink": "ask",
65
+ "*/unlink *": "ask",
66
+ "sudo": "ask",
67
+ "sudo *": "ask",
68
+ "*/sudo": "ask",
69
+ "*/sudo *": "ask",
70
+ "doas": "ask",
71
+ "doas *": "ask",
72
+ "*/doas": "ask",
73
+ "*/doas *": "ask",
74
+ "runas": "ask",
75
+ "runas *": "ask",
76
+ "*/runas": "ask",
77
+ "*/runas *": "ask",
78
+ "su": "ask",
79
+ "su *": "ask",
80
+ "*/su": "ask",
81
+ "*/su *": "ask",
82
+ "env": "ask",
83
+ "env *": "ask",
84
+ "*/env": "ask",
85
+ "*/env *": "ask",
86
+ "eval": "ask",
87
+ "eval *": "ask",
88
+ "*/eval": "ask",
89
+ "*/eval *": "ask",
90
+ "exec": "ask",
91
+ "exec *": "ask",
92
+ "*/exec": "ask",
93
+ "*/exec *": "ask",
94
+ "command": "ask",
95
+ "command *": "ask",
96
+ "*/command": "ask",
97
+ "*/command *": "ask",
98
+ "xargs": "ask",
99
+ "xargs *": "ask",
100
+ "*/xargs": "ask",
101
+ "*/xargs *": "ask",
102
+ "sh": "ask",
103
+ "sh *": "ask",
104
+ "*/sh": "ask",
105
+ "*/sh *": "ask",
106
+ "bash": "ask",
107
+ "bash *": "ask",
108
+ "*/bash": "ask",
109
+ "*/bash *": "ask",
110
+ "zsh": "ask",
111
+ "zsh *": "ask",
112
+ "*/zsh": "ask",
113
+ "*/zsh *": "ask",
114
+ "fish": "ask",
115
+ "fish *": "ask",
116
+ "*/fish": "ask",
117
+ "*/fish *": "ask",
118
+ "pwsh": "ask",
119
+ "pwsh *": "ask",
120
+ "*/pwsh": "ask",
121
+ "*/pwsh *": "ask",
122
+ "powershell": "ask",
123
+ "powershell *": "ask",
124
+ "*/powershell": "ask",
125
+ "*/powershell *": "ask",
126
+ "python": "ask",
127
+ "python *": "ask",
128
+ "*/python": "ask",
129
+ "*/python *": "ask",
130
+ "python3": "ask",
131
+ "python3 *": "ask",
132
+ "*/python3": "ask",
133
+ "*/python3 *": "ask",
134
+ "node": "ask",
135
+ "node *": "ask",
136
+ "*/node": "ask",
137
+ "*/node *": "ask",
138
+ "ruby": "ask",
139
+ "ruby *": "ask",
140
+ "*/ruby": "ask",
141
+ "*/ruby *": "ask",
142
+ "perl": "ask",
143
+ "perl *": "ask",
144
+ "*/perl": "ask",
145
+ "*/perl *": "ask",
146
+ "deno": "ask",
147
+ "deno *": "ask",
148
+ "*/deno": "ask",
149
+ "*/deno *": "ask",
150
+ "git *reset*": "ask",
151
+ "*/git *reset*": "ask",
152
+ "git.exe *reset*": "ask",
153
+ "*/git.exe *reset*": "ask",
154
+ "*\\git.exe *reset*": "ask",
155
+ "git *clean*": "ask",
156
+ "*/git *clean*": "ask",
157
+ "git.exe *clean*": "ask",
158
+ "*/git.exe *clean*": "ask",
159
+ "*\\git.exe *clean*": "ask",
160
+ "git *push*": "ask",
161
+ "*/git *push*": "ask",
162
+ "git.exe *push*": "ask",
163
+ "*/git.exe *push*": "ask",
164
+ "*\\git.exe *push*": "ask",
165
+ "git -c *": "ask",
166
+ "*/git -c *": "ask",
167
+ "git.exe -c *": "ask",
168
+ "*/git.exe -c *": "ask",
169
+ "*\\git.exe -c *": "ask",
170
+ "git * -c *": "ask",
171
+ "*/git * -c *": "ask",
172
+ "git.exe * -c *": "ask",
173
+ "*/git.exe * -c *": "ask",
174
+ "*\\git.exe * -c *": "ask",
175
+ "git --config-env*": "ask",
176
+ "*/git --config-env*": "ask",
177
+ "git.exe --config-env*": "ask",
178
+ "*/git.exe --config-env*": "ask",
179
+ "*\\git.exe --config-env*": "ask",
180
+ "git *--output*": "ask",
181
+ "*/git *--output*": "ask",
182
+ "git.exe *--output*": "ask",
183
+ "*/git.exe *--output*": "ask",
184
+ "*\\git.exe *--output*": "ask",
185
+ "git *--ext-diff*": "ask",
186
+ "*/git *--ext-diff*": "ask",
187
+ "git.exe *--ext-diff*": "ask",
188
+ "*/git.exe *--ext-diff*": "ask",
189
+ "*\\git.exe *--ext-diff*": "ask",
190
+ "git *--textconv*": "ask",
191
+ "*/git *--textconv*": "ask",
192
+ "git.exe *--textconv*": "ask",
193
+ "*/git.exe *--textconv*": "ask",
194
+ "*\\git.exe *--textconv*": "ask",
195
+ "git *--show-signature*": "ask",
196
+ "*/git *--show-signature*": "ask",
197
+ "git.exe *--show-signature*": "ask",
198
+ "*/git.exe *--show-signature*": "ask",
199
+ "*\\git.exe *--show-signature*": "ask",
200
+ "git *%G*": "ask",
201
+ "*/git *%G*": "ask",
202
+ "git.exe *%G*": "ask",
203
+ "*/git.exe *%G*": "ask",
204
+ "*\\git.exe *%G*": "ask",
205
+ "pnpm exec*": "ask",
206
+ "pnpm dlx*": "ask",
207
+ "truncate": "ask",
208
+ "truncate *": "ask",
209
+ "*/truncate": "ask",
210
+ "*/truncate *": "ask",
211
+ "Remove-Item": "ask",
212
+ "Remove-Item *": "ask",
213
+ "*/Remove-Item": "ask",
214
+ "*/Remove-Item *": "ask",
215
+ "remove-item": "ask",
216
+ "remove-item *": "ask",
217
+ "*/remove-item": "ask",
218
+ "*/remove-item *": "ask",
219
+ "ri": "ask",
220
+ "ri *": "ask",
221
+ "*/ri": "ask",
222
+ "*/ri *": "ask",
223
+ "erase": "ask",
224
+ "erase *": "ask",
225
+ "*/erase": "ask",
226
+ "*/erase *": "ask",
227
+ "rd": "ask",
228
+ "rd *": "ask",
229
+ "*/rd": "ask",
230
+ "*/rd *": "ask",
231
+ "Clear-Content": "ask",
232
+ "Clear-Content *": "ask",
233
+ "*/Clear-Content": "ask",
234
+ "*/Clear-Content *": "ask",
235
+ "clear-content": "ask",
236
+ "clear-content *": "ask",
237
+ "*/clear-content": "ask",
238
+ "*/clear-content *": "ask",
239
+ "find *-delete*": "ask",
240
+ "find *-exec*": "ask",
241
+ "find *-ok*": "ask",
242
+ "*/find *-delete*": "ask",
243
+ "*/find *-exec*": "ask",
244
+ "*/find *-ok*": "ask",
245
+ "* rm": "ask",
246
+ "* rm *": "ask",
247
+ "* rmdir": "ask",
248
+ "* rmdir *": "ask",
249
+ "* del": "ask",
250
+ "* del *": "ask",
251
+ "* unlink": "ask",
252
+ "* unlink *": "ask",
253
+ "* sudo": "ask",
254
+ "* sudo *": "ask",
255
+ "* doas": "ask",
256
+ "* doas *": "ask",
257
+ "* runas": "ask",
258
+ "* runas *": "ask",
259
+ "* su": "ask",
260
+ "* su *": "ask",
261
+ "* env": "ask",
262
+ "* env *": "ask",
263
+ "* eval": "ask",
264
+ "* eval *": "ask",
265
+ "* exec": "ask",
266
+ "* exec *": "ask",
267
+ "* command": "ask",
268
+ "* command *": "ask",
269
+ "* xargs": "ask",
270
+ "* xargs *": "ask",
271
+ "* sh": "ask",
272
+ "* sh *": "ask",
273
+ "* bash": "ask",
274
+ "* bash *": "ask",
275
+ "* zsh": "ask",
276
+ "* zsh *": "ask",
277
+ "* fish": "ask",
278
+ "* fish *": "ask",
279
+ "* pwsh": "ask",
280
+ "* pwsh *": "ask",
281
+ "* powershell": "ask",
282
+ "* powershell *": "ask",
283
+ "* python": "ask",
284
+ "* python *": "ask",
285
+ "* python3": "ask",
286
+ "* python3 *": "ask",
287
+ "* node": "ask",
288
+ "* node *": "ask",
289
+ "* ruby": "ask",
290
+ "* ruby *": "ask",
291
+ "* perl": "ask",
292
+ "* perl *": "ask",
293
+ "* deno": "ask",
294
+ "* deno *": "ask",
295
+ "* git *reset*": "ask",
296
+ "* git.exe *reset*": "ask",
297
+ "* git *clean*": "ask",
298
+ "* git.exe *clean*": "ask",
299
+ "* git *push*": "ask",
300
+ "* git.exe *push*": "ask",
301
+ "* git -c *": "ask",
302
+ "* git.exe -c *": "ask",
303
+ "* git * -c *": "ask",
304
+ "* git.exe * -c *": "ask",
305
+ "* git --config-env*": "ask",
306
+ "* git.exe --config-env*": "ask",
307
+ "* git *--output*": "ask",
308
+ "* git.exe *--output*": "ask",
309
+ "* git *--ext-diff*": "ask",
310
+ "* git.exe *--ext-diff*": "ask",
311
+ "* git *--textconv*": "ask",
312
+ "* git.exe *--textconv*": "ask",
313
+ "* git *--show-signature*": "ask",
314
+ "* git.exe *--show-signature*": "ask",
315
+ "* git *%G*": "ask",
316
+ "* git.exe *%G*": "ask",
317
+ "* pnpm exec*": "ask",
318
+ "* pnpm dlx*": "ask",
319
+ "* truncate": "ask",
320
+ "* truncate *": "ask",
321
+ "* Remove-Item": "ask",
322
+ "* Remove-Item *": "ask",
323
+ "* remove-item": "ask",
324
+ "* remove-item *": "ask",
325
+ "* ri": "ask",
326
+ "* ri *": "ask",
327
+ "* erase": "ask",
328
+ "* erase *": "ask",
329
+ "* rd": "ask",
330
+ "* rd *": "ask",
331
+ "* Clear-Content": "ask",
332
+ "* Clear-Content *": "ask",
333
+ "* clear-content": "ask",
334
+ "* clear-content *": "ask",
335
+ "* find *-delete*": "ask",
336
+ "* find *-exec*": "ask",
337
+ "* find *-ok*": "ask",
338
+ "format": "deny",
38
339
  "format *": "deny",
340
+ "*/format": "deny",
341
+ "*/format *": "deny",
342
+ "mkfs": "deny",
39
343
  "mkfs *": "deny",
344
+ "*/mkfs": "deny",
345
+ "*/mkfs *": "deny",
346
+ "dd": "deny",
40
347
  "dd *": "deny",
41
- "shred *": "deny"
42
- }
348
+ "*/dd": "deny",
349
+ "*/dd *": "deny",
350
+ "shred": "deny",
351
+ "shred *": "deny",
352
+ "*/shred": "deny",
353
+ "*/shred *": "deny",
354
+ "mkfs.*": "deny",
355
+ "*/mkfs.*": "deny",
356
+ "rm /": "deny",
357
+ "rm * /": "deny",
358
+ "rm * / *": "deny",
359
+ "rm /etc": "deny",
360
+ "rm * /etc": "deny",
361
+ "rm * /etc *": "deny",
362
+ "rm /usr": "deny",
363
+ "rm * /usr": "deny",
364
+ "rm * /usr *": "deny",
365
+ "rm /bin": "deny",
366
+ "rm * /bin": "deny",
367
+ "rm * /bin *": "deny",
368
+ "rm /sbin": "deny",
369
+ "rm * /sbin": "deny",
370
+ "rm * /sbin *": "deny",
371
+ "rm /boot": "deny",
372
+ "rm * /boot": "deny",
373
+ "rm * /boot *": "deny",
374
+ "rm /dev": "deny",
375
+ "rm * /dev": "deny",
376
+ "rm * /dev *": "deny",
377
+ "rm /proc": "deny",
378
+ "rm * /proc": "deny",
379
+ "rm * /proc *": "deny",
380
+ "rm /sys": "deny",
381
+ "rm * /sys": "deny",
382
+ "rm * /sys *": "deny",
383
+ "*/rm /": "deny",
384
+ "*/rm * /": "deny",
385
+ "*/rm * / *": "deny",
386
+ "*/rm /etc": "deny",
387
+ "*/rm * /etc": "deny",
388
+ "*/rm * /etc *": "deny",
389
+ "*/rm /usr": "deny",
390
+ "*/rm * /usr": "deny",
391
+ "*/rm * /usr *": "deny",
392
+ "*/rm /bin": "deny",
393
+ "*/rm * /bin": "deny",
394
+ "*/rm * /bin *": "deny",
395
+ "*/rm /sbin": "deny",
396
+ "*/rm * /sbin": "deny",
397
+ "*/rm * /sbin *": "deny",
398
+ "*/rm /boot": "deny",
399
+ "*/rm * /boot": "deny",
400
+ "*/rm * /boot *": "deny",
401
+ "*/rm /dev": "deny",
402
+ "*/rm * /dev": "deny",
403
+ "*/rm * /dev *": "deny",
404
+ "*/rm /proc": "deny",
405
+ "*/rm * /proc": "deny",
406
+ "*/rm * /proc *": "deny",
407
+ "*/rm /sys": "deny",
408
+ "*/rm * /sys": "deny",
409
+ "*/rm * /sys *": "deny",
410
+ "rmdir /": "deny",
411
+ "rmdir * /": "deny",
412
+ "rmdir * / *": "deny",
413
+ "rmdir /etc": "deny",
414
+ "rmdir * /etc": "deny",
415
+ "rmdir * /etc *": "deny",
416
+ "rmdir /usr": "deny",
417
+ "rmdir * /usr": "deny",
418
+ "rmdir * /usr *": "deny",
419
+ "rmdir /bin": "deny",
420
+ "rmdir * /bin": "deny",
421
+ "rmdir * /bin *": "deny",
422
+ "rmdir /sbin": "deny",
423
+ "rmdir * /sbin": "deny",
424
+ "rmdir * /sbin *": "deny",
425
+ "rmdir /boot": "deny",
426
+ "rmdir * /boot": "deny",
427
+ "rmdir * /boot *": "deny",
428
+ "rmdir /dev": "deny",
429
+ "rmdir * /dev": "deny",
430
+ "rmdir * /dev *": "deny",
431
+ "rmdir /proc": "deny",
432
+ "rmdir * /proc": "deny",
433
+ "rmdir * /proc *": "deny",
434
+ "rmdir /sys": "deny",
435
+ "rmdir * /sys": "deny",
436
+ "rmdir * /sys *": "deny",
437
+ "*/rmdir /": "deny",
438
+ "*/rmdir * /": "deny",
439
+ "*/rmdir * / *": "deny",
440
+ "*/rmdir /etc": "deny",
441
+ "*/rmdir * /etc": "deny",
442
+ "*/rmdir * /etc *": "deny",
443
+ "*/rmdir /usr": "deny",
444
+ "*/rmdir * /usr": "deny",
445
+ "*/rmdir * /usr *": "deny",
446
+ "*/rmdir /bin": "deny",
447
+ "*/rmdir * /bin": "deny",
448
+ "*/rmdir * /bin *": "deny",
449
+ "*/rmdir /sbin": "deny",
450
+ "*/rmdir * /sbin": "deny",
451
+ "*/rmdir * /sbin *": "deny",
452
+ "*/rmdir /boot": "deny",
453
+ "*/rmdir * /boot": "deny",
454
+ "*/rmdir * /boot *": "deny",
455
+ "*/rmdir /dev": "deny",
456
+ "*/rmdir * /dev": "deny",
457
+ "*/rmdir * /dev *": "deny",
458
+ "*/rmdir /proc": "deny",
459
+ "*/rmdir * /proc": "deny",
460
+ "*/rmdir * /proc *": "deny",
461
+ "*/rmdir /sys": "deny",
462
+ "*/rmdir * /sys": "deny",
463
+ "*/rmdir * /sys *": "deny",
464
+ "*.env*": "deny",
465
+ "*/.ssh*": "deny",
466
+ "*/.aws/credentials*": "deny",
467
+ "*.npmrc*": "deny",
468
+ "*.git-credentials*": "deny",
469
+ "*id_rsa*": "deny",
470
+ "*id_ed25519*": "deny",
471
+ "*.pem*": "deny",
472
+ "*.key*": "deny",
473
+ "*rm /etc/*": "deny",
474
+ "*rm * /etc/*": "deny",
475
+ "*rm /usr/*": "deny",
476
+ "*rm * /usr/*": "deny",
477
+ "*rm /bin/*": "deny",
478
+ "*rm * /bin/*": "deny",
479
+ "*rm /sbin/*": "deny",
480
+ "*rm * /sbin/*": "deny",
481
+ "*rm /boot/*": "deny",
482
+ "*rm * /boot/*": "deny",
483
+ "*rm /dev/*": "deny",
484
+ "*rm * /dev/*": "deny",
485
+ "*rm /proc/*": "deny",
486
+ "*rm * /proc/*": "deny",
487
+ "*rm /sys/*": "deny",
488
+ "*rm * /sys/*": "deny",
489
+ "*rm /": "deny",
490
+ "*rm * /": "deny",
491
+ "*rm * / *": "deny",
492
+ "*rmdir /etc/*": "deny",
493
+ "*rmdir * /etc/*": "deny",
494
+ "*rmdir /usr/*": "deny",
495
+ "*rmdir * /usr/*": "deny",
496
+ "*rmdir /bin/*": "deny",
497
+ "*rmdir * /bin/*": "deny",
498
+ "*rmdir /sbin/*": "deny",
499
+ "*rmdir * /sbin/*": "deny",
500
+ "*rmdir /boot/*": "deny",
501
+ "*rmdir * /boot/*": "deny",
502
+ "*rmdir /dev/*": "deny",
503
+ "*rmdir * /dev/*": "deny",
504
+ "*rmdir /proc/*": "deny",
505
+ "*rmdir * /proc/*": "deny",
506
+ "*rmdir /sys/*": "deny",
507
+ "*rmdir * /sys/*": "deny",
508
+ "*rmdir /": "deny",
509
+ "*rmdir * /": "deny",
510
+ "*rmdir * / *": "deny",
511
+ "find / *-delete*": "deny",
512
+ "find * / *-delete*": "deny",
513
+ "find //* *-delete*": "deny",
514
+ "find * //* *-delete*": "deny",
515
+ "find /etc *-delete*": "deny",
516
+ "find * /etc *-delete*": "deny",
517
+ "find /etc/* *-delete*": "deny",
518
+ "find * /etc/* *-delete*": "deny",
519
+ "find /usr *-delete*": "deny",
520
+ "find * /usr *-delete*": "deny",
521
+ "find /usr/* *-delete*": "deny",
522
+ "find * /usr/* *-delete*": "deny",
523
+ "find /bin *-delete*": "deny",
524
+ "find * /bin *-delete*": "deny",
525
+ "find /bin/* *-delete*": "deny",
526
+ "find * /bin/* *-delete*": "deny",
527
+ "find /sbin *-delete*": "deny",
528
+ "find * /sbin *-delete*": "deny",
529
+ "find /sbin/* *-delete*": "deny",
530
+ "find * /sbin/* *-delete*": "deny",
531
+ "find /boot *-delete*": "deny",
532
+ "find * /boot *-delete*": "deny",
533
+ "find /boot/* *-delete*": "deny",
534
+ "find * /boot/* *-delete*": "deny",
535
+ "find /dev *-delete*": "deny",
536
+ "find * /dev *-delete*": "deny",
537
+ "find /dev/* *-delete*": "deny",
538
+ "find * /dev/* *-delete*": "deny",
539
+ "find /proc *-delete*": "deny",
540
+ "find * /proc *-delete*": "deny",
541
+ "find /proc/* *-delete*": "deny",
542
+ "find * /proc/* *-delete*": "deny",
543
+ "find /sys *-delete*": "deny",
544
+ "find * /sys *-delete*": "deny",
545
+ "find /sys/* *-delete*": "deny",
546
+ "find * /sys/* *-delete*": "deny",
547
+ "* format": "deny",
548
+ "* format *": "deny",
549
+ "* mkfs": "deny",
550
+ "* mkfs *": "deny",
551
+ "* dd": "deny",
552
+ "* dd *": "deny",
553
+ "* shred": "deny",
554
+ "* shred *": "deny",
555
+ "* mkfs.*": "deny",
556
+ "* rm /": "deny",
557
+ "* rm * /": "deny",
558
+ "* rm * / *": "deny",
559
+ "* rm /etc": "deny",
560
+ "* rm * /etc": "deny",
561
+ "* rm * /etc *": "deny",
562
+ "* rm /usr": "deny",
563
+ "* rm * /usr": "deny",
564
+ "* rm * /usr *": "deny",
565
+ "* rm /bin": "deny",
566
+ "* rm * /bin": "deny",
567
+ "* rm * /bin *": "deny",
568
+ "* rm /sbin": "deny",
569
+ "* rm * /sbin": "deny",
570
+ "* rm * /sbin *": "deny",
571
+ "* rm /boot": "deny",
572
+ "* rm * /boot": "deny",
573
+ "* rm * /boot *": "deny",
574
+ "* rm /dev": "deny",
575
+ "* rm * /dev": "deny",
576
+ "* rm * /dev *": "deny",
577
+ "* rm /proc": "deny",
578
+ "* rm * /proc": "deny",
579
+ "* rm * /proc *": "deny",
580
+ "* rm /sys": "deny",
581
+ "* rm * /sys": "deny",
582
+ "* rm * /sys *": "deny",
583
+ "* rmdir /": "deny",
584
+ "* rmdir * /": "deny",
585
+ "* rmdir * / *": "deny",
586
+ "* rmdir /etc": "deny",
587
+ "* rmdir * /etc": "deny",
588
+ "* rmdir * /etc *": "deny",
589
+ "* rmdir /usr": "deny",
590
+ "* rmdir * /usr": "deny",
591
+ "* rmdir * /usr *": "deny",
592
+ "* rmdir /bin": "deny",
593
+ "* rmdir * /bin": "deny",
594
+ "* rmdir * /bin *": "deny",
595
+ "* rmdir /sbin": "deny",
596
+ "* rmdir * /sbin": "deny",
597
+ "* rmdir * /sbin *": "deny",
598
+ "* rmdir /boot": "deny",
599
+ "* rmdir * /boot": "deny",
600
+ "* rmdir * /boot *": "deny",
601
+ "* rmdir /dev": "deny",
602
+ "* rmdir * /dev": "deny",
603
+ "* rmdir * /dev *": "deny",
604
+ "* rmdir /proc": "deny",
605
+ "* rmdir * /proc": "deny",
606
+ "* rmdir * /proc *": "deny",
607
+ "* rmdir /sys": "deny",
608
+ "* rmdir * /sys": "deny",
609
+ "* rmdir * /sys *": "deny",
610
+ "* find / *-delete*": "deny",
611
+ "* find * / *-delete*": "deny",
612
+ "* find //* *-delete*": "deny",
613
+ "* find * //* *-delete*": "deny",
614
+ "* find /etc *-delete*": "deny",
615
+ "* find * /etc *-delete*": "deny",
616
+ "* find /etc/* *-delete*": "deny",
617
+ "* find * /etc/* *-delete*": "deny",
618
+ "* find /usr *-delete*": "deny",
619
+ "* find * /usr *-delete*": "deny",
620
+ "* find /usr/* *-delete*": "deny",
621
+ "* find * /usr/* *-delete*": "deny",
622
+ "* find /bin *-delete*": "deny",
623
+ "* find * /bin *-delete*": "deny",
624
+ "* find /bin/* *-delete*": "deny",
625
+ "* find * /bin/* *-delete*": "deny",
626
+ "* find /sbin *-delete*": "deny",
627
+ "* find * /sbin *-delete*": "deny",
628
+ "* find /sbin/* *-delete*": "deny",
629
+ "* find * /sbin/* *-delete*": "deny",
630
+ "* find /boot *-delete*": "deny",
631
+ "* find * /boot *-delete*": "deny",
632
+ "* find /boot/* *-delete*": "deny",
633
+ "* find * /boot/* *-delete*": "deny",
634
+ "* find /dev *-delete*": "deny",
635
+ "* find * /dev *-delete*": "deny",
636
+ "* find /dev/* *-delete*": "deny",
637
+ "* find * /dev/* *-delete*": "deny",
638
+ "* find /proc *-delete*": "deny",
639
+ "* find * /proc *-delete*": "deny",
640
+ "* find /proc/* *-delete*": "deny",
641
+ "* find * /proc/* *-delete*": "deny",
642
+ "* find /sys *-delete*": "deny",
643
+ "* find * /sys *-delete*": "deny",
644
+ "* find /sys/* *-delete*": "deny",
645
+ "* find * /sys/* *-delete*": "deny"
646
+ },
647
+ "engram_*": "allow",
648
+ "context7_*": "allow"
43
649
  }
44
650
  },
45
651
  "claude-code": {