contexta-ai 2.0.0__tar.gz → 2.2.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.
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/.github/workflows/build-linux.yml +10 -5
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/.gitignore +6 -0
- contexta_ai-2.2.0/CHANGELOG.md +191 -0
- contexta_ai-2.2.0/PKG-INFO +453 -0
- contexta_ai-2.2.0/README.md +406 -0
- contexta_ai-2.2.0/README.pt-BR.md +390 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/SECURITY.md +5 -2
- contexta_ai-2.2.0/action.yml +97 -0
- contexta_ai-2.2.0/assets/action.png +0 -0
- contexta_ai-2.2.0/assets/brand_assets.py +106 -0
- contexta_ai-2.2.0/assets/cli.png +0 -0
- contexta_ai-2.2.0/assets/dark.png +0 -0
- contexta_ai-2.2.0/assets/empty.png +0 -0
- contexta_ai-2.2.0/assets/graph.png +0 -0
- contexta_ai-2.2.0/assets/icon.ico +0 -0
- contexta_ai-2.2.0/assets/icon.png +0 -0
- contexta_ai-2.2.0/assets/install.png +0 -0
- contexta_ai-2.2.0/assets/logo.png +0 -0
- contexta_ai-2.2.0/assets/logo.svg +8 -0
- contexta_ai-2.2.0/assets/logo@2x.png +0 -0
- contexta_ai-2.2.0/assets/memory.png +0 -0
- contexta_ai-2.2.0/assets/result.png +0 -0
- contexta_ai-2.2.0/assets/white.png +0 -0
- contexta_ai-2.2.0/benchmarks/README.md +83 -0
- contexta_ai-2.2.0/benchmarks/bench.py +246 -0
- contexta_ai-2.2.0/benchmarks/results.json +298 -0
- contexta_ai-2.2.0/benchmarks/results.md +23 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/build.bat +9 -4
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/build.sh +4 -1
- contexta_ai-2.2.0/contexta.py +60 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/contexta_app/__init__.py +2 -0
- contexta_ai-2.2.0/contexta_app/budgets.py +154 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/contexta_app/cache.py +2 -1
- contexta_ai-2.2.0/contexta_app/ci_report.py +219 -0
- contexta_ai-2.2.0/contexta_app/cli.py +678 -0
- contexta_ai-2.2.0/contexta_app/cli_style.py +94 -0
- contexta_ai-2.2.0/contexta_app/config.py +360 -0
- contexta_ai-2.2.0/contexta_app/context_engine.py +241 -0
- contexta_ai-2.2.0/contexta_app/embedded_icon_data.py +164 -0
- contexta_ai-2.2.0/contexta_app/engine/__init__.py +1 -0
- contexta_ai-2.2.0/contexta_app/engine/blobs.py +86 -0
- contexta_ai-2.2.0/contexta_app/engine/constants.py +550 -0
- contexta_ai-2.2.0/contexta_app/engine/excerpts.py +119 -0
- contexta_ai-2.2.0/contexta_app/engine/fingerprint.py +1133 -0
- contexta_ai-2.2.0/contexta_app/engine/focus.py +67 -0
- contexta_ai-2.2.0/contexta_app/engine/insight.py +161 -0
- contexta_ai-2.2.0/contexta_app/engine/manifests.py +251 -0
- contexta_ai-2.2.0/contexta_app/engine/models.py +137 -0
- contexta_ai-2.2.0/contexta_app/engine/pipeline.py +188 -0
- contexta_ai-2.2.0/contexta_app/engine/relations.py +376 -0
- contexta_ai-2.2.0/contexta_app/engine/risk.py +273 -0
- contexta_ai-2.2.0/contexta_app/engine/roles.py +617 -0
- contexta_ai-2.2.0/contexta_app/engine/scoring.py +196 -0
- contexta_ai-2.2.0/contexta_app/engine/selection.py +597 -0
- contexta_ai-2.2.0/contexta_app/engine/summary.py +556 -0
- contexta_ai-2.2.0/contexta_app/engine/surfaces.py +301 -0
- contexta_ai-2.2.0/contexta_app/graph.py +1233 -0
- contexta_ai-2.2.0/contexta_app/graph_cli.py +216 -0
- contexta_ai-2.2.0/contexta_app/install.py +211 -0
- contexta_ai-2.2.0/contexta_app/mcp_server.py +724 -0
- contexta_ai-2.2.0/contexta_app/memory.py +324 -0
- contexta_ai-2.2.0/contexta_app/project_meta.py +142 -0
- contexta_ai-2.2.0/contexta_app/redaction.py +401 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/contexta_app/renderer.py +431 -32
- contexta_ai-2.2.0/contexta_app/safety.py +67 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/contexta_app/scanner.py +164 -28
- contexta_ai-2.2.0/contexta_app/selector.py +133 -0
- contexta_ai-2.2.0/contexta_app/symbols.py +409 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/contexta_app/syntax.py +22 -1
- contexta_ai-2.2.0/contexta_app/theme.py +190 -0
- contexta_ai-2.2.0/contexta_app/ui.py +2348 -0
- contexta_ai-2.2.0/docs/contexta.toml.example +18 -0
- contexta_ai-2.2.0/docs/github-action.md +76 -0
- contexta_ai-2.2.0/docs/graph.md +82 -0
- contexta_ai-2.2.0/docs/images/error.png +0 -0
- contexta_ai-2.2.0/packaging/cli_screenshot.py +121 -0
- contexta_ai-2.2.0/packaging/gui_screenshots.py +140 -0
- contexta_ai-2.2.0/packaging/make_brand_assets.py +84 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/packaging/pyinstaller/contexta-safe.spec +1 -1
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/packaging/pyinstaller/contexta.spec +1 -1
- contexta_ai-2.2.0/packaging/sync_version.py +53 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/packaging/version_info.txt +4 -4
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/packaging/windows/contexta.iss +4 -1
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/pyproject.toml +7 -4
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/requirements.txt +1 -0
- contexta_ai-2.2.0/tests/conftest.py +21 -0
- contexta_ai-2.2.0/tests/test_action.py +148 -0
- contexta_ai-2.2.0/tests/test_adoption.py +398 -0
- contexta_ai-2.2.0/tests/test_benchmark.py +42 -0
- contexta_ai-2.2.0/tests/test_budget.py +163 -0
- contexta_ai-2.2.0/tests/test_cli_stdout.py +34 -0
- contexta_ai-2.2.0/tests/test_cli_style.py +32 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/tests/test_context_engine.py +9 -22
- contexta_ai-2.2.0/tests/test_descriptions.py +98 -0
- contexta_ai-2.2.0/tests/test_engine_layout.py +46 -0
- contexta_ai-2.2.0/tests/test_graph.py +330 -0
- contexta_ai-2.2.0/tests/test_graph_cli.py +62 -0
- contexta_ai-2.2.0/tests/test_install.py +118 -0
- contexta_ai-2.2.0/tests/test_mcp_v2.py +118 -0
- contexta_ai-2.2.0/tests/test_memory.py +377 -0
- contexta_ai-2.2.0/tests/test_memory_ui.py +359 -0
- contexta_ai-2.2.0/tests/test_pack_graph.py +169 -0
- contexta_ai-2.2.0/tests/test_performance.py +137 -0
- contexta_ai-2.2.0/tests/test_polish.py +34 -0
- contexta_ai-2.2.0/tests/test_security.py +283 -0
- contexta_ai-2.2.0/tests/test_theme.py +49 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/tests/test_ui.py +18 -5
- contexta_ai-2.2.0/tests/test_version.py +46 -0
- contexta_ai-2.2.0/tests/test_version_and_brand.py +185 -0
- contexta_ai-2.0.0/CHANGELOG.md +0 -109
- contexta_ai-2.0.0/PKG-INFO +0 -299
- contexta_ai-2.0.0/README.md +0 -261
- contexta_ai-2.0.0/README.pt-BR.md +0 -261
- contexta_ai-2.0.0/assets/brand_assets.py +0 -321
- contexta_ai-2.0.0/assets/dark.png +0 -0
- contexta_ai-2.0.0/assets/icon.ico +0 -0
- contexta_ai-2.0.0/assets/white.png +0 -0
- contexta_ai-2.0.0/contexta.py +0 -34
- contexta_ai-2.0.0/contexta_app/cli.py +0 -188
- contexta_ai-2.0.0/contexta_app/context_engine.py +0 -5113
- contexta_ai-2.0.0/contexta_app/embedded_icon_data.py +0 -269
- contexta_ai-2.0.0/contexta_app/mcp_server.py +0 -327
- contexta_ai-2.0.0/contexta_app/theme.py +0 -126
- contexta_ai-2.0.0/contexta_app/ui.py +0 -1283
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/.github/workflows/publish-pypi.yml +0 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/CONTRIBUTING.md +0 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/LICENSE +0 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/assets/assets/dark.png +0 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/assets/assets/white.png +0 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/contexta_app/ai_client.py +0 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/contexta_app/utils.py +0 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/contexta_mcp.py +0 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/docs/contexta-1.6-dependency-proposal.md +0 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/mdcodebrief.py +0 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/packaging/linux/install-contexta.sh +0 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/packaging/pyinstaller/contexta-onefile.spec +0 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/packaging/pyinstaller/mdcodebrief.spec +0 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/requirements-build.txt +0 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/tests/__init__.py +0 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/tests/test_renderer.py +0 -0
- {contexta_ai-2.0.0 → contexta_ai-2.2.0}/tests/test_scanner.py +0 -0
|
@@ -2,12 +2,11 @@ name: Build Linux Executable
|
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
4
|
workflow_dispatch:
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
- "v*"
|
|
5
|
+
release:
|
|
6
|
+
types: [published]
|
|
8
7
|
|
|
9
8
|
permissions:
|
|
10
|
-
contents:
|
|
9
|
+
contents: write
|
|
11
10
|
|
|
12
11
|
jobs:
|
|
13
12
|
build-linux:
|
|
@@ -35,9 +34,15 @@ jobs:
|
|
|
35
34
|
chmod +x build.sh
|
|
36
35
|
./build.sh
|
|
37
36
|
|
|
38
|
-
- name: Upload Linux package
|
|
37
|
+
- name: Upload Linux package (artifact)
|
|
39
38
|
uses: actions/upload-artifact@v4
|
|
40
39
|
with:
|
|
41
40
|
name: contexta-linux
|
|
42
41
|
path: dist/contexta-linux.tar.gz
|
|
43
42
|
if-no-files-found: error
|
|
43
|
+
|
|
44
|
+
- name: Attach to GitHub Release
|
|
45
|
+
if: github.event_name == 'release'
|
|
46
|
+
run: gh release upload "${{ github.event.release.tag_name }}" dist/contexta-linux.tar.gz --clobber
|
|
47
|
+
env:
|
|
48
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
Format: [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
|
|
5
|
+
Versioning: [Semantic Versioning](https://semver.org/)
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## [2.2.0] - 2026-10-24
|
|
10
|
+
|
|
11
|
+
Contexta now remembers your project. A local graph of files, symbols, tests and git history answers
|
|
12
|
+
"what does this change touch" and makes budgeted packs faster and better aimed.
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
- **Project graph** (`.contexta/graph.db`, SQLite, gitignored by default). Files, symbols and tests, with `imports`, `calls`, `tests` and git `cochange` edges. Updated incrementally by mtime and hash. Never stores file contents, credential files or authors, and signatures are redacted. `contexta graph update|status|clear|dependents|dependencies|impact|changed|hot|symbols|map|export`. Export as JSON (`contexta.graph.v1`), JSONL or Markdown. See [docs/graph.md](docs/graph.md)
|
|
16
|
+
- **Graph-aware packs.** With `--budget`, graph rank and churn raise a file's priority. With `--focus`, the tests that cover the matching files come along. On repos over 800 files, a budgeted or focused run analyses the 400 highest-ranked source files plus their tests instead of all of them: FastAPI at `--budget 20000` takes 1.4 s warm instead of 3.6 s. `--no-graph` or `graph = false` turns it off, `CONTEXTA_GRAPH_DIR` moves it
|
|
17
|
+
- **MCP v2 tools:** `repo_map`, `search_symbols`, `impacted_tests`, `graph_query` and `context_for(task, budget)`. `find_files` also searches file contents and symbol names, with redacted matches. All confined to the server roots
|
|
18
|
+
- **Repo map.** A ranked map of files and symbols inside a token budget. Python uses `ast`; JavaScript, TypeScript, Go and Rust use tree-sitter when installed, with a regex fallback
|
|
19
|
+
- **`contexta install cursor|claude|copilot|mcp`** writes agent rules or MCP config. Idempotent, merge-safe for existing JSON, never overwrites without `--force`, `--dry-run`
|
|
20
|
+
- **`--for bugfix|review|onboard|refactor`** picks the pack. `review` compares against `origin/main`, `main`, `origin/master` or `master`, whichever exists. `--help` is regrouped, with a short usage line and examples
|
|
21
|
+
- **GitHub Action** (`action.yml`): PR context with the diff, impacted tests and a redacted pack inside a token budget, as an artifact and an optional comment that updates in place. See [docs/github-action.md](docs/github-action.md)
|
|
22
|
+
- **Benchmark** against Repomix and Gitingest on Flask, Requests and FastAPI: tokens, time and recall, with the places Contexta loses. `python benchmarks/bench.py`
|
|
23
|
+
- **Project memory card** in the desktop app: status for the selected project (files, symbols, edges, last update) and **Update memory** (background thread), **Hot files**, **Symbols**, **Impact** and **Open map**. Answers show in a new **Memory** tab. Handles no project, an empty project, a missing `graph.db` (offers to build it) and unreadable files, in plain words
|
|
24
|
+
- **Per-analysis memory control.** A **Save this analysis to Contexta memory** toggle (on by default; off means the run may read an existing memory but never writes it) and a memory selector: this project's memory, another folder's memory (Browse), or none. Remembered between launches in `~/.contexta/gui.json`
|
|
25
|
+
- CLI: `--no-memory` (same as `--no-graph`), `--memory PATH` and `--memory-read-only`; config keys `memory_path` and `memory_save`
|
|
26
|
+
- A memory kept outside `.contexta/` is stamped with its project. A run never overwrites a memory that belongs to another project: it reads it, read-only, and says so
|
|
27
|
+
- `assets/memory.png`; `packaging/gui_screenshots.py` regenerates it
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
- `tree-sitter` is now optional: `pip install "contexta-ai[syntax]"`. Without it, non-Python languages use a regex scanner. The `gui` extra installs the same parsers (Tk ships with Python and cannot come from pip). `contexta` without Tk now explains how to install it instead of failing with a traceback
|
|
31
|
+
- **Engine split.** `context_engine.py` (about 5,000 lines) is now `contexta_app/engine/`, 16 cohesive modules, and a facade that keeps every public name. Output is byte-identical
|
|
32
|
+
- When the file cap is hit, application code is scanned first, then tests, then `docs` and `examples`. On FastAPI the 2,000-file cap used to cut off the `fastapi/` package and pack `docs_src` instead
|
|
33
|
+
- When a file has more definitions than fit in a pack, the signature list keeps focus matches, then classes, then top-level functions, instead of the first 18 in file order. Focus stemming also matches `dependency` with `dependencies`
|
|
34
|
+
- Contexta writes `.contexta/` in the project (it ignores itself) unless `--no-graph` or `graph = false` is set. It still never modifies your files
|
|
35
|
+
- The desktop app now builds the project graph during an analysis by default (it used to skip it), so "save to memory" does what it says. Turn it off with the toggle or choose **None**. The Project card now says "Your files are never modified"
|
|
36
|
+
- Worker threads in the app no longer touch Tk widgets or call `after` from outside the UI thread
|
|
37
|
+
|
|
38
|
+
### Fixed
|
|
39
|
+
- "Scanning directory: assets/assets" repeated the folder name in the scan log
|
|
40
|
+
- The pack date used a fixed Brazilian format. It is ISO now (`2026-10-24 15:29:18`)
|
|
41
|
+
- The file-limit warning was printed once per folder on the way back up. It prints once
|
|
42
|
+
|
|
43
|
+
## [2.1.0] - 2026-10-24
|
|
44
|
+
|
|
45
|
+
This is a security and quality release. If you run the 2.0.0 MCP server, upgrade.
|
|
46
|
+
|
|
47
|
+
### Security
|
|
48
|
+
- **MCP root confinement** — the MCP server in 2.0.0 accepted any absolute path and could read any file the user could. Tools now read only inside `--root` (repeatable), `CONTEXTA_ROOT`, or the folder the server started in. Paths outside, `..` escapes, and symlinks that leave the project are refused. **Behavior change:** `contexta serve` without `--root` is limited to its working directory
|
|
49
|
+
- **Credential files are never read** — `.env*`, private keys, `.npmrc`, `.netrc`, cloud and package-manager credential files are skipped by the scan and refused by `read_files`. `.env.example` style templates still work
|
|
50
|
+
- **Redaction is complete** — 2.0.0 had no redaction in MCP `read_files` or in packs. Now a span-based engine covers known token formats, `password: ...` lines in JSON and YAML, and random-looking strings (high-entropy check, tuned for no false positives on Flask, Requests and FastAPI)
|
|
51
|
+
- **`--dry-run`** lists file, line and rule of every value that would be redacted, never the value. `--format json` is supported
|
|
52
|
+
- **Allowlist** — `redact_allow` in `contexta.toml`, or a `contexta:allow` / `pragma: allowlist secret` marker on the line
|
|
53
|
+
- `--redact` and `--no-redact` now share one option and cannot be combined
|
|
54
|
+
- The scanner no longer follows symlinks that point outside the project
|
|
55
|
+
|
|
56
|
+
### Added
|
|
57
|
+
- **`--budget N`** (alias `--max-tokens`) — picks files by score until the pack fits N tokens and lists what was left out in a "Token Budget" section. MCP `generate_context` takes `budget`
|
|
58
|
+
- **`--focus` filters and ranks** — `--focus "session cookie signing"` on Flask returns 8 files (about 17k tokens) with `sessions.py` first, instead of the whole repo (about 165k)
|
|
59
|
+
- **`--max-files`** — the 2000-file cap is configurable (also `max_files` in `contexta.toml`, `CONTEXTA_MAX_FILES`)
|
|
60
|
+
- Banner, colors and status lines go to stderr, so `--stdout` carries only the pack
|
|
61
|
+
- **Model token budgets** — every pack reports whether it fits the selected AI profile (GPT-4o, GPT-4.1, Claude Sonnet, Claude Opus, Gemini, Copilot Chat, and a generic long-context fallback)
|
|
62
|
+
- **PR-aware diffs** — `--base main` (or `origin/main`) selects files changed since the merge-base, including uncommitted work
|
|
63
|
+
- **Daily presets** — `bugfix` and `refactor` packs join the existing onboarding and PR review presets
|
|
64
|
+
- **Project config** — `contexta.toml` / `.contexta.toml` for defaults, plus `.contextaignore` and an `ignore` list on top of `.gitignore`. `contexta --init` writes starters. User defaults live in `~/.contexta/config.toml`
|
|
65
|
+
- **CLI handoff** — `--stdout` (and automatic stdout when piped), `--format json`, clipboard fallbacks for Wayland and X11, and errors that say what to run next
|
|
66
|
+
|
|
67
|
+
### Fixed
|
|
68
|
+
- **Wrong project descriptions** — a scanned project got Contexta's own text (Flask was "feeds, profiles, messaging", `cli.py` described Contexta's CLI). Descriptions now come from the project's own pyproject, package.json, Cargo.toml, composer.json, pubspec.yaml, or README
|
|
69
|
+
- **Performance** — the related-test matching compared every file with every other. FastAPI went from 69 s to 5 s, Flask from 2.9 s to 0.7 s, with identical selection
|
|
70
|
+
- GUI section subtitles were clipped on narrow cards
|
|
71
|
+
- `python -m contexta_app.cli` now runs the CLI
|
|
72
|
+
- Engine tests no longer need Tk; the production helper `test_relation_score` is now `related_test_score` (the old name remains as an alias) so pytest stops collecting it
|
|
73
|
+
|
|
74
|
+
### Changed
|
|
75
|
+
- Explicit CLI flags and project config now override pack presets. `--pack pr_review --compression lean` stays lean
|
|
76
|
+
- The README now leads with "the right context, inside your token budget, safe by default"
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## [2.0.0] - 2026-07-11
|
|
81
|
+
|
|
82
|
+
### Added
|
|
83
|
+
- **MCP server** — `contexta serve` exposes `scan_project`, `get_architecture`, `generate_context`, `find_files`, `read_files`, `list_packs`, `cache_status`, and `refresh_cache` to Claude Code, Cursor, Windsurf, and other MCP clients
|
|
84
|
+
- **AI API integration** — `--ask` sends the pack and a question to Claude, Gemini, or OpenAI; `--configure-ai` stores keys locally
|
|
85
|
+
- **Smart cache** — in-memory analysis cache with mtime-based invalidation (~2 ms on a hit)
|
|
86
|
+
- **Raw files pack** — `raw_files` preset dumps path and content with no analysis
|
|
87
|
+
- **PyPI package** — `pip install contexta-ai`, with a trusted-publisher release workflow
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## [1.6.0] - 2026-04-19
|
|
92
|
+
|
|
93
|
+
### Added
|
|
94
|
+
- **Token-Lean compression mode** - new `lean` option exports only file metadata and up to 5 signatures per file (~65 tokens/file). Best for quick orientation or tight API budget constraints
|
|
95
|
+
- **Inline blob sanitization** - any line longer than 400 chars that looks like a base64/binary payload (e.g. embedded icons, encoded assets) is automatically collapsed into a one-line placeholder comment in every compression mode, including Full Content. A 15 000-char base64 constant adds zero review value to any export
|
|
96
|
+
- **Multi-language project detection** - engine now correctly identifies Django (from imports alone, without `manage.py`), Kotlin Android, Spring Boot with Gradle, and more; fixes a long-standing bias where many projects were misclassified as PHP CRUD
|
|
97
|
+
- **Kotlin, Swift, C++, C, Scala, Lua, R, Nim, Zig** - added to language weights and tech labels; Kotlin/Java JVM detection unified so Kotlin-only Android projects are recognized correctly
|
|
98
|
+
- **Domain detection from directory names** - `boards/`, `sprints/`, `patients/`, `products/` and similar folder names now boost the domain classification without requiring manifest files
|
|
99
|
+
- **Syntax-aware parsing foundation** - Contexta now ships with `tree-sitter` and a dedicated syntax layer for stronger multi-language symbol extraction
|
|
100
|
+
- **Foundation runtime dependencies** - `pathspec`, `charset-normalizer`, `tiktoken`, and `rapidfuzz` are now part of the runtime analysis stack
|
|
101
|
+
- **Linux install bundle** - Linux builds now ship as `contexta-linux.tar.gz` with an `install.sh` helper for user-local installs
|
|
102
|
+
- **Optional Windows installer support** - `build.bat` now emits `contexta-setup.exe` whenever Inno Setup is available locally
|
|
103
|
+
|
|
104
|
+
### Changed
|
|
105
|
+
- **Gitignore handling** - scan filtering now uses Git-style pattern matching via `pathspec` instead of relying only on hand-rolled glob rules
|
|
106
|
+
- **File decoding** - file reading now prefers `charset-normalizer` before strict encoding fallbacks, improving support for real-world mixed encodings
|
|
107
|
+
- **Token estimation** - renderer token sizing now uses `tiktoken` instead of character heuristics alone when available
|
|
108
|
+
- **Test relationship scoring** - related-test detection now uses stronger fuzzy matching instead of substring checks alone
|
|
109
|
+
- **Windows build pipeline** - official Windows builds now use Nuitka onefile output
|
|
110
|
+
- **Linux build pipeline** - Unix builds now package both a portable binary and an installable tarball bundle
|
|
111
|
+
- **File role descriptions** - `requirements.txt`, `build.bat`, `build.sh` now show generic descriptions by default; project-specific text only appears when Contexta analyzes itself
|
|
112
|
+
- **XML file roles** - `AndroidManifest.xml`, `beans.xml`, `web.xml`, `docker-compose.yml`, `logback.xml`, and CI/CD workflow files now get accurate role descriptions
|
|
113
|
+
|
|
114
|
+
### Fixed
|
|
115
|
+
- **Scope vs insights bug** - `compute_project_type_signals` and `detect_domain_label` were accidentally receiving test and doc files in their input, causing wrong project type scores; now correctly filtered to runtime files only
|
|
116
|
+
- **Multi-language symbol extraction** - added better extraction coverage for Java, C#, Go, and Rust, plus tree-sitter-backed paths for supported languages
|
|
117
|
+
- **Scanner robustness** - unreadable files and legacy encodings now fall back more gracefully instead of being discarded too early
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## [1.3.1] - 2026-04-11
|
|
122
|
+
|
|
123
|
+
### Changed
|
|
124
|
+
- **Compact, resizable interface** - reduced the default window size, added proper resize behavior, and tightened spacing so the app feels lighter on smaller screens
|
|
125
|
+
- **App branding refresh** - the GUI now uses the bundled `icon.ico` as the real window/app icon instead of the default feather-style fallback
|
|
126
|
+
- **Safer diff flow** - diff mode now behaves more predictably when there are no changed files, instead of surprising the user with a full-project export
|
|
127
|
+
|
|
128
|
+
### Added
|
|
129
|
+
- **36 unit tests** - expanded coverage for hidden-file filtering, diff behavior, renderer output, and related safety cases
|
|
130
|
+
|
|
131
|
+
### Fixed
|
|
132
|
+
- **Hidden file filtering** - dotfiles such as `.env` stay excluded by default when hidden files are not enabled
|
|
133
|
+
- **Git diff detection** - changed-file exports now better reflect staged, unstaged, and new-file workflows
|
|
134
|
+
- **Clipboard reliability** - clipboard writes now happen on the Tk main thread to avoid intermittent GUI issues
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## [1.3.0] - 2025-04-10
|
|
139
|
+
|
|
140
|
+
### Changed
|
|
141
|
+
- **Modular architecture** - split into `scanner.py`, `renderer.py`, `theme.py`, `ui.py`, `cli.py`; `mdcodebrief.py` is now a clean 20-line entry point
|
|
142
|
+
- **Improved `.gitignore` parser** - now supports negation (`!`), rooted patterns (`/build`), directory-only patterns (`dist/`), and `**` wildcards
|
|
143
|
+
- **Version consistency** - `__version__` unified across all modules
|
|
144
|
+
|
|
145
|
+
### Added
|
|
146
|
+
- **33 unit tests** - covering scanner, renderer, gitignore parser, token estimation, and tree building (`unittest`, zero extra dependencies)
|
|
147
|
+
- Screenshot added to README with download button
|
|
148
|
+
|
|
149
|
+
### Fixed
|
|
150
|
+
- Windows SmartScreen false positive - removed `--add-data` from build scripts (`--noupx` retained)
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## [1.2.0] - 2025-04-10
|
|
155
|
+
|
|
156
|
+
### Added
|
|
157
|
+
- Dark / Light theme toggle (instant switch, no rebuild)
|
|
158
|
+
- Pill-style toggle switches replacing checkboxes
|
|
159
|
+
- Two-column layout (AI Instruction + Options side by side)
|
|
160
|
+
- Status pill indicator (shows Scanning... / Done / Error)
|
|
161
|
+
|
|
162
|
+
### Fixed
|
|
163
|
+
- White Entry field on Windows (readonly state color bug)
|
|
164
|
+
- Progress bar style name incompatible with Python 3.14
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## [1.1.0] - 2025-04-10
|
|
169
|
+
|
|
170
|
+
### Added
|
|
171
|
+
- Native `.gitignore` support
|
|
172
|
+
- Copy to clipboard - GUI button + `--copy` / `-c` CLI flag
|
|
173
|
+
- Token estimation with model hints in log and footer
|
|
174
|
+
- Git diff mode - `--diff` and `--staged` flags
|
|
175
|
+
- AI instruction injection - GUI text field + `-p / --prompt` CLI flag
|
|
176
|
+
- Build scripts (`build.bat`, `build.sh`)
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## [1.0.0] - 2025-04-10
|
|
181
|
+
|
|
182
|
+
### Added
|
|
183
|
+
- GUI with dark theme (tkinter, zero dependencies)
|
|
184
|
+
- CLI mode
|
|
185
|
+
- Recursive project scanner with smart filtering
|
|
186
|
+
- ASCII directory tree
|
|
187
|
+
- Syntax-highlighted code blocks for 50+ extensions
|
|
188
|
+
- Multi-encoding file reader (UTF-8, latin-1, cp1252, UTF-16)
|
|
189
|
+
- Safety limits: 1 000 lines/file, 2 000 files/scan
|
|
190
|
+
- Cross-platform Desktop path detection
|
|
191
|
+
- MIT License
|