scar-cli 0.8.0__tar.gz → 0.9.0__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.
- scar_cli-0.9.0/.release-please-manifest.json +3 -0
- scar_cli-0.8.0/.scars/candidates/rich-output-nontty-must-bypass-rich.md → scar_cli-0.9.0/.scars/0008-rich-output-nontty-must-bypass-rich.landmine.md +5 -8
- {scar_cli-0.8.0 → scar_cli-0.9.0}/CHANGELOG.md +7 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/PKG-INFO +2 -1
- {scar_cli-0.8.0 → scar_cli-0.9.0}/plugin/plugin.json +1 -1
- {scar_cli-0.8.0 → scar_cli-0.9.0}/pyproject.toml +2 -1
- {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/cli.py +38 -20
- {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_cli.py +43 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/uv.lock +18 -2
- scar_cli-0.8.0/.release-please-manifest.json +0 -3
- {scar_cli-0.8.0 → scar_cli-0.9.0}/.claude-plugin/marketplace.json +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/.github/workflows/ci.yml +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/.github/workflows/pr-validation.yml +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/.github/workflows/release.yml +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/.gitignore +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/0001-git-grep-ere-pitfalls.landmine.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/0002-agent-direct-hook-install.deadend.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/0003-installer-binds-to-active-venv-scar.landmine.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/0004-promote-roundtrip-drops-expires-evidence.landmine.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/0005-history-rewrite-orphans-commit-evidence.landmine.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/0006-yaml-pattern-anchor-over-escaping.landmine.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/0007-release-please-config-change-skips-open-pr.landmine.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/README.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/candidates/fp-log.txt +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/template.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/AGENTS.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/CONTRIBUTING.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/IDEA.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/LICENSE +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/README.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/ROADMAP.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/SCAR-FORMAT.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/SPEC.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/STRESS-TEST.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/anchor-survival/PROTOCOL.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/anchor-survival/RESULTS.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/anchor-survival/long_replay.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/anchor-survival/replay.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/auto-authorship/FINDINGS.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/auto-authorship/PROTOCOL.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/.gitignore +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/PROTOCOL.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/RESULTS.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/.scars/0001-vendor-retry-window.fence.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/.scars/0002-evicting-session-store.deadend.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/.scars/0003-export-column-order.landmine.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/README.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/payments/retry.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/reports/export.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/services/sessions.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/grade.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/harvest/PROTOCOL.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/harvest/harvest.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/hook/scar-hooks.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/plugin/skills/scar-authoring/SKILL.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/plugin/skills/scar-authoring/assets/template.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/release-please-config.json +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/__init__.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/agent.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/evidence.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/harvest.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/hooks.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/installer.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/lint.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/match.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/mcp.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/model.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/orphan.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/output.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/render.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/skills/scar-authoring/SKILL.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/skills/scar-authoring/assets/template.md +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/store.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_docs.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_evidence.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_harvest.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_hooks.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_installer.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_lifecycle.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_lint.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_match.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_mcp.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_model.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_orphan.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_output.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_plugin.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_skill.py +0 -0
- {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_store.py +0 -0
|
@@ -1,25 +1,22 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
# A human reviewer promotes to .scars/NNNN-<slug>.<type>.md with status: active.
|
|
5
|
-
id: 0 # assigned at promotion (next free NNNN)
|
|
6
|
-
type: landmine # deadend = tried+failed | fence = looks wrong, intentional | landmine = touching A breaks B
|
|
2
|
+
id: 8
|
|
3
|
+
type: landmine
|
|
7
4
|
title: Read commands' non-tty branch must bypass Rich — Rich wraps to 80 cols and breaks path-substring tests
|
|
8
5
|
severity: high
|
|
9
6
|
confidence: 0.9
|
|
10
7
|
created: 2026-06-30
|
|
11
|
-
authors: ["claude-code"]
|
|
8
|
+
authors: ["claude-code", "kibukx"]
|
|
12
9
|
anchors:
|
|
13
10
|
- path: src/scar/cli.py
|
|
14
11
|
- path: src/scar/output.py
|
|
15
12
|
- pattern: "output\.render\("
|
|
16
13
|
evidence:
|
|
17
14
|
- issue: 78
|
|
18
|
-
- note:
|
|
15
|
+
- note: 187-test suite asserts plain substrings like '0001-bad.deadend.md' and long anchor paths on main([...]) under capsys
|
|
19
16
|
expires:
|
|
20
17
|
condition: "the test suite stops asserting on plain stdout substrings (e.g. moves to asserting structured --json only)"
|
|
21
18
|
review_after: 2027-06-30
|
|
22
|
-
status:
|
|
19
|
+
status: active
|
|
23
20
|
---
|
|
24
21
|
|
|
25
22
|
The five read commands (status, lint, check, why, orphan) route output 3 ways:
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.9.0](https://github.com/Daily-Nerd/Scar/compare/v0.8.0...v0.9.0) (2026-07-01)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **cli:** Rich-colored --help via rich-argparse ([#81](https://github.com/Daily-Nerd/Scar/issues/81)) ([7983a85](https://github.com/Daily-Nerd/Scar/commit/7983a85a2069a548ffa676b8c07f5fe928f8971c)), closes [#80](https://github.com/Daily-Nerd/Scar/issues/80)
|
|
9
|
+
|
|
3
10
|
## [0.8.0](https://github.com/Daily-Nerd/Scar/compare/v0.7.0...v0.8.0) (2026-06-30)
|
|
4
11
|
|
|
5
12
|
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: scar-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.9.0
|
|
4
4
|
Summary: SCAR — version control for negative knowledge (deadends, fences, landmines)
|
|
5
5
|
License: MIT
|
|
6
6
|
License-File: LICENSE
|
|
7
7
|
Requires-Python: >=3.10
|
|
8
|
+
Requires-Dist: rich-argparse>=1.8.0
|
|
8
9
|
Requires-Dist: rich>=15.0.0
|
|
9
10
|
Description-Content-Type: text/markdown
|
|
10
11
|
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "scar-cli"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.9.0"
|
|
4
4
|
description = "SCAR — version control for negative knowledge (deadends, fences, landmines)"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
7
7
|
license = { text = "MIT" }
|
|
8
8
|
dependencies = [
|
|
9
9
|
"rich>=15.0.0",
|
|
10
|
+
"rich-argparse>=1.8.0",
|
|
10
11
|
]
|
|
11
12
|
|
|
12
13
|
[project.scripts]
|
|
@@ -14,6 +14,8 @@ import time
|
|
|
14
14
|
from importlib.metadata import PackageNotFoundError, version as _dist_version
|
|
15
15
|
from pathlib import Path
|
|
16
16
|
|
|
17
|
+
from rich_argparse import RichHelpFormatter
|
|
18
|
+
|
|
17
19
|
from .lint import lint_text
|
|
18
20
|
from .match import rank_for_edit, rank_matches_for_diff, rank_matches_for_edit
|
|
19
21
|
from .model import parse_scar_text
|
|
@@ -729,45 +731,56 @@ def _scar_version() -> str:
|
|
|
729
731
|
return "unknown"
|
|
730
732
|
|
|
731
733
|
|
|
732
|
-
def
|
|
734
|
+
def build_parser() -> argparse.ArgumentParser:
|
|
735
|
+
"""Construct the fully-wired argparse parser.
|
|
736
|
+
|
|
737
|
+
Subparsers do NOT inherit ``formatter_class`` from their parent, so every
|
|
738
|
+
``add_parser`` call is routed through ``_add`` to wire RichHelpFormatter in
|
|
739
|
+
one place instead of repeating it per command.
|
|
740
|
+
"""
|
|
741
|
+
|
|
742
|
+
def _add(subparsers, name, **kw):
|
|
743
|
+
return subparsers.add_parser(name, formatter_class=RichHelpFormatter, **kw)
|
|
744
|
+
|
|
733
745
|
parser = argparse.ArgumentParser(prog="scar",
|
|
734
|
-
description="version control for negative knowledge"
|
|
746
|
+
description="version control for negative knowledge",
|
|
747
|
+
formatter_class=RichHelpFormatter)
|
|
735
748
|
# argparse's version action prints and exits during optional parsing, before
|
|
736
749
|
# the required-subcommand check below — so `scar --version` needs no command.
|
|
737
750
|
parser.add_argument("--version", action="version", version=f"scar {_scar_version()}")
|
|
738
751
|
sub = parser.add_subparsers(dest="command", required=True)
|
|
739
752
|
|
|
740
|
-
sub
|
|
741
|
-
p = sub
|
|
753
|
+
_add(sub, "init", help="create .scars/ layout in the current repo")
|
|
754
|
+
p = _add(sub, "lint", help="validate every scar and candidate")
|
|
742
755
|
p.add_argument("--fail-orphans", action="store_true",
|
|
743
756
|
help="exit non-zero when any scar is orphan-detected")
|
|
744
757
|
p.add_argument("--json", action="store_true", help="emit machine-readable JSON")
|
|
745
|
-
p = sub
|
|
758
|
+
p = _add(sub, "status", help="counts, titles, broken-file warnings")
|
|
746
759
|
p.add_argument("--json", action="store_true", help="emit machine-readable JSON")
|
|
747
760
|
|
|
748
|
-
p = sub
|
|
761
|
+
p = _add(sub, "promote", help="review a candidate into an active scar")
|
|
749
762
|
p.add_argument("candidate", help="candidate filename (or unique substring)")
|
|
750
763
|
p.add_argument("--reviewer", default="", help="human reviewer to add to authors")
|
|
751
764
|
|
|
752
|
-
p = sub
|
|
765
|
+
p = _add(sub, "check", help="scars anchored to a path")
|
|
753
766
|
p.add_argument("path")
|
|
754
767
|
p.add_argument("--content", default="", help="new code to test pattern anchors against")
|
|
755
768
|
p.add_argument("--top-k", type=int, default=10)
|
|
756
769
|
p.add_argument("--json", action="store_true", help="emit machine-readable JSON")
|
|
757
770
|
|
|
758
|
-
p = sub
|
|
771
|
+
p = _add(sub, "why", help="history of pain for a path (any status)")
|
|
759
772
|
p.add_argument("path")
|
|
760
773
|
p.add_argument("--json", action="store_true", help="emit machine-readable JSON")
|
|
761
774
|
|
|
762
|
-
p = sub
|
|
775
|
+
p = _add(sub, "challenge", help="dispute a scar (still fires, marked challenged)")
|
|
763
776
|
p.add_argument("id", type=int)
|
|
764
777
|
p.add_argument("--reason", required=True, help="why the scar may no longer hold")
|
|
765
778
|
|
|
766
|
-
p = sub
|
|
779
|
+
p = _add(sub, "archive", help="retire a scar (never fires; history kept)")
|
|
767
780
|
p.add_argument("id", type=int)
|
|
768
781
|
p.add_argument("--reason", required=True, help="why it is retired (e.g. expiry condition met)")
|
|
769
782
|
|
|
770
|
-
p = sub
|
|
783
|
+
p = _add(sub, "orphan", help="list scars whose anchors all went dead")
|
|
771
784
|
p.add_argument("--apply", action="store_true",
|
|
772
785
|
help="persist status: orphaned (human review only — never CI)")
|
|
773
786
|
p.add_argument("--id", type=int, default=None,
|
|
@@ -777,7 +790,7 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
777
790
|
p.add_argument("--json", action="store_true",
|
|
778
791
|
help="emit machine-readable JSON (read mode only)")
|
|
779
792
|
|
|
780
|
-
p = sub
|
|
793
|
+
p = _add(sub, "harvest", help="mine git history for candidate scars")
|
|
781
794
|
p.add_argument("repo", nargs="?", default=".")
|
|
782
795
|
p.add_argument("--top-k", type=int, default=None,
|
|
783
796
|
help="show the N highest-scoring candidates across all sections "
|
|
@@ -792,33 +805,38 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
792
805
|
p.add_argument("--at", default=None,
|
|
793
806
|
help="with --precision: comma-separated N values (default 5,10,20)")
|
|
794
807
|
|
|
795
|
-
p = sub
|
|
808
|
+
p = _add(sub, "hook", help="install, remove, inspect, or run Claude Code hooks")
|
|
796
809
|
p.add_argument("kind", choices=["install", "uninstall", "status",
|
|
797
810
|
"precheck", "session-notice", "stop-drafter"])
|
|
798
811
|
p.add_argument("--dry-run", action="store_true",
|
|
799
812
|
help="show lifecycle changes without writing settings")
|
|
800
813
|
|
|
801
|
-
p = sub
|
|
814
|
+
p = _add(sub, "skill", help="install, remove, or inspect the scar-authoring skill")
|
|
802
815
|
p.add_argument("kind", choices=["install", "uninstall", "status"])
|
|
803
816
|
p.add_argument("--dry-run", action="store_true",
|
|
804
817
|
help="show changes without writing to ~/.claude/skills")
|
|
805
818
|
|
|
806
|
-
sub
|
|
819
|
+
_add(sub, "mcp", help="run the SCAR MCP stdio server")
|
|
807
820
|
|
|
808
|
-
p = sub
|
|
821
|
+
p = _add(sub, "agent", help="agent integration helpers")
|
|
809
822
|
agent_sub = p.add_subparsers(dest="agent_command", required=True)
|
|
810
|
-
agent_sub
|
|
811
|
-
cfg = agent_sub
|
|
823
|
+
_add(agent_sub, "doctor", help="show local agent integration readiness")
|
|
824
|
+
cfg = _add(agent_sub, "config", help="print config for an agent runtime")
|
|
812
825
|
cfg.add_argument("target", choices=["codex", "cursor", "opencode", "windsurf"])
|
|
813
|
-
agent_sub
|
|
826
|
+
_add(agent_sub, "skill", help="print the scar-authoring skill body")
|
|
814
827
|
|
|
815
|
-
p = sub
|
|
828
|
+
p = _add(sub, "inject", help="machine mode for hooks: JSON or silence")
|
|
816
829
|
p.add_argument("--path")
|
|
817
830
|
p.add_argument("--content", default="")
|
|
818
831
|
p.add_argument("--diff", help="unified diff text, or path to a diff file")
|
|
819
832
|
p.add_argument("--top-k", type=int, default=3)
|
|
820
833
|
p.add_argument("--hook-event", default="PreToolUse")
|
|
821
834
|
|
|
835
|
+
return parser
|
|
836
|
+
|
|
837
|
+
|
|
838
|
+
def main(argv: list[str] | None = None) -> int:
|
|
839
|
+
parser = build_parser()
|
|
822
840
|
args = parser.parse_args(argv)
|
|
823
841
|
if args.command == "mcp":
|
|
824
842
|
from .mcp import serve
|
|
@@ -63,6 +63,49 @@ def test_version_flag_prints_version_and_exits_zero(capsys):
|
|
|
63
63
|
assert re.search(r"\d+\.\d+", out)
|
|
64
64
|
|
|
65
65
|
|
|
66
|
+
def test_root_parser_uses_rich_help_formatter():
|
|
67
|
+
from rich_argparse import RichHelpFormatter
|
|
68
|
+
|
|
69
|
+
from scar.cli import build_parser
|
|
70
|
+
|
|
71
|
+
parser = build_parser()
|
|
72
|
+
assert parser.formatter_class is RichHelpFormatter
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _subparsers_choices(parser):
|
|
76
|
+
import argparse
|
|
77
|
+
|
|
78
|
+
for action in parser._actions:
|
|
79
|
+
if isinstance(action, argparse._SubParsersAction):
|
|
80
|
+
return action.choices
|
|
81
|
+
raise AssertionError("no subparsers action found")
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def test_subparser_uses_rich_help_formatter():
|
|
85
|
+
from rich_argparse import RichHelpFormatter
|
|
86
|
+
|
|
87
|
+
from scar.cli import build_parser
|
|
88
|
+
|
|
89
|
+
lint = _subparsers_choices(build_parser())["lint"]
|
|
90
|
+
assert lint.formatter_class is RichHelpFormatter
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def test_nested_agent_subparser_uses_rich_help_formatter():
|
|
94
|
+
from rich_argparse import RichHelpFormatter
|
|
95
|
+
|
|
96
|
+
from scar.cli import build_parser
|
|
97
|
+
|
|
98
|
+
agent = _subparsers_choices(build_parser())["agent"]
|
|
99
|
+
config = _subparsers_choices(agent)["config"]
|
|
100
|
+
assert config.formatter_class is RichHelpFormatter
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def test_help_still_exits_zero(capsys):
|
|
104
|
+
with pytest.raises(SystemExit) as exc:
|
|
105
|
+
main(["--help"])
|
|
106
|
+
assert exc.value.code == 0
|
|
107
|
+
|
|
108
|
+
|
|
66
109
|
def test_status_counts(repo, capsys):
|
|
67
110
|
init_scars(repo)
|
|
68
111
|
(repo / ".scars" / "candidates" / "x.md").write_text(CANDIDATE)
|
|
@@ -111,12 +111,25 @@ wheels = [
|
|
|
111
111
|
{ url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" },
|
|
112
112
|
]
|
|
113
113
|
|
|
114
|
+
[[package]]
|
|
115
|
+
name = "rich-argparse"
|
|
116
|
+
version = "1.8.0"
|
|
117
|
+
source = { registry = "https://pypi.org/simple" }
|
|
118
|
+
dependencies = [
|
|
119
|
+
{ name = "rich" },
|
|
120
|
+
]
|
|
121
|
+
sdist = { url = "https://files.pythonhosted.org/packages/6a/e5/1064c43203a357d668cd42435f7a15fe6af51512d85b2104fecb937aa861/rich_argparse-1.8.0.tar.gz", hash = "sha256:679df3d832fa94ad6e4bdb07ded088cd7ea2dddc58ae9b2b46346a40b06cbc0c", size = 38940, upload-time = "2026-05-01T15:18:43.604Z" }
|
|
122
|
+
wheels = [
|
|
123
|
+
{ url = "https://files.pythonhosted.org/packages/0b/35/1cceccc5fcb50fa2ed53e2aa278cd032f3902682a73e763fb1ac3be8e6fa/rich_argparse-1.8.0-py3-none-any.whl", hash = "sha256:d2a3ce7854654e2253c578763ab0a32f05016f23a55fadba7b9a91b6c0e92142", size = 25616, upload-time = "2026-05-01T15:18:42.395Z" },
|
|
124
|
+
]
|
|
125
|
+
|
|
114
126
|
[[package]]
|
|
115
127
|
name = "scar-cli"
|
|
116
|
-
version = "0.
|
|
128
|
+
version = "0.8.0"
|
|
117
129
|
source = { editable = "." }
|
|
118
130
|
dependencies = [
|
|
119
131
|
{ name = "rich" },
|
|
132
|
+
{ name = "rich-argparse" },
|
|
120
133
|
]
|
|
121
134
|
|
|
122
135
|
[package.dev-dependencies]
|
|
@@ -125,7 +138,10 @@ dev = [
|
|
|
125
138
|
]
|
|
126
139
|
|
|
127
140
|
[package.metadata]
|
|
128
|
-
requires-dist = [
|
|
141
|
+
requires-dist = [
|
|
142
|
+
{ name = "rich", specifier = ">=15.0.0" },
|
|
143
|
+
{ name = "rich-argparse", specifier = ">=1.8.0" },
|
|
144
|
+
]
|
|
129
145
|
|
|
130
146
|
[package.metadata.requires-dev]
|
|
131
147
|
dev = [{ name = "pytest", specifier = ">=8.0" }]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/0003-installer-binds-to-active-venv-scar.landmine.md
RENAMED
|
File without changes
|
{scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/0004-promote-roundtrip-drops-expires-evidence.landmine.md
RENAMED
|
File without changes
|
{scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/0005-history-rewrite-orphans-commit-evidence.landmine.md
RENAMED
|
File without changes
|
|
File without changes
|
{scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/0007-release-please-config-change-skips-open-pr.landmine.md
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
|
|
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
|