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.
- scar_cli-0.9.0/.release-please-manifest.json +3 -0
- scar_cli-0.9.0/.scars/0008-rich-output-nontty-must-bypass-rich.landmine.md +39 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/CHANGELOG.md +15 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/PKG-INFO +3 -1
- {scar_cli-0.7.0 → scar_cli-0.9.0}/plugin/plugin.json +1 -1
- {scar_cli-0.7.0 → scar_cli-0.9.0}/pyproject.toml +5 -2
- {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/cli.py +336 -94
- scar_cli-0.9.0/src/scar/output.py +52 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_cli.py +167 -0
- scar_cli-0.9.0/tests/test_output.py +48 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/uv.lock +55 -1
- scar_cli-0.7.0/.release-please-manifest.json +0 -3
- {scar_cli-0.7.0 → scar_cli-0.9.0}/.claude-plugin/marketplace.json +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/.github/workflows/ci.yml +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/.github/workflows/pr-validation.yml +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/.github/workflows/release.yml +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/.gitignore +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/.scars/0001-git-grep-ere-pitfalls.landmine.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/.scars/0002-agent-direct-hook-install.deadend.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/.scars/0003-installer-binds-to-active-venv-scar.landmine.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/.scars/0004-promote-roundtrip-drops-expires-evidence.landmine.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/.scars/0005-history-rewrite-orphans-commit-evidence.landmine.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/.scars/0006-yaml-pattern-anchor-over-escaping.landmine.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/.scars/0007-release-please-config-change-skips-open-pr.landmine.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/.scars/README.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/.scars/candidates/fp-log.txt +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/.scars/template.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/AGENTS.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/CONTRIBUTING.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/IDEA.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/LICENSE +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/README.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/ROADMAP.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/SCAR-FORMAT.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/SPEC.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/STRESS-TEST.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/anchor-survival/PROTOCOL.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/anchor-survival/RESULTS.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/anchor-survival/long_replay.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/anchor-survival/replay.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/auto-authorship/FINDINGS.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/auto-authorship/PROTOCOL.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/.gitignore +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/PROTOCOL.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/RESULTS.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/.scars/0001-vendor-retry-window.fence.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/.scars/0002-evicting-session-store.deadend.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/.scars/0003-export-column-order.landmine.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/README.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/payments/retry.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/reports/export.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/fixture/services/sessions.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/fence-honor/grade.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/harvest/PROTOCOL.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/experiments/harvest/harvest.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/hook/scar-hooks.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/plugin/skills/scar-authoring/SKILL.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/plugin/skills/scar-authoring/assets/template.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/release-please-config.json +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/__init__.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/agent.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/evidence.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/harvest.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/hooks.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/installer.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/lint.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/match.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/mcp.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/model.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/orphan.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/render.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/skills/scar-authoring/SKILL.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/skills/scar-authoring/assets/template.md +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/src/scar/store.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_docs.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_evidence.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_harvest.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_hooks.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_installer.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_lifecycle.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_lint.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_match.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_mcp.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_model.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_orphan.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_plugin.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_skill.py +0 -0
- {scar_cli-0.7.0 → scar_cli-0.9.0}/tests/test_store.py +0 -0
|
@@ -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.
|
|
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,11 +1,14 @@
|
|
|
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
|
-
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"
|