codecortex 0.20.0__tar.gz → 0.22.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 (136) hide show
  1. {codecortex-0.20.0/src/codecortex.egg-info → codecortex-0.22.0}/PKG-INFO +2 -2
  2. {codecortex-0.20.0 → codecortex-0.22.0}/README.md +1 -1
  3. {codecortex-0.20.0 → codecortex-0.22.0/src/codecortex.egg-info}/PKG-INFO +2 -2
  4. {codecortex-0.20.0 → codecortex-0.22.0}/src/codecortex.egg-info/SOURCES.txt +3 -1
  5. codecortex-0.22.0/src/codeintel/__init__.py +1 -0
  6. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/graph_backend.py +29 -17
  7. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/providers/graph.py +338 -72
  8. codecortex-0.22.0/src/codeintel/wire_text.py +376 -0
  9. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_edge_confidence.py +11 -6
  10. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_graph_failure_population.py +3 -0
  11. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_graph_provider.py +33 -5
  12. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_graph_real.py +18 -5
  13. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_null_reason_and_ripple.py +153 -1
  14. codecortex-0.22.0/tests/test_wire_text.py +233 -0
  15. codecortex-0.20.0/src/codeintel/__init__.py +0 -1
  16. {codecortex-0.20.0 → codecortex-0.22.0}/LICENSE +0 -0
  17. {codecortex-0.20.0 → codecortex-0.22.0}/pyproject.toml +0 -0
  18. {codecortex-0.20.0 → codecortex-0.22.0}/setup.cfg +0 -0
  19. {codecortex-0.20.0 → codecortex-0.22.0}/src/codecortex.egg-info/dependency_links.txt +0 -0
  20. {codecortex-0.20.0 → codecortex-0.22.0}/src/codecortex.egg-info/entry_points.txt +0 -0
  21. {codecortex-0.20.0 → codecortex-0.22.0}/src/codecortex.egg-info/requires.txt +0 -0
  22. {codecortex-0.20.0 → codecortex-0.22.0}/src/codecortex.egg-info/top_level.txt +0 -0
  23. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/__main__.py +0 -0
  24. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/agent_prompt.py +0 -0
  25. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/auth.py +0 -0
  26. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/c4.py +0 -0
  27. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/cache.py +0 -0
  28. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/commands/__init__.py +0 -0
  29. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/commands/_common.py +0 -0
  30. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/commands/c4.py +0 -0
  31. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/commands/doctor.py +0 -0
  32. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/commands/gen_token.py +0 -0
  33. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/commands/graph.py +0 -0
  34. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/commands/index.py +0 -0
  35. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/commands/install.py +0 -0
  36. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/commands/map.py +0 -0
  37. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/commands/prompt.py +0 -0
  38. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/commands/query.py +0 -0
  39. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/commands/reset.py +0 -0
  40. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/commands/serve.py +0 -0
  41. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/commands/serve_http.py +0 -0
  42. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/commands/setup.py +0 -0
  43. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/commands/status.py +0 -0
  44. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/config.py +0 -0
  45. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/containment.py +0 -0
  46. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/doctor.py +0 -0
  47. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/gateway.py +0 -0
  48. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/graph_render.py +0 -0
  49. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/graph_resolution.py +0 -0
  50. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/grapher.py +0 -0
  51. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/http_server.py +0 -0
  52. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/indexer.py +0 -0
  53. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/injector.py +0 -0
  54. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/installer.py +0 -0
  55. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/loc.py +0 -0
  56. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/logconfig.py +0 -0
  57. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/mapper.py +0 -0
  58. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/metrics.py +0 -0
  59. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/onboarding.py +0 -0
  60. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/outcome.py +0 -0
  61. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/paths.py +0 -0
  62. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/policy.py +0 -0
  63. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/progress.py +0 -0
  64. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/provider.py +0 -0
  65. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/providers/__init__.py +0 -0
  66. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/providers/lsp.py +0 -0
  67. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/providers/none.py +0 -0
  68. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/providers/semantic.py +0 -0
  69. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/py.typed +0 -0
  70. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/query_ops.py +0 -0
  71. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/redact.py +0 -0
  72. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/reindexer.py +0 -0
  73. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/reset.py +0 -0
  74. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/searcher.py +0 -0
  75. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/semantic_db.py +0 -0
  76. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/server.py +0 -0
  77. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/source_kind.py +0 -0
  78. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/term.py +0 -0
  79. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/verify.py +0 -0
  80. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/viewer/__init__.py +0 -0
  81. {codecortex-0.20.0 → codecortex-0.22.0}/src/codeintel/viewer/graph_template.html +0 -0
  82. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_agent_prompt.py +0 -0
  83. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_backend_reaper.py +0 -0
  84. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_c4.py +0 -0
  85. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_c4_model.py +0 -0
  86. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_c4_output.py +0 -0
  87. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_cache.py +0 -0
  88. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_chunking.py +0 -0
  89. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_cli_commands.py +0 -0
  90. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_cli_help.py +0 -0
  91. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_cli_install_dry_run.py +0 -0
  92. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_cli_install_offer_injection.py +0 -0
  93. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_cold_process.py +0 -0
  94. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_config.py +0 -0
  95. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_corpus.py +0 -0
  96. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_docs_ci_claims.py +0 -0
  97. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_docs_deadcode_withdrawal.py +0 -0
  98. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_doctor.py +0 -0
  99. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_e2e.py +0 -0
  100. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_engine_adoption.py +0 -0
  101. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_enterprise.py +0 -0
  102. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_gateway.py +0 -0
  103. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_graph_stdin.py +0 -0
  104. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_grapher.py +0 -0
  105. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_hardening.py +0 -0
  106. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_http_auth.py +0 -0
  107. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_http_server.py +0 -0
  108. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_incompleteness.py +0 -0
  109. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_index_progress.py +0 -0
  110. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_indexer_binary.py +0 -0
  111. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_installer.py +0 -0
  112. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_integration.py +0 -0
  113. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_loc_census.py +0 -0
  114. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_lsp_language_coverage.py +0 -0
  115. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_lsp_provider.py +0 -0
  116. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_lsp_real.py +0 -0
  117. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_mapper.py +0 -0
  118. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_mcp_handshake.py +0 -0
  119. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_mcp_server.py +0 -0
  120. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_model_dimension.py +0 -0
  121. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_never_raise.py +0 -0
  122. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_onboarding.py +0 -0
  123. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_rbac.py +0 -0
  124. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_redaction_boundary.py +0 -0
  125. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_reindexer.py +0 -0
  126. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_rerank.py +0 -0
  127. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_reset.py +0 -0
  128. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_semantic_provider.py +0 -0
  129. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_source_kind.py +0 -0
  130. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_staleness.py +0 -0
  131. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_symbol_context.py +0 -0
  132. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_term.py +0 -0
  133. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_treesitter.py +0 -0
  134. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_verify.py +0 -0
  135. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_verify_call.py +0 -0
  136. {codecortex-0.20.0 → codecortex-0.22.0}/tests/test_version_skew.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codecortex
