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.
Files changed (88) hide show
  1. scar_cli-0.9.0/.release-please-manifest.json +3 -0
  2. 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
  3. {scar_cli-0.8.0 → scar_cli-0.9.0}/CHANGELOG.md +7 -0
  4. {scar_cli-0.8.0 → scar_cli-0.9.0}/PKG-INFO +2 -1
  5. {scar_cli-0.8.0 → scar_cli-0.9.0}/plugin/plugin.json +1 -1
  6. {scar_cli-0.8.0 → scar_cli-0.9.0}/pyproject.toml +2 -1
  7. {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/cli.py +38 -20
  8. {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_cli.py +43 -0
  9. {scar_cli-0.8.0 → scar_cli-0.9.0}/uv.lock +18 -2
  10. scar_cli-0.8.0/.release-please-manifest.json +0 -3
  11. {scar_cli-0.8.0 → scar_cli-0.9.0}/.claude-plugin/marketplace.json +0 -0
  12. {scar_cli-0.8.0 → scar_cli-0.9.0}/.github/workflows/ci.yml +0 -0
  13. {scar_cli-0.8.0 → scar_cli-0.9.0}/.github/workflows/pr-validation.yml +0 -0
  14. {scar_cli-0.8.0 → scar_cli-0.9.0}/.github/workflows/release.yml +0 -0
  15. {scar_cli-0.8.0 → scar_cli-0.9.0}/.gitignore +0 -0
  16. {scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/0001-git-grep-ere-pitfalls.landmine.md +0 -0
  17. {scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/0002-agent-direct-hook-install.deadend.md +0 -0
  18. {scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/0003-installer-binds-to-active-venv-scar.landmine.md +0 -0
  19. {scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/0004-promote-roundtrip-drops-expires-evidence.landmine.md +0 -0
  20. {scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/0005-history-rewrite-orphans-commit-evidence.landmine.md +0 -0
  21. {scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/0006-yaml-pattern-anchor-over-escaping.landmine.md +0 -0
  22. {scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/0007-release-please-config-change-skips-open-pr.landmine.md +0 -0
  23. {scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/README.md +0 -0
  24. {scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/candidates/fp-log.txt +0 -0
  25. {scar_cli-0.8.0 → scar_cli-0.9.0}/.scars/template.md +0 -0
  26. {scar_cli-0.8.0 → scar_cli-0.9.0}/AGENTS.md +0 -0
  27. {scar_cli-0.8.0 → scar_cli-0.9.0}/CONTRIBUTING.md +0 -0
  28. {scar_cli-0.8.0 → scar_cli-0.9.0}/IDEA.md +0 -0
  29. {scar_cli-0.8.0 → scar_cli-0.9.0}/LICENSE +0 -0
  30. {scar_cli-0.8.0 → scar_cli-0.9.0}/README.md +0 -0
  31. {scar_cli-0.8.0 → scar_cli-0.9.0}/ROADMAP.md +0 -0
  32. {scar_cli-0.8.0 → scar_cli-0.9.0}/SCAR-FORMAT.md +0 -0
  33. {scar_cli-0.8.0 → scar_cli-0.9.0}/SPEC.md +0 -0
  34. {scar_cli-0.8.0 → scar_cli-0.9.0}/STRESS-TEST.md +0 -0
  35. {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/anchor-survival/PROTOCOL.md +0 -0
  36. {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/anchor-survival/RESULTS.md +0 -0
  37. {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/anchor-survival/long_replay.py +0 -0
  38. {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/anchor-survival/replay.py +0 -0
  39. {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/auto-authorship/FINDINGS.md +0 -0
  40. {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/auto-authorship/PROTOCOL.md +0 -0
  41. {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/.gitignore +0 -0
  42. {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/PROTOCOL.md +0 -0
  43. {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/RESULTS.md +0 -0
  44. {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/.scars/0001-vendor-retry-window.fence.md +0 -0
  45. {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/.scars/0002-evicting-session-store.deadend.md +0 -0
  46. {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/.scars/0003-export-column-order.landmine.md +0 -0
  47. {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/README.md +0 -0
  48. {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/payments/retry.py +0 -0
  49. {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/reports/export.py +0 -0
  50. {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/services/sessions.py +0 -0
  51. {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/fence-honor/grade.py +0 -0
  52. {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/harvest/PROTOCOL.md +0 -0
  53. {scar_cli-0.8.0 → scar_cli-0.9.0}/experiments/harvest/harvest.py +0 -0
  54. {scar_cli-0.8.0 → scar_cli-0.9.0}/hook/scar-hooks.py +0 -0
  55. {scar_cli-0.8.0 → scar_cli-0.9.0}/plugin/skills/scar-authoring/SKILL.md +0 -0
  56. {scar_cli-0.8.0 → scar_cli-0.9.0}/plugin/skills/scar-authoring/assets/template.md +0 -0
  57. {scar_cli-0.8.0 → scar_cli-0.9.0}/release-please-config.json +0 -0
  58. {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/__init__.py +0 -0
  59. {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/agent.py +0 -0
  60. {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/evidence.py +0 -0
  61. {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/harvest.py +0 -0
  62. {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/hooks.py +0 -0
  63. {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/installer.py +0 -0
  64. {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/lint.py +0 -0
  65. {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/match.py +0 -0
  66. {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/mcp.py +0 -0
  67. {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/model.py +0 -0
  68. {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/orphan.py +0 -0
  69. {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/output.py +0 -0
  70. {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/render.py +0 -0
  71. {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/skills/scar-authoring/SKILL.md +0 -0
  72. {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/skills/scar-authoring/assets/template.md +0 -0
  73. {scar_cli-0.8.0 → scar_cli-0.9.0}/src/scar/store.py +0 -0
  74. {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_docs.py +0 -0
  75. {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_evidence.py +0 -0
  76. {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_harvest.py +0 -0
  77. {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_hooks.py +0 -0
  78. {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_installer.py +0 -0
  79. {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_lifecycle.py +0 -0
  80. {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_lint.py +0 -0
  81. {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_match.py +0 -0
  82. {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_mcp.py +0 -0
  83. {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_model.py +0 -0
  84. {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_orphan.py +0 -0
  85. {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_output.py +0 -0
  86. {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_plugin.py +0 -0
  87. {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_skill.py +0 -0
  88. {scar_cli-0.8.0 → scar_cli-0.9.0}/tests/test_store.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.9.0"
3
+ }
@@ -1,25 +1,22 @@
1
1
  ---
2
- # COPY THIS FILE — do not edit the template itself.
3
- # New scars: write to .scars/candidates/<slug>.md with status: candidate.
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: "187-test suite asserts plain substrings like '0001-bad.deadend.md' and long anchor paths on main([...]) under capsys"
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: candidate
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.8.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,6 +1,6 @@
1
1
  {
2
2
  "name": "scar",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "SCAR — version control for negative knowledge (deadends, fences, landmines)",
5
5
  "hooks": {
6
6
  "PreToolUse": [
@@ -1,12 +1,13 @@
1
1
  [project]
2
2
  name = "scar-cli"
3
- version = "0.8.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 main(argv: list[str] | None = None) -> int:
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.add_parser("init", help="create .scars/ layout in the current repo")
741
- p = sub.add_parser("lint", help="validate every scar and candidate")
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.add_parser("status", help="counts, titles, broken-file warnings")
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.add_parser("promote", help="review a candidate into an active scar")
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.add_parser("check", help="scars anchored to a path")
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.add_parser("why", help="history of pain for a path (any status)")
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.add_parser("challenge", help="dispute a scar (still fires, marked challenged)")
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.add_parser("archive", help="retire a scar (never fires; history kept)")
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.add_parser("orphan", help="list scars whose anchors all went dead")
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.add_parser("harvest", help="mine git history for candidate scars")
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.add_parser("hook", help="install, remove, inspect, or run Claude Code hooks")
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.add_parser("skill", help="install, remove, or inspect the scar-authoring skill")
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.add_parser("mcp", help="run the SCAR MCP stdio server")
819
+ _add(sub, "mcp", help="run the SCAR MCP stdio server")
807
820
 
808
- p = sub.add_parser("agent", help="agent integration helpers")
821
+ p = _add(sub, "agent", help="agent integration helpers")
809
822
  agent_sub = p.add_subparsers(dest="agent_command", required=True)
810
- agent_sub.add_parser("doctor", help="show local agent integration readiness")
811
- cfg = agent_sub.add_parser("config", help="print config for an agent runtime")
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.add_parser("skill", help="print the scar-authoring skill body")
826
+ _add(agent_sub, "skill", help="print the scar-authoring skill body")
814
827
 
815
- p = sub.add_parser("inject", help="machine mode for hooks: JSON or silence")
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.7.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 = [{ name = "rich", specifier = ">=15.0.0" }]
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" }]
@@ -1,3 +0,0 @@
1
- {
2
- ".": "0.8.0"
3
- }
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