damage-control-dev 0.1.0__tar.gz → 0.1.1__tar.gz

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 (77) hide show
  1. damage_control_dev-0.1.1/PKG-INFO +92 -0
  2. damage_control_dev-0.1.1/README.md +68 -0
  3. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/pyproject.toml +11 -1
  4. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/__init__.py +1 -1
  5. damage_control_dev-0.1.0/PKG-INFO +0 -15
  6. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/.gitignore +0 -0
  7. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/LICENSE +0 -0
  8. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/NOTICE +0 -0
  9. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/__main__.py +0 -0
  10. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/adapter.py +0 -0
  11. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/audit.py +0 -0
  12. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/breakglass.py +0 -0
  13. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/claude_code.py +0 -0
  14. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/cli.py +0 -0
  15. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/engine.py +0 -0
  16. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/groups.py +0 -0
  17. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/harness_config.py +0 -0
  18. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/hook.py +0 -0
  19. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/install.py +0 -0
  20. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/packs.py +0 -0
  21. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/policy.py +0 -0
  22. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/profile.py +0 -0
  23. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/aws.json +0 -0
  24. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/aws.yaml +0 -0
  25. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/cloud-hosting.json +0 -0
  26. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/cloud-hosting.yaml +0 -0
  27. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/containers.json +0 -0
  28. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/containers.yaml +0 -0
  29. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/control-plane.json +0 -0
  30. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/control-plane.yaml +0 -0
  31. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/core.json +0 -0
  32. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/core.yaml +0 -0
  33. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/databases.json +0 -0
  34. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/databases.yaml +0 -0
  35. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/firebase.json +0 -0
  36. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/firebase.yaml +0 -0
  37. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/gcp.json +0 -0
  38. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/gcp.yaml +0 -0
  39. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/git.json +0 -0
  40. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/git.yaml +0 -0
  41. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/infrastructure.json +0 -0
  42. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/infrastructure.yaml +0 -0
  43. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/mcp-tools.json +0 -0
  44. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/mcp-tools.yaml +0 -0
  45. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/outbound.json +0 -0
  46. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/outbound.yaml +0 -0
  47. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/payloads.json +0 -0
  48. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/payloads.yaml +0 -0
  49. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/publish.json +0 -0
  50. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/publish.yaml +0 -0
  51. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/registry.json +0 -0
  52. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/registry.yaml +0 -0
  53. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/remote.json +0 -0
  54. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/remote.yaml +0 -0
  55. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/tmux.json +0 -0
  56. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/rules/tmux.yaml +0 -0
  57. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/ruleset.py +0 -0
  58. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/tooldefs/aws.json +0 -0
  59. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/tooldefs/aws.yaml +0 -0
  60. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/tooldefs/docker.json +0 -0
  61. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/tooldefs/docker.yaml +0 -0
  62. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/tooldefs/gcp.json +0 -0
  63. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/tooldefs/gcp.yaml +0 -0
  64. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/tooldefs/gh.json +0 -0
  65. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/tooldefs/gh.yaml +0 -0
  66. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/tooldefs/git.json +0 -0
  67. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/tooldefs/git.yaml +0 -0
  68. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/tooldefs/kubectl.json +0 -0
  69. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/tooldefs/kubectl.yaml +0 -0
  70. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/tooldefs/npm.json +0 -0
  71. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/tooldefs/npm.yaml +0 -0
  72. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/tooldefs/terraform.json +0 -0
  73. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/tooldefs/terraform.yaml +0 -0
  74. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/tooldefs/uv.json +0 -0
  75. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/src/damage_control/tooldefs/uv.yaml +0 -0
  76. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/tools/build_rules_json.py +0 -0
  77. {damage_control_dev-0.1.0 → damage_control_dev-0.1.1}/tools/coverage_matrix.py +0 -0
