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.
Files changed (31) hide show
  1. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/PKG-INFO +1 -1
  2. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/cli.py +7 -1
  3. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/gather.py +1 -1
  4. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli.egg-info/PKG-INFO +1 -1
  5. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/pyproject.toml +1 -1
  6. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/tests/test_cli.py +11 -1
  7. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/tests/test_gapped_series.py +13 -0
  8. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/LICENSE +0 -0
  9. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/README.md +0 -0
  10. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/__init__.py +0 -0
  11. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/__main__.py +0 -0
  12. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/baseline.py +0 -0
  13. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/drift.py +0 -0
  14. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/paths.py +0 -0
  15. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/pin.py +0 -0
  16. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/profile.py +0 -0
  17. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/py.typed +0 -0
  18. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli/setdiff.py +0 -0
  19. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli.egg-info/SOURCES.txt +0 -0
  20. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli.egg-info/dependency_links.txt +0 -0
  21. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli.egg-info/entry_points.txt +0 -0
  22. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli.egg-info/requires.txt +0 -0
  23. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/assurance_cli.egg-info/top_level.txt +0 -0
  24. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/setup.cfg +0 -0
  25. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/tests/test_drift.py +0 -0
  26. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/tests/test_installed_wheel.py +0 -0
  27. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/tests/test_pin.py +0 -0
  28. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/tests/test_read_only.py +0 -0
  29. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/tests/test_readme_blocks.py +0 -0
  30. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/tests/test_setdiff.py +0 -0
  31. {assurance_cli-0.6.2 → assurance_cli-0.6.4}/tests/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: assurance-cli
3
- Version: 0.6.2
3
+ Version: 0.6.4
4
4
  Summary: CLI for folder assurance checks — coverage, staleness, and baselines.
5
5
  Author-email: "I-Ops Operations Intelligence, LLC" <hello@i-ops.dev>
6
6
  License: Apache-2.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. **If these really are a {named[0]} series** you can say so "
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
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: assurance-cli
3
- Version: 0.6.2
3
+ Version: 0.6.4
4
4
  Summary: CLI for folder assurance checks — coverage, staleness, and baselines.
5
5
  Author-email: "I-Ops Operations Intelligence, LLC" <hello@i-ops.dev>
6
6
  License: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "assurance-cli"
7
- version = "0.6.2"
7
+ version = "0.6.4"
8
8
  description = "CLI for folder assurance checks — coverage, staleness, and baselines."
9
9
  readme = "README.md"
10
10
  license = { text = "Apache-2.0" }
@@ -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