traceforge-toolkit 0.1.0__py3-none-any.whl

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 (205) hide show
  1. traceforge/__init__.py +72 -0
  2. traceforge/__main__.py +5 -0
  3. traceforge/_generated.py +254 -0
  4. traceforge/adapters/__init__.py +12 -0
  5. traceforge/adapters/base.py +82 -0
  6. traceforge/adapters/genai_otel.py +164 -0
  7. traceforge/adapters/mapped_json.py +297 -0
  8. traceforge/adapters/otel.py +220 -0
  9. traceforge/boundary/__init__.py +46 -0
  10. traceforge/boundary/data/boundary-model.joblib +0 -0
  11. traceforge/boundary/decode.py +87 -0
  12. traceforge/boundary/features.py +137 -0
  13. traceforge/boundary/inference.py +267 -0
  14. traceforge/boundary/inferencer.py +146 -0
  15. traceforge/classify/__init__.py +95 -0
  16. traceforge/classify/cmd.py +109 -0
  17. traceforge/classify/coding.py +213 -0
  18. traceforge/classify/config.py +554 -0
  19. traceforge/classify/core.py +266 -0
  20. traceforge/classify/data/binary_info.yaml +358 -0
  21. traceforge/classify/data/canonical_tools.yaml +251 -0
  22. traceforge/classify/data/effect_overrides.yaml +480 -0
  23. traceforge/classify/data/mcp_profiles.yaml +711 -0
  24. traceforge/classify/data/recommendation_rules.yaml +111 -0
  25. traceforge/classify/data/risk.yaml +534 -0
  26. traceforge/classify/data/shell_defaults.yaml +95 -0
  27. traceforge/classify/data/shell_rules.yaml +1192 -0
  28. traceforge/classify/data/tool_classifications.yaml +215 -0
  29. traceforge/classify/data/verb_inference.yaml +218 -0
  30. traceforge/classify/mcp.py +181 -0
  31. traceforge/classify/phases.py +75 -0
  32. traceforge/classify/powershell.py +93 -0
  33. traceforge/classify/registry.py +138 -0
  34. traceforge/classify/risk.py +553 -0
  35. traceforge/classify/rules.py +215 -0
  36. traceforge/classify/schema.yaml +282 -0
  37. traceforge/classify/shell.py +503 -0
  38. traceforge/classify/tools.py +91 -0
  39. traceforge/classify/workflow.py +32 -0
  40. traceforge/cli/__init__.py +42 -0
  41. traceforge/cli/config_cmd.py +130 -0
  42. traceforge/cli/detect.py +46 -0
  43. traceforge/cli/download_cmd.py +74 -0
  44. traceforge/cli/factory.py +60 -0
  45. traceforge/cli/gate_cmd.py +30 -0
  46. traceforge/cli/init_cmd.py +86 -0
  47. traceforge/cli/replay.py +130 -0
  48. traceforge/cli/runner.py +181 -0
  49. traceforge/cli/score.py +217 -0
  50. traceforge/cli/status.py +65 -0
  51. traceforge/cli/watch.py +297 -0
  52. traceforge/config/__init__.py +80 -0
  53. traceforge/config/defaults.py +149 -0
  54. traceforge/config/loader.py +239 -0
  55. traceforge/config/mappings.py +104 -0
  56. traceforge/config/models.py +579 -0
  57. traceforge/enricher.py +576 -0
  58. traceforge/formatting/__init__.py +12 -0
  59. traceforge/formatting/budget.py +92 -0
  60. traceforge/formatting/density.py +154 -0
  61. traceforge/gate/__init__.py +17 -0
  62. traceforge/gate/client.py +145 -0
  63. traceforge/gate/external.py +305 -0
  64. traceforge/gate/registry.py +108 -0
  65. traceforge/gate/server.py +174 -0
  66. traceforge/gates/__init__.py +8 -0
  67. traceforge/gates/pii.py +352 -0
  68. traceforge/gates/pii_patterns.yaml +228 -0
  69. traceforge/governance/__init__.py +121 -0
  70. traceforge/governance/assessor.py +441 -0
  71. traceforge/governance/budget.py +59 -0
  72. traceforge/governance/canonical.py +56 -0
  73. traceforge/governance/codec.py +414 -0
  74. traceforge/governance/context.py +249 -0
  75. traceforge/governance/drift.py +196 -0
  76. traceforge/governance/emitter.py +234 -0
  77. traceforge/governance/envelope.py +138 -0
  78. traceforge/governance/ifc.py +364 -0
  79. traceforge/governance/integrity.py +162 -0
  80. traceforge/governance/labeler.py +250 -0
  81. traceforge/governance/mcp_drift.py +328 -0
  82. traceforge/governance/monitor.py +539 -0
  83. traceforge/governance/observer.py +276 -0
  84. traceforge/governance/persistence.py +401 -0
  85. traceforge/governance/phase1.py +77 -0
  86. traceforge/governance/pii.py +276 -0
  87. traceforge/governance/pipeline.py +840 -0
  88. traceforge/governance/registry.py +110 -0
  89. traceforge/governance/results.py +183 -0
  90. traceforge/governance/risk_wrapper.py +113 -0
  91. traceforge/governance/rules.py +368 -0
  92. traceforge/governance/scorer.py +262 -0
  93. traceforge/governance/shield.py +318 -0
  94. traceforge/governance/state.py +466 -0
  95. traceforge/governance/types.py +176 -0
  96. traceforge/mappings/__init__.py +1 -0
  97. traceforge/mappings/aider.yaml +216 -0
  98. traceforge/mappings/aider_markdown.yaml +113 -0
  99. traceforge/mappings/amazonq.yaml +56 -0
  100. traceforge/mappings/antigravity.yaml +88 -0
  101. traceforge/mappings/claude.yaml +93 -0
  102. traceforge/mappings/cline.yaml +286 -0
  103. traceforge/mappings/codex.yaml +158 -0
  104. traceforge/mappings/continue_dev.yaml +57 -0
  105. traceforge/mappings/copilot.yaml +266 -0
  106. traceforge/mappings/copilot_markdown.yaml +72 -0
  107. traceforge/mappings/copilot_vscode.yaml +181 -0
  108. traceforge/mappings/crewai.yaml +592 -0
  109. traceforge/mappings/goose.yaml +128 -0
  110. traceforge/mappings/langgraph.yaml +165 -0
  111. traceforge/mappings/maf.yaml +90 -0
  112. traceforge/mappings/maf_transcript.yaml +99 -0
  113. traceforge/mappings/openai_agents.yaml +144 -0
  114. traceforge/mappings/opencode.yaml +473 -0
  115. traceforge/mappings/openhands.yaml +320 -0
  116. traceforge/mappings/pydantic_ai.yaml +183 -0
  117. traceforge/mappings/smolagents.yaml +89 -0
  118. traceforge/mappings/sweagent.yaml +82 -0
  119. traceforge/migrations/__init__.py +1 -0
  120. traceforge/migrations/env.py +60 -0
  121. traceforge/migrations/models.py +145 -0
  122. traceforge/migrations/runner.py +44 -0
  123. traceforge/migrations/script.py.mako +25 -0
  124. traceforge/migrations/versions/0001_initial.py +176 -0
  125. traceforge/migrations/versions/__init__.py +4 -0
  126. traceforge/models.py +29 -0
  127. traceforge/parsers/__init__.py +21 -0
  128. traceforge/parsers/aider.py +416 -0
  129. traceforge/parsers/base.py +226 -0
  130. traceforge/parsers/copilot.py +314 -0
  131. traceforge/phase/__init__.py +50 -0
  132. traceforge/phase/data/phase-model.joblib +0 -0
  133. traceforge/phase/data/potion-base-8M/README.md +99 -0
  134. traceforge/phase/data/potion-base-8M/config.json +13 -0
  135. traceforge/phase/data/potion-base-8M/model.safetensors +0 -0
  136. traceforge/phase/data/potion-base-8M/modules.json +14 -0
  137. traceforge/phase/data/potion-base-8M/tokenizer.json +1 -0
  138. traceforge/phase/event_rows.py +107 -0
  139. traceforge/phase/features.py +468 -0
  140. traceforge/phase/inference.py +279 -0
  141. traceforge/phase/inferencer.py +171 -0
  142. traceforge/phase/segmentation.py +258 -0
  143. traceforge/pipeline.py +891 -0
  144. traceforge/preprocessors/__init__.py +34 -0
  145. traceforge/preprocessors/amazonq.py +224 -0
  146. traceforge/preprocessors/antigravity.py +116 -0
  147. traceforge/preprocessors/claude.py +95 -0
  148. traceforge/preprocessors/cline.py +36 -0
  149. traceforge/preprocessors/codex.py +311 -0
  150. traceforge/preprocessors/continue_dev.py +119 -0
  151. traceforge/preprocessors/copilot_vscode.py +171 -0
  152. traceforge/preprocessors/goose.py +156 -0
  153. traceforge/preprocessors/maf_transcript.py +84 -0
  154. traceforge/preprocessors/openai_agents.py +86 -0
  155. traceforge/preprocessors/opencode.py +85 -0
  156. traceforge/preprocessors/openhands.py +36 -0
  157. traceforge/preprocessors/pydantic_ai.py +62 -0
  158. traceforge/preprocessors/registry.py +24 -0
  159. traceforge/preprocessors/smolagents.py +90 -0
  160. traceforge/py.typed +0 -0
  161. traceforge/sdk/__init__.py +59 -0
  162. traceforge/sdk/gate_policy.py +63 -0
  163. traceforge/sdk/gate_types.py +140 -0
  164. traceforge/sdk/pipeline.py +265 -0
  165. traceforge/sdk/verdict.py +81 -0
  166. traceforge/sinks/__init__.py +23 -0
  167. traceforge/sinks/base.py +95 -0
  168. traceforge/sinks/callback.py +132 -0
  169. traceforge/sinks/console.py +112 -0
  170. traceforge/sinks/factory.py +94 -0
  171. traceforge/sinks/jsonl.py +125 -0
  172. traceforge/sinks/otel_exporter.py +212 -0
  173. traceforge/sinks/parquet.py +260 -0
  174. traceforge/sinks/s3.py +206 -0
  175. traceforge/sinks/sqlite_output.py +234 -0
  176. traceforge/sinks/webhook.py +136 -0
  177. traceforge/sources/__init__.py +18 -0
  178. traceforge/sources/auto_detect.py +173 -0
  179. traceforge/sources/base.py +45 -0
  180. traceforge/sources/file_poll.py +136 -0
  181. traceforge/sources/file_watch.py +221 -0
  182. traceforge/sources/http_poll.py +141 -0
  183. traceforge/sources/replay.py +63 -0
  184. traceforge/sources/sqlite.py +187 -0
  185. traceforge/sources/sse.py +198 -0
  186. traceforge/telemetry/__init__.py +192 -0
  187. traceforge/title/__init__.py +23 -0
  188. traceforge/title/_resolve.py +79 -0
  189. traceforge/title/context.py +295 -0
  190. traceforge/title/data/boilerplate_files.json +14 -0
  191. traceforge/title/heuristics.py +429 -0
  192. traceforge/title/hygiene.py +90 -0
  193. traceforge/title/inference.py +314 -0
  194. traceforge/title/inferencer.py +477 -0
  195. traceforge/title/naming.py +398 -0
  196. traceforge/trace.py +291 -0
  197. traceforge/tracking/__init__.py +30 -0
  198. traceforge/tracking/models.py +115 -0
  199. traceforge/tracking/phase_tracker.py +288 -0
  200. traceforge/types.py +315 -0
  201. traceforge_toolkit-0.1.0.dist-info/METADATA +188 -0
  202. traceforge_toolkit-0.1.0.dist-info/RECORD +205 -0
  203. traceforge_toolkit-0.1.0.dist-info/WHEEL +4 -0
  204. traceforge_toolkit-0.1.0.dist-info/entry_points.txt +2 -0
  205. traceforge_toolkit-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,480 @@