@@ -0,0 +1,92 @@
1
+ Metadata-Version: 2.5
2
+ Name: damage-control-dev
3
+ Version: 0.1.1
4
+ Summary: Damage control for AI coding agents: a PreToolUse guard that blocks or asks before destructive commands and protected-path writes (Claude Code).
5
+ Project-URL: Homepage, https://github.com/dotdevdotdev/damage-control-dev
6
+ Project-URL: Source, https://github.com/dotdevdotdev/damage-control-dev
7
+ Project-URL: Issues, https://github.com/dotdevdotdev/damage-control-dev/issues
8
+ Project-URL: Security, https://github.com/dotdevdotdev/damage-control-dev/security/policy
9
+ Author-email: dotdev <dev@dotdev.dev>
10
+ License: Apache-2.0
11
+ License-File: LICENSE
12
+ License-File: NOTICE
13
+ Keywords: agent,ai,claude-code,guardrails,hooks,safety
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: License :: OSI Approved :: Apache Software License
17
+ Classifier: Operating System :: MacOS
18
+ Classifier: Operating System :: POSIX :: Linux
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.9
21
+ Requires-Python: >=3.9
22
+ Requires-Dist: pyyaml>=6.0
23
+ Description-Content-Type: text/markdown
24
+
25
+ # damage-control-dev
26
+
27
+ A guardrail layer for AI coding agents. It runs as a Claude Code `PreToolUse` hook and **blocks or asks before destructive commands, secret access, protected-path writes and risky MCP calls**, before the tool runs.
28
+
29
+ It is a seatbelt, not a sandbox. See [What it is not](#what-it-is-not).
30
+
31
+ ```
32
+ uv tool install damage-control-dev # or: pipx install damage-control-dev
33
+ damage-control-dev init # register the hooks, self-test them, record the install
34
+ damage-control-dev status # read-only drift report
35
+ ```
36
+
37
+ Supports **Claude Code on macOS and Linux**, Python 3.9 or newer. Nothing else is supported or planned.
38
+
39
+ ## What it does
40
+
41
+ - Guards Bash, Edit, Write, Read and MCP tool calls through one policy ladder (allow, ask, block).
42
+ - Re-scans wrapped commands as commands in their own right: `ssh host "..."`, `sh -c`, database clients (`psql -c`, `mysql -e`), `git -c` keys that run programs.
43
+ - Protects its own control plane: the hook scripts, the settings that register them, and its policy file cannot be edited by the agent it guards.
44
+ - Fails closed: any crash or import failure in the hook exits 2 (block), and `init` registers the hook with `onFailure: block` (Claude Code 2.1.295 or newer) so a missing interpreter blocks the call instead of silently allowing it.
45
+ - Unattended mode: when no human can answer a prompt, an `ask` becomes a block unless a rule carries an explicit grant.
46
+ - Rules ship as groups that are on by default (core, git, registry, payloads, remote, MCP tools, control plane) and opt-in vendor packs: `aws`, `gcp`, `firebase`, `cloud-hosting`, `databases`, `containers`, `infrastructure`, `publish`, `tmux`. Every rule has a frozen, stable id.
47
+ - Offline: after `init` nothing touches the network.
48
+
49
+ ```
50
+ damage-control-dev check "git push --force origin main" # what would the hooks decide?
51
+ damage-control-dev rules # list enforced rule ids
52
+ damage-control-dev packs # list packs; enabling is human-terminal only
53
+ damage-control-dev doctor --fix # self-test and repair
54
+ damage-control-dev uninstall # remove exactly our entries
55
+ ```
56
+
57
+ ## What it is not
58
+
59
+ - Not a sandbox, and not a boundary against a determined adversary. A process running as the same OS user can edit anything this tool can.
60
+ - Only as strong as the harness's hook surface: commands you type yourself with `!`, tools that have no hook event, and a hook that times out are outside its reach.
61
+ - No network egress filtering, containment or resource limits.
62
+ - Expect false positives and false negatives. The policy is: ask, then learn.
63
+
64
+ See [docs/threat-model.md](docs/threat-model.md).
65
+
66
+ ## Where things live
67
+
68
+ Everything the installer keeps is under `~/.damage-control/` (or `$DAMAGE_CONTROL_HOME`):
69
+
70
+ - `damagecontrol.yml`: the protected policy (kill switch, `packs:`, `disabled_groups:`)
71
+ - `damage-control/`, `tooldefs/`: your own rule overlays
72
+ - `state/install.json`: what `init` recorded (interpreter, ruleset digest, per-scope write hash); `state/backups/` holds first-write backups of your settings file
73
+ - `bin/damage-control-breakglass`: a stdlib-only script that unregisters the hooks if the Python environment is ever broken
74
+
75
+ A policy with no `packs:` key loads the default groups and no vendor packs; an unreadable policy loads everything.
76
+
77
+ If the environment breaks (for example a `uv tool install --force` interrupted mid-upgrade) and the hook cannot start, every tool call is blocked by design. Run `python3 ~/.damage-control/bin/damage-control-breakglass unregister` from a normal terminal, then reinstall and run `init` again.
78
+
79
+ ## Docs
80
+
81
+ - [docs/threat-model.md](docs/threat-model.md): what it protects against and the residuals
82
+ - [docs/coverage.md](docs/coverage.md): which tools are covered and how
83
+ - [docs/rule-authoring.md](docs/rule-authoring.md): writing rules, packs and overlays
84
+ - [docs/extending.md](docs/extending.md): profiles, the hook runtime, registration and repair
85
+
86
+ ## Security
87
+
88
+ A bypass of a shipped rule that the threat model says should be caught is a vulnerability. Report it privately, see [SECURITY.md](SECURITY.md).
89
+
90
+ ## License
91
+
92
+ Apache-2.0. Contributions are signed off under the DCO, see [CONTRIBUTING.md](CONTRIBUTING.md).
@@ -0,0 +1,68 @@
1
+ # damage-control-dev
2
+
3
+ A guardrail layer for AI coding agents. It runs as a Claude Code `PreToolUse` hook and **blocks or asks before destructive commands, secret access, protected-path writes and risky MCP calls**, before the tool runs.
4
+
5
+ It is a seatbelt, not a sandbox. See [What it is not](#what-it-is-not).
6
+
7
+ ```
8
+ uv tool install damage-control-dev # or: pipx install damage-control-dev
9
+ damage-control-dev init # register the hooks, self-test them, record the install
10
+ damage-control-dev status # read-only drift report
11
+ ```
12
+
13
+ Supports **Claude Code on macOS and Linux**, Python 3.9 or newer. Nothing else is supported or planned.
14
+
15
+ ## What it does
16
+
17
+ - Guards Bash, Edit, Write, Read and MCP tool calls through one policy ladder (allow, ask, block).
18
+ - Re-scans wrapped commands as commands in their own right: `ssh host "..."`, `sh -c`, database clients (`psql -c`, `mysql -e`), `git -c` keys that run programs.
19
+ - Protects its own control plane: the hook scripts, the settings that register them, and its policy file cannot be edited by the agent it guards.
20
+ - Fails closed: any crash or import failure in the hook exits 2 (block), and `init` registers the hook with `onFailure: block` (Claude Code 2.1.295 or newer) so a missing interpreter blocks the call instead of silently allowing it.
21
+ - Unattended mode: when no human can answer a prompt, an `ask` becomes a block unless a rule carries an explicit grant.
22
+ - Rules ship as groups that are on by default (core, git, registry, payloads, remote, MCP tools, control plane) and opt-in vendor packs: `aws`, `gcp`, `firebase`, `cloud-hosting`, `databases`, `containers`, `infrastructure`, `publish`, `tmux`. Every rule has a frozen, stable id.
23
+ - Offline: after `init` nothing touches the network.
24
+
25
+ ```
26
+ damage-control-dev check "git push --force origin main" # what would the hooks decide?
27
+ damage-control-dev rules # list enforced rule ids
28
+ damage-control-dev packs # list packs; enabling is human-terminal only
29
+ damage-control-dev doctor --fix # self-test and repair
30
+ damage-control-dev uninstall # remove exactly our entries
31
+ ```
32
+
33
+ ## What it is not
34
+
35
+ - Not a sandbox, and not a boundary against a determined adversary. A process running as the same OS user can edit anything this tool can.
36
+ - Only as strong as the harness's hook surface: commands you type yourself with `!`, tools that have no hook event, and a hook that times out are outside its reach.
37
+ - No network egress filtering, containment or resource limits.
38
+ - Expect false positives and false negatives. The policy is: ask, then learn.
39
+
40
+ See [docs/threat-model.md](docs/threat-model.md).
41
+
42
+ ## Where things live
43
+
44
+ Everything the installer keeps is under `~/.damage-control/` (or `$DAMAGE_CONTROL_HOME`):
45
+
46
+ - `damagecontrol.yml`: the protected policy (kill switch, `packs:`, `disabled_groups:`)
47
+ - `damage-control/`, `tooldefs/`: your own rule overlays
48
+ - `state/install.json`: what `init` recorded (interpreter, ruleset digest, per-scope write hash); `state/backups/` holds first-write backups of your settings file
49
+ - `bin/damage-control-breakglass`: a stdlib-only script that unregisters the hooks if the Python environment is ever broken
50
+
51
+ A policy with no `packs:` key loads the default groups and no vendor packs; an unreadable policy loads everything.
52
+
53
+ If the environment breaks (for example a `uv tool install --force` interrupted mid-upgrade) and the hook cannot start, every tool call is blocked by design. Run `python3 ~/.damage-control/bin/damage-control-breakglass unregister` from a normal terminal, then reinstall and run `init` again.
54
+
55
+ ## Docs
56
+
57
+ - [docs/threat-model.md](docs/threat-model.md): what it protects against and the residuals
58
+ - [docs/coverage.md](docs/coverage.md): which tools are covered and how
59
+ - [docs/rule-authoring.md](docs/rule-authoring.md): writing rules, packs and overlays
60
+ - [docs/extending.md](docs/extending.md): profiles, the hook runtime, registration and repair
61
+
62
+ ## Security
63
+
64
+ A bypass of a shipped rule that the threat model says should be caught is a vulnerability. Report it privately, see [SECURITY.md](SECURITY.md).
65
+
66
+ ## License
67
+
68
+ Apache-2.0. Contributions are signed off under the DCO, see [CONTRIBUTING.md](CONTRIBUTING.md).
@@ -2,11 +2,15 @@
2
2
  name = "damage-control-dev"
3
3
  dynamic = ["version"]
4
4
  description = "Damage control for AI coding agents: a PreToolUse guard that blocks or asks before destructive commands and protected-path writes (Claude Code)."
5
+ readme = "README.md"
5
6
  requires-python = ">=3.9"
6
7
  license = { text = "Apache-2.0" }
7
8
  authors = [{ name = "dotdev", email = "dev@dotdev.dev" }]
8
- keywords = ["ai", "agent", "claude-code", "safety", "hooks"]
9
+ keywords = ["ai", "agent", "claude-code", "safety", "hooks", "guardrails"]
9
10
  classifiers = [
11
+ "Development Status :: 4 - Beta",
12
+ "License :: OSI Approved :: Apache Software License",
13
+ "Intended Audience :: Developers",
10
14
  "Operating System :: MacOS",
11
15
  "Operating System :: POSIX :: Linux",
12
16
  "Programming Language :: Python :: 3",
@@ -16,6 +20,12 @@ classifiers = [
16
20
  # bundled rules ship as JSON, so a hook with no PyYAML still enforces every bundled rule.
17
21
  dependencies = ["pyyaml>=6.0"]
18
22
 
23
+ [project.urls]
24
+ Homepage = "https://github.com/dotdevdotdev/damage-control-dev"
25
+ Source = "https://github.com/dotdevdotdev/damage-control-dev"
26
+ Issues = "https://github.com/dotdevdotdev/damage-control-dev/issues"
27
+ Security = "https://github.com/dotdevdotdev/damage-control-dev/security/policy"
28
+
19
29
  [project.scripts]
20
30
  damage-control-dev = "damage_control.cli:main"
21
31
 
@@ -6,4 +6,4 @@ escape the hook's fail-closed wrapper (a Python crash exits 1, which Claude Code
6
6
  as non-blocking).
7
7
  """
8
8
 
9
- __version__ = "0.1.0"
9
+ __version__ = "0.1.1"
@@ -1,15 +0,0 @@
1
- Metadata-Version: 2.5
2
- Name: damage-control-dev
3
- Version: 0.1.0
4
- Summary: Damage control for AI coding agents: a PreToolUse guard that blocks or asks before destructive commands and protected-path writes (Claude Code).
5
- Author-email: dotdev <dev@dotdev.dev>
6
- License: Apache-2.0
7
- License-File: LICENSE
8
- License-File: NOTICE
9
- Keywords: agent,ai,claude-code,hooks,safety
10
- Classifier: Operating System :: MacOS
11
- Classifier: Operating System :: POSIX :: Linux
12
- Classifier: Programming Language :: Python :: 3
13
- Classifier: Programming Language :: Python :: 3.9
14
- Requires-Python: >=3.9
15
- Requires-Dist: pyyaml>=6.0