cctx-cli 1.9.0__tar.gz → 1.10.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.
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/CHANGELOG.md +9 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/PKG-INFO +1 -1
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/__init__.py +1 -1
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/cli.py +8 -4
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/exporters/jsonl.py +45 -1
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/pyproject.toml +1 -1
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/test_cli.py +28 -3
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/.github/workflows/ci.yml +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/.github/workflows/publish.yml +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/.github/workflows/release.yml +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/.gitignore +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/CLAUDE.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/DESIGN.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/PRODUCT.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/README.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/action.yml +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/agents.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/diagnostician/__init__.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/diagnostician/aggregate.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/diagnostician/inflection.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/diagnostician/patterns/__init__.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/diagnostician/patterns/dead_end.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/diagnostician/patterns/fan_out.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/diagnostician/patterns/project_specific.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/diagnostician/patterns/retry_loop.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/diagnostician/patterns/scope_creep.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/diagnostician/patterns/stale_context.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/diagnostician/patterns/tool_thrash.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/discovery.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/exporters/__init__.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/exporters/csv.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/exporters/json.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/harvest.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/models.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/parsers/__init__.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/parsers/claude_code.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/pricing.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/recommender/__init__.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/recommender/claude_md.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/recommender/evidence.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/renderers/__init__.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/renderers/github.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/renderers/report.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/renderers/templates/autopsy.html.j2 +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/renderers/terminal.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/renderers/trace_tui.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/tokenizer.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx/watcher.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/cctx-project-brief.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/demo.gif +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/demo.tape +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/health-reviews/2026-05-15-deep-review-summary.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/health-reviews/2026-05-15-health-review.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/product-reviews/2026-05-15-product-review.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/product-reviews/2026-06-09-product-review.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/superpowers/plans/2026-05-12-claude-code-parser.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/superpowers/plans/2026-05-14-autopsy-v0.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/superpowers/plans/2026-05-16-readme-pypi-release.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/superpowers/plans/2026-05-17-harvest-check-depth.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/superpowers/plans/2026-05-17-project-pattern-detection.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/superpowers/plans/2026-05-19-claude-agents-live-integration.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/superpowers/specs/2026-05-12-claude-code-parser-design.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/superpowers/specs/2026-05-14-autopsy-design.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/superpowers/specs/2026-05-14-harvest-design.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/superpowers/specs/2026-05-14-trace-tui-design.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/superpowers/specs/2026-05-16-readme-pypi-release-design.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/superpowers/specs/2026-05-17-harvest-check-depth-design.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/superpowers/specs/2026-05-17-project-pattern-detection-design.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/superpowers/specs/2026-05-19-claude-agents-live-integration-design.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/superpowers/specs/2026-06-09-cross-agent-emit-design.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/__init__.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/conftest.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/diagnostician/__init__.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/diagnostician/conftest.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/diagnostician/test_dead_end.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/diagnostician/test_inflection.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/diagnostician/test_orchestrator.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/diagnostician/test_project_specific.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/diagnostician/test_retry_loop.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/diagnostician/test_scope_creep.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/diagnostician/test_stale_context.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/diagnostician/test_tool_thrash.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/exporters/__init__.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/exporters/test_csv.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/exporters/test_jsonl.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/README.md +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/short-clean/short-clean.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-attachments/with-attachments/subagents/agent-a0b4c2cf1dde0ca56.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-attachments/with-attachments/subagents/agent-a116ae34b1b09c332.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-attachments/with-attachments/subagents/agent-a1c4c417b35658c9e.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-attachments/with-attachments/subagents/agent-a1e41a901de38f1b5.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-attachments/with-attachments/subagents/agent-a338f8d0c74612a24.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-attachments/with-attachments/subagents/agent-a34f6f3c0e7094186.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-attachments/with-attachments/subagents/agent-a5a5a0cff4d13308b.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-attachments/with-attachments/subagents/agent-a6b0a3da6a0484db5.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-attachments/with-attachments/subagents/agent-a7f73f1790b02cde5.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-attachments/with-attachments/subagents/agent-a7f7c17c38a9d8788.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-attachments/with-attachments/subagents/agent-a853259e2cd7bbe8a.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-attachments/with-attachments/subagents/agent-a8d9aedb0d0c6e12d.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-attachments/with-attachments/subagents/agent-aa778bc1d59e4a441.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-attachments/with-attachments/subagents/agent-aba869dedee4a12ba.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-attachments/with-attachments/subagents/agent-ada2746d9774b94db.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-attachments/with-attachments/subagents/agent-aea0132068c64d2dd.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-attachments/with-attachments/subagents/agent-aea215eff50874d5f.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-attachments/with-attachments/subagents/agent-afee21f2b3852a4a0.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-attachments/with-attachments.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-a051d9c9a6b2f5cc3.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-a051d9c9a6b2f5cc3.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-a171f16f4e65cfe75.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-a171f16f4e65cfe75.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-a1b77fea2c0a2269b.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-a1b77fea2c0a2269b.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-a20da4c01a54acca8.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-a20da4c01a54acca8.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-a3c82739b1383fb14.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-a3c82739b1383fb14.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-a49e8539611c5fe12.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-a49e8539611c5fe12.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-a7bb58f3fff2b3e8d.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-a7bb58f3fff2b3e8d.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-a92b48c0331195aac.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-a92b48c0331195aac.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-ab96c4264099694a9.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-ab96c4264099694a9.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-acb2895c5e34ffec0.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-acb2895c5e34ffec0.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-adb2302769938fb3f.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-adb2302769938fb3f.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-ae585eca15cb93b9c.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-ae585eca15cb93b9c.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-aec9c917feb903d67.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction/subagents/agent-aec9c917feb903d67.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-subagents/with-subagents/subagents/agent-a1a3a21aeb76bb0a9.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-subagents/with-subagents/subagents/agent-a1a3a21aeb76bb0a9.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-subagents/with-subagents/subagents/agent-aaa1d6ecc05a78442.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-subagents/with-subagents/subagents/agent-aaa1d6ecc05a78442.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-subagents/with-subagents/subagents/agent-af3c545ccd30036d2.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-subagents/with-subagents/subagents/agent-af3c545ccd30036d2.meta.json +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-subagents/with-subagents/tool-results/btwp2bzro.txt +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-subagents/with-subagents/tool-results/byqjbgy4b.txt +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-subagents/with-subagents.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-tool-results/with-tool-results/tool-results/bosbkda0h.txt +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-tool-results/with-tool-results.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/scrub.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/synthetic/bookkeeping_only.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/synthetic/malformed_middle.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/synthetic/truncated_final_line.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/synthetic/unknown_attachment_shape.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/synthetic/unknown_type.jsonl +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/parsers/__init__.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/parsers/test_claude_code.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/parsers/test_claude_code_integration.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/recommender/__init__.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/recommender/test_claude_md.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/recommender/test_evidence.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/renderers/__init__.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/renderers/test_report.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/renderers/test_terminal_renderer_full.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/test_agents.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/test_aggregate.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/test_cli_export.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/test_diagnostician_subagents.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/test_discovery.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/test_efficacy.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/test_fanout_classifier.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/test_github_summary.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/test_harvest.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/test_harvest_check.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/test_harvest_emit.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/test_models.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/test_models_project_pattern.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/test_recommender.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/test_smoke.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/test_terminal_renderer.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/test_tokenizer.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/test_trace_tui.py +0 -0
- {cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/test_watcher.py +0 -0
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- version list -->
|
|
4
4
|
|
|
5
|
+
## v1.10.0 (2026-06-11)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
- Autopsy --json aggregate output for --since mode (closes #97)
|
|
10
|
+
([#112](https://github.com/jacquardlabs/cctx/pull/112),
|
|
11
|
+
[`86b10e0`](https://github.com/jacquardlabs/cctx/commit/86b10e0787efa99e9af251e979e311053d7b8b72))
|
|
12
|
+
|
|
13
|
+
|
|
5
14
|
## v1.9.0 (2026-06-11)
|
|
6
15
|
|
|
7
16
|
### Bug Fixes
|
|
@@ -326,8 +326,6 @@ def autopsy(
|
|
|
326
326
|
raise click.UsageError("--turn is not supported with --since.")
|
|
327
327
|
if until_date is not None and since is None:
|
|
328
328
|
raise click.UsageError("--until requires --since.")
|
|
329
|
-
if json_out and since is not None:
|
|
330
|
-
raise click.UsageError("--json is not supported with --since.")
|
|
331
329
|
|
|
332
330
|
if target is None:
|
|
333
331
|
if not latest:
|
|
@@ -392,8 +390,14 @@ def autopsy(
|
|
|
392
390
|
patches=patches,
|
|
393
391
|
project_patterns=patterns,
|
|
394
392
|
)
|
|
395
|
-
|
|
396
|
-
|
|
393
|
+
if json_out:
|
|
394
|
+
import json as _json
|
|
395
|
+
|
|
396
|
+
from cctx.exporters.jsonl import export_aggregate as _export_agg
|
|
397
|
+
click.echo(_json.dumps(_json.loads(_export_agg(report)), indent=2))
|
|
398
|
+
else:
|
|
399
|
+
render_aggregate(report)
|
|
400
|
+
_aggregate_drilldown(report, diagnoses)
|
|
397
401
|
else:
|
|
398
402
|
# Single-session path
|
|
399
403
|
if target.is_dir():
|
|
@@ -5,7 +5,7 @@ import json
|
|
|
5
5
|
from typing import IO, TYPE_CHECKING
|
|
6
6
|
|
|
7
7
|
if TYPE_CHECKING:
|
|
8
|
-
from cctx.models import Diagnosis, SessionTrace
|
|
8
|
+
from cctx.models import AggregateReport, Diagnosis, SessionTrace
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
def export_diagnosis(
|
|
@@ -64,6 +64,50 @@ def export_diagnosis(
|
|
|
64
64
|
return json.dumps(obj)
|
|
65
65
|
|
|
66
66
|
|
|
67
|
+
def export_aggregate(report: AggregateReport) -> str:
|
|
68
|
+
"""Serialize an AggregateReport to a JSON string."""
|
|
69
|
+
by_kind = {
|
|
70
|
+
k.value: {
|
|
71
|
+
"session_count": v.session_count,
|
|
72
|
+
"total_waste_usd": v.total_waste_usd,
|
|
73
|
+
"example_summaries": v.example_summaries,
|
|
74
|
+
}
|
|
75
|
+
for k, v in report.by_kind.items()
|
|
76
|
+
}
|
|
77
|
+
patches = [
|
|
78
|
+
{
|
|
79
|
+
"target_file": p.target_file,
|
|
80
|
+
"finding_kind": p.finding_kind.value,
|
|
81
|
+
"description": p.description,
|
|
82
|
+
"evidence_summary": p.evidence_summary,
|
|
83
|
+
}
|
|
84
|
+
for p in report.patches
|
|
85
|
+
]
|
|
86
|
+
project_patterns = [
|
|
87
|
+
{
|
|
88
|
+
"tool_name": pp.tool_name,
|
|
89
|
+
"failure_key": pp.failure_key,
|
|
90
|
+
"fix_key": pp.fix_key,
|
|
91
|
+
"session_count": pp.session_count,
|
|
92
|
+
"avg_wasted_turns": pp.avg_wasted_turns,
|
|
93
|
+
"total_waste_usd": pp.total_waste_usd,
|
|
94
|
+
"example_sessions": pp.example_sessions,
|
|
95
|
+
}
|
|
96
|
+
for pp in report.project_patterns
|
|
97
|
+
]
|
|
98
|
+
obj = {
|
|
99
|
+
"period_label": report.period_label,
|
|
100
|
+
"sessions_analysed": report.sessions_analysed,
|
|
101
|
+
"sessions_with_findings": report.sessions_with_findings,
|
|
102
|
+
"total_cost_usd": report.total_cost_usd,
|
|
103
|
+
"waste_cost_usd": report.waste_cost_usd,
|
|
104
|
+
"by_kind": by_kind,
|
|
105
|
+
"patches": patches,
|
|
106
|
+
"project_patterns": project_patterns,
|
|
107
|
+
}
|
|
108
|
+
return json.dumps(obj)
|
|
109
|
+
|
|
110
|
+
|
|
67
111
|
def write(
|
|
68
112
|
diagnoses: list[tuple[Diagnosis, SessionTrace]],
|
|
69
113
|
out: IO[str],
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "cctx-cli"
|
|
7
|
-
version = "1.
|
|
7
|
+
version = "1.10.0"
|
|
8
8
|
description = "Diagnose Claude Code sessions — find what went wrong, what it cost, and what to add to CLAUDE.md"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -488,17 +488,42 @@ def test_autopsy_json_outputs_valid_json(runner, session_jsonl):
|
|
|
488
488
|
assert "findings" in data
|
|
489
489
|
|
|
490
490
|
|
|
491
|
-
def
|
|
492
|
-
"""--json + --since →
|
|
491
|
+
def test_autopsy_json_aggregate_outputs_valid_json(runner, tmp_path):
|
|
492
|
+
"""--json + --since → valid aggregate JSON with expected top-level keys."""
|
|
493
493
|
from cctx.cli import cli
|
|
494
494
|
|
|
495
495
|
project_dir = tmp_path / "-Users-test-Projects-demo"
|
|
496
496
|
project_dir.mkdir()
|
|
497
497
|
|
|
498
|
+
session_id = "json-agg-test-01"
|
|
499
|
+
line = {
|
|
500
|
+
"type": "user",
|
|
501
|
+
"uuid": f"{session_id}-u1",
|
|
502
|
+
"parentUuid": None,
|
|
503
|
+
"isSidechain": False,
|
|
504
|
+
"timestamp": "2026-05-14T10:00:00.000Z",
|
|
505
|
+
"sessionId": session_id,
|
|
506
|
+
"version": "2.1.138",
|
|
507
|
+
"cwd": "/Users/test/Projects/demo",
|
|
508
|
+
"gitBranch": "main",
|
|
509
|
+
"userType": "external",
|
|
510
|
+
"entrypoint": "cli",
|
|
511
|
+
"message": {"role": "user", "content": "hello"},
|
|
512
|
+
}
|
|
513
|
+
(project_dir / f"{session_id}.jsonl").write_text(json.dumps(line) + "\n")
|
|
514
|
+
|
|
498
515
|
result = runner.invoke(
|
|
499
516
|
cli, ["autopsy", str(project_dir), "--since", "7", "--json"],
|
|
517
|
+
catch_exceptions=False,
|
|
500
518
|
)
|
|
501
|
-
assert result.exit_code
|
|
519
|
+
assert result.exit_code == 0
|
|
520
|
+
data = json.loads(result.output)
|
|
521
|
+
assert "sessions_analysed" in data
|
|
522
|
+
assert "total_cost_usd" in data
|
|
523
|
+
assert "waste_cost_usd" in data
|
|
524
|
+
assert "by_kind" in data
|
|
525
|
+
assert "patches" in data
|
|
526
|
+
assert "project_patterns" in data
|
|
502
527
|
|
|
503
528
|
|
|
504
529
|
def test_autopsy_json_contains_cost(runner, session_jsonl):
|
|
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
|
{cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/superpowers/plans/2026-05-17-project-pattern-detection.md
RENAMED
|
File without changes
|
|
File without changes
|
{cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/superpowers/specs/2026-05-12-claude-code-parser-design.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/superpowers/specs/2026-05-16-readme-pypi-release-design.md
RENAMED
|
File without changes
|
{cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/superpowers/specs/2026-05-17-harvest-check-depth-design.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cctx_cli-1.9.0 → cctx_cli-1.10.0}/docs/superpowers/specs/2026-06-09-cross-agent-emit-design.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
|
{cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-compaction/with-compaction.jsonl
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
|
{cctx_cli-1.9.0 → cctx_cli-1.10.0}/tests/fixtures/claude_code/with-subagents/with-subagents.jsonl
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
|