codemap-core 0.1.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 (106) hide show
  1. codemap_core-0.1.0/.gitignore +43 -0
  2. codemap_core-0.1.0/CHANGELOG.md +541 -0
  3. codemap_core-0.1.0/LICENSE +21 -0
  4. codemap_core-0.1.0/PKG-INFO +480 -0
  5. codemap_core-0.1.0/README.md +413 -0
  6. codemap_core-0.1.0/docs/adr/0000-template.md +28 -0
  7. codemap_core-0.1.0/docs/adr/0001-symbol-id-format.md +43 -0
  8. codemap_core-0.1.0/docs/adr/0002-storage-backend.md +37 -0
  9. codemap_core-0.1.0/docs/adr/0003-module-boundaries.md +32 -0
  10. codemap_core-0.1.0/docs/adr/0004-indexer-bridge-plugin.md +35 -0
  11. codemap_core-0.1.0/docs/adr/0005-exit-codes.md +37 -0
  12. codemap_core-0.1.0/docs/adr/0006-schema-version.md +33 -0
  13. codemap_core-0.1.0/docs/adr/0007-diagnostic-isolation.md +33 -0
  14. codemap_core-0.1.0/docs/adr/0008-atomic-write.md +37 -0
  15. codemap_core-0.1.0/docs/adr/0009-quality-gates.md +38 -0
  16. codemap_core-0.1.0/docs/adr/0010-benchmark-regression.md +58 -0
  17. codemap_core-0.1.0/docs/adr/0011-language-neutrality.md +50 -0
  18. codemap_core-0.1.0/docs/adr/0012-first-language-cohort.md +40 -0
  19. codemap_core-0.1.0/docs/bridges/http_route.md +132 -0
  20. codemap_core-0.1.0/docs/cli.md +139 -0
  21. codemap_core-0.1.0/docs/configuration.md +105 -0
  22. codemap_core-0.1.0/docs/indexers/python.md +150 -0
  23. codemap_core-0.1.0/docs/performance.md +73 -0
  24. codemap_core-0.1.0/docs/plugin-guide.md +153 -0
  25. codemap_core-0.1.0/pyproject.toml +237 -0
  26. codemap_core-0.1.0/src/codemap/__init__.py +7 -0
  27. codemap_core-0.1.0/src/codemap/cli/__init__.py +3 -0
  28. codemap_core-0.1.0/src/codemap/cli/_common.py +90 -0
  29. codemap_core-0.1.0/src/codemap/cli/commands/__init__.py +3 -0
  30. codemap_core-0.1.0/src/codemap/cli/commands/callees.py +102 -0
  31. codemap_core-0.1.0/src/codemap/cli/commands/callers.py +107 -0
  32. codemap_core-0.1.0/src/codemap/cli/commands/config.py +78 -0
  33. codemap_core-0.1.0/src/codemap/cli/commands/diagnostics.py +142 -0
  34. codemap_core-0.1.0/src/codemap/cli/commands/doctor.py +158 -0
  35. codemap_core-0.1.0/src/codemap/cli/commands/get.py +93 -0
  36. codemap_core-0.1.0/src/codemap/cli/commands/index.py +725 -0
  37. codemap_core-0.1.0/src/codemap/cli/commands/routes.py +104 -0
  38. codemap_core-0.1.0/src/codemap/cli/commands/search.py +78 -0
  39. codemap_core-0.1.0/src/codemap/cli/commands/trace.py +179 -0
  40. codemap_core-0.1.0/src/codemap/cli/main.py +140 -0
  41. codemap_core-0.1.0/src/codemap/cli/renderers/__init__.py +3 -0
  42. codemap_core-0.1.0/src/codemap/cli/renderers/json.py +32 -0
  43. codemap_core-0.1.0/src/codemap/cli/renderers/text.py +24 -0
  44. codemap_core-0.1.0/src/codemap/config/__init__.py +31 -0
  45. codemap_core-0.1.0/src/codemap/config/loader.py +96 -0
  46. codemap_core-0.1.0/src/codemap/config/schema.py +122 -0
  47. codemap_core-0.1.0/src/codemap/core/__init__.py +7 -0
  48. codemap_core-0.1.0/src/codemap/core/bridge/__init__.py +8 -0
  49. codemap_core-0.1.0/src/codemap/core/bridge/base.py +38 -0
  50. codemap_core-0.1.0/src/codemap/core/bridge/http_route.py +374 -0
  51. codemap_core-0.1.0/src/codemap/core/bridge/python_cross_module.py +120 -0
  52. codemap_core-0.1.0/src/codemap/core/bridge/registry.py +117 -0
  53. codemap_core-0.1.0/src/codemap/core/graph.py +183 -0
  54. codemap_core-0.1.0/src/codemap/core/models.py +299 -0
  55. codemap_core-0.1.0/src/codemap/core/store.py +78 -0
  56. codemap_core-0.1.0/src/codemap/core/symbol.py +314 -0
  57. codemap_core-0.1.0/src/codemap/diagnostics/__init__.py +3 -0
  58. codemap_core-0.1.0/src/codemap/diagnostics/exit_codes.py +30 -0
  59. codemap_core-0.1.0/src/codemap/diagnostics/logging.py +65 -0
  60. codemap_core-0.1.0/src/codemap/diagnostics/progress.py +68 -0
  61. codemap_core-0.1.0/src/codemap/indexers/__init__.py +9 -0
  62. codemap_core-0.1.0/src/codemap/indexers/_example_lang.py +135 -0
  63. codemap_core-0.1.0/src/codemap/indexers/base.py +77 -0
  64. codemap_core-0.1.0/src/codemap/indexers/python.py +577 -0
  65. codemap_core-0.1.0/src/codemap/indexers/registry.py +104 -0
  66. codemap_core-0.1.0/src/codemap/io/__init__.py +8 -0
  67. codemap_core-0.1.0/src/codemap/io/atomic.py +97 -0
  68. codemap_core-0.1.0/src/codemap/io/base.py +12 -0
  69. codemap_core-0.1.0/src/codemap/io/json_store.py +433 -0
  70. codemap_core-0.1.0/src/codemap/io/lock.py +87 -0
  71. codemap_core-0.1.0/src/codemap/io/manifest.py +90 -0
  72. codemap_core-0.1.0/src/codemap/mcp/__init__.py +3 -0
  73. codemap_core-0.1.0/tests/__init__.py +0 -0
  74. codemap_core-0.1.0/tests/bench/__init__.py +0 -0
  75. codemap_core-0.1.0/tests/bench/conftest.py +41 -0
  76. codemap_core-0.1.0/tests/bench/test_index_perf.py +45 -0
  77. codemap_core-0.1.0/tests/bench/test_query_perf.py +62 -0
  78. codemap_core-0.1.0/tests/e2e/__init__.py +0 -0
  79. codemap_core-0.1.0/tests/e2e/test_cli.py +169 -0
  80. codemap_core-0.1.0/tests/e2e/test_config_integration.py +186 -0
  81. codemap_core-0.1.0/tests/e2e/test_cross_module_callers.py +79 -0
  82. codemap_core-0.1.0/tests/e2e/test_diagnostics.py +211 -0
  83. codemap_core-0.1.0/tests/e2e/test_error_experience.py +142 -0
  84. codemap_core-0.1.0/tests/e2e/test_http_pipeline.py +138 -0
  85. codemap_core-0.1.0/tests/e2e/test_incremental.py +153 -0
  86. codemap_core-0.1.0/tests/e2e/test_query_commands.py +332 -0
  87. codemap_core-0.1.0/tests/fixtures/indexers/python/basics/expected/symbol_ids.txt +6 -0
  88. codemap_core-0.1.0/tests/fixtures/indexers/python/basics/input/pkg/mod.py +18 -0
  89. codemap_core-0.1.0/tests/fixtures/indexers/python/imports/expected/symbol_ids.txt +2 -0
  90. codemap_core-0.1.0/tests/fixtures/indexers/python/imports/input/users.py +14 -0
  91. codemap_core-0.1.0/tests/fixtures/indexers/python/inheritance/expected/symbol_ids.txt +7 -0
  92. codemap_core-0.1.0/tests/fixtures/indexers/python/inheritance/input/shapes.py +20 -0
  93. codemap_core-0.1.0/tests/fixtures/smoke/a.example +5 -0
  94. codemap_core-0.1.0/tests/fixtures/smoke/b.example +1 -0
  95. codemap_core-0.1.0/tests/integration/__init__.py +0 -0
  96. codemap_core-0.1.0/tests/integration/test_http_route_bridge_e2e.py +102 -0
  97. codemap_core-0.1.0/tests/unit/__init__.py +0 -0
  98. codemap_core-0.1.0/tests/unit/test_config.py +191 -0
  99. codemap_core-0.1.0/tests/unit/test_graph.py +180 -0
  100. codemap_core-0.1.0/tests/unit/test_http_route_bridge.py +383 -0
  101. codemap_core-0.1.0/tests/unit/test_indexer_registry.py +169 -0
  102. codemap_core-0.1.0/tests/unit/test_io.py +418 -0
  103. codemap_core-0.1.0/tests/unit/test_models.py +254 -0
  104. codemap_core-0.1.0/tests/unit/test_python_cross_module_bridge.py +230 -0
  105. codemap_core-0.1.0/tests/unit/test_python_indexer.py +626 -0
  106. codemap_core-0.1.0/tests/unit/test_symbol.py +268 -0
