codebase-receipts-cli 1.0.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.
- codebase_receipts_cli-1.0.0/.env.example +98 -0
- codebase_receipts_cli-1.0.0/.github/workflows/ci.yml +28 -0
- codebase_receipts_cli-1.0.0/.github/workflows/publish.yml +36 -0
- codebase_receipts_cli-1.0.0/.gitignore +33 -0
- codebase_receipts_cli-1.0.0/.pre-commit-config.yaml +19 -0
- codebase_receipts_cli-1.0.0/CHANGELOG.md +153 -0
- codebase_receipts_cli-1.0.0/CLAUDE.md +774 -0
- codebase_receipts_cli-1.0.0/LEARN.md +2485 -0
- codebase_receipts_cli-1.0.0/LICENSE +21 -0
- codebase_receipts_cli-1.0.0/PKG-INFO +268 -0
- codebase_receipts_cli-1.0.0/README.md +224 -0
- codebase_receipts_cli-1.0.0/SETUP.md +306 -0
- codebase_receipts_cli-1.0.0/pyproject.toml +110 -0
- codebase_receipts_cli-1.0.0/receipts/__init__.py +0 -0
- codebase_receipts_cli-1.0.0/receipts/ama/__init__.py +0 -0
- codebase_receipts_cli-1.0.0/receipts/ama/interviewer.py +415 -0
- codebase_receipts_cli-1.0.0/receipts/ats/__init__.py +1 -0
- codebase_receipts_cli-1.0.0/receipts/ats/comparator.py +98 -0
- codebase_receipts_cli-1.0.0/receipts/ats/scorer.py +550 -0
- codebase_receipts_cli-1.0.0/receipts/ats/stats.py +164 -0
- codebase_receipts_cli-1.0.0/receipts/cli.py +2062 -0
- codebase_receipts_cli-1.0.0/receipts/config.py +106 -0
- codebase_receipts_cli-1.0.0/receipts/errors.py +18 -0
- codebase_receipts_cli-1.0.0/receipts/export.py +120 -0
- codebase_receipts_cli-1.0.0/receipts/ingest/__init__.py +0 -0
- codebase_receipts_cli-1.0.0/receipts/ingest/artifact_extractor.py +679 -0
- codebase_receipts_cli-1.0.0/receipts/ingest/git_source.py +159 -0
- codebase_receipts_cli-1.0.0/receipts/ingest/manifest.py +114 -0
- codebase_receipts_cli-1.0.0/receipts/ingest/scanner.py +141 -0
- codebase_receipts_cli-1.0.0/receipts/ingest/secrets_scanner.py +225 -0
- codebase_receipts_cli-1.0.0/receipts/interactive/__init__.py +1 -0
- codebase_receipts_cli-1.0.0/receipts/interactive/repl.py +755 -0
- codebase_receipts_cli-1.0.0/receipts/ledger/__init__.py +0 -0
- codebase_receipts_cli-1.0.0/receipts/ledger/pricing_table.py +54 -0
- codebase_receipts_cli-1.0.0/receipts/ledger/token_ledger.py +226 -0
- codebase_receipts_cli-1.0.0/receipts/llm/__init__.py +0 -0
- codebase_receipts_cli-1.0.0/receipts/llm/anthropic_provider.py +95 -0
- codebase_receipts_cli-1.0.0/receipts/llm/factory.py +124 -0
- codebase_receipts_cli-1.0.0/receipts/llm/fake_provider.py +79 -0
- codebase_receipts_cli-1.0.0/receipts/llm/gemini_provider.py +205 -0
- codebase_receipts_cli-1.0.0/receipts/llm/json_utils.py +46 -0
- codebase_receipts_cli-1.0.0/receipts/llm/metered.py +62 -0
- codebase_receipts_cli-1.0.0/receipts/llm/ollama_provider.py +117 -0
- codebase_receipts_cli-1.0.0/receipts/llm/openai_provider.py +118 -0
- codebase_receipts_cli-1.0.0/receipts/llm/provider.py +42 -0
- codebase_receipts_cli-1.0.0/receipts/llm/split.py +78 -0
- codebase_receipts_cli-1.0.0/receipts/llm/token_estimate.py +35 -0
- codebase_receipts_cli-1.0.0/receipts/mine/__init__.py +1 -0
- codebase_receipts_cli-1.0.0/receipts/mine/code_metrics.py +246 -0
- codebase_receipts_cli-1.0.0/receipts/mine/git_evidence.py +109 -0
- codebase_receipts_cli-1.0.0/receipts/prep/__init__.py +1 -0
- codebase_receipts_cli-1.0.0/receipts/prep/dossier.py +313 -0
- codebase_receipts_cli-1.0.0/receipts/prep/readiness.py +227 -0
- codebase_receipts_cli-1.0.0/receipts/resume/__init__.py +0 -0
- codebase_receipts_cli-1.0.0/receipts/resume/claim_extractor.py +338 -0
- codebase_receipts_cli-1.0.0/receipts/resume/loader.py +35 -0
- codebase_receipts_cli-1.0.0/receipts/resume/pdf_parser.py +259 -0
- codebase_receipts_cli-1.0.0/receipts/resume/tex_parser.py +394 -0
- codebase_receipts_cli-1.0.0/receipts/rewrite/__init__.py +0 -0
- codebase_receipts_cli-1.0.0/receipts/rewrite/compiler.py +180 -0
- codebase_receipts_cli-1.0.0/receipts/rewrite/optimizer.py +140 -0
- codebase_receipts_cli-1.0.0/receipts/rewrite/tex_rewriter.py +227 -0
- codebase_receipts_cli-1.0.0/receipts/tui/__init__.py +0 -0
- codebase_receipts_cli-1.0.0/receipts/tui/ama_app.py +454 -0
- codebase_receipts_cli-1.0.0/receipts/tui/app.py +316 -0
- codebase_receipts_cli-1.0.0/receipts/tui/dossier_app.py +170 -0
- codebase_receipts_cli-1.0.0/receipts/tui/hub.py +367 -0
- codebase_receipts_cli-1.0.0/receipts/tui/ingest_app.py +183 -0
- codebase_receipts_cli-1.0.0/receipts/tui/rewrite_app.py +463 -0
- codebase_receipts_cli-1.0.0/receipts/tui/score_app.py +237 -0
- codebase_receipts_cli-1.0.0/receipts/tui/widgets/__init__.py +0 -0
- codebase_receipts_cli-1.0.0/receipts/tui/widgets/claims_table.py +50 -0
- codebase_receipts_cli-1.0.0/receipts/tui/widgets/diff_view.py +38 -0
- codebase_receipts_cli-1.0.0/receipts/tui/widgets/status_bar.py +38 -0
- codebase_receipts_cli-1.0.0/receipts/verify/__init__.py +0 -0
- codebase_receipts_cli-1.0.0/receipts/verify/bm25.py +112 -0
- codebase_receipts_cli-1.0.0/receipts/verify/enrich.py +128 -0
- codebase_receipts_cli-1.0.0/receipts/verify/jd_fetch.py +101 -0
- codebase_receipts_cli-1.0.0/receipts/verify/kb.py +379 -0
- codebase_receipts_cli-1.0.0/receipts/verify/keyword_gap.py +127 -0
- codebase_receipts_cli-1.0.0/receipts/verify/query_expand.py +88 -0
- codebase_receipts_cli-1.0.0/receipts/verify/rerank.py +74 -0
- codebase_receipts_cli-1.0.0/receipts/verify/rewriter.py +172 -0
- codebase_receipts_cli-1.0.0/receipts/verify/router.py +211 -0
- codebase_receipts_cli-1.0.0/receipts/verify/summaries.py +258 -0
- codebase_receipts_cli-1.0.0/receipts/verify/verifier.py +552 -0
- codebase_receipts_cli-1.0.0/tests/__init__.py +0 -0
- codebase_receipts_cli-1.0.0/tests/conftest.py +83 -0
- codebase_receipts_cli-1.0.0/tests/test_artifact_extractor.py +154 -0
- codebase_receipts_cli-1.0.0/tests/test_ats_comparator.py +127 -0
- codebase_receipts_cli-1.0.0/tests/test_ats_keyword_fix.py +60 -0
- codebase_receipts_cli-1.0.0/tests/test_ats_scorer.py +226 -0
- codebase_receipts_cli-1.0.0/tests/test_ats_stats.py +158 -0
- codebase_receipts_cli-1.0.0/tests/test_ats_v2.py +145 -0
- codebase_receipts_cli-1.0.0/tests/test_batch_parser_hardening.py +99 -0
- codebase_receipts_cli-1.0.0/tests/test_claim_extractor.py +224 -0
- codebase_receipts_cli-1.0.0/tests/test_cli.py +46 -0
- codebase_receipts_cli-1.0.0/tests/test_code_metrics.py +160 -0
- codebase_receipts_cli-1.0.0/tests/test_compiler.py +43 -0
- codebase_receipts_cli-1.0.0/tests/test_config.py +41 -0
- codebase_receipts_cli-1.0.0/tests/test_dossier.py +198 -0
- codebase_receipts_cli-1.0.0/tests/test_entry_filter.py +116 -0
- codebase_receipts_cli-1.0.0/tests/test_export.py +96 -0
- codebase_receipts_cli-1.0.0/tests/test_factory.py +69 -0
- codebase_receipts_cli-1.0.0/tests/test_fake_provider.py +48 -0
- codebase_receipts_cli-1.0.0/tests/test_gemini_provider.py +234 -0
- codebase_receipts_cli-1.0.0/tests/test_git_evidence.py +82 -0
- codebase_receipts_cli-1.0.0/tests/test_git_source.py +55 -0
- codebase_receipts_cli-1.0.0/tests/test_hybrid_retrieval.py +149 -0
- codebase_receipts_cli-1.0.0/tests/test_ingest_cli.py +62 -0
- codebase_receipts_cli-1.0.0/tests/test_interactive.py +230 -0
- codebase_receipts_cli-1.0.0/tests/test_interview_styles.py +85 -0
- codebase_receipts_cli-1.0.0/tests/test_interviewer.py +288 -0
- codebase_receipts_cli-1.0.0/tests/test_json_utils.py +55 -0
- codebase_receipts_cli-1.0.0/tests/test_kb.py +246 -0
- codebase_receipts_cli-1.0.0/tests/test_keyword_gap.py +166 -0
- codebase_receipts_cli-1.0.0/tests/test_language_coverage.py +195 -0
- codebase_receipts_cli-1.0.0/tests/test_ledger.py +138 -0
- codebase_receipts_cli-1.0.0/tests/test_metered_provider.py +77 -0
- codebase_receipts_cli-1.0.0/tests/test_new_tuis.py +139 -0
- codebase_receipts_cli-1.0.0/tests/test_openai_base_url.py +40 -0
- codebase_receipts_cli-1.0.0/tests/test_optimizer.py +168 -0
- codebase_receipts_cli-1.0.0/tests/test_pdf_parser.py +192 -0
- codebase_receipts_cli-1.0.0/tests/test_provider_contract.py +59 -0
- codebase_receipts_cli-1.0.0/tests/test_readiness.py +151 -0
- codebase_receipts_cli-1.0.0/tests/test_remote_sources.py +245 -0
- codebase_receipts_cli-1.0.0/tests/test_retrieval_upgrades.py +300 -0
- codebase_receipts_cli-1.0.0/tests/test_rewriter.py +168 -0
- codebase_receipts_cli-1.0.0/tests/test_rewriter_grounding.py +116 -0
- codebase_receipts_cli-1.0.0/tests/test_router.py +295 -0
- codebase_receipts_cli-1.0.0/tests/test_scanner.py +68 -0
- codebase_receipts_cli-1.0.0/tests/test_scanner_gitignored_venv.py +21 -0
- codebase_receipts_cli-1.0.0/tests/test_secrets_scanner.py +115 -0
- codebase_receipts_cli-1.0.0/tests/test_setup_config.py +47 -0
- codebase_receipts_cli-1.0.0/tests/test_split_provider.py +112 -0
- codebase_receipts_cli-1.0.0/tests/test_tex_identity_replacement.py +209 -0
- codebase_receipts_cli-1.0.0/tests/test_tex_parser.py +165 -0
- codebase_receipts_cli-1.0.0/tests/test_tex_rewriter.py +221 -0
- codebase_receipts_cli-1.0.0/tests/test_tui.py +107 -0
- codebase_receipts_cli-1.0.0/tests/test_tui_rewrite.py +62 -0
- codebase_receipts_cli-1.0.0/tests/test_tui_score.py +64 -0
- codebase_receipts_cli-1.0.0/tests/test_verifier.py +301 -0
- codebase_receipts_cli-1.0.0/tests/test_verifier_batch.py +255 -0
- codebase_receipts_cli-1.0.0/uv.lock +4754 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Receipts configuration — copy this file to `.env` and edit as needed:
|
|
2
|
+
# cp .env.example .env
|
|
3
|
+
# The real `.env` is gitignored and must NEVER be committed. Every value here
|
|
4
|
+
# is a safe local default; nothing requires a paid API key.
|
|
5
|
+
|
|
6
|
+
# Which LLM provider to use: ollama | gemini | anthropic | openai | fake
|
|
7
|
+
# ollama — local, free, private, the default; needs the Ollama app running.
|
|
8
|
+
# gemini — Google Gemini with a FREE key from https://aistudio.google.com/apikey
|
|
9
|
+
# anthropic — paid; needs ANTHROPIC_API_KEY (pip install codebase-receipts-cli[anthropic])
|
|
10
|
+
# openai — paid; needs OPENAI_API_KEY (pip install codebase-receipts-cli[openai])
|
|
11
|
+
# fake — deterministic offline stub, only useful for tests/demos.
|
|
12
|
+
RECEIPTS_PROVIDER=ollama
|
|
13
|
+
|
|
14
|
+
# Optional: use a DIFFERENT provider for embeddings than for chat.
|
|
15
|
+
# Required for anthropic (Claude has no embeddings API):
|
|
16
|
+
# RECEIPTS_PROVIDER=anthropic
|
|
17
|
+
# RECEIPTS_EMBED_PROVIDER=gemini
|
|
18
|
+
# IMPORTANT: must match whatever embedded your knowledge base — vectors from
|
|
19
|
+
# different embedding models are not comparable (re-ingest if you switch).
|
|
20
|
+
RECEIPTS_EMBED_PROVIDER=
|
|
21
|
+
|
|
22
|
+
# Hybrid retrieval (dense embeddings + BM25 keyword match, fused): on by
|
|
23
|
+
# default and costs zero extra LLM calls. Set to 0 to fall back to
|
|
24
|
+
# embeddings-only retrieval.
|
|
25
|
+
RECEIPTS_HYBRID=1
|
|
26
|
+
|
|
27
|
+
# --- Optional retrieval upgrades (each costs LLM calls; all off by default
|
|
28
|
+
# --- so the standard path stays fast on modest machines) -------------------
|
|
29
|
+
|
|
30
|
+
# Contextual chunk enrichment at ingest: one LLM call per artifact generates
|
|
31
|
+
# a one-line context prepended before embedding. Cached by content hash, so
|
|
32
|
+
# re-ingests regenerate nothing. Better disambiguation at query time.
|
|
33
|
+
RECEIPTS_ENRICH=0
|
|
34
|
+
|
|
35
|
+
# Hierarchical corpus summaries at ingest: per-file -> per-directory -> one
|
|
36
|
+
# repo-level architecture summary, each stored as a searchable chunk so
|
|
37
|
+
# whole-repo claims ("microservices architecture") can retrieve real
|
|
38
|
+
# evidence. Cached like enrichment. (The zero-LLM CODE FACTS and IMPORT MAP
|
|
39
|
+
# chunks are always added — no flag needed.)
|
|
40
|
+
RECEIPTS_SUMMARIES=0
|
|
41
|
+
|
|
42
|
+
# Query expansion + HyDE at verify time: rewrite each claim into 2-3
|
|
43
|
+
# code-phrased queries plus a hypothetical snippet, search all of them, and
|
|
44
|
+
# allow ONE reformulate-and-retry when nothing passes the threshold.
|
|
45
|
+
RECEIPTS_QUERY_EXPANSION=0
|
|
46
|
+
|
|
47
|
+
# LLM reranking at verify time: over-fetch candidates and let the model
|
|
48
|
+
# reorder the top of the pile before verification. Reorders/drops only —
|
|
49
|
+
# it can never add evidence or bypass the distance threshold.
|
|
50
|
+
RECEIPTS_RERANK=0
|
|
51
|
+
|
|
52
|
+
# Where the local Ollama daemon listens. The default matches a standard install.
|
|
53
|
+
OLLAMA_HOST=http://localhost:11434
|
|
54
|
+
|
|
55
|
+
# Ollama chat model for verification/rewriting. gpt-oss:20b is strong at code
|
|
56
|
+
# reasoning but needs ~16 GB RAM; if your machine struggles, try gemma3:4b.
|
|
57
|
+
# See what you have with `ollama list`; pull with `ollama pull <model>`.
|
|
58
|
+
OLLAMA_CHAT_MODEL=gpt-oss:20b
|
|
59
|
+
|
|
60
|
+
# Ollama embedding model used to index your code. nomic-embed-text is the
|
|
61
|
+
# standard lightweight choice. Changing it later means re-ingesting, since
|
|
62
|
+
# vectors from different models are not comparable.
|
|
63
|
+
OLLAMA_EMBED_MODEL=nomic-embed-text
|
|
64
|
+
|
|
65
|
+
# Free Gemini API key from Google AI Studio (https://aistudio.google.com/apikey).
|
|
66
|
+
# Only needed when RECEIPTS_PROVIDER=gemini. Note: receipts reads exactly this
|
|
67
|
+
# variable and passes it to the SDK explicitly, so a stray GOOGLE_API_KEY in
|
|
68
|
+
# your environment won't silently take over.
|
|
69
|
+
GEMINI_API_KEY=
|
|
70
|
+
|
|
71
|
+
# Gemini chat model (free-tier eligible as of July 2026).
|
|
72
|
+
GEMINI_CHAT_MODEL=gemini-3.5-flash
|
|
73
|
+
|
|
74
|
+
# Gemini embedding model. gemini-embedding-001 also works, but its vectors are
|
|
75
|
+
# INCOMPATIBLE with gemini-embedding-2 — pick one and re-ingest if you switch.
|
|
76
|
+
GEMINI_EMBED_MODEL=gemini-embedding-2
|
|
77
|
+
|
|
78
|
+
# Anthropic API key (paid). Only needed when RECEIPTS_PROVIDER=anthropic.
|
|
79
|
+
# Get one at https://console.anthropic.com/
|
|
80
|
+
# Note: Anthropic does not offer an embeddings API. Use Ollama or Gemini for
|
|
81
|
+
# ingestion, then switch to anthropic for verification/rewriting.
|
|
82
|
+
ANTHROPIC_API_KEY=
|
|
83
|
+
ANTHROPIC_CHAT_MODEL=claude-sonnet-4-20250514
|
|
84
|
+
|
|
85
|
+
# OpenAI API key (paid). Only needed when RECEIPTS_PROVIDER=openai.
|
|
86
|
+
# Get one at https://platform.openai.com/
|
|
87
|
+
OPENAI_API_KEY=
|
|
88
|
+
OPENAI_CHAT_MODEL=gpt-4o-mini
|
|
89
|
+
OPENAI_EMBED_MODEL=text-embedding-3-small
|
|
90
|
+
|
|
91
|
+
# Optional: point the OpenAI adapter at any OpenAI-COMPATIBLE endpoint —
|
|
92
|
+
# e.g. Groq or OpenRouter (both have hosted strong open models like
|
|
93
|
+
# gpt-oss-20b, sometimes with free tiers) or a local inference server.
|
|
94
|
+
# Leave empty for the official OpenAI API. Set OPENAI_API_KEY to the key
|
|
95
|
+
# for whichever service the URL points at.
|
|
96
|
+
# Groq: OPENAI_BASE_URL=https://api.groq.com/openai/v1
|
|
97
|
+
# OpenRouter: OPENAI_BASE_URL=https://openrouter.ai/api/v1
|
|
98
|
+
OPENAI_BASE_URL=
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
test:
|
|
14
|
+
runs-on: ${{ matrix.os }}
|
|
15
|
+
strategy:
|
|
16
|
+
matrix:
|
|
17
|
+
os: [ubuntu-latest, windows-latest]
|
|
18
|
+
python-version: ["3.10", "3.12"]
|
|
19
|
+
steps:
|
|
20
|
+
- uses: actions/checkout@v4
|
|
21
|
+
- uses: astral-sh/setup-uv@v4
|
|
22
|
+
with:
|
|
23
|
+
version: "latest"
|
|
24
|
+
- run: uv python install ${{ matrix.python-version }}
|
|
25
|
+
- run: uv sync --group dev
|
|
26
|
+
- run: uv run ruff check receipts/ tests/
|
|
27
|
+
- run: uv run black --check receipts/ tests/
|
|
28
|
+
- run: uv run pytest -v
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
test:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
- uses: astral-sh/setup-uv@v4
|
|
17
|
+
with:
|
|
18
|
+
version: "latest"
|
|
19
|
+
- run: uv sync --group dev
|
|
20
|
+
- run: uv run ruff check receipts/ tests/
|
|
21
|
+
- run: uv run black --check receipts/ tests/
|
|
22
|
+
- run: uv run pytest -v
|
|
23
|
+
|
|
24
|
+
publish:
|
|
25
|
+
needs: test
|
|
26
|
+
runs-on: ubuntu-latest
|
|
27
|
+
environment: pypi
|
|
28
|
+
permissions:
|
|
29
|
+
id-token: write
|
|
30
|
+
steps:
|
|
31
|
+
- uses: actions/checkout@v4
|
|
32
|
+
- uses: astral-sh/setup-uv@v4
|
|
33
|
+
with:
|
|
34
|
+
version: "latest"
|
|
35
|
+
- run: uv build
|
|
36
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
__pycache__/
|
|
2
|
+
*.pyc
|
|
3
|
+
.venv/
|
|
4
|
+
.uv/
|
|
5
|
+
dist/
|
|
6
|
+
*.egg-info/
|
|
7
|
+
.pytest_cache/
|
|
8
|
+
.ruff_cache/
|
|
9
|
+
|
|
10
|
+
# BYOK — real keys live here and must never be committed
|
|
11
|
+
.env
|
|
12
|
+
|
|
13
|
+
# Personal test data — your actual resume and target JD stay local
|
|
14
|
+
resume.tex
|
|
15
|
+
jd.txt
|
|
16
|
+
|
|
17
|
+
# Generated outputs (rebuilt by the tool on demand)
|
|
18
|
+
resume_optimized.tex
|
|
19
|
+
resume_optimized.pdf
|
|
20
|
+
dossier.md
|
|
21
|
+
dossier.pdf
|
|
22
|
+
|
|
23
|
+
# Editor / assistant local state
|
|
24
|
+
.claude/
|
|
25
|
+
.vscode/
|
|
26
|
+
|
|
27
|
+
# LaTeX build artifacts (receipts export / pdflatex)
|
|
28
|
+
*.aux
|
|
29
|
+
*.toc
|
|
30
|
+
resume_optimized.log
|
|
31
|
+
resume_optimized.out
|
|
32
|
+
sanity_dossier.md
|
|
33
|
+
sanity_dossier.pdf
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
3
|
+
rev: v0.15.20
|
|
4
|
+
hooks:
|
|
5
|
+
- id: ruff
|
|
6
|
+
args: [--fix]
|
|
7
|
+
- repo: https://github.com/psf/black
|
|
8
|
+
rev: 26.5.1
|
|
9
|
+
hooks:
|
|
10
|
+
- id: black
|
|
11
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
12
|
+
rev: v6.0.0
|
|
13
|
+
hooks:
|
|
14
|
+
- id: end-of-file-fixer
|
|
15
|
+
- id: trailing-whitespace
|
|
16
|
+
- id: check-added-large-files
|
|
17
|
+
# uv.lock is ~1MB and belongs in the repo (reproducible dev env)
|
|
18
|
+
args: [--maxkb=2048]
|
|
19
|
+
- id: detect-private-key
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
<h1 align="center">CHANGELOG</h1>
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<sub>All notable changes, one version at a time.</sub>
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
<br>
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## `1.0.0` — 2026-07-17
|
|
12
|
+
|
|
13
|
+
> Phases 8 through 23. Multi-repo, scale, remote sources, universal
|
|
14
|
+
> language coverage, a unified TUI, next-gen retrieval, and PDF resumes —
|
|
15
|
+
> on top of the 0.1.0 foundation.
|
|
16
|
+
|
|
17
|
+
### Model Answers & Interview Prep
|
|
18
|
+
|
|
19
|
+
- AMA reveals a grounded, honest model answer after every round (honest
|
|
20
|
+
reframe when no evidence exists) instead of just a pass/fail verdict
|
|
21
|
+
- Dossier upgraded to one model answer per question, not one per bullet
|
|
22
|
+
- Readiness tracking persists model answers via an additive DB migration
|
|
23
|
+
|
|
24
|
+
### Complete Slash-Command Palette
|
|
25
|
+
|
|
26
|
+
- `/check` `/setup` `/tui` `/export` `/ledger` `/dashboard` added to the
|
|
27
|
+
interactive REPL — every CLI command now has a slash equivalent
|
|
28
|
+
- Fixed `/check` incorrectly fuzzy-matching into `/verify`
|
|
29
|
+
- Fixed a dead `--session` flag on `receipts ledger` that silently did
|
|
30
|
+
nothing; added `TokenLedger.last_session_summary()`
|
|
31
|
+
|
|
32
|
+
### Scale Provisioning
|
|
33
|
+
|
|
34
|
+
- Ingest budget auto-scales to corpus size with importance allocation
|
|
35
|
+
(parsed code over file excerpts, round-robin across directories) instead
|
|
36
|
+
of a fixed cap spent in alphabetical order
|
|
37
|
+
- Incremental sync via content hashing: only new/changed artifacts are
|
|
38
|
+
re-embedded on re-ingest — measured 249.6s cold to 4.7s warm (~53x)
|
|
39
|
+
on a 376-artifact codebase
|
|
40
|
+
- Source-labelled, filterable retrieval closes a measured cross-source
|
|
41
|
+
contamination gap (86% of claims picked up wrong-project evidence in a
|
|
42
|
+
merged corpus; 0% with the filter)
|
|
43
|
+
|
|
44
|
+
### Remote Sources
|
|
45
|
+
|
|
46
|
+
- `receipts ingest <github-url>` gets a durable, URL-keyed knowledge base
|
|
47
|
+
and a manifest of aliases usable anywhere a folder is accepted
|
|
48
|
+
- `GITHUB_TOKEN` support for private repos (never logged, scrubbed from
|
|
49
|
+
every error message), `--branch`, `--full-history`
|
|
50
|
+
- `--jd-url` fetches a job description straight from a posting URL
|
|
51
|
+
|
|
52
|
+
### Universal Language Coverage
|
|
53
|
+
|
|
54
|
+
- Extraction parity for Java, Kotlin, Go, Rust, C, C++, C#, PHP, Ruby,
|
|
55
|
+
Swift — tree-sitter grammar node types probe-verified against the
|
|
56
|
+
installed parser (never guessed) plus a regex fallback for the Windows
|
|
57
|
+
path where tree-sitter is disabled
|
|
58
|
+
|
|
59
|
+
### PDF & Plain-Text Resumes
|
|
60
|
+
|
|
61
|
+
- `verify`, `ama`, `dossier`, and `score` accept `.pdf` and `.txt` resumes
|
|
62
|
+
in addition to `.tex` — zero LLM cost, pure text extraction plus
|
|
63
|
+
layout heuristics, measured at 85% claim-fidelity against a `.tex`
|
|
64
|
+
ground truth
|
|
65
|
+
- Scanned/image PDFs are rejected with guidance, never guessed at
|
|
66
|
+
|
|
67
|
+
### TUI Hub
|
|
68
|
+
|
|
69
|
+
- One unified app for dashboard, readiness, and ledger screens with
|
|
70
|
+
consistent keybindings and `--tui` deep links from each command
|
|
71
|
+
- New per-model token/cost breakdown on the ledger screen
|
|
72
|
+
|
|
73
|
+
### Next-Generation Retrieval
|
|
74
|
+
|
|
75
|
+
- Hybrid retrieval: a from-scratch BM25 lexical index fused with dense
|
|
76
|
+
embeddings via reciprocal rank fusion, on by default — measured
|
|
77
|
+
recall@5 improvement (8/11 to 11/11) with false-evidence chunks going
|
|
78
|
+
*down*, not up
|
|
79
|
+
- A self-checking calibration gate measures whether any retrieval upgrade
|
|
80
|
+
makes the tool more gullible before it ships. It already caught one:
|
|
81
|
+
query-expansion/HyDE doubled the false-evidence rate (15 to 30 chunks)
|
|
82
|
+
by generating fake supporting code and searching with it — that
|
|
83
|
+
feature now ships disabled by default
|
|
84
|
+
- Contextual chunk enrichment, hierarchical corpus summaries, and an
|
|
85
|
+
LLM reranker, all opt-in and independently toggleable
|
|
86
|
+
|
|
87
|
+
### Fixes
|
|
88
|
+
|
|
89
|
+
- MiKTeX-aware TeX compiler with platform-ordered fallbacks (pdflatex
|
|
90
|
+
before latexmk on Windows, where latexmk needs Perl)
|
|
91
|
+
- Architecture-aware install failure messages for tree-sitter and chromadb
|
|
92
|
+
on unsupported platforms, with concrete fix instructions per OS
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## `0.1.0` — 2026-07-08
|
|
97
|
+
|
|
98
|
+
> The one that ships everything.
|
|
99
|
+
|
|
100
|
+
### Ingest Pipeline
|
|
101
|
+
|
|
102
|
+
- Tree-style codebase scanner respecting `.gitignore`
|
|
103
|
+
- Git URL support — clone remote repos, scan, clean up
|
|
104
|
+
- Pre-embedding secrets detection (named patterns + Shannon entropy) with
|
|
105
|
+
automatic redaction
|
|
106
|
+
- Tree-sitter artifact extraction (functions, classes) with configurable
|
|
107
|
+
token budget
|
|
108
|
+
|
|
109
|
+
### Resume Parsing
|
|
110
|
+
|
|
111
|
+
- LaTeX `.tex` parser supporting rendercv and common resume templates
|
|
112
|
+
- Claim extractor: percentages, counts, latency figures, technology names
|
|
113
|
+
|
|
114
|
+
### Verification Engine
|
|
115
|
+
|
|
116
|
+
- ChromaDB-backed knowledge base with cosine similarity search
|
|
117
|
+
- Three-tier classification: **Verified** / **Plausible** / **Unsupported**
|
|
118
|
+
- Hard rule: no evidence past distance threshold = Unsupported, no LLM call
|
|
119
|
+
- Honest rewriter: rewrites weak bullets using only what the code can justify
|
|
120
|
+
- Keyword gap analysis: job description vs resume vs codebase
|
|
121
|
+
|
|
122
|
+
### Terminal UI
|
|
123
|
+
|
|
124
|
+
- Full-screen Textual app: file tree, claims table, rewrites diff, LLM log
|
|
125
|
+
- Live token counter and status bar
|
|
126
|
+
- Background verification with thread-safe UI updates
|
|
127
|
+
|
|
128
|
+
### Mock Interview
|
|
129
|
+
|
|
130
|
+
- `ama` command: weighted Q&A loop targeting weak claims
|
|
131
|
+
- Follow-up questions, per-bullet assessment, final summary
|
|
132
|
+
|
|
133
|
+
### Provider Abstraction (BYOK)
|
|
134
|
+
|
|
135
|
+
- **Ollama** — default, local, free, no key needed
|
|
136
|
+
- **Gemini** — free-tier Google AI Studio key
|
|
137
|
+
- **Anthropic** — paid BYOK adapter (optional dependency)
|
|
138
|
+
- **OpenAI** — paid BYOK adapter (optional dependency)
|
|
139
|
+
- Fake provider for fully offline, deterministic testing
|
|
140
|
+
|
|
141
|
+
### Token Ledger
|
|
142
|
+
|
|
143
|
+
- SQLite-backed per-session and lifetime token/cost tracking
|
|
144
|
+
- Pricing table: $/1K-token rates per provider and model
|
|
145
|
+
- `receipts ledger` CLI command for usage summaries
|
|
146
|
+
|
|
147
|
+
### Infrastructure
|
|
148
|
+
|
|
149
|
+
- `uv`-managed project with ruff + black pre-commit hooks
|
|
150
|
+
- 136 tests, zero network access, zero Ollama dependency
|
|
151
|
+
- CI: GitHub Actions on Ubuntu + Windows, Python 3.10 + 3.12
|
|
152
|
+
- Publishing: trusted publishing (OIDC) to PyPI on tag push
|
|
153
|
+
- MIT License
|