scar-cli 0.7.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.9.0/.scars/0008-rich-output-nontty-must-bypass-rich.landmine.md +39 -0
  3. {scar_cli-0.7.0 → scar_cli-0.9.0}/CHANGELOG.md +15 -0
  4. {scar_cli-0.7.0 → scar_cli-0.9.0}/PKG-INFO +3 -1
  5. {scar_cli-0.7.0 → scar_cli-0.9.0}/plugin/plugin.json +1 -1
  6. {scar_cli-0.7.0 → scar_cli-0.9.0}/pyproject.toml +5 -2
  7. {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/cli.py +336 -94
  8. scar_cli-0.9.0/src/scar/output.py +52 -0
  9. {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_cli.py +167 -0
  10. scar_cli-0.9.0/tests/test_output.py +48 -0
  11. {scar_cli-0.7.0 → scar_cli-0.9.0}/uv.lock +55 -1
  12. scar_cli-0.7.0/.release-please-manifest.json +0 -3
  13. {scar_cli-0.7.0 → scar_cli-0.9.0}/.claude-plugin/marketplace.json +0 -0
  14. {scar_cli-0.7.0 → scar_cli-0.9.0}/.github/workflows/ci.yml +0 -0
  15. {scar_cli-0.7.0 → scar_cli-0.9.0}/.github/workflows/pr-validation.yml +0 -0
  16. {scar_cli-0.7.0 → scar_cli-0.9.0}/.github/workflows/release.yml +0 -0
  17. {scar_cli-0.7.0 → scar_cli-0.9.0}/.gitignore +0 -0
  18. {scar_cli-0.7.0 → scar_cli-0.9.0}/.scars/0001-git-grep-ere-pitfalls.landmine.md +0 -0
  19. {scar_cli-0.7.0 → scar_cli-0.9.0}/.scars/0002-agent-direct-hook-install.deadend.md +0 -0
  20. {scar_cli-0.7.0 → scar_cli-0.9.0}/.scars/0003-installer-binds-to-active-venv-scar.landmine.md +0 -0
  21. {scar_cli-0.7.0 → scar_cli-0.9.0}/.scars/0004-promote-roundtrip-drops-expires-evidence.landmine.md +0 -0
  22. {scar_cli-0.7.0 → scar_cli-0.9.0}/.scars/0005-history-rewrite-orphans-commit-evidence.landmine.md +0 -0
  23. {scar_cli-0.7.0 → scar_cli-0.9.0}/.scars/0006-yaml-pattern-anchor-over-escaping.landmine.md +0 -0
  24. {scar_cli-0.7.0 → scar_cli-0.9.0}/.scars/0007-release-please-config-change-skips-open-pr.landmine.md +0 -0
  25. {scar_cli-0.7.0 → scar_cli-0.9.0}/.scars/README.md +0 -0
  26. {scar_cli-0.7.0 → scar_cli-0.9.0}/.scars/candidates/fp-log.txt +0 -0
  27. {scar_cli-0.7.0 → scar_cli-0.9.0}/.scars/template.md +0 -0
  28. {scar_cli-0.7.0 → scar_cli-0.9.0}/AGENTS.md +0 -0
  29. {scar_cli-0.7.0 → scar_cli-0.9.0}/CONTRIBUTING.md +0 -0
  30. {scar_cli-0.7.0 → scar_cli-0.9.0}/IDEA.md +0 -0
  31. {scar_cli-0.7.0 → scar_cli-0.9.0}/LICENSE +0 -0
  32. {scar_cli-0.7.0 → scar_cli-0.9.0}/README.md +0 -0
  33. {scar_cli-0.7.0 → scar_cli-0.9.0}/ROADMAP.md +0 -0
  34. {scar_cli-0.7.0 → scar_cli-0.9.0}/SCAR-FORMAT.md +0 -0
  35. {scar_cli-0.7.0 → scar_cli-0.9.0}/SPEC.md +0 -0
  36. {scar_cli-0.7.0 → scar_cli-0.9.0}/STRESS-TEST.md +0 -0
  37. {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/anchor-survival/PROTOCOL.md +0 -0
  38. {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/anchor-survival/RESULTS.md +0 -0
  39. {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/anchor-survival/long_replay.py +0 -0
  40. {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/anchor-survival/replay.py +0 -0
  41. {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/auto-authorship/FINDINGS.md +0 -0
  42. {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/auto-authorship/PROTOCOL.md +0 -0
  43. {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/.gitignore +0 -0
  44. {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/PROTOCOL.md +0 -0
  45. {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/RESULTS.md +0 -0
  46. {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/.scars/0001-vendor-retry-window.fence.md +0 -0
  47. {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/.scars/0002-evicting-session-store.deadend.md +0 -0
  48. {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/.scars/0003-export-column-order.landmine.md +0 -0
  49. {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/README.md +0 -0
  50. {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/payments/retry.py +0 -0
  51. {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/reports/export.py +0 -0
  52. {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/services/sessions.py +0 -0
  53. {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/grade.py +0 -0
  54. {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/harvest/PROTOCOL.md +0 -0
  55. {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/harvest/harvest.py +0 -0
  56. {scar_cli-0.7.0 → scar_cli-0.9.0}/hook/scar-hooks.py +0 -0
  57. {scar_cli-0.7.0 → scar_cli-0.9.0}/plugin/skills/scar-authoring/SKILL.md +0 -0
  58. {scar_cli-0.7.0 → scar_cli-0.9.0}/plugin/skills/scar-authoring/assets/template.md +0 -0
  59. {scar_cli-0.7.0 → scar_cli-0.9.0}/release-please-config.json +0 -0
  60. {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/__init__.py +0 -0
  61. {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/agent.py +0 -0
  62. {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/evidence.py +0 -0
  63. {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/harvest.py +0 -0
  64. {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/hooks.py +0 -0
  65. {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/installer.py +0 -0
  66. {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/lint.py +0 -0
  67. {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/match.py +0 -0
  68. {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/mcp.py +0 -0
  69. {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/model.py +0 -0
  70. {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/orphan.py +0 -0
  71. {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/render.py +0 -0
  72. {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/skills/scar-authoring/SKILL.md +0 -0
  73. {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/skills/scar-authoring/assets/template.md +0 -0
  74. {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/store.py +0 -0
  75. {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_docs.py +0 -0
  76. {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_evidence.py +0 -0
  77. {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_harvest.py +0 -0
  78. {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_hooks.py +0 -0
  79. {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_installer.py +0 -0
  80. {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_lifecycle.py +0 -0
  81. {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_lint.py +0 -0
  82. {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_match.py +0 -0
  83. {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_mcp.py +0 -0
  84. {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_model.py +0 -0
  85. {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_orphan.py +0 -0
  86. {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_plugin.py +0 -0
  87. {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_skill.py +0 -0
  88. {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_store.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.9.0"
3
+ }
@@ -0,0 +1,39 @@
1
+ ---
2
+ id: 8
3
+ type: landmine
4
+ title: Read commands' non-tty branch must bypass Rich — Rich wraps to 80 cols and breaks path-substring tests
5
+ severity: high
6
+ confidence: 0.9
7
+ created: 2026-06-30
8
+ authors: ["claude-code", "kibukx"]
9
+ anchors:
10
+ - path: src/scar/cli.py
11
+ - path: src/scar/output.py
12
+ - pattern: "output\.render\("
13
+ evidence:
14
+ - issue: 78
15
+ - note: 187-test suite asserts plain substrings like '0001-bad.deadend.md' and long anchor paths on main([...]) under capsys
16
+ expires:
17
+ condition: "the test suite stops asserting on plain stdout substrings (e.g. moves to asserting structured --json only)"
18
+ review_after: 2027-06-30
19
+ status: active
20
+ ---
21
+
22
+ The five read commands (status, lint, check, why, orphan) route output 3 ways:
23
+ --json, Rich (tty), and plain print() (non-tty). The non-tty branch MUST keep
24
+ emitting the legacy plain lines byte-for-byte. It looks redundant — "why not
25
+ just always render with Rich?" — but it is load-bearing.
26
+
27
+ Rich's Console wraps and truncates to ~80 columns when it does not detect a wide
28
+ terminal. Many existing tests call main([...]) under pytest's capsys (stdout is
29
+ NOT a tty) and assert on plain SUBSTRINGS, including long anchor paths like
30
+ `src/long_gone/` and filenames like `0001-bad.deadend.md`. If you route the
31
+ non-tty branch through Rich, those strings get wrapped/elided and the assertions
32
+ fail in subtle, hard-to-trace ways (the value is "there" visually but split
33
+ across a wrapped line).
34
+
35
+ What a future editor must do: keep `output.is_tty()` gating Rich. Only branch 2
36
+ (real tty) may call a `_*_rich` renderer. The `plain()` closure in each handler
37
+ is the contract for non-tty + CI consumers — change its text only if you also
38
+ update the corresponding test substrings. Do NOT collapse the plain branch into
39
+ the Rich branch. See issue #78 and src/scar/output.py's module docstring.
@@ -1,5 +1,20 @@
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
+
10
+ ## [0.8.0](https://github.com/Daily-Nerd/Scar/compare/v0.7.0...v0.8.0) (2026-06-30)
11
+
12
+
13
+ ### Features
14
+
15
+ * **cli:** add --version flag to report installed version ([#76](https://github.com/Daily-Nerd/Scar/issues/76)) ([e45805d](https://github.com/Daily-Nerd/Scar/commit/e45805d01d171e2264a37a102f73a5254d5cedeb)), closes [#75](https://github.com/Daily-Nerd/Scar/issues/75)
16
+ * **cli:** Rich output for read commands (TTY-detect + --json) ([#79](https://github.com/Daily-Nerd/Scar/issues/79)) ([3ff9d40](https://github.com/Daily-Nerd/Scar/commit/3ff9d4036138e7c898cae8dc18c9affc26553525))
17
+
3
18
  ## [0.7.0](https://github.com/Daily-Nerd/Scar/compare/v0.6.1...v0.7.0) (2026-06-30)
4
19
 
5
20
 
@@ -1,10 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scar-cli
3
- Version: 0.7.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
9
+ Requires-Dist: rich>=15.0.0
8
10
  Description-Content-Type: text/markdown
9
11
 
10
12
  # SCAR — Version Control for Negative Knowledge
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scar",
3
- "version": "0.7.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,11 +1,14 @@
1
1
  [project]
2
2
  name = "scar-cli"
3
- version = "0.7.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
- dependencies = []
8
+ dependencies = [
9
+ "rich>=15.0.0",
10
+ "rich-argparse>=1.8.0",
11
+ ]
9
12
 
10
13
  [project.scripts]
11
14
  scar = "scar.cli:main"