1
+ # Effect overrides for specific binary+subcmd or binary+flag combinations.
2
+ # Used by effect_for_binary() when no shell_rule matched with an explicit effect.
3
+ #
4
+ # Format:
5
+ # binary_name:
6
+ # flag_effects: # flag-based overrides (checked first)
7
+ # - flags: ["-X", "--data", ...]
8
+ # effect: mutating
9
+ # mode: any_present # "any_present" = any flag matches
10
+ # - flags: ["--check"]
11
+ # effect: read_only
12
+ # mode: any_present
13
+ # subcmd_effects: # subcommand-based effects
14
+ # subcmd_name: effect
15
+ # default_effect: read_only # when no subcmd rule matches
16
+
17
+ effect_overrides:
18
+ # Linters: --fix flag makes them mutating
19
+ ruff:
20
+ flag_effects:
21
+ - flags: ["--fix"]
22
+ effect: mutating
23
+ mode: any_present
24
+ default_effect: read_only
25
+
26
+ eslint:
27
+ flag_effects:
28
+ - flags: ["--fix"]
29
+ effect: mutating
30
+ mode: any_present
31
+ default_effect: read_only
32
+
33
+ rubocop:
34
+ flag_effects:
35
+ - flags: ["--fix", "-a", "-A", "--auto-correct"]
36
+ effect: mutating
37
+ mode: any_present
38
+ default_effect: read_only
39
+
40
+ clippy:
41
+ flag_effects:
42
+ - flags: ["--fix"]
43
+ effect: mutating
44
+ mode: any_present
45
+ default_effect: read_only
46
+
47
+ # Formatters: --check flag makes them read-only
48
+ black:
49
+ flag_effects:
50
+ - flags: ["--check"]
51
+ effect: read_only
52
+ mode: any_present
53
+ default_effect: mutating
54
+
55
+ prettier:
56
+ flag_effects:
57
+ - flags: ["--check"]
58
+ effect: read_only
59
+ mode: any_present
60
+ default_effect: mutating
61
+
62
+ # sed/perl: -i flag means in-place edit
63
+ sed:
64
+ flag_effects:
65
+ - flags: ["-i"]
66
+ effect: mutating
67
+ mode: any_present
68
+ default_effect: read_only
69
+
70
+ perl:
71
+ flag_effects:
72
+ - flags: ["-i"]
73
+ effect: mutating
74
+ mode: any_present
75
+
76
+ # curl: write flags make it mutating
77
+ curl:
78
+ flag_effects:
79
+ - flags: ["-X", "--request", "-d", "--data", "--data-raw", "--data-binary",
80
+ "--data-urlencode", "-F", "--form", "-T", "--upload-file",
81
+ "-o", "-O", "--output"]
82
+ effect: mutating
83
+ mode: any_present
84
+ default_effect: read_only
85
+
86
+ # Git: subcmd determines effect
87
+ git:
88
+ subcmd_effects:
89
+ commit: mutating
90
+ push: mutating
91
+ merge: mutating
92
+ rebase: mutating
93
+ cherry-pick: mutating
94
+ tag: mutating
95
+ reset: mutating
96
+ stash: mutating
97
+ add: mutating
98
+ checkout: mutating
99
+ switch: mutating
100
+ pull: mutating
101
+ clone: mutating
102
+ restore: mutating
103
+ clean: destructive
104
+ default_effect: read_only
105
+
106
+ # Docker/Podman
107
+ docker:
108
+ subcmd_effects:
109
+ rm: destructive
110
+ rmi: destructive
111
+ prune: destructive
112
+ build: mutating
113
+ push: mutating
114
+ run: mutating
115
+ exec: mutating
116
+ start: mutating
117
+ restart: mutating
118
+ stop: mutating
119
+ pull: mutating
120
+ ps: read_only
121
+ images: read_only
122
+ logs: read_only
123
+ inspect: read_only
124
+ stats: read_only
125
+ system: read_only
126
+ compound_subcmd_effects:
127
+ system:
128
+ prune: destructive
129
+ image:
130
+ prune: destructive
131
+ volume:
132
+ prune: destructive
133
+ container:
134
+ prune: destructive
135
+
136
+ podman:
137
+ subcmd_effects:
138
+ rm: destructive
139
+ rmi: destructive
140
+ prune: destructive
141
+ build: mutating
142
+ push: mutating
143
+ run: mutating
144
+ exec: mutating
145
+ start: mutating
146
+ restart: mutating
147
+ stop: mutating
148
+ pull: mutating
149
+ ps: read_only
150
+ images: read_only
151
+ logs: read_only
152
+ inspect: read_only
153
+ stats: read_only
154
+ system: read_only
155
+ compound_subcmd_effects:
156
+ system:
157
+ prune: destructive
158
+ image:
159
+ prune: destructive
160
+ volume:
161
+ prune: destructive
162
+ container:
163
+ prune: destructive
164
+
165
+ # Kubernetes
166
+ kubectl:
167
+ subcmd_effects:
168
+ delete: destructive
169
+ apply: mutating
170
+ create: mutating
171
+ patch: mutating
172
+ replace: mutating
173
+ exec: mutating
174
+ run: mutating
175
+ get: read_only
176
+ describe: read_only
177
+ logs: read_only
178
+ top: read_only
179
+ events: read_only
180
+
181
+ # Terraform / OpenTofu
182
+ terraform:
183
+ subcmd_effects:
184
+ destroy: destructive
185
+ apply: mutating
186
+ init: mutating
187
+ plan: read_only
188
+ validate: read_only
189
+ show: read_only
190
+ state: read_only
191
+ output: read_only
192
+
193
+ tofu:
194
+ subcmd_effects:
195
+ destroy: destructive
196
+ apply: mutating
197
+ init: mutating
198
+ plan: read_only
199
+ validate: read_only
200
+ show: read_only
201
+ state: read_only
202
+ output: read_only
203
+
204
+ # ═══════════════════════════════════════════════════════════════════════════
205
+ # Cloud provider CLIs — use verb_prefix_effects for multi-level commands
206
+ # These match verbs appearing anywhere in positional args (e.g., "aws ec2 describe-instances")
207
+ # ═══════════════════════════════════════════════════════════════════════════
208
+
209
+ aws:
210
+ verb_prefix_effects:
211
+ # Read-only verbs
212
+ describe: read_only
213
+ get: read_only
214
+ list: read_only
215
+ head: read_only
216
+ wait: read_only
217
+ check: read_only
218
+ preview: read_only
219
+ validate: read_only
220
+ estimate: read_only
221
+ lookup: read_only
222
+ download: read_only
223
+ receive: read_only
224
+ verify: read_only
225
+ scan: read_only
226
+ detect: read_only
227
+ analyze: read_only
228
+ evaluate: read_only
229
+ batch-get: read_only
230
+ batch-check: read_only
231
+ generate: read_only
232
+ ls: read_only
233
+ presign: read_only
234
+ # Mutating verbs
235
+ create: mutating
236
+ batch-put: mutating
237
+ batch-write: mutating
238
+ put: mutating
239
+ update: mutating
240
+ tag: mutating
241
+ untag: mutating
242
+ start: mutating
243
+ stop: mutating
244
+ reboot: mutating
245
+ modify: mutating
246
+ attach: mutating
247
+ detach: mutating
248
+ associate: mutating
249
+ disassociate: mutating
250
+ enable: mutating
251
+ disable: mutating
252
+ register: mutating
253
+ import: mutating
254
+ copy: mutating
255
+ set: mutating
256
+ add: mutating
257
+ scale: mutating
258
+ restore: mutating
259
+ rotate: mutating
260
+ encrypt: mutating
261
+ allocate: mutating
262
+ assign: mutating
263
+ authorize: mutating
264
+ accept: mutating
265
+ invoke: mutating
266
+ send: mutating
267
+ publish: mutating
268
+ subscribe: mutating
269
+ confirm: mutating
270
+ run: mutating
271
+ execute: mutating
272
+ submit: mutating
273
+ reset: mutating
274
+ move: mutating
275
+ upgrade: mutating
276
+ renew: mutating
277
+ replace: mutating
278
+ configure: mutating
279
+ connect: mutating
280
+ provision: mutating
281
+ activate: mutating
282
+ resume: mutating
283
+ pause: mutating
284
+ protect: mutating
285
+ unprotect: mutating
286
+ assume: mutating
287
+ cp: mutating
288
+ mv: mutating
289
+ mb: mutating
290
+ sync: mutating
291
+ deploy: mutating
292
+ push: mutating
293
+ upload: mutating
294
+ change: mutating
295
+ # Destructive verbs
296
+ delete: destructive
297
+ batch-delete: destructive
298
+ terminate: destructive
299
+ remove: destructive
300
+ purge: destructive
301
+ destroy: destructive
302
+ revoke: destructive
303
+ deregister: destructive
304
+ cancel: destructive
305
+ abort: destructive
306
+ reject: destructive
307
+ force-delete: destructive
308
+ empty: destructive
309
+ release: destructive
310
+ rm: destructive
311
+ rb: destructive
312
+
313
+ az:
314
+ verb_prefix_effects:
315
+ # Read-only verbs
316
+ list: read_only
317
+ show: read_only
318
+ get: read_only
319
+ check: read_only
320
+ wait: read_only
321
+ exists: read_only
322
+ browse: read_only
323
+ export: read_only
324
+ query: read_only
325
+ download: read_only
326
+ generate: read_only
327
+ # Mutating verbs
328
+ create: mutating
329
+ update: mutating
330
+ set: mutating
331
+ start: mutating
332
+ stop: mutating
333
+ restart: mutating
334
+ scale: mutating
335
+ import: mutating
336
+ assign: mutating
337
+ move: mutating
338
+ lock: mutating
339
+ unlock: mutating
340
+ configure: mutating
341
+ connect: mutating
342
+ enable: mutating
343
+ disable: mutating
344
+ rotate: mutating
345
+ upgrade: mutating
346
+ add: mutating
347
+ renew: mutating
348
+ failover: mutating
349
+ swap: mutating
350
+ resize: mutating
351
+ restore: mutating
352
+ recover: mutating
353
+ accept: mutating
354
+ invoke: mutating
355
+ apply: mutating
356
+ attach: mutating
357
+ migrate: mutating
358
+ convert: mutating
359
+ redeploy: mutating
360
+ reimage: mutating
361
+ generalize: mutating
362
+ capture: mutating
363
+ provision: mutating
364
+ deploy: mutating
365
+ push: mutating
366
+ publish: mutating
367
+ upload: mutating
368
+ up: mutating
369
+ build: mutating
370
+ run: mutating
371
+ detach: mutating
372
+ login: read_only
373
+ logout: read_only
374
+ account: read_only
375
+ # Destructive verbs
376
+ delete: destructive
377
+ purge: destructive
378
+ remove: destructive
379
+ clear: destructive
380
+ revoke: destructive
381
+ deallocate: mutating
382
+ deactivate: destructive
383
+ cancel: destructive
384
+ abort: destructive
385
+ force-delete: destructive
386
+ unbind: destructive
387
+
388
+ gcloud:
389
+ verb_prefix_effects:
390
+ # Read-only verbs
391
+ list: read_only
392
+ ls: read_only
393
+ cat: read_only
394
+ describe: read_only
395
+ get-iam-policy: read_only
396
+ info: read_only
397
+ export: read_only
398
+ get: read_only
399
+ print-access-token: read_only
400
+ print-identity-token: read_only
401
+ read: read_only
402
+ tail: read_only
403
+ show: read_only
404
+ check: read_only
405
+ auth: read_only
406
+ config: read_only
407
+ init: read_only
408
+ components: read_only
409
+ version: read_only
410
+ # Mutating verbs
411
+ create: mutating
412
+ update: mutating
413
+ set: mutating
414
+ set-iam-policy: mutating
415
+ add-iam-policy-binding: mutating
416
+ start: mutating
417
+ stop: mutating
418
+ resize: mutating
419
+ add: mutating
420
+ import: mutating
421
+ enable: mutating
422
+ disable: mutating
423
+ connect: mutating
424
+ ssh: mutating
425
+ scp: mutating
426
+ attach: mutating
427
+ detach: mutating
428
+ move: mutating
429
+ restore: mutating
430
+ reset: mutating
431
+ upgrade: mutating
432
+ scale: mutating
433
+ apply: mutating
434
+ configure: mutating
435
+ submit: mutating
436
+ invoke: mutating
437
+ trigger: mutating
438
+ approve: mutating
439
+ reject: destructive
440
+ activate: mutating
441
+ modify: mutating
442
+ patch: mutating
443
+ promote: mutating
444
+ deploy: mutating
445
+ push: mutating
446
+ cp: mutating
447
+ mv: mutating
448
+ undelete: mutating
449
+ snapshot: mutating
450
+ # Destructive verbs
451
+ delete: destructive
452
+ rm: destructive
453
+ remove-iam-policy-binding: destructive
454
+ destroy: destructive
455
+ drain: destructive
456
+ clear: destructive
457
+ revoke: destructive
458
+ purge: destructive
459
+ drop: destructive
460
+
461
+ # gsutil legacy CLI (verb is the first positional — handled by subcmd_effects)
462
+ gsutil:
463
+ subcmd_effects:
464
+ ls: read_only
465
+ cat: read_only
466
+ stat: read_only
467
+ du: read_only
468
+ hash: read_only
469
+ ver: read_only
470
+ cp: mutating
471
+ mv: mutating
472
+ mb: mutating
473
+ rsync: mutating
474
+ rewrite: mutating
475
+ compose: mutating
476
+ setmeta: mutating
477
+ signurl: read_only
478
+ rm: destructive
479
+ rb: destructive
480
+ default_effect: read_only