3
- Version: 0.20.0
3
+ Version: 0.22.0
4
4
  Summary: Local-first, MCP-native code-intelligence server — graph, LSP, and semantic search behind one safe code.query tool for coding agents.
5
5
  Author: Shammai Hamilton
6
6
  License-Expression: MIT
@@ -281,7 +281,7 @@ Then it launches the exact command it registered and drives a real MCP handshake
281
281
  ```text
282
282
  v claude: registered at /Users/you/.claude.json
283
283
 
284
- v verified: codeintel 0.20.0 — 4 tools (code.query, code.status, code.doctor, code.map)
284
+ v verified: codeintel 0.22.0 — 4 tools (code.query, code.status, code.doctor, code.map)
285
285
  ```
286
286
 
287
287
  If the command is not on `PATH`, or the server fails to start, install says so and exits non-zero
@@ -244,7 +244,7 @@ Then it launches the exact command it registered and drives a real MCP handshake
244
244
  ```text
245
245
  v claude: registered at /Users/you/.claude.json
246
246
 
247
- v verified: codeintel 0.20.0 — 4 tools (code.query, code.status, code.doctor, code.map)
247
+ v verified: codeintel 0.22.0 — 4 tools (code.query, code.status, code.doctor, code.map)
248
248
  ```
249
249
 
250
250
  If the command is not on `PATH`, or the server fails to start, install says so and exits non-zero
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codecortex
3
- Version: 0.20.0
3
+ Version: 0.22.0
4
4
  Summary: Local-first, MCP-native code-intelligence server — graph, LSP, and semantic search behind one safe code.query tool for coding agents.
5
5
  Author: Shammai Hamilton
6
6
  License-Expression: MIT
