assurance-cli 0.6.2__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.
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/PKG-INFO +1 -1
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/cli.py +7 -1
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/gather.py +1 -1
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli.egg-info/PKG-INFO +1 -1
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/pyproject.toml +1 -1
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/tests/test_cli.py +11 -1
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/tests/test_gapped_series.py +13 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/LICENSE +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/README.md +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/__init__.py +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/__main__.py +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/baseline.py +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/drift.py +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/paths.py +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/pin.py +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/profile.py +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/py.typed +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/setdiff.py +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli.egg-info/SOURCES.txt +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli.egg-info/dependency_links.txt +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli.egg-info/entry_points.txt +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli.egg-info/requires.txt +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli.egg-info/top_level.txt +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/setup.cfg +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/tests/test_drift.py +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/tests/test_installed_wheel.py +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/tests/test_pin.py +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/tests/test_read_only.py +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/tests/test_readme_blocks.py +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/tests/test_setdiff.py +0 -0
- {assurance_cli-0.6.2 → assurance_cli-0.6.4}/tests/test_version.py +0 -0
|
@@ -26,15 +26,16 @@ FORWARDED: dict[str, tuple[str, str]] = {
|
|
|
26
26
|
"authority": ("assurance_authority.cli", "pip install assurance-authority"),
|
|
27
27
|
"audit": ("assurance_budget.session_cli", "pip install assurance-budget"),
|
|
28
28
|
"hook": ("assurance_budget.hook_setup", "pip install assurance-budget"),
|
|
29
|
+
"serve": ("assurance_budget.serve", "pip install assurance-budget"),
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
_START_HERE = """\
|
|
32
33
|
assurance — your AI agent says it's done. This tells you what it didn't check.
|
|
33
|
-
No model, no network, no account.
|
|
34
34
|
|
|
35
35
|
assurance audit what the Claude Code session in this folder did, and skipped
|
|
36
36
|
assurance audit --demo the same report on a bundled sample session
|
|
37
37
|
assurance hook install run the audit after every Claude Code turn (remove undoes it)
|
|
38
|
+
assurance serve a local endpoint any agent sends its traces or runs to
|
|
38
39
|
assurance diff --expected A --found B was everything that should have been read, read?
|
|
39
40
|
assurance pin --save | --check did an MCP server change a tool after you approved it?
|
|
40
41
|
assurance deps package.json what an install will execute, read without running it
|
|
@@ -118,6 +119,11 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
118
119
|
help="Run the audit after every Claude Code turn: install, remove, status",
|
|
119
120
|
)
|
|
120
121
|
|
|
122
|
+
sub.add_parser(
|
|
123
|
+
"serve", add_help=False,
|
|
124
|
+
help="A local endpoint any agent sends its traces or run records to, and any workflow asks for an audit",
|
|
125
|
+
)
|
|
126
|
+
|
|
121
127
|
init_parser = sub.add_parser("init", help="Write .assurance.json baseline")
|
|
122
128
|
init_parser.add_argument("folder", help="Folder to baseline")
|
|
123
129
|
init_parser.add_argument("--update", action="store_true", help="Overwrite an existing baseline")
|
|
@@ -846,7 +846,7 @@ def _no_series_summary(root: Path, by_key: dict[str, list[Path]]) -> str:
|
|
|
846
846
|
# says "if these really are", names what it would take, and does not recommend it.
|
|
847
847
|
return (
|
|
848
848
|
f"No dated or numbered series detected. {where}, and they look {named[0]}, but their "
|
|
849
|
-
f"spacing agrees on no cadence.
|
|
849
|
+
f"spacing agrees on no cadence. If these really are a {named[0]} series you can say so "
|
|
850
850
|
f"— both flags are needed, neither works alone: --expect {named[0]} "
|
|
851
851
|
f"--from {keys[0]} --to {keys[-1]}. If they are not a series, this refusal is the answer."
|
|
852
852
|
)
|
|
@@ -840,10 +840,20 @@ def test_help_lists_every_forwarded_command(capsys) -> None:
|
|
|
840
840
|
with pytest.raises(SystemExit):
|
|
841
841
|
main(["--help"])
|
|
842
842
|
out = capsys.readouterr().out
|
|
843
|
-
for name in ("deps", "budget", "authority", "audit", "hook"):
|
|
843
|
+
for name in ("deps", "budget", "authority", "audit", "hook", "serve"):
|
|
844
844
|
assert name in out
|
|
845
845
|
|
|
846
846
|
|
|
847
|
+
def test_the_serve_subcommand_reaches_the_server(capsys) -> None:
|
|
848
|
+
"""`assurance serve` is forwarded whole to assurance-budget, like `audit`."""
|
|
849
|
+
pytest.importorskip("assurance_budget.serve")
|
|
850
|
+
with pytest.raises(SystemExit) as done:
|
|
851
|
+
main(["serve", "--help"])
|
|
852
|
+
assert done.value.code == 0
|
|
853
|
+
out = capsys.readouterr().out
|
|
854
|
+
assert out.startswith("usage: assurance serve") and "--port" in out and "--store" in out
|
|
855
|
+
|
|
856
|
+
|
|
847
857
|
def test_the_hook_subcommand_reaches_the_installer(tmp_path: Path, capsys, monkeypatch) -> None:
|
|
848
858
|
"""`assurance hook` is forwarded whole to assurance-budget, like `audit`."""
|
|
849
859
|
pytest.importorskip("assurance_budget.hook_setup")
|
|
@@ -60,6 +60,19 @@ def test_an_irregular_set_is_still_refused(tmp_path: Path) -> None:
|
|
|
60
60
|
assert "If these really are" in summary
|
|
61
61
|
|
|
62
62
|
|
|
63
|
+
def test_refusal_message_carries_no_markdown_emphasis(tmp_path: Path) -> None:
|
|
64
|
+
"""No ``**`` reaches the summary the terminal prints (issue #33).
|
|
65
|
+
|
|
66
|
+
The emphasis used to arrive as literal asterisks. It is gone from the
|
|
67
|
+
rendered message, and the load-bearing phrase survives without it.
|
|
68
|
+
"""
|
|
69
|
+
folder = _days(tmp_path, "2025-01-08", "2025-01-09", "2025-01-23", "2025-02-02", "2025-03-14")
|
|
70
|
+
summary = check_coverage(str(folder))["summary"]
|
|
71
|
+
|
|
72
|
+
assert "**" not in summary, summary
|
|
73
|
+
assert "If these really are" in summary
|
|
74
|
+
|
|
75
|
+
|
|
63
76
|
# ── where the line sits ────────────────────────────────────────────────────────────────────────
|
|
64
77
|
|
|
65
78
|
|
|
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
|