judgetap 0.1.1.dev34__tar.gz → 0.1.1.dev3601__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.
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/.github/workflows/release.yml +12 -2
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/CONTRIBUTING.md +1 -1
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/PKG-INFO +1 -1
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/pyproject.toml +1 -1
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/__init__.py +1 -1
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/guard/rules.py +2 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/tests/test_guard_trust.py +25 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/.github/workflows/ci.yml +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/.github/workflows/demo.yml +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/.gitignore +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/.python-version +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/.release-please-manifest.json +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/CHANGELOG.md +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/LICENSE +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/README.md +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/docs/SPEC.md +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/docs/demo.tape +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/release-please-config.json +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/_compat.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/api.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/cascade.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/cli.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/dashboard/__init__.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/dashboard/data.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/dashboard/page.html +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/dashboard/server.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/decision_log.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/engine.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/engines/__init__.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/engines/agentjev.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/engines/jev.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/engines/laya.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/engines/llm.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/errors.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/evaluate.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/guard/__init__.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/guard/core.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/guard/hook.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/guard/install.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/guard/loop.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/guard/stop.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/py.typed +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/secrets.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/testing.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/src/judgetap/types.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/tests/test_api.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/tests/test_call_accounting.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/tests/test_calls.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/tests/test_cascade.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/tests/test_dashboard.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/tests/test_decision_log.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/tests/test_engine_jev.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/tests/test_engine_llm.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/tests/test_engine_local.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/tests/test_evaluate.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/tests/test_guard_agents.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/tests/test_guard_core.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/tests/test_guard_hook.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/tests/test_guard_loop.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/tests/test_guard_polish_76.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/tests/test_guard_rules.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/tests/test_guard_stop.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/tests/test_questions.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/tests/test_robustness_68.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/tests/test_secrets.py +0 -0
- {judgetap-0.1.1.dev34 → judgetap-0.1.1.dev3601}/uv.lock +0 -0
|
@@ -82,8 +82,15 @@ jobs:
|
|
|
82
82
|
steps:
|
|
83
83
|
- uses: actions/checkout@v4
|
|
84
84
|
with:
|
|
85
|
-
|
|
85
|
+
# Always a tag, never a branch that happens to share the name.
|
|
86
|
+
ref: refs/tags/${{ needs.release-please.outputs.tag || github.event.release.tag_name || inputs.tag }}
|
|
86
87
|
- uses: astral-sh/setup-uv@v6
|
|
88
|
+
- name: A manual publish needs a GitHub Release for the tag
|
|
89
|
+
if: github.event_name == 'workflow_dispatch'
|
|
90
|
+
env:
|
|
91
|
+
GH_TOKEN: ${{ github.token }}
|
|
92
|
+
TAG: ${{ inputs.tag }}
|
|
93
|
+
run: gh release view "$TAG" --repo "$GITHUB_REPOSITORY" >/dev/null
|
|
87
94
|
- name: Check the tag matches the package version
|
|
88
95
|
# The tag arrives through the environment, never interpolated into the
|
|
89
96
|
# script: a release tag is user-controlled text.
|
|
@@ -115,10 +122,13 @@ jobs:
|
|
|
115
122
|
# and before the next one, and is unique per run.
|
|
116
123
|
env:
|
|
117
124
|
RUN_NUMBER: ${{ github.run_number }}
|
|
125
|
+
RUN_ATTEMPT: ${{ github.run_attempt }}
|
|
118
126
|
run: |
|
|
119
127
|
uv run --no-project python - <<'EOF'
|
|
120
128
|
import json, os, re, pathlib
|
|
121
|
-
|
|
129
|
+
# run_number * 100 + attempt: a rerun (same run number) still gets a
|
|
130
|
+
# new, higher version; up to 99 attempts per run.
|
|
131
|
+
run = int(os.environ["RUN_NUMBER"]) * 100 + int(os.environ["RUN_ATTEMPT"])
|
|
122
132
|
current = json.load(open(".release-please-manifest.json"))["."]
|
|
123
133
|
major, minor, patch = (int(x) for x in current.split("."))
|
|
124
134
|
dev = f"{major}.{minor}.{patch + 1}.dev{run}"
|
|
@@ -48,5 +48,5 @@ By contributing you agree your work is licensed under Apache-2.0.
|
|
|
48
48
|
## Releases
|
|
49
49
|
|
|
50
50
|
- Every merge to `main` publishes a dev build to PyPI (`X.Y.Z.devN`), except merging the release PR itself, which publishes the stable version instead. `pip install judgetap` ignores it; `pip install --pre judgetap` gets it.
|
|
51
|
-
- A stable version is published only when a GitHub Release is created: release-please keeps a release PR open with the next version and the changelog, built from conventional commit titles, and merging it tags and publishes. A release published by hand in GitHub is published the same way, after checking the tag matches the package version.
|
|
51
|
+
- A stable version is published only when a GitHub Release is created: release-please keeps a release PR open with the next version and the changelog, built from conventional commit titles, and merging it tags and publishes. A release published by hand in GitHub is published the same way, after checking the tag matches the package version. If a stable publish fails, re-run it from Actions → release → "Run workflow" with the release tag; it only publishes a tag that has a GitHub Release.
|
|
52
52
|
- Publishing uses PyPI Trusted Publishing (OIDC): no tokens are stored anywhere.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: judgetap
|
|
3
|
-
Version: 0.1.1.
|
|
3
|
+
Version: 0.1.1.dev3601
|
|
4
4
|
Summary: Fast typed decisions (choice, score, yes/no) across Jev-style engines, plus a guard for coding agents. Early development.
|
|
5
5
|
Project-URL: Homepage, https://github.com/mergesafe-ai/judgetap
|
|
6
6
|
Author-email: Omer Bar-Ness <omer@zsquared.io>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "judgetap"
|
|
3
|
-
version = "0.1.1.
|
|
3
|
+
version = "0.1.1.dev3601"
|
|
4
4
|
description = "Fast typed decisions (choice, score, yes/no) across Jev-style engines, plus a guard for coding agents. Early development."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "Apache-2.0"
|
|
@@ -920,6 +920,8 @@ def check_path(
|
|
|
920
920
|
# python -c, ...) is an unbounded list; a mention is not. Reading the config
|
|
921
921
|
# (`cat guard.toml`) asks too: rare, and cheap to approve.
|
|
922
922
|
GUARD_CONFIG_MENTION = re.compile(
|
|
923
|
+
# A whole name at both ends: myguard.toml or foo.claude/... is another file.
|
|
924
|
+
r"(?<![\w.-])"
|
|
923
925
|
r"(?:guard\.toml|\.claude/settings[^\s'\"/]*\.json|\.cursor/hooks\.json"
|
|
924
926
|
r"|\.codex/hooks\.json|\.codex/config\.toml)"
|
|
925
927
|
# A whole name: guard.toml.example or settings.json.bak is another file.
|
|
@@ -318,3 +318,28 @@ def test_symlink_with_equals_in_its_name_asks(tmp_path):
|
|
|
318
318
|
(tmp_path / "alias=cfg").symlink_to(tmp_path / "guard.toml")
|
|
319
319
|
assert check_command_writes("echo x >alias=cfg", tmp_path) is not None
|
|
320
320
|
assert check_command_writes("dd if=x of=alias=cfg", tmp_path) is not None
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
@pytest.mark.parametrize(
|
|
324
|
+
"command", ["cat myguard.toml", "cat x-guard.toml", "ls foo.claude/settings.json"]
|
|
325
|
+
)
|
|
326
|
+
def test_other_files_ending_in_a_config_name_do_not_ask(command, tmp_path):
|
|
327
|
+
from judgetap.guard.rules import check_command_writes
|
|
328
|
+
|
|
329
|
+
assert check_command_writes(command, tmp_path) is None
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
@pytest.mark.parametrize(
|
|
333
|
+
"command",
|
|
334
|
+
[
|
|
335
|
+
"cat guard.toml",
|
|
336
|
+
"cat ./guard.toml",
|
|
337
|
+
"echo x >guard.toml",
|
|
338
|
+
"cp a '.claude/settings.json'",
|
|
339
|
+
"x=guard.toml",
|
|
340
|
+
],
|
|
341
|
+
)
|
|
342
|
+
def test_config_name_at_a_boundary_still_asks(command, tmp_path):
|
|
343
|
+
from judgetap.guard.rules import check_command_writes
|
|
344
|
+
|
|
345
|
+
assert check_command_writes(command, tmp_path) is not None
|
|
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
|
|
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
|