@@ -0,0 +1,43 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # Build artifacts
7
+ build/
8
+ dist/
9
+ *.egg-info/
10
+ *.egg
11
+ .eggs/
12
+
13
+ # Test / coverage
14
+ .pytest_cache/
15
+ .coverage
16
+ .coverage.*
17
+ htmlcov/
18
+ coverage.xml
19
+ .tox/
20
+ .mypy_cache/
21
+ .ruff_cache/
22
+ .benchmarks/
23
+
24
+ # Virtualenv
25
+ .venv/
26
+ venv/
27
+ env/
28
+
29
+ # uv / pdm lockfiles (commit uv.lock once we settle)
30
+ # uv.lock
31
+
32
+ # IDE
33
+ .idea/
34
+ .vscode/
35
+ *.swp
36
+ *.swo
37
+
38
+ # OS
39
+ .DS_Store
40
+ Thumbs.db
41
+
42
+ # CodeMap own index when dogfooding
43
+ .codemap/
@@ -0,0 +1,541 @@
1
+ # Changelog
2
+
3
+ All notable changes to CodeMap will be documented here.
4
+
5
+ Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
+ Versioning: [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+ During `0.x`, MINOR may introduce breaking changes — they will be marked `BREAKING:`.
8
+
9
+ ## [Unreleased]
10
+
11
+ ### Added — Three new language plugins (`codemap-javascript`, `codemap-vue`, `codemap-jsp`)
12
+
13
+ Plugin family grows 15 → 18. Each ships as an independent PyPI
14
+ distribution at `0.2.0a1`.
15
+
16
+ * **`codemap-javascript`** — covers `*.js` / `*.jsx` / `*.mjs` /
17
+ `*.cjs` via `tree-sitter-javascript`. Symbol coverage mirrors
18
+ `codemap-typescript` (top-level functions, classes with methods,
19
+ module-level `const` / `let` / `var`). Sibling of
20
+ `codemap-typescript` — install either or both depending on the code
21
+ base.
22
+
23
+ * **`codemap-vue`** — covers `*.vue` Single File Components. Since
24
+ `tree-sitter-vue` is not on PyPI, the plugin uses a permissive
25
+ regex-driven SFC scanner (`codemap_vue.sfc.extract_script_blocks`)
26
+ to locate every top-level `<script>` block and read its `lang=`
27
+ attribute, then dispatches the inner bytes to
28
+ `tree-sitter-javascript` (always required) or
29
+ `tree-sitter-typescript` (optional `[typescript]` extra, only
30
+ required when a block declares `lang="ts"` / `lang="tsx"`).
31
+ Symbol line numbers are translated back to the original `.vue`
32
+ coordinate space so `codemap get` jumps to the right line even
33
+ when `<script>` follows a long `<template>`.
34
+
35
+ * **`codemap-jsp`** — covers `*.jsp` / `*.jspx` / `*.tag` / `*.tagx`
36
+ for legacy Java web projects. Scans top-level constructs via regex
37
+ (`codemap_jsp.sfc.extract`) — page imports, includes, declaration
38
+ blocks (`<%! ... %>`), scriptlets, `<form action="...">`, and
39
+ `<a href="...">` — then parses each declaration block as a Java
40
+ member context using a synthetic `class _S { … }` wrapper so
41
+ `tree-sitter-java` emits `field_declaration` / `method_declaration`
42
+ / nested `class_declaration` rather than `local_variable_declaration`.
43
+ Form actions and links are surfaced as `extra.http_client_calls` on
44
+ the page-level pseudo-class symbol, ready to be linked to server
45
+ controllers by the `http_route` bridge — the standard JSP →
46
+ Controller navigation chain.
47
+
48
+ `codemap doctor` now lists **18 indexers** (4 built-in + 14 plugins).
49
+
50
+ ## [0.1.0] — 2026-06-03
51
+
52
+ First stable PyPI release. The CLI is now installable via:
53
+
54
+ ```bash
55
+ pipx install codemap-core
56
+ # or
57
+ pip install codemap-core
58
+ ```
59
+
60
+ …plus language adapters as separate distributions (`codemap-bash`,
61
+ `codemap-c`, `codemap-cpp`, `codemap-csharp`, `codemap-go`,
62
+ `codemap-java`, `codemap-kotlin`, `codemap-php`, `codemap-ruby`,
63
+ `codemap-rust`, `codemap-scala`, `codemap-sql`, `codemap-swift`,
64
+ `codemap-typescript`). `pipx inject codemap codemap-<lang>` is the
65
+ canonical pattern for adding language support to a `pipx`-installed
66
+ CLI.
67
+
68
+ ### Changed — `README.md` / `INSTALL.md` switch to PyPI-first installation
69
+
70
+ Both `README.md` / `README.zh-CN.md` / `INSTALL.md` / `INSTALL.zh-CN.md`
71
+ and the 14 plugin READMEs now show `pip install codemap-core` and
72
+ `pip install codemap-<lang>` as the primary install path. The
73
+ `git+https://github.com/qxbyte/codemap.git[#subdirectory=…]` form is
74
+ retained as a fallback for users who want to track `main` or pin to a
75
+ specific commit before the next PyPI release.
76
+
77
+ ### Fixed — `publish.yml`: `uv venv` does not bootstrap `pip` (2026-06-01)
78
+
79
+ The publish workflow's "Create isolated build venv" step was calling
80
+ `<venv>/bin/pip`, but `uv venv` (unlike `python -m venv`) intentionally
81
+ does not install `pip` into the venv. All 15 publish jobs failed at
82
+ exit 127 ("`pip: command not found`") under tag `v0.1.0a2`.
83
+
84
+ Fix: use `uv pip install --python <venv>/bin/python build twine`, the
85
+ same shape as the `bench.yml` fix in PR #3. Validated under tag
86
+ `v0.1.0a3` — 16/16 jobs green on TestPyPI.
87
+
88
+ ### Added — `bench.yml`: PR-vs-main median delta comparison (2026-05-31)
89
+
90
+ The benchmark CI workflow now checks out `main` into a separate
91
+ `git worktree`, runs the `pytest-benchmark` suite against both PR HEAD
92
+ and main, then compares per-test median deltas. Threshold: ≥20%
93
+ regression on any benchmark fails the job; ≤−20% improvement and
94
+ in-band changes pass with `warn` / `ok` flags surfaced in the job
95
+ summary.
96
+
97
+ ### Documented — PyPI rate-limit findings
98
+
99
+ Empirically, PyPI applies a per-account new-project-creation throttle:
100
+ roughly **4 new project registrations per 24-hour sliding window**.
101
+ File uploads (`.whl` / `.tar.gz`) to already-existing projects use a
102
+ separate, much looser bucket. The 0.1.0 release was paced across two
103
+ days to stay within this limit; subsequent maintenance releases are
104
+ unaffected because the projects already exist. The corresponding
105
+ support ticket is `pypi/support#10881`.
106
+
107
+ ## [0.1.0a1] — 2026-05-30
108
+
109
+ First PyPI release rehearsal. Pre-release artifacts are published to
110
+ TestPyPI and (rate-permitting) PyPI under the new distribution names.
111
+
112
+ ### Changed — Distribution rename: `codemap` → `codemap-core`
113
+
114
+ The PyPI distribution name for the main package becomes `codemap-core`.
115
+ Reason: `codemap` is held by an unrelated, actively-maintained PyPI
116
+ project (Sarthak Mishra, latest `2.0.0`); `code-map` (the obvious
117
+ hyphenated variant) is rejected by PyPI's similarity check because the
118
+ edit distance from `codemap` is 1. The `-core` suffix mirrors the
119
+ plugin naming convention — `codemap-core` is the engine, `codemap-java`
120
+ / `codemap-go` / etc. are language adapters.
121
+
122
+ Behavior:
123
+
124
+ * **Import path is unchanged** — `from codemap.core.models import Symbol`
125
+ still works; the wheel still ships `src/codemap/` to `site-packages/codemap/`.
126
+ * **CLI command is unchanged** — `codemap doctor`, `codemap index .`, etc.
127
+ still appear on `$PATH` after install.
128
+ * **Install command does change** — users moving from a git-based install
129
+ to PyPI will use `pip install codemap-core` (not `pip install codemap`).
130
+
131
+ ### Changed — Plugins now depend on `codemap-core` with a version range
132
+
133
+ Each of the 14 language plugins replaces its bare `"codemap"` dependency
134
+ with `"codemap-core>=0.1.0a1,<0.2"`. The lower bound admits the alpha
135
+ series; the upper bound stops a future BREAKING bump to `0.2.x` from
136
+ silently pulling an incompatible engine.
137
+
138
+ ### Added — `.github/workflows/publish.yml` (Trusted Publishing)
139
+
140
+ Tag-driven publish pipeline:
141
+
142
+ * `v<X>.<Y>.<Z>(a|b|rc)<N>` → TestPyPI
143
+ * `v<X>.<Y>.<Z>` → PyPI
144
+ * anything else → workflow fails fast
145
+
146
+ 15-package matrix (1 main + 14 plugins), each step:
147
+
148
+ 1. `uv` installs Python 3.13 + `build` + `twine`
149
+ 2. `python -m build` produces `dist/*.tar.gz` and `dist/*.whl`
150
+ 3. `twine check dist/*` validates metadata + README rendering
151
+ 4. `pypa/gh-action-pypi-publish@release/v1` uploads via OIDC
152
+
153
+ Uses GitHub Environments (`pypi` / `testpypi`) for Trusted Publishing.
154
+ `id-token: write` permission grants the OIDC token; no PyPI API token
155
+ is stored in repository secrets. `skip-existing: true` makes re-runs
156
+ idempotent.
157
+
158
+ ### Added — `twine>=5.0` to `[dev]` extras
159
+
160
+ For local manual `twine check` / `twine upload` outside CI.
161
+
162
+ ### Added — Distribution metadata polish
163
+
164
+ Main `pyproject.toml` gains:
165
+
166
+ * `Environment :: Console`,
167
+ `Intended Audience :: Information Technology`,
168
+ `Operating System :: MacOS`,
169
+ `Operating System :: POSIX :: Linux`,
170
+ `Topic :: Software Development :: Libraries :: Python Modules`
171
+ classifiers.
172
+ * `Changelog` URL in `[project.urls]`.
173
+
174
+ ### Validated locally (2026-05-30)
175
+
176
+ * `python -m build` succeeds for all 15 packages; 30 artifacts produced
177
+ (15 sdists + 15 wheels).
178
+ * `twine check dist/* plugins/*/dist/*` reports **30 PASSED**.
179
+ * All 15 names uploaded to **TestPyPI** successfully:
180
+ <https://test.pypi.org/project/codemap-core/0.1.0a1/> and the 14
181
+ matching `codemap-<lang>` siblings.
182
+ * Production **PyPI** upload was rate-limited (HTTP 429) after the
183
+ first batch; a background retry loop with `--skip-existing` brings
184
+ the remaining names up over the following minutes.
185
+
186
+ ### Added — Bilingual `INSTALL.md` install guide (2026-05-30)
187
+
188
+ - New `INSTALL.md` (English) and `INSTALL.zh-CN.md` (Simplified
189
+ Chinese) walk through `pipx` / `uv tool` / `pip` installation paths
190
+ for the main CLI, then `pipx inject` / `uv tool inject` / `pip
191
+ install` for the 14 language plugins. Covers the `[watch]` extra,
192
+ offline wheel-bundle distribution, upgrade/uninstall, and a
193
+ troubleshooting matrix for the common gotchas (Python < 3.11,
194
+ `command not found`, plugin not discovered, slow first install,
195
+ `tree-sitter-*` build failures, partial plugin removal).
196
+ - Both files end with a verbatim **validation log** captured on a
197
+ fresh Python 3.12 virtualenv on 2026-05-30 against
198
+ [`c4cd436`](https://github.com/qxbyte/codemap/commit/c4cd436):
199
+ install (2 m 05 s), `doctor` on a clean install (2 indexers, 2
200
+ bridges), Java plugin inject (15.6 s, auto-discovered), index a
201
+ mixed Java + Python fixture (6 symbols, 1 route, 0 diagnostics),
202
+ and `--json` output for AI agents.
203
+ - Both `README.md` and `README.zh-CN.md` now link to the install
204
+ guide near the top, ahead of their own (lighter) install sections.
205
+
206
+ ### Added — C / C++ / C# / Scala independent PyPI plugins (2026-05-30)
207
+
208
+ - `plugins/codemap-c/` — `tree-sitter-c` backed. Captures
209
+ `function_definition`, named `struct_specifier` / `union_specifier`
210
+ with bodies (with their `field_declaration` members), named
211
+ `enum_specifier` (with enumerators as fields), `type_definition`
212
+ (`typedef`), object and function-like `preproc_def` macros, and
213
+ top-level `declaration` with an initializer. Function bodies are
214
+ opaque so locals do not leak as script-level symbols.
215
+ 15 unit tests. Scheme `scip-c`. Files: `*.c`, `*.h`.
216
+ - `plugins/codemap-cpp/` — `tree-sitter-cpp` backed. Recurses through
217
+ `namespace_definition` so descriptors carry the full namespace chain;
218
+ unwraps `template_declaration` to surface the inner function or class.
219
+ Captures `class_specifier` / `struct_specifier` / `union_specifier`
220
+ (with `extra.cpp_kind`), `enum_specifier`, top-level and in-class
221
+ `function_definition` (as `function` / `method`), and data-member
222
+ `field_declaration`. 13 unit tests. Scheme `scip-cpp`. Files: `*.cpp`,
223
+ `*.cc`, `*.cxx`, `*.hpp`, `*.hh`, `*.hxx`.
224
+ - `plugins/codemap-csharp/` — `tree-sitter-c-sharp` backed.
225
+ `namespace_declaration` is walked and dotted `qualified_name`
226
+ (`App.Core.Util`) is split into individual NAMESPACE descriptors.
227
+ Captures `class_declaration` / `interface_declaration` /
228
+ `struct_declaration` / `record_declaration` / `enum_declaration` /
229
+ `delegate_declaration` (all as `class` with distinguishing
230
+ `extra.csharp_kind`), `method_declaration`, `property_declaration`,
231
+ multi-declarator `field_declaration`, and `enum_member_declaration`.
232
+ 13 unit tests. Scheme `scip-csharp`. Files: `*.cs`, `*.csx`.
233
+ - `plugins/codemap-scala/` — `tree-sitter-scala` backed. Leading
234
+ `package_clause` prefixes every symbol with NAMESPACE descriptors.
235
+ Captures `class_definition` (including `case class` — with its
236
+ `class_parameter`s emitted as fields), `object_definition`,
237
+ `trait_definition`, top-level `type_definition`,
238
+ `function_definition` / `function_declaration` (as methods), and
239
+ `val_definition` / `var_definition` (as fields, tagged with
240
+ `extra.scala_kind`). Nested members inside template bodies are
241
+ scoped under the enclosing type. 13 unit tests. Scheme `scip-scala`.
242
+ Files: `*.scala`, `*.sc`.
243
+ - `codemap doctor` now lists **15 indexers** (the four built-ins plus
244
+ ten plugin-shipped grammars).
245
+
246
+ ### Fixed — CI: `astral-sh/setup-uv@v3` fails without `uv.lock` (2026-05-30)
247
+
248
+ - Both `test.yml` and `bench.yml` workflows enabled `cache: true` on
249
+ `setup-uv@v3`, which defaults its dependency glob to `**/uv.lock`.
250
+ We don't commit a lockfile yet, so the action failed with
251
+ *"No file in ... matched to [**/uv.lock]"* before any tests ran.
252
+ - Set `cache-dependency-glob: "pyproject.toml"` so the cache keys on a
253
+ file that actually exists. No effect on local development.
254
+
255
+ ### Added — SQL (DDL) and Bash independent PyPI plugins (2026-05-30)
256
+
257
+ - `plugins/codemap-sql/` — `tree-sitter-sql` backed. DDL only: emits
258
+ `class` symbols for `CREATE TABLE` / `CREATE VIEW`, `variable`
259
+ symbols for `CREATE INDEX`, and `field` symbols for each
260
+ `column_definition` attached to the parent table.
261
+ `SELECT`/`INSERT`/`UPDATE`/`DELETE` are intentionally ignored.
262
+ 13 unit tests. Scheme `scip-sql`. Files: `*.sql`, `*.ddl`.
263
+ - `plugins/codemap-bash/` — `tree-sitter-bash` backed. Captures
264
+ `function_definition`, top-level `variable_assignment`, and
265
+ `declaration_command` keywords (`readonly` / `declare` / `export` /
266
+ `local` / `typeset`) tagged via `extra.bash_kind`. Function-internal
267
+ state is deliberately not surfaced. Extensionless files with a bash
268
+ shebang are also accepted via `supports()`. 14 unit tests. Scheme
269
+ `scip-bash`. Files: `*.sh`, `*.bash`, `*.bats`.
270
+ - README (both languages) updated with the two new install commands,
271
+ the bigger doctor table, and the longer indexer reference table.
272
+
273
+ ### Added — Swift, Kotlin, Ruby, PHP independent PyPI plugins (2026-05-30)
274
+
275
+ - `plugins/codemap-swift/` — `tree-sitter-swift` backed. Class / struct /
276
+ enum / protocol kept under `extra.swift_kind`; functions and `init`
277
+ inside types become methods; top-level `let`/`var` become variables.
278
+ 14 unit tests. Scheme `scip-swift`.
279
+ - `plugins/codemap-kotlin/` — `tree-sitter-kotlin` backed. Class /
280
+ interface / object under `extra.kotlin_kind`, package header captured
281
+ as `extra.package`, `fun` inside type → method, top-level `val`/`var`
282
+ → variable. Supports both `.kt` and `.kts`. 14 unit tests. Scheme
283
+ `scip-kotlin`.
284
+ - `plugins/codemap-ruby/` — `tree-sitter-ruby` backed. Class / module
285
+ under `extra.ruby_kind`, top-level `def` → function, `def` inside
286
+ type → method, `def self.x` → method with `extra.ruby_kind=singleton`.
287
+ Nested module/class produces qualified `Outer#Inner#m()` IDs. 13 unit
288
+ tests. Scheme `scip-ruby`.
289
+ - `plugins/codemap-php/` — `tree-sitter-php` backed. Class / interface /
290
+ trait / enum under `extra.php_kind`, `namespace_definition` captured
291
+ as `extra.namespace`, method / property / const declarations inside
292
+ types, free `function_definition` at module level, top-level `const`
293
+ as variable. 13 unit tests. Scheme `scip-php`.
294
+ - README (both languages) updated with 4 new subdirectory install
295
+ commands and the expanded doctor table (10 indexers total: 1
296
+ reference + 9 language plugins).
297
+ - End-to-end smoke fixture: 9 User-class files across Java / Go / Rust /
298
+ TypeScript / Python / Swift / Kotlin / Ruby / PHP indexed in one
299
+ `codemap index` pass — 24 symbols across 9 SCIP schemes, 0
300
+ diagnostics, both bridges executed.
301
+
302
+ ### Added — Java, Go, Rust independent PyPI plugins (2026-05-30)
303
+
304
+ - `plugins/codemap-java/` — Java indexer backed by `tree-sitter-java`.
305
+ Captures class / interface / enum / record / method / constructor /
306
+ field declarations, honours `package` declarations as `extra.package`,
307
+ and walks nested types via a class stack. SCIP scheme `scip-java`.
308
+ 14 unit tests.
309
+ - `plugins/codemap-go/` — Go indexer backed by `tree-sitter-go`.
310
+ Captures function / method (receiver-aware) / struct / interface /
311
+ type / const / var declarations. `func (u *User) Login()` produces
312
+ `scip-go . . . main.go/User#Login().` so both value and pointer
313
+ receivers feed into the same `User#…` namespace. 13 unit tests.
314
+ - `plugins/codemap-rust/` — Rust indexer backed by `tree-sitter-rust`.
315
+ Captures free functions, methods inside `impl` (both inherent and
316
+ `impl Trait for Type`) attached to the impl'd type, trait method
317
+ signatures attached to the trait, plus struct / enum / trait / const /
318
+ static items. SCIP scheme `scip-rust`. 13 unit tests.
319
+ - Each plugin ships with its own `pyproject.toml`, `README.md`,
320
+ `src/codemap_<lang>/`, and `tests/`, depends only on `codemap +
321
+ tree-sitter-<lang>`, and registers its indexer through the
322
+ `codemap.indexers` entry-point group — identical mechanism to the
323
+ built-in Python indexer and the previously shipped
324
+ `codemap-typescript` plugin.
325
+ - README (both English and Simplified Chinese) updated with subdirectory
326
+ install commands for all four language plugins and the updated
327
+ `codemap doctor` indexer table.
328
+ - End-to-end smoke test on a 5-language fixture (Java + Go + Rust + TS +
329
+ Python User class): 13 symbols emitted across 5 schemes, all bridges
330
+ ran successfully, 0 diagnostics.
331
+
332
+ ### Added — TypeScript indexer as an independent PyPI plugin (2026-05-30)
333
+
334
+ - New `plugins/codemap-typescript/` package: a fully independent
335
+ Python distribution implementing the `Indexer` Protocol for
336
+ TypeScript / TSX. Backed by `tree-sitter-typescript`. Recognises
337
+ `function_declaration`, `class_declaration`, `interface_declaration`,
338
+ `method_definition`, module-level `lexical_declaration` (const/let),
339
+ and `import_statement`. SCIP scheme `scip-typescript`.
340
+ - The plugin lives in its own directory with its own `pyproject.toml`,
341
+ `README.md`, `src/codemap_typescript/`, and tests. It declares one
342
+ entry-point — `codemap.indexers.typescript = codemap_typescript:Type
343
+ ScriptIndexer` — and that single line is the only coupling to the host
344
+ CodeMap repo. After `pip install -e plugins/codemap-typescript/`,
345
+ `codemap doctor` lists `typescript` next to the built-in `python` and
346
+ `_example_lang` indexers on **identical terms** (ADR-004 + ADR-L001).
347
+ - 14 plugin-local unit tests cover the indexer's symbol generation,
348
+ scheme consistency, TSX support, syntax-error and invalid-UTF8
349
+ diagnostics, and the nested-class case.
350
+ - New `docs/plugin-guide.md` walks third-party authors through the
351
+ process step by step using the TypeScript plugin as the reference.
352
+ - End-to-end smoke test against a sample TS + TSX project: 9 symbols
353
+ emitted across function / class / interface / method / variable
354
+ kinds; both `.ts` and `.tsx` file patterns work.
355
+
356
+ ### Added — Incremental + watch (2026-05-30)
357
+
358
+ - `codemap index --incremental` compares each file's sha256 against the
359
+ previous `manifest.files` entry and only re-parses changed files. Deleted
360
+ files are removed; new files are picked up. Bridges re-run from scratch
361
+ on every incremental pass via a new `JsonStore.clear_bridge_outputs()`
362
+ helper so cross-module aliases / routes always reflect the current state.
363
+ - `codemap index --watch` keeps the process alive, runs an initial
364
+ (incremental) pass, and re-indexes after every batch of file-system
365
+ events (debounced 500 ms). Requires the `watchdog` extra
366
+ (`pip install codemap[watch]`); the runtime check exits 69 (`EX_UNAVAILABLE`)
367
+ with a friendly install hint when watchdog is missing.
368
+ - Watch mode ignores events under `.codemap/` to avoid feedback loops on
369
+ its own writes.
370
+ - 7 e2e tests cover the no-op fast path, modified / deleted / new files,
371
+ bridge re-evaluation after a rename, fallback to full when no prior
372
+ index exists, and a real subprocess-based watch test that proves the
373
+ watcher reacts to a live file change.
374
+
375
+ ### Added — Cross-module Python call resolution (2026-05-30)
376
+
377
+ - New `codemap.core.bridge.python_cross_module.PythonCrossModuleBridge`
378
+ resolves the synthetic `scip-python . . . <module>/<leaf>.` targets the
379
+ Python indexer emits for cross-file imports. The bridge looks for a
380
+ local symbol with the matching leaf name; if the file stem also matches
381
+ the last namespace segment of the synthetic target the alias confidence
382
+ is `high`, otherwise it falls back to `medium` for unambiguous single
383
+ candidates and bails on ambiguity.
384
+ - `JsonStore.callers` / `callees` now transparently expand aliases via a
385
+ reverse-alias index built at load time, so query commands automatically
386
+ see cross-module callers without the caller doing anything special.
387
+ - On the CodeMap repo itself, `callers SymbolID#` now finds 10 callers
388
+ across http_route.py / _example_lang.py / python.py / test_symbol.py
389
+ rather than just the 1 same-file reference visible before.
390
+ - 10 unit tests + 3 e2e tests cover happy paths (file-stem match,
391
+ single-candidate by leaf), explicit skips (no candidates, ambiguous
392
+ candidates, non-python scheme, non-call edges, already-resolved
393
+ targets, dedup), and the multi-file callers behaviour through the CLI.
394
+
395
+ ### Added — Diagnostics command + error UX (2026-05-30)
396
+
397
+ - New `codemap diagnostics` command lists diagnostics recorded during the
398
+ last `codemap index`. Filters: `--severity` (error/warning/info),
399
+ `--producer` (indexer or bridge name), `--code` (e.g. `ROUTE001`),
400
+ `--limit`. Both human and JSON outputs.
401
+ - Indexer crashes mid-file now become an `INDEXER_CRASH` diagnostic
402
+ instead of being buried in stderr. Bridge crashes become
403
+ `BRIDGE_CRASH`. Unreadable source files become `IO001`. The run
404
+ completes either way.
405
+ - `codemap index --dry-run` walks the project and reports the per-indexer
406
+ file counts without writing `.codemap/`.
407
+ - Friendly CLI exception wrapper: unhandled exceptions print a short
408
+ marked-up "Internal error" message with the issue tracker URL and exit
409
+ 70 (`EX_SOFTWARE`). Set `CODEMAP_FULL_TRACEBACK=1` for the full
410
+ traceback.
411
+
412
+ ### Added — Configuration file (2026-05-30)
413
+
414
+ - `.codemap/config.yaml` now actually loads, replacing the previous empty
415
+ placeholder. Three layers are merged in order: built-in defaults →
416
+ `~/.config/codemap/config.yaml` → `<project>/.codemap/config.yaml`.
417
+ Recursive mapping merge means each layer only has to mention what it
418
+ changes.
419
+ - New schema (`codemap.config.schema.Config`, pydantic-backed,
420
+ `extra=forbid` so typos surface as errors):
421
+ - `storage.backend` (`json` | `sqlite`)
422
+ - `index.ignore` (glob patterns on both file names and project-relative
423
+ paths), `index.max_file_bytes`, `index.follow_symlinks`
424
+ - `indexers.enabled` / `indexers.disabled`
425
+ - `bridges.enabled` / `bridges.disabled`
426
+ - `codemap index` honours every field — `ignore` filters the walk,
427
+ `max_file_bytes` replaces the previously hard-coded limit, and
428
+ enabled/disabled lists shape which indexers / bridges run.
429
+ - New `codemap config show [--project P]` command prints the merged
430
+ configuration (rendered YAML + source paths or a JSON envelope) so it's
431
+ obvious which layer contributed which value.
432
+ - Validation errors surface as `EX_CONFIG` (exit 78) with the offending
433
+ field path, never as a stack trace.
434
+ - 15 unit tests + 10 e2e tests cover schema defaults, layer merging,
435
+ YAML errors, validation errors, ignore / max_file_bytes / disabled
436
+ indexers / disabled bridges in action. `docs/configuration.md`
437
+ documents every key.
438
+
439
+ ### Added — Python HTTP recognition + benchmark gate (2026-05-30)
440
+
441
+ - **Python indexer** now produces `http_route` and `http_calls` metadata
442
+ for the `http_route` bridge to consume — meaning the cross-language
443
+ pipeline works end-to-end on real Python projects, not just synthetic
444
+ fixtures. Recognises FastAPI-style verb decorators (`@app.get("/x")`),
445
+ Flask-style `@route("/x", methods=[...])`, and `requests` / `httpx` /
446
+ `aiohttp` / `urllib3` client calls. URL-like heuristic (`/` or `http(s)://`)
447
+ filters out incidental `dict.get("key")` calls. 17 new unit tests cover
448
+ the matrix; 4 e2e tests prove `codemap routes` and `codemap callers`
449
+ surface the linked client→server graph after a single `codemap index`.
450
+ - **Benchmark suite** (`tests/bench/`) with `pytest-benchmark`, gated behind
451
+ the `bench` marker so the default `pytest` run is unaffected. Six
452
+ measurements: full-index throughput, callers / callees / search / walk /
453
+ shortest_path. Targets are documented in `docs/performance.md`.
454
+ - **ADR-010 (benchmark regression gate)** flipped from Proposed to
455
+ **Accepted**. Current baseline on the CodeMap repo: full-index 73 ms /
456
+ callers 4.7 µs / callees 26 µs / walk depth-10 72 µs — every target from
457
+ design §21 cleared by orders of magnitude. `.github/workflows/bench.yml`
458
+ runs the suite on every PR and fails the build on ≥ 20 % median
459
+ regression vs. main.
460
+
461
+ ### Added — Query commands (2026-05-30)
462
+
463
+ - `codemap search QUERY` — keyword search across symbol IDs / signatures / docs.
464
+ - `codemap get <symbol-id>` — fetch one symbol's definition site, doc, and a
465
+ source-line snippet. Exits 1 if not found, 64 (`EX_USAGE`) on malformed
466
+ SymbolID, 66 (`EX_NOINPUT`) when `.codemap/` is missing.
467
+ - `codemap callers <symbol-id> [-d N]` — every edge whose target matches the
468
+ given id (depth-limited).
469
+ - `codemap callees <symbol-id> [-d N]` — every edge whose source matches.
470
+ - `codemap trace --from <id> [--to <id>] [-d N]` — BFS downstream walk or
471
+ bidirectional shortest-path between two symbols, with rich-tree text output
472
+ and a structured JSON envelope.
473
+ - `codemap routes [--method M]` — list every HTTP route the `http_route`
474
+ bridge has registered, with handler `file:line` references.
475
+ - `codemap.core.graph` — depth-limited downstream `walk_chain` and
476
+ bidirectional `shortest_path` (capped per-side, so `-d N` finds paths up
477
+ to `2N` hops).
478
+ - All commands accept `--project / -p`, support `--json`, and use the same
479
+ exit-code conventions (ADR-005). 14 graph unit tests + 19 end-to-end CLI
480
+ tests cover the new surface. `docs/cli.md` documents every command and its
481
+ JSON shape.
482
+
483
+ ### Added — Sprint M-1 — HTTP route bridge (2026-05-30)
484
+
485
+ - `codemap.core.bridge.http_route.HttpRouteBridge` — first cross-language
486
+ Bridge. Reads `Symbol.extra["http_route"]` (server-side) and
487
+ `Symbol.extra["http_calls"]` (client-side) metadata and emits
488
+ `Route` / `Alias` / `Edge` entries pivoting on a synthetic
489
+ `scip-route` intermediate symbol per `(method, path)`.
490
+ - Path-variable matching (`/user/{id}` ↔ `/user/42`), context-path
491
+ prefix joining (`context_path` + `path` → `full_path`), and query-string
492
+ stripping on the client URL.
493
+ - Diagnostics: `ROUTE001` for duplicate server handlers on the same route;
494
+ `ROUTE002` for high-confidence client calls with no matching server
495
+ route. Low-confidence (dynamic) client URLs do not warn.
496
+ - Tests: 21 unit cases (covering empty inputs, malformed metadata,
497
+ path-variable matching, cross-language aggregation, etc.) plus 1
498
+ integration test wiring the Bridge through a real `JsonStore` round
499
+ trip on disk. `docs/bridges/http_route.md` documents the metadata
500
+ contract and known limitations.
501
+ - Registered via `[project.entry-points."codemap.bridges"] http_route =
502
+ "codemap.core.bridge.http_route:HttpRouteBridge"` — on equal footing
503
+ with any third-party Bridge (ADR-004).
504
+
505
+ ### Added — Sprint N-1 — Python indexer (2026-05-30)
506
+
507
+ - `codemap.indexers.python.PythonIndexer` — first real-language indexer.
508
+ Built on the stdlib `ast` module; produces `function` / `method` /
509
+ `class` / `field` / `variable` symbols and `calls` / `imports` /
510
+ `extends` edges. Diagnostics are isolated per file (syntax errors,
511
+ non-UTF-8 sources do not abort a run).
512
+ - SymbolID scheme `scip-python`; the file path is encoded as a chain of
513
+ `namespace` descriptors, matching the SCIP convention.
514
+ - 25 unit cases + 3 golden directory fixtures under
515
+ `tests/fixtures/indexers/python/`. Dogfood baseline on this repository:
516
+ 48 files / 437 symbols / 1232 edges / 0 diagnostics.
517
+ - `docs/indexers/python.md` documents the resolution policy, the
518
+ confidence ladder, and known limitations.
519
+
520
+ ### Changed
521
+
522
+ - `JsonStore` integrity check now treats only missing edge **sources** as
523
+ corruption; missing edge **targets** are normal (external library
524
+ references the indexer did not cover). Design doc §6.4 updated to
525
+ match.
526
+
527
+ ### Added — Sprint 0 — Engineering scaffolding (2026-05-30)
528
+
529
+ - Project layout following ADR-003 (`core` / `io` / `indexers` / `cli` / `mcp` separation).
530
+ - `pyproject.toml` (Hatch backend) with quality-gate configuration: ruff, mypy strict, pytest, coverage, import-linter.
531
+ - `SymbolID` (SCIP format) with parse / `to_string` round-trip — ADR-001.
532
+ - Pydantic data models with `schema_version` enforcement — ADR-006.
533
+ - `SymbolStore` Protocol + JSON backend with atomic writes and file locking — ADR-002, ADR-008.
534
+ - `Indexer` / `Bridge` Protocols with entry_points registry — ADR-004.
535
+ - Typer CLI skeleton: `--version`, `--help`, `doctor`, `index`.
536
+ - Diagnostics: sysexits.h exit codes, structured logging — ADR-005.
537
+ - CI: GitHub Actions matrix (Python 3.11/3.12/3.13 × macOS/Linux), lint + type + test + build.
538
+ - ADRs 0001–0012 documenting Day-1 decisions (including ADR-L001 language neutrality).
539
+ - Reference indexer `_example_lang` to validate end-to-end pipeline.
540
+
541
+ [Unreleased]: https://github.com/qxbyte/codemap/compare/v0.0.0...HEAD
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Xue Qiang
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.