@@ -281,7 +281,7 @@ Then it launches the exact command it registered and drives a real MCP handshake
281
281
  ```text
282
282
  v claude: registered at /Users/you/.claude.json
283
283
 
284
- v verified: codeintel 0.20.0 — 4 tools (code.query, code.status, code.doctor, code.map)
284
+ v verified: codeintel 0.22.0 — 4 tools (code.query, code.status, code.doctor, code.map)
285
285
  ```
286
286
 
287
287
  If the command is not on `PATH`, or the server fails to start, install says so and exits non-zero
@@ -46,6 +46,7 @@ src/codeintel/server.py
46
46
  src/codeintel/source_kind.py
47
47
  src/codeintel/term.py
48
48
  src/codeintel/verify.py
49
+ src/codeintel/wire_text.py
49
50
  src/codeintel/commands/__init__.py
50
51
  src/codeintel/commands/_common.py
51
52
  src/codeintel/commands/c4.py
@@ -128,4 +129,5 @@ tests/test_term.py
128
129
  tests/test_treesitter.py
129
130
  tests/test_verify.py
130
131
  tests/test_verify_call.py
131
- tests/test_version_skew.py
132
+ tests/test_version_skew.py
133
+ tests/test_wire_text.py
@@ -0,0 +1 @@
1
+ __version__ = "0.22.0"
@@ -27,6 +27,7 @@ import threading
27
27
  import time
28
28
  from typing import Any
29
29
 
30
+ from codeintel import wire_text
30
31
  from codeintel.outcome import Missing
31
32
 
32
33
 
@@ -162,18 +163,7 @@ class BackendClient:
162
163
  )
163
164
  if result.returncode != 0:
164
165
  return self._FAIL # unsupported / error → let the raw-JSON fallback try
165
- try:
166
- return json.loads(result.stdout)
167
- except ValueError:
168
- # The backend RAN and exited 0 — it simply did not answer in JSON. That is a
169
- # dialect mismatch, not a failure, and it must not be folded into the same `None`
170
- # as a crash: `codebase-memory-mcp` 0.10.x replaced the `{columns, rows}` payload
171
- # this provider parses with a compact human-readable text format, so every op that
172
- # is not `list_projects` (still JSON) silently returned "not in graph index" — on a
173
- # repository that was fully indexed. Distinguishing it is what lets the caller say
174
- # so instead of sending the user to re-index for the third time.
175
- self._saw_unparsable = True
176
- return self._UNPARSABLE
166
+ return self._decode(method, result.stdout)
177
167
  except Exception:
178
168
  return self._FAIL
179
169
 
@@ -190,14 +180,36 @@ class BackendClient:
190
180
  )
191
181
  if result.returncode != 0:
192
182
  return self._FAIL
193
- try:
194
- return json.loads(result.stdout)
195
- except ValueError:
196
- self._saw_unparsable = True
197
- return self._UNPARSABLE
183
+ return self._decode(method, result.stdout)
198
184
  except Exception:
199
185
  return self._FAIL
200
186
 
187
+ def _decode(self, method: str, stdout: bytes) -> Any:
188
+ """One backend reply, in whichever dialect the installed backend speaks.
189
+
190
+ Two are supported. 0.9.x answers in JSON. 0.10.x answers all but `list_projects` in a
191
+ compact human-readable text layout — passing `--json` does not undo that, it only wraps the
192
+ same text in an MCP envelope — and `wire_text` translates it back into the 0.9.x-shaped
193
+ dict every caller above this line already parses. Neither the ops nor the renderers learn
194
+ that a second dialect exists.
195
+
196
+ The ordering matters: JSON is tried first, so a 0.9.x backend never pays for the text path
197
+ and never risks a misparse. And the text path must still be able to FAIL — a reply that is
198
+ no longer in a shape this release understands has to reach `_UNPARSABLE`, because the
199
+ "your backend and this release do not agree on a wire format" answer is the only thing that
200
+ made the 0.9→0.10 break diagnosable instead of looking like an unindexed repository. A
201
+ parser that guessed rather than refused would take that away.
202
+ """
203
+ try:
204
+ return json.loads(stdout)
205
+ except ValueError:
206
+ pass
207
+ parsed = wire_text.parse(method, stdout.decode("utf-8", "replace"))
208
+ if parsed is not None:
209
+ return parsed
210
+ self._saw_unparsable = True
211
+ return self._UNPARSABLE
212
+
201
213
  def _clear_failure(self) -> None:
202
214
  """Reset the per-query failure record.
203
215