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.
Files changed (141) hide show
  1. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/.github/workflows/build-linux.yml +10 -5
  2. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/.gitignore +6 -0
  3. contexta_ai-2.2.0/CHANGELOG.md +191 -0
  4. contexta_ai-2.2.0/PKG-INFO +453 -0
  5. contexta_ai-2.2.0/README.md +406 -0
  6. contexta_ai-2.2.0/README.pt-BR.md +390 -0
  7. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/SECURITY.md +5 -2
  8. contexta_ai-2.2.0/action.yml +97 -0
  9. contexta_ai-2.2.0/assets/action.png +0 -0
  10. contexta_ai-2.2.0/assets/brand_assets.py +106 -0
  11. contexta_ai-2.2.0/assets/cli.png +0 -0
  12. contexta_ai-2.2.0/assets/dark.png +0 -0
  13. contexta_ai-2.2.0/assets/empty.png +0 -0
  14. contexta_ai-2.2.0/assets/graph.png +0 -0
  15. contexta_ai-2.2.0/assets/icon.ico +0 -0
  16. contexta_ai-2.2.0/assets/icon.png +0 -0
  17. contexta_ai-2.2.0/assets/install.png +0 -0
  18. contexta_ai-2.2.0/assets/logo.png +0 -0
  19. contexta_ai-2.2.0/assets/logo.svg +8 -0
  20. contexta_ai-2.2.0/assets/logo@2x.png +0 -0
  21. contexta_ai-2.2.0/assets/memory.png +0 -0
  22. contexta_ai-2.2.0/assets/result.png +0 -0
  23. contexta_ai-2.2.0/assets/white.png +0 -0
  24. contexta_ai-2.2.0/benchmarks/README.md +83 -0
  25. contexta_ai-2.2.0/benchmarks/bench.py +246 -0
  26. contexta_ai-2.2.0/benchmarks/results.json +298 -0
  27. contexta_ai-2.2.0/benchmarks/results.md +23 -0
  28. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/build.bat +9 -4
  29. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/build.sh +4 -1
  30. contexta_ai-2.2.0/contexta.py +60 -0
  31. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/contexta_app/__init__.py +2 -0
  32. contexta_ai-2.2.0/contexta_app/budgets.py +154 -0
  33. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/contexta_app/cache.py +2 -1
  34. contexta_ai-2.2.0/contexta_app/ci_report.py +219 -0
  35. contexta_ai-2.2.0/contexta_app/cli.py +678 -0
  36. contexta_ai-2.2.0/contexta_app/cli_style.py +94 -0
  37. contexta_ai-2.2.0/contexta_app/config.py +360 -0
  38. contexta_ai-2.2.0/contexta_app/context_engine.py +241 -0
  39. contexta_ai-2.2.0/contexta_app/embedded_icon_data.py +164 -0
  40. contexta_ai-2.2.0/contexta_app/engine/__init__.py +1 -0
  41. contexta_ai-2.2.0/contexta_app/engine/blobs.py +86 -0
  42. contexta_ai-2.2.0/contexta_app/engine/constants.py +550 -0
  43. contexta_ai-2.2.0/contexta_app/engine/excerpts.py +119 -0
  44. contexta_ai-2.2.0/contexta_app/engine/fingerprint.py +1133 -0
  45. contexta_ai-2.2.0/contexta_app/engine/focus.py +67 -0
  46. contexta_ai-2.2.0/contexta_app/engine/insight.py +161 -0
  47. contexta_ai-2.2.0/contexta_app/engine/manifests.py +251 -0
  48. contexta_ai-2.2.0/contexta_app/engine/models.py +137 -0
  49. contexta_ai-2.2.0/contexta_app/engine/pipeline.py +188 -0
  50. contexta_ai-2.2.0/contexta_app/engine/relations.py +376 -0
  51. contexta_ai-2.2.0/contexta_app/engine/risk.py +273 -0
  52. contexta_ai-2.2.0/contexta_app/engine/roles.py +617 -0
  53. contexta_ai-2.2.0/contexta_app/engine/scoring.py +196 -0
  54. contexta_ai-2.2.0/contexta_app/engine/selection.py +597 -0
  55. contexta_ai-2.2.0/contexta_app/engine/summary.py +556 -0
  56. contexta_ai-2.2.0/contexta_app/engine/surfaces.py +301 -0
  57. contexta_ai-2.2.0/contexta_app/graph.py +1233 -0
  58. contexta_ai-2.2.0/contexta_app/graph_cli.py +216 -0
  59. contexta_ai-2.2.0/contexta_app/install.py +211 -0
  60. contexta_ai-2.2.0/contexta_app/mcp_server.py +724 -0
  61. contexta_ai-2.2.0/contexta_app/memory.py +324 -0
  62. contexta_ai-2.2.0/contexta_app/project_meta.py +142 -0
  63. contexta_ai-2.2.0/contexta_app/redaction.py +401 -0
  64. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/contexta_app/renderer.py +431 -32
  65. contexta_ai-2.2.0/contexta_app/safety.py +67 -0
  66. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/contexta_app/scanner.py +164 -28
  67. contexta_ai-2.2.0/contexta_app/selector.py +133 -0
  68. contexta_ai-2.2.0/contexta_app/symbols.py +409 -0
  69. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/contexta_app/syntax.py +22 -1
  70. contexta_ai-2.2.0/contexta_app/theme.py +190 -0
  71. contexta_ai-2.2.0/contexta_app/ui.py +2348 -0
  72. contexta_ai-2.2.0/docs/contexta.toml.example +18 -0
  73. contexta_ai-2.2.0/docs/github-action.md +76 -0
  74. contexta_ai-2.2.0/docs/graph.md +82 -0
  75. contexta_ai-2.2.0/docs/images/error.png +0 -0
  76. contexta_ai-2.2.0/packaging/cli_screenshot.py +121 -0
  77. contexta_ai-2.2.0/packaging/gui_screenshots.py +140 -0
  78. contexta_ai-2.2.0/packaging/make_brand_assets.py +84 -0
  79. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/packaging/pyinstaller/contexta-safe.spec +1 -1
  80. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/packaging/pyinstaller/contexta.spec +1 -1
  81. contexta_ai-2.2.0/packaging/sync_version.py +53 -0
  82. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/packaging/version_info.txt +4 -4
  83. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/packaging/windows/contexta.iss +4 -1
  84. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/pyproject.toml +7 -4
  85. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/requirements.txt +1 -0
  86. contexta_ai-2.2.0/tests/conftest.py +21 -0
  87. contexta_ai-2.2.0/tests/test_action.py +148 -0
  88. contexta_ai-2.2.0/tests/test_adoption.py +398 -0
  89. contexta_ai-2.2.0/tests/test_benchmark.py +42 -0
  90. contexta_ai-2.2.0/tests/test_budget.py +163 -0
  91. contexta_ai-2.2.0/tests/test_cli_stdout.py +34 -0
  92. contexta_ai-2.2.0/tests/test_cli_style.py +32 -0
  93. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/tests/test_context_engine.py +9 -22
  94. contexta_ai-2.2.0/tests/test_descriptions.py +98 -0
  95. contexta_ai-2.2.0/tests/test_engine_layout.py +46 -0
  96. contexta_ai-2.2.0/tests/test_graph.py +330 -0
  97. contexta_ai-2.2.0/tests/test_graph_cli.py +62 -0
  98. contexta_ai-2.2.0/tests/test_install.py +118 -0
  99. contexta_ai-2.2.0/tests/test_mcp_v2.py +118 -0
  100. contexta_ai-2.2.0/tests/test_memory.py +377 -0
  101. contexta_ai-2.2.0/tests/test_memory_ui.py +359 -0
  102. contexta_ai-2.2.0/tests/test_pack_graph.py +169 -0
  103. contexta_ai-2.2.0/tests/test_performance.py +137 -0
  104. contexta_ai-2.2.0/tests/test_polish.py +34 -0
  105. contexta_ai-2.2.0/tests/test_security.py +283 -0
  106. contexta_ai-2.2.0/tests/test_theme.py +49 -0
  107. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/tests/test_ui.py +18 -5
  108. contexta_ai-2.2.0/tests/test_version.py +46 -0
  109. contexta_ai-2.2.0/tests/test_version_and_brand.py +185 -0
  110. contexta_ai-2.0.0/CHANGELOG.md +0 -109
  111. contexta_ai-2.0.0/PKG-INFO +0 -299
  112. contexta_ai-2.0.0/README.md +0 -261
  113. contexta_ai-2.0.0/README.pt-BR.md +0 -261
  114. contexta_ai-2.0.0/assets/brand_assets.py +0 -321
  115. contexta_ai-2.0.0/assets/dark.png +0 -0
  116. contexta_ai-2.0.0/assets/icon.ico +0 -0
  117. contexta_ai-2.0.0/assets/white.png +0 -0
  118. contexta_ai-2.0.0/contexta.py +0 -34
  119. contexta_ai-2.0.0/contexta_app/cli.py +0 -188
  120. contexta_ai-2.0.0/contexta_app/context_engine.py +0 -5113
  121. contexta_ai-2.0.0/contexta_app/embedded_icon_data.py +0 -269
  122. contexta_ai-2.0.0/contexta_app/mcp_server.py +0 -327
  123. contexta_ai-2.0.0/contexta_app/theme.py +0 -126
  124. contexta_ai-2.0.0/contexta_app/ui.py +0 -1283
  125. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/.github/workflows/publish-pypi.yml +0 -0
  126. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/CONTRIBUTING.md +0 -0
  127. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/LICENSE +0 -0
  128. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/assets/assets/dark.png +0 -0
  129. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/assets/assets/white.png +0 -0
  130. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/contexta_app/ai_client.py +0 -0
  131. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/contexta_app/utils.py +0 -0
  132. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/contexta_mcp.py +0 -0
  133. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/docs/contexta-1.6-dependency-proposal.md +0 -0
  134. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/mdcodebrief.py +0 -0
  135. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/packaging/linux/install-contexta.sh +0 -0
  136. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/packaging/pyinstaller/contexta-onefile.spec +0 -0
  137. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/packaging/pyinstaller/mdcodebrief.spec +0 -0
  138. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/requirements-build.txt +0 -0
  139. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/tests/__init__.py +0 -0
  140. {contexta_ai-2.0.0 → contexta_ai-2.2.0}/tests/test_renderer.py +0 -0
  141. {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
- push:
6
- tags:
7
- - "v*"
5
+ release:
6
+ types: [published]
8
7
 
9
8
  permissions:
10
- contents: read
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 }}
@@ -15,3 +15,9 @@ Thumbs.db
15
15
  resume - *.md
16
16
  tests/.tmp/
17
17
  nuitka-crash-report.xml
18
+
19
+ # Contexta project graph (self-ignored too) and benchmark scratch
20
+ .contexta/
21
+ benchmarks/.tools/
22
+ benchmarks/.repos/
23
+ benchmarks/.work/
@@ -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