grudge-cli 0.1.1__tar.gz → 0.1.3__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 (128) hide show
  1. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/PKG-INFO +48 -4
  2. grudge_cli-0.1.1/grudge_cli.egg-info/PKG-INFO → grudge_cli-0.1.3/README.md +132 -109
  3. grudge_cli-0.1.1/README.md → grudge_cli-0.1.3/grudge_cli.egg-info/PKG-INFO +138 -73
  4. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/pyproject.toml +1 -1
  5. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/LICENSE +0 -0
  6. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/examples/__init__.py +0 -0
  7. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/examples/leaky_agent/__init__.py +0 -0
  8. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/examples/leaky_agent/agent.py +0 -0
  9. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/examples/leaky_agent/agent_fixed.py +0 -0
  10. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/examples/leaky_agent/tools.py +0 -0
  11. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/__init__.py +0 -0
  12. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/__main__.py +0 -0
  13. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/_stubs.py +0 -0
  14. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/admission/__init__.py +0 -0
  15. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/admission/court.py +0 -0
  16. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/admission/verdict.py +0 -0
  17. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/cli/__init__.py +0 -0
  18. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/cli/_common.py +0 -0
  19. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/cli/admit.py +0 -0
  20. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/cli/capture.py +0 -0
  21. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/cli/compile.py +0 -0
  22. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/cli/demo.py +0 -0
  23. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/cli/main.py +0 -0
  24. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/cli/run.py +0 -0
  25. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/cli/scars.py +0 -0
  26. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/cli/shrink.py +0 -0
  27. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/config.py +0 -0
  28. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/demo/__init__.py +0 -0
  29. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/demo/events.py +0 -0
  30. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/demo/orchestrator.py +0 -0
  31. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/demo/server.py +0 -0
  32. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/errors.py +0 -0
  33. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/fuzzer/__init__.py +0 -0
  34. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/fuzzer/fingerprint_guard.py +0 -0
  35. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/fuzzer/mutators.py +0 -0
  36. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/gate/__init__.py +0 -0
  37. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/gate/report.py +0 -0
  38. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/gate/runner.py +0 -0
  39. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/gate/selector.py +0 -0
  40. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/gate/wilson.py +0 -0
  41. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/guard/__init__.py +0 -0
  42. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/guard/compile.py +0 -0
  43. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/guard/import_session.py +0 -0
  44. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/integrations/__init__.py +0 -0
  45. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/integrations/github_comment.py +0 -0
  46. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/integrations/pytest_plugin.py +0 -0
  47. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/llm/__init__.py +0 -0
  48. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/llm/cache.py +0 -0
  49. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/llm/client.py +0 -0
  50. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/locator/__init__.py +0 -0
  51. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/locator/fork.py +0 -0
  52. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/locator/point_of_no_return.py +0 -0
  53. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/predicates/__init__.py +0 -0
  54. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/predicates/call_shape.py +0 -0
  55. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/predicates/compiler.py +0 -0
  56. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/predicates/dsl.py +0 -0
  57. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/predicates/fallback_rules.py +0 -0
  58. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/predicates/ordering.py +0 -0
  59. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/predicates/outcome.py +0 -0
  60. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/predicates/prompts/synthesize.md +0 -0
  61. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/predicates/synthesizer.py +0 -0
  62. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/predicates/taint_flow.py +0 -0
  63. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/recorder/__init__.py +0 -0
  64. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/recorder/adapters/__init__.py +0 -0
  65. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/recorder/adapters/langgraph.py +0 -0
  66. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/recorder/adapters/mcp_proxy.py +0 -0
  67. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/recorder/adapters/raw_sdk.py +0 -0
  68. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/recorder/recorder.py +0 -0
  69. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/recorder/redact.py +0 -0
  70. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/registry/__init__.py +0 -0
  71. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/registry/db.py +0 -0
  72. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/registry/fingerprint.py +0 -0
  73. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/registry/flakiness.py +0 -0
  74. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/registry/retirement.py +0 -0
  75. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/replay/__init__.py +0 -0
  76. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/replay/cassette_player.py +0 -0
  77. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/replay/sandbox.py +0 -0
  78. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/replay/scripted_llm.py +0 -0
  79. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/schema/__init__.py +0 -0
  80. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/schema/cassette.py +0 -0
  81. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/schema/predicate.py +0 -0
  82. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/schema/scar.py +0 -0
  83. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/schema/trace.py +0 -0
  84. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/shrinker/__init__.py +0 -0
  85. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/shrinker/cassette_builder.py +0 -0
  86. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/shrinker/ddmin.py +0 -0
  87. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/shrinker/oracle.py +0 -0
  88. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/shrinker/reducers.py +0 -0
  89. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge_cli.egg-info/SOURCES.txt +0 -0
  90. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge_cli.egg-info/dependency_links.txt +0 -0
  91. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge_cli.egg-info/entry_points.txt +0 -0
  92. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge_cli.egg-info/requires.txt +0 -0
  93. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge_cli.egg-info/top_level.txt +0 -0
  94. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/setup.cfg +0 -0
  95. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_admission_court.py +0 -0
  96. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_cassette_builder.py +0 -0
  97. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_cassette_player.py +0 -0
  98. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_cassette_schema.py +0 -0
  99. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_cli.py +0 -0
  100. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_config.py +0 -0
  101. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_ddmin.py +0 -0
  102. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_demo_flow.py +0 -0
  103. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_docs_check.py +0 -0
  104. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_errors.py +0 -0
  105. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_gate_report.py +0 -0
  106. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_gate_runner.py +0 -0
  107. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_guard_compile.py +0 -0
  108. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_guard_conformance.py +0 -0
  109. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_import_session.py +0 -0
  110. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_leaky_agents.py +0 -0
  111. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_leaky_tools.py +0 -0
  112. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_phase12.py +0 -0
  113. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_predicate_compiler.py +0 -0
  114. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_predicate_schema.py +0 -0
  115. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_predicate_synthesizer.py +0 -0
  116. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_predicates_dsl.py +0 -0
  117. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_recorder.py +0 -0
  118. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_redact.py +0 -0
  119. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_reducers.py +0 -0
  120. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_replay_sandbox.py +0 -0
  121. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_sample_scar.py +0 -0
  122. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_scar_schema.py +0 -0
  123. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_shrinker_oracle.py +0 -0
  124. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_stretch_stubs.py +0 -0
  125. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_trace_hypothesis.py +0 -0
  126. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_trace_schema.py +0 -0
  127. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_viewer_static.py +0 -0
  128. {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_wilson.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: grudge-cli
3
- Version: 0.1.1
3
+ Version: 0.1.3
4
4
  Summary: Deterministic regression scars for agent mistakes.
5
5
  Author: Grudge contributors
6
6
  License: MIT
@@ -29,14 +29,21 @@ Agent failures are often buried in long, provider-dependent transcripts that are
29
29
 
30
30
  ## 30-second quickstart
31
31
 
32
- Use Python 3.14.0 or another interpreter supported by `pyproject.toml`, then run
33
- the complete offline demo from the repository root:
32
+ Install the local Guard in a repository, then verify it:
33
+
34
+ ```powershell
35
+ npx grudge-cli@latest setup
36
+ npx grudge-cli@latest doctor
37
+ ```
38
+
39
+ For the complete Python offline demo, use Python 3.14.0 or another interpreter
40
+ supported by `pyproject.toml`, then run:
34
41
 
35
42
  ```bash
36
43
  pip install -e . && grudge demo
37
44
  ```
38
45
 
39
- The command opens the local viewer and plays the five-beat story: capture the
46
+ The demo opens the local viewer and plays the five-beat story: capture the
40
47
  vulnerable run, shrink its world, synthesize a predicate, prove red-on-bad and
41
48
  green-on-fixed admission, then reintroduce the bug and block it. The demo is
42
49
  offline and deterministic: it uses checked-in fake tools, scripted policies,
@@ -45,6 +52,42 @@ the public network. For a headless smoke run, use
45
52
  `python -m grudge demo --no-browser --fast --json`. For the two-session
46
53
  Claude-style hook proof, use `python -m grudge demo --guard --json`.
47
54
 
55
+ ## Published packages
56
+
57
+ Grudge CLI `0.1.1` is published in both public package registries. Release
58
+ `0.1.2` is prepared locally but has not been published yet:
59
+
60
+ - **npm:** [`grudge-cli`](https://www.npmjs.com/package/grudge-cli)
61
+ - **PyPI:** [`grudge-cli`](https://pypi.org/project/grudge-cli/)
62
+
63
+ Install the Python CLI with:
64
+
65
+ ```bash
66
+ python -m pip install grudge-cli
67
+ grudge --help
68
+ ```
69
+
70
+ Both packages install a command named `grudge`. The Python package exposes the
71
+ full engine (`capture`, `compile`, `shrink`, `admit`, `run`, and `demo`); the npm
72
+ package exposes the local Node Guard (`setup`, `doctor`, `hook`, `propose`,
73
+ `scars`, `stats`, `report`, and `statusline`).
74
+
75
+ Install the Node.js setup wizard with:
76
+
77
+ ```bash
78
+ npx grudge-cli@latest setup
79
+ ```
80
+
81
+ The setup wizard detects supported agent tools, lets you select agents with
82
+ arrow keys and Space, and asks whether to configure the current repository,
83
+ personal settings, or all projects.
84
+
85
+ When PowerShell strips DSL quotes, pass the rule on stdin instead:
86
+
87
+ ```powershell
88
+ 'never call shell where command ~ "GRUDGE_TEST"' | grudge propose --rule-stdin --why "harmless test rule" --preventive
89
+ ```
90
+
48
91
  ### Install the local guard
49
92
 
50
93
  These commands exercise the checkout's Node package from the repository root;
@@ -316,5 +359,6 @@ docker run --rm grudge:latest
316
359
  - [Documentation index](docs/INDEX.md) — every documentation file and owner phase.
317
360
  - [Roadmap](docs/roadmap.md) — every deferred stub and its design notes.
318
361
  - [Demo guide](docs/demo-guide.md) — presenter, server, JSON, and shell operation.
362
+ - [Walkthrough test](TEST.md) — scratch-directory Guard walkthrough and release checks.
319
363
  - [Pitch artifacts](pitch/one_liner.md) — one-liner, 90-second script, and slides.
320
364
  - [Progress tracker](Progress.md) — canonical phase status.
@@ -1,24 +1,3 @@
1
- Metadata-Version: 2.2
2
- Name: grudge-cli
3
- Version: 0.1.1
4
- Summary: Deterministic regression scars for agent mistakes.
5
- Author: Grudge contributors
6
- License: MIT
7
- Requires-Python: <3.15,>=3.11
8
- Description-Content-Type: text/markdown
9
- License-File: LICENSE
10
- Requires-Dist: pydantic==2.12.5
11
- Requires-Dist: typer==0.15.1
12
- Requires-Dist: click==8.1.8
13
- Requires-Dist: rich==13.9.4
14
- Requires-Dist: httpx==0.28.1
15
- Provides-Extra: dev
16
- Requires-Dist: pytest==8.3.4; extra == "dev"
17
- Requires-Dist: pytest-cov==6.0.0; extra == "dev"
18
- Requires-Dist: hypothesis==6.123.10; extra == "dev"
19
- Requires-Dist: ruff==0.14.14; extra == "dev"
20
- Requires-Dist: mypy==1.18.2; extra == "dev"
21
-
22
1
  # Grudge
23
2
 
24
3
  **Agents repeat mistakes. Grudge makes each one happen exactly once.**
@@ -27,49 +6,92 @@ Requires-Dist: mypy==1.18.2; extra == "dev"
27
6
 
28
7
  Agent failures are often buried in long, provider-dependent transcripts that are difficult to reproduce. A copied transcript can show what happened, but it cannot show whether the live policy would make the same decision when the world changes. Grudge turns one failure into a small, reviewable regression Scar that can run offline and block the same behavior from returning.
29
8
 
30
- ## 30-second quickstart
31
-
32
- Use Python 3.14.0 or another interpreter supported by `pyproject.toml`, then run
33
- the complete offline demo from the repository root:
34
-
35
- ```bash
36
- pip install -e . && grudge demo
37
- ```
38
-
39
- The command opens the local viewer and plays the five-beat story: capture the
40
- vulnerable run, shrink its world, synthesize a predicate, prove red-on-bad and
41
- green-on-fixed admission, then reintroduce the bug and block it. The demo is
42
- offline and deterministic: it uses checked-in fake tools, scripted policies,
43
- the checked-in Scar, and the fallback predicate; it does not call a provider or
44
- the public network. For a headless smoke run, use
45
- `python -m grudge demo --no-browser --fast --json`. For the two-session
46
- Claude-style hook proof, use `python -m grudge demo --guard --json`.
47
-
48
- ### Install the local guard
49
-
50
- These commands exercise the checkout's Node package from the repository root;
51
- they do not resolve a package from the npm registry:
52
-
53
- ```bash
54
- npm --prefix packages/grudge run build
55
- npm --prefix packages/grudge run setup:repo
56
- npm --prefix packages/grudge run doctor:repo
57
- ```
58
-
59
- If `grudge` has been published, run the interactive registry setup with
60
- `npx grudge-cli setup`. Use the arrow keys to move, Space to select agents, and
61
- Enter to confirm the agent and scope choices. When working from `packages/grudge`, use `node dist/grudge.mjs`
62
- and add `--cwd ../..` when the hooks should target the repository root. The
63
- short package-directory commands are `npm run setup:repo` and
64
- `npm run doctor:repo`. Do not combine `cd packages/grudge` with the
65
- root-relative path `packages/grudge/dist/grudge.mjs`, or it resolves to
66
- `packages/grudge/packages/grudge/dist/grudge.mjs`.
9
+ ## 30-second quickstart
10
+
11
+ Install the local Guard in a repository, then verify it:
12
+
13
+ ```powershell
14
+ npx grudge-cli@latest setup
15
+ npx grudge-cli@latest doctor
16
+ ```
17
+
18
+ For the complete Python offline demo, use Python 3.14.0 or another interpreter
19
+ supported by `pyproject.toml`, then run:
20
+
21
+ ```bash
22
+ pip install -e . && grudge demo
23
+ ```
24
+
25
+ The demo opens the local viewer and plays the five-beat story: capture the
26
+ vulnerable run, shrink its world, synthesize a predicate, prove red-on-bad and
27
+ green-on-fixed admission, then reintroduce the bug and block it. The demo is
28
+ offline and deterministic: it uses checked-in fake tools, scripted policies,
29
+ the checked-in Scar, and the fallback predicate; it does not call a provider or
30
+ the public network. For a headless smoke run, use
31
+ `python -m grudge demo --no-browser --fast --json`. For the two-session
32
+ Claude-style hook proof, use `python -m grudge demo --guard --json`.
33
+
34
+ ## Published packages
35
+
36
+ Grudge CLI `0.1.1` is published in both public package registries. Release
37
+ `0.1.2` is prepared locally but has not been published yet:
38
+
39
+ - **npm:** [`grudge-cli`](https://www.npmjs.com/package/grudge-cli)
40
+ - **PyPI:** [`grudge-cli`](https://pypi.org/project/grudge-cli/)
41
+
42
+ Install the Python CLI with:
43
+
44
+ ```bash
45
+ python -m pip install grudge-cli
46
+ grudge --help
47
+ ```
48
+
49
+ Both packages install a command named `grudge`. The Python package exposes the
50
+ full engine (`capture`, `compile`, `shrink`, `admit`, `run`, and `demo`); the npm
51
+ package exposes the local Node Guard (`setup`, `doctor`, `hook`, `propose`,
52
+ `scars`, `stats`, `report`, and `statusline`).
53
+
54
+ Install the Node.js setup wizard with:
55
+
56
+ ```bash
57
+ npx grudge-cli@latest setup
58
+ ```
59
+
60
+ The setup wizard detects supported agent tools, lets you select agents with
61
+ arrow keys and Space, and asks whether to configure the current repository,
62
+ personal settings, or all projects.
63
+
64
+ When PowerShell strips DSL quotes, pass the rule on stdin instead:
65
+
66
+ ```powershell
67
+ 'never call shell where command ~ "GRUDGE_TEST"' | grudge propose --rule-stdin --why "harmless test rule" --preventive
68
+ ```
69
+
70
+ ### Install the local guard
71
+
72
+ These commands exercise the checkout's Node package from the repository root;
73
+ they do not resolve a package from the npm registry:
74
+
75
+ ```bash
76
+ npm --prefix packages/grudge run build
77
+ npm --prefix packages/grudge run setup:repo
78
+ npm --prefix packages/grudge run doctor:repo
79
+ ```
80
+
81
+ If `grudge` has been published, run the interactive registry setup with
82
+ `npx grudge-cli setup`. Use the arrow keys to move, Space to select agents, and
83
+ Enter to confirm the agent and scope choices. When working from `packages/grudge`, use `node dist/grudge.mjs`
84
+ and add `--cwd ../..` when the hooks should target the repository root. The
85
+ short package-directory commands are `npm run setup:repo` and
86
+ `npm run doctor:repo`. Do not combine `cd packages/grudge` with the
87
+ root-relative path `packages/grudge/dist/grudge.mjs`, or it resolves to
88
+ `packages/grudge/packages/grudge/dist/grudge.mjs`.
67
89
 
68
90
  Claude Code is the verified **Guard** tier. Codex, Gemini CLI, GitHub Copilot,
69
91
  OpenCode, and Windsurf are **Advisory** integrations; Cursor is unverified and
70
92
  the installer writes no Cursor files. See [the integration matrix](docs/integrations.md).
71
- Use `node packages/grudge/dist/grudge.mjs setup --dry-run` to inspect a plan and
72
- `node packages/grudge/dist/grudge.mjs uninstall` to remove Grudge-managed files.
93
+ Use `node packages/grudge/dist/grudge.mjs setup --dry-run` to inspect a plan and
94
+ `node packages/grudge/dist/grudge.mjs uninstall` to remove Grudge-managed files.
73
95
 
74
96
  ## What the shrink shows
75
97
 
@@ -258,63 +280,64 @@ python scripts/generate_trace.py --steps 40 --output artifacts/phase12/trace.jso
258
280
  It does not time shrinking or aggregate measurements automatically; benchmark
259
281
  rows must be captured from a clean run and recorded with their environment.
260
282
 
261
- ## Checks and reproducibility
262
-
263
- The default supported runtime is Python 3.14.0, recorded in `.python-version`.
264
- The package supports Python 3.11 through 3.14, and the lockfile is
265
- `requirements.lock`. The project Makefile keeps dependencies in a local virtual
266
- environment:
283
+ ## Checks and reproducibility
284
+
285
+ The default supported runtime is Python 3.14.0, recorded in `.python-version`.
286
+ The package supports Python 3.11 through 3.14, and the lockfile is
287
+ `requirements.lock`. The project Makefile keeps dependencies in a local virtual
288
+ environment:
267
289
 
268
290
  ```bash
269
291
  make install
270
- make test
271
- make lint
272
- make typecheck
273
- make docs-check
274
- make all
275
- ```
276
-
277
- ### Clean Linux commands
278
-
279
- From a fresh checkout, the shortest reproducible workflow is:
280
-
281
- ```bash
282
- git clone https://github.com/harshithKumar12/Grudge.git
283
- cd Grudge
284
- # Debian/Ubuntu only, if Python reports that ensurepip is unavailable:
285
- # sudo apt-get install python3.14-venv
286
- python3.14 --version
287
- make PYTHON=python3.14 install
288
- make test
289
- make demo
290
- ```
291
-
292
- The host prerequisites are Python 3.14 with its `venv` module and GNU Make.
293
- Node.js 18+ is optional for the JavaScript package tests; the Python tests and
294
- demo do not require Node.js.
295
-
296
- `make test` runs the Python suite and the Node package suite when Node.js 18+
297
- is installed; it remains usable on a Python-only machine. The headless proof
298
- is useful in CI:
299
-
300
- ```bash
301
- .venv/bin/python -m grudge demo --guard --json
302
- ```
303
-
304
- The offline path needs no API keys or real personal data. Copy `.env.example`
305
- only when experimenting with the optional provider boundary; never commit a
306
- key. Docker remains an optional reproducibility path:
307
-
308
- ```bash
309
- docker build -t grudge:latest .
310
- docker run --rm grudge:latest
311
- ```
292
+ make test
293
+ make lint
294
+ make typecheck
295
+ make docs-check
296
+ make all
297
+ ```
298
+
299
+ ### Clean Linux commands
300
+
301
+ From a fresh checkout, the shortest reproducible workflow is:
302
+
303
+ ```bash
304
+ git clone https://github.com/harshithKumar12/Grudge.git
305
+ cd Grudge
306
+ # Debian/Ubuntu only, if Python reports that ensurepip is unavailable:
307
+ # sudo apt-get install python3.14-venv
308
+ python3.14 --version
309
+ make PYTHON=python3.14 install
310
+ make test
311
+ make demo
312
+ ```
313
+
314
+ The host prerequisites are Python 3.14 with its `venv` module and GNU Make.
315
+ Node.js 18+ is optional for the JavaScript package tests; the Python tests and
316
+ demo do not require Node.js.
317
+
318
+ `make test` runs the Python suite and the Node package suite when Node.js 18+
319
+ is installed; it remains usable on a Python-only machine. The headless proof
320
+ is useful in CI:
321
+
322
+ ```bash
323
+ .venv/bin/python -m grudge demo --guard --json
324
+ ```
325
+
326
+ The offline path needs no API keys or real personal data. Copy `.env.example`
327
+ only when experimenting with the optional provider boundary; never commit a
328
+ key. Docker remains an optional reproducibility path:
329
+
330
+ ```bash
331
+ docker build -t grudge:latest .
332
+ docker run --rm grudge:latest
333
+ ```
312
334
 
313
335
  ## Repository guide
314
336
 
315
337
  - [Architecture](docs/architecture.md) — contracts and pipeline boundaries.
316
338
  - [Documentation index](docs/INDEX.md) — every documentation file and owner phase.
317
339
  - [Roadmap](docs/roadmap.md) — every deferred stub and its design notes.
318
- - [Demo guide](docs/demo-guide.md) — presenter, server, JSON, and shell operation.
340
+ - [Demo guide](docs/demo-guide.md) — presenter, server, JSON, and shell operation.
341
+ - [Walkthrough test](TEST.md) — scratch-directory Guard walkthrough and release checks.
319
342
  - [Pitch artifacts](pitch/one_liner.md) — one-liner, 90-second script, and slides.
320
343
  - [Progress tracker](Progress.md) — canonical phase status.
@@ -1,3 +1,24 @@
1
+ Metadata-Version: 2.2
2
+ Name: grudge-cli
3
+ Version: 0.1.3
4
+ Summary: Deterministic regression scars for agent mistakes.
5
+ Author: Grudge contributors
6
+ License: MIT
7
+ Requires-Python: <3.15,>=3.11
8
+ Description-Content-Type: text/markdown
9
+ License-File: LICENSE
10
+ Requires-Dist: pydantic==2.12.5
11
+ Requires-Dist: typer==0.15.1
12
+ Requires-Dist: click==8.1.8
13
+ Requires-Dist: rich==13.9.4
14
+ Requires-Dist: httpx==0.28.1
15
+ Provides-Extra: dev
16
+ Requires-Dist: pytest==8.3.4; extra == "dev"
17
+ Requires-Dist: pytest-cov==6.0.0; extra == "dev"
18
+ Requires-Dist: hypothesis==6.123.10; extra == "dev"
19
+ Requires-Dist: ruff==0.14.14; extra == "dev"
20
+ Requires-Dist: mypy==1.18.2; extra == "dev"
21
+
1
22
  # Grudge
2
23
 
3
24
  **Agents repeat mistakes. Grudge makes each one happen exactly once.**
@@ -8,47 +29,90 @@ Agent failures are often buried in long, provider-dependent transcripts that are
8
29
 
9
30
  ## 30-second quickstart
10
31
 
11
- Use Python 3.14.0 or another interpreter supported by `pyproject.toml`, then run
12
- the complete offline demo from the repository root:
32
+ Install the local Guard in a repository, then verify it:
33
+
34
+ ```powershell
35
+ npx grudge-cli@latest setup
36
+ npx grudge-cli@latest doctor
37
+ ```
38
+
39
+ For the complete Python offline demo, use Python 3.14.0 or another interpreter
40
+ supported by `pyproject.toml`, then run:
13
41
 
14
42
  ```bash
15
43
  pip install -e . && grudge demo
16
44
  ```
17
45
 
18
- The command opens the local viewer and plays the five-beat story: capture the
46
+ The demo opens the local viewer and plays the five-beat story: capture the
19
47
  vulnerable run, shrink its world, synthesize a predicate, prove red-on-bad and
20
48
  green-on-fixed admission, then reintroduce the bug and block it. The demo is
21
49
  offline and deterministic: it uses checked-in fake tools, scripted policies,
22
50
  the checked-in Scar, and the fallback predicate; it does not call a provider or
23
- the public network. For a headless smoke run, use
24
- `python -m grudge demo --no-browser --fast --json`. For the two-session
25
- Claude-style hook proof, use `python -m grudge demo --guard --json`.
51
+ the public network. For a headless smoke run, use
52
+ `python -m grudge demo --no-browser --fast --json`. For the two-session
53
+ Claude-style hook proof, use `python -m grudge demo --guard --json`.
54
+
55
+ ## Published packages
56
+
57
+ Grudge CLI `0.1.1` is published in both public package registries. Release
58
+ `0.1.2` is prepared locally but has not been published yet:
59
+
60
+ - **npm:** [`grudge-cli`](https://www.npmjs.com/package/grudge-cli)
61
+ - **PyPI:** [`grudge-cli`](https://pypi.org/project/grudge-cli/)
62
+
63
+ Install the Python CLI with:
64
+
65
+ ```bash
66
+ python -m pip install grudge-cli
67
+ grudge --help
68
+ ```
69
+
70
+ Both packages install a command named `grudge`. The Python package exposes the
71
+ full engine (`capture`, `compile`, `shrink`, `admit`, `run`, and `demo`); the npm
72
+ package exposes the local Node Guard (`setup`, `doctor`, `hook`, `propose`,
73
+ `scars`, `stats`, `report`, and `statusline`).
74
+
75
+ Install the Node.js setup wizard with:
76
+
77
+ ```bash
78
+ npx grudge-cli@latest setup
79
+ ```
80
+
81
+ The setup wizard detects supported agent tools, lets you select agents with
82
+ arrow keys and Space, and asks whether to configure the current repository,
83
+ personal settings, or all projects.
84
+
85
+ When PowerShell strips DSL quotes, pass the rule on stdin instead:
86
+
87
+ ```powershell
88
+ 'never call shell where command ~ "GRUDGE_TEST"' | grudge propose --rule-stdin --why "harmless test rule" --preventive
89
+ ```
26
90
 
27
91
  ### Install the local guard
28
92
 
29
- These commands exercise the checkout's Node package from the repository root;
30
- they do not resolve a package from the npm registry:
31
-
32
- ```bash
33
- npm --prefix packages/grudge run build
34
- npm --prefix packages/grudge run setup:repo
35
- npm --prefix packages/grudge run doctor:repo
36
- ```
37
-
38
- If `grudge` has been published, run the interactive registry setup with
39
- `npx grudge-cli setup`. Use the arrow keys to move, Space to select agents, and
40
- Enter to confirm the agent and scope choices. When working from `packages/grudge`, use `node dist/grudge.mjs`
41
- and add `--cwd ../..` when the hooks should target the repository root. The
42
- short package-directory commands are `npm run setup:repo` and
43
- `npm run doctor:repo`. Do not combine `cd packages/grudge` with the
44
- root-relative path `packages/grudge/dist/grudge.mjs`, or it resolves to
45
- `packages/grudge/packages/grudge/dist/grudge.mjs`.
93
+ These commands exercise the checkout's Node package from the repository root;
94
+ they do not resolve a package from the npm registry:
95
+
96
+ ```bash
97
+ npm --prefix packages/grudge run build
98
+ npm --prefix packages/grudge run setup:repo
99
+ npm --prefix packages/grudge run doctor:repo
100
+ ```
101
+
102
+ If `grudge` has been published, run the interactive registry setup with
103
+ `npx grudge-cli setup`. Use the arrow keys to move, Space to select agents, and
104
+ Enter to confirm the agent and scope choices. When working from `packages/grudge`, use `node dist/grudge.mjs`
105
+ and add `--cwd ../..` when the hooks should target the repository root. The
106
+ short package-directory commands are `npm run setup:repo` and
107
+ `npm run doctor:repo`. Do not combine `cd packages/grudge` with the
108
+ root-relative path `packages/grudge/dist/grudge.mjs`, or it resolves to
109
+ `packages/grudge/packages/grudge/dist/grudge.mjs`.
46
110
 
47
111
  Claude Code is the verified **Guard** tier. Codex, Gemini CLI, GitHub Copilot,
48
112
  OpenCode, and Windsurf are **Advisory** integrations; Cursor is unverified and
49
113
  the installer writes no Cursor files. See [the integration matrix](docs/integrations.md).
50
- Use `node packages/grudge/dist/grudge.mjs setup --dry-run` to inspect a plan and
51
- `node packages/grudge/dist/grudge.mjs uninstall` to remove Grudge-managed files.
114
+ Use `node packages/grudge/dist/grudge.mjs setup --dry-run` to inspect a plan and
115
+ `node packages/grudge/dist/grudge.mjs uninstall` to remove Grudge-managed files.
52
116
 
53
117
  ## What the shrink shows
54
118
 
@@ -237,57 +301,57 @@ python scripts/generate_trace.py --steps 40 --output artifacts/phase12/trace.jso
237
301
  It does not time shrinking or aggregate measurements automatically; benchmark
238
302
  rows must be captured from a clean run and recorded with their environment.
239
303
 
240
- ## Checks and reproducibility
241
-
242
- The default supported runtime is Python 3.14.0, recorded in `.python-version`.
243
- The package supports Python 3.11 through 3.14, and the lockfile is
244
- `requirements.lock`. The project Makefile keeps dependencies in a local virtual
245
- environment:
304
+ ## Checks and reproducibility
305
+
306
+ The default supported runtime is Python 3.14.0, recorded in `.python-version`.
307
+ The package supports Python 3.11 through 3.14, and the lockfile is
308
+ `requirements.lock`. The project Makefile keeps dependencies in a local virtual
309
+ environment:
246
310
 
247
311
  ```bash
248
312
  make install
249
- make test
250
- make lint
251
- make typecheck
252
- make docs-check
253
- make all
254
- ```
255
-
256
- ### Clean Linux commands
257
-
258
- From a fresh checkout, the shortest reproducible workflow is:
259
-
260
- ```bash
261
- git clone https://github.com/harshithKumar12/Grudge.git
262
- cd Grudge
263
- # Debian/Ubuntu only, if Python reports that ensurepip is unavailable:
264
- # sudo apt-get install python3.14-venv
265
- python3.14 --version
266
- make PYTHON=python3.14 install
267
- make test
268
- make demo
269
- ```
270
-
271
- The host prerequisites are Python 3.14 with its `venv` module and GNU Make.
272
- Node.js 18+ is optional for the JavaScript package tests; the Python tests and
273
- demo do not require Node.js.
274
-
275
- `make test` runs the Python suite and the Node package suite when Node.js 18+
276
- is installed; it remains usable on a Python-only machine. The headless proof
277
- is useful in CI:
278
-
279
- ```bash
280
- .venv/bin/python -m grudge demo --guard --json
281
- ```
282
-
283
- The offline path needs no API keys or real personal data. Copy `.env.example`
284
- only when experimenting with the optional provider boundary; never commit a
285
- key. Docker remains an optional reproducibility path:
286
-
287
- ```bash
288
- docker build -t grudge:latest .
289
- docker run --rm grudge:latest
290
- ```
313
+ make test
314
+ make lint
315
+ make typecheck
316
+ make docs-check
317
+ make all
318
+ ```
319
+
320
+ ### Clean Linux commands
321
+
322
+ From a fresh checkout, the shortest reproducible workflow is:
323
+
324
+ ```bash
325
+ git clone https://github.com/harshithKumar12/Grudge.git
326
+ cd Grudge
327
+ # Debian/Ubuntu only, if Python reports that ensurepip is unavailable:
328
+ # sudo apt-get install python3.14-venv
329
+ python3.14 --version
330
+ make PYTHON=python3.14 install
331
+ make test
332
+ make demo
333
+ ```
334
+
335
+ The host prerequisites are Python 3.14 with its `venv` module and GNU Make.
336
+ Node.js 18+ is optional for the JavaScript package tests; the Python tests and
337
+ demo do not require Node.js.
338
+
339
+ `make test` runs the Python suite and the Node package suite when Node.js 18+
340
+ is installed; it remains usable on a Python-only machine. The headless proof
341
+ is useful in CI:
342
+
343
+ ```bash
344
+ .venv/bin/python -m grudge demo --guard --json
345
+ ```
346
+
347
+ The offline path needs no API keys or real personal data. Copy `.env.example`
348
+ only when experimenting with the optional provider boundary; never commit a
349
+ key. Docker remains an optional reproducibility path:
350
+
351
+ ```bash
352
+ docker build -t grudge:latest .
353
+ docker run --rm grudge:latest
354
+ ```
291
355
 
292
356
  ## Repository guide
293
357
 
@@ -295,5 +359,6 @@ docker run --rm grudge:latest
295
359
  - [Documentation index](docs/INDEX.md) — every documentation file and owner phase.
296
360
  - [Roadmap](docs/roadmap.md) — every deferred stub and its design notes.
297
361
  - [Demo guide](docs/demo-guide.md) — presenter, server, JSON, and shell operation.
362
+ - [Walkthrough test](TEST.md) — scratch-directory Guard walkthrough and release checks.
298
363
  - [Pitch artifacts](pitch/one_liner.md) — one-liner, 90-second script, and slides.
299
364
  - [Progress tracker](Progress.md) — canonical phase status.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "grudge-cli"
7
- version = "0.1.1"
7
+ version = "0.1.3"
8
8
  description = "Deterministic regression scars for agent mistakes."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11,<3.15"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes