tenuo-claude-code 0.6.3__tar.gz → 0.6.4__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.
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/PKG-INFO +2 -2
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/docs/DETAILS.md +1 -1
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/pyproject.toml +2 -2
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/src/tenuo_claude_code/__init__.py +1 -1
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/src/tenuo_claude_code/authorizer_runtime.py +1 -1
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/src/tenuo_claude_code/cli.py +2 -2
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/tests/test_authorizer_runtime.py +2 -2
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/.gitignore +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/CONTRIBUTING.md +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/LICENSE +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/README.md +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/demo/.claude/agents/researcher.md +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/demo/.mcp.json +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/demo/README.md +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/demo/docs/README.md +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/demo/fake-secrets.env +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/demo/ops_server.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/demo/sandbox/checkout-evidence.log +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/demo/sandbox/incident-report.md +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/demo/sandbox/notes.txt +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/demo/tenuo.yaml +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/demo/tenuo_demo.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/docs/ENTERPRISE.md +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/docs/TROUBLESHOOTING.md +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/docs/images/cloud-audit-stream.png +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/docs/images/cloud-receipt-approval-detail.png +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/docs/images/tenuo_claude_code_architecture.png +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/docs/images/tenuo_claude_code_architecture.svg +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/examples/managed/README.md +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/examples/policies/README.md +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/examples/policies/dry-run-rollout.yaml +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/examples/policies/enforce-with-mcp.yaml +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/examples/policies/read-only-research.yaml +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/src/tenuo_claude_code/admin.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/src/tenuo_claude_code/data/harness_tools.yaml +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/src/tenuo_claude_code/packs/filesystem-dev/pack.yaml +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/src/tenuo_claude_code/packs/filesystem-dev/tenuo.yaml.tmpl +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/src/tenuo_claude_code/packs/github-mcp/pack.yaml +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/src/tenuo_claude_code/packs/github-mcp/tenuo.yaml.tmpl +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/src/tenuo_claude_code/packs/http-api-safe/pack.yaml +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/src/tenuo_claude_code/packs/http-api-safe/tenuo.yaml.tmpl +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/src/tenuo_claude_code/packs.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/src/tenuo_claude_code/paths.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/src/tenuo_claude_code/templates/tenuo.yaml.example +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/src/tenuo_claude_code/verify.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/templates/README.md +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/templates/admin.env.example +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/templates/cloud.env.example +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/templates/tenuo.yaml.advanced.example +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/templates/tenuo.yaml.cloud.example +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/templates/tenuo.yaml.example +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/tests/conftest.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/tests/test_admin.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/tests/test_approvals.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/tests/test_authorize_call.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/tests/test_check.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/tests/test_cloud_bindings.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/tests/test_constraints.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/tests/test_dx_improvements.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/tests/test_ipc_transport.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/tests/test_managed_template.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/tests/test_mcp_proxy.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/tests/test_packs.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/tests/test_permissions.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/tests/test_posture.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/tests/test_routing.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/tests/test_scaffold.py +0 -0
- {tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/tests/test_subagents.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: tenuo-claude-code
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.4
|
|
4
4
|
Summary: Tenuo governance for Claude Code — warrants, hooks, MCP proxy, and Cloud lifecycle
|
|
5
5
|
Project-URL: Homepage, https://tenuo.ai
|
|
6
6
|
Project-URL: Repository, https://github.com/tenuo-ai/claude-governance
|
|
@@ -27,7 +27,7 @@ Requires-Dist: certifi>=2024.0
|
|
|
27
27
|
Requires-Dist: cryptography>=42.0
|
|
28
28
|
Requires-Dist: mcp<2,>=1.0
|
|
29
29
|
Requires-Dist: pyyaml>=6.0
|
|
30
|
-
Requires-Dist: tenuo<0.
|
|
30
|
+
Requires-Dist: tenuo<0.4,>=0.3.0
|
|
31
31
|
Description-Content-Type: text/markdown
|
|
32
32
|
|
|
33
33
|
# Tenuo for Claude Code
|
|
@@ -76,7 +76,7 @@ When `subagents:` is declared, you get two layers:
|
|
|
76
76
|
|
|
77
77
|
Roles must match a real `subagent_type` (`.claude/agents/<name>.md` frontmatter `name:`, or a built-in); `verify` and `status` check this. Omit `subagents:` for flat coverage: spawns are then audited, not gated, and the subagent runs under the full session warrant.
|
|
78
78
|
|
|
79
|
-
Changing `subagents:` is a policy change: re-run `tenuo-admin setup` (Cloud) or `init` (local). Note one sharp edge: the bundled `Workflow` harness tool tags its inner calls with an `agent_type` that isn't a declared role, so under `subagents:` those inner calls are denied. Remove `Workflow` from the `allow:` list or omit `subagents:` if you need it. Requires `tenuo` ≥ 0.
|
|
79
|
+
Changing `subagents:` is a policy change: re-run `tenuo-admin setup` (Cloud) or `init` (local). Note one sharp edge: the bundled `Workflow` harness tool tags its inner calls with an `agent_type` that isn't a declared role, so under `subagents:` those inner calls are denied. Remove `Workflow` from the `allow:` list or omit `subagents:` if you need it. Requires `tenuo` ≥ 0.3.0 and authorizer `0.3.0` (pinned in `cli.py`).
|
|
80
80
|
|
|
81
81
|
## Dry-run mode (`mode: dry-run`)
|
|
82
82
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "tenuo-claude-code"
|
|
3
|
-
version = "0.6.
|
|
3
|
+
version = "0.6.4"
|
|
4
4
|
description = "Tenuo governance for Claude Code — warrants, hooks, MCP proxy, and Cloud lifecycle"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
@@ -23,7 +23,7 @@ classifiers = [
|
|
|
23
23
|
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
24
24
|
]
|
|
25
25
|
dependencies = [
|
|
26
|
-
"tenuo>=0.
|
|
26
|
+
"tenuo>=0.3.0,<0.4",
|
|
27
27
|
"mcp>=1.0,<2",
|
|
28
28
|
"PyYAML>=6.0",
|
|
29
29
|
"certifi>=2024.0",
|
{tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/src/tenuo_claude_code/authorizer_runtime.py
RENAMED
|
@@ -23,7 +23,7 @@ from typing import Callable
|
|
|
23
23
|
|
|
24
24
|
import certifi
|
|
25
25
|
|
|
26
|
-
DEFAULT_IMAGE = "tenuo/authorizer:0.
|
|
26
|
+
DEFAULT_IMAGE = "tenuo/authorizer:0.3.0"
|
|
27
27
|
DEFAULT_AUTHORIZER_PORT = 9090
|
|
28
28
|
AUTHORIZER_PORT_ENV = "TENUO_AUTHORIZER_PORT"
|
|
29
29
|
LEGACY_AUTHORIZER_PORT_ENV = "PORT"
|
|
@@ -354,7 +354,7 @@ POP_HEADER = "X-Tenuo-PoP"
|
|
|
354
354
|
# The authorizer ships as a published container image (Docker Hub), pinned in
|
|
355
355
|
# lockstep with the `tenuo` PyPI package. Override with TENUO_AUTHORIZER_IMAGE or
|
|
356
356
|
# an `authorizer.image` key in tenuo.yaml.
|
|
357
|
-
DEFAULT_AUTHZ_IMAGE = "tenuo/authorizer:0.
|
|
357
|
+
DEFAULT_AUTHZ_IMAGE = "tenuo/authorizer:0.3.0"
|
|
358
358
|
|
|
359
359
|
# Claude tool -> (capability, primary arg, Claude input field for that arg)
|
|
360
360
|
#
|
|
@@ -1271,7 +1271,7 @@ def _parse_connect_token(raw: str) -> dict:
|
|
|
1271
1271
|
except ImportError as e:
|
|
1272
1272
|
raise SystemExit(
|
|
1273
1273
|
"TENUO_CONNECT_TOKEN requires the tenuo_core extension "
|
|
1274
|
-
"(bundled with tenuo>=0.
|
|
1274
|
+
"(bundled with tenuo>=0.3.0)."
|
|
1275
1275
|
) from e
|
|
1276
1276
|
except Exception as e:
|
|
1277
1277
|
raise SystemExit(f"Invalid TENUO_CONNECT_TOKEN: {e}") from e
|
|
@@ -119,7 +119,7 @@ def test_install_authorizer_skips_when_current(tmp_path, monkeypatch):
|
|
|
119
119
|
managed.parent.mkdir()
|
|
120
120
|
managed.write_bytes(b"fake")
|
|
121
121
|
with mock.patch.object(art, "managed_binary_path", return_value=managed):
|
|
122
|
-
with mock.patch.object(art, "query_binary_version", return_value="0.
|
|
122
|
+
with mock.patch.object(art, "query_binary_version", return_value="0.3.0+authz.3"):
|
|
123
123
|
with mock.patch.object(art, "download_release_binary") as dl:
|
|
124
124
|
result = art.install_authorizer(force=False)
|
|
125
125
|
assert result == managed
|
|
@@ -182,7 +182,7 @@ def test_install_authorizer_cmd_without_project(tmp_path, monkeypatch):
|
|
|
182
182
|
fake.parent.mkdir()
|
|
183
183
|
fake.write_bytes(b"fake")
|
|
184
184
|
monkeypatch.setattr(art, "install_authorizer", lambda *a, **kw: fake)
|
|
185
|
-
monkeypatch.setattr(art, "query_binary_version", lambda p: "0.
|
|
185
|
+
monkeypatch.setattr(art, "query_binary_version", lambda p: "0.3.0+authz.3")
|
|
186
186
|
cli.main()
|
|
187
187
|
|
|
188
188
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/docs/images/cloud-receipt-approval-detail.png
RENAMED
|
File without changes
|
{tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/docs/images/tenuo_claude_code_architecture.png
RENAMED
|
File without changes
|
{tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/docs/images/tenuo_claude_code_architecture.svg
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/examples/policies/read-only-research.yaml
RENAMED
|
File without changes
|
|
File without changes
|
{tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/src/tenuo_claude_code/data/harness_tools.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tenuo_claude_code-0.6.3 → tenuo_claude_code-0.6.4}/src/tenuo_claude_code/packs/github-mcp/pack.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|