codrspot-processor-mcp 0.1.6__tar.gz → 0.1.7__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. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/PKG-INFO +1 -1
  2. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/pyproject.toml +1 -1
  3. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/mcp/server.py +11 -2
  4. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/mcp/tools.py +28 -11
  5. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codrspot_processor_mcp.egg-info/PKG-INFO +1 -1
  6. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/LICENSE +0 -0
  7. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/README.md +0 -0
  8. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/setup.cfg +0 -0
  9. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/__init__.py +0 -0
  10. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/__main__.py +0 -0
  11. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/__init__.py +0 -0
  12. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/allowed_scope_cache.py +0 -0
  13. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/api_client/__init__.py +0 -0
  14. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/api_client/lease_client.py +0 -0
  15. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/api_client/net_guard.py +0 -0
  16. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/api_client/promote_client.py +0 -0
  17. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/api_client/reasoning_client.py +0 -0
  18. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/api_client/registry_client.py +0 -0
  19. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/api_client/superkg_client.py +0 -0
  20. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/cli/__init__.py +0 -0
  21. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/cli/init.py +0 -0
  22. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/cli/main.py +0 -0
  23. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/cli/setup.py +0 -0
  24. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/config.py +0 -0
  25. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/git_utils.py +0 -0
  26. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/license/__init__.py +0 -0
  27. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/license/fingerprint.py +0 -0
  28. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/license/jwt_client.py +0 -0
  29. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/license/project_lock.py +0 -0
  30. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/local_registry.py +0 -0
  31. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/manifest/__init__.py +0 -0
  32. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/manifest/credentials.py +0 -0
  33. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/mcp/__init__.py +0 -0
  34. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/mcp/action_monitor.py +0 -0
  35. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/mcp/lifecycle.py +0 -0
  36. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer1_business/project_registry.py +0 -0
  37. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/__init__.py +0 -0
  38. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/__init__.py +0 -0
  39. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/ast_graph.py +0 -0
  40. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/bm25_store.py +0 -0
  41. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/chunking/__init__.py +0 -0
  42. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/chunking/ast_chunker.py +0 -0
  43. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/chunking/languages.py +0 -0
  44. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/embed_worker.py +0 -0
  45. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/embeddings.py +0 -0
  46. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/extract/__init__.py +0 -0
  47. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/extract/compactor.py +0 -0
  48. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/extract/providers/__init__.py +0 -0
  49. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/extract/providers/base.py +0 -0
  50. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/indexer.py +0 -0
  51. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/ppl/__init__.py +0 -0
  52. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/ppl/emitter.py +0 -0
  53. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/ppl/parser.py +0 -0
  54. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/qdrant_store.py +0 -0
  55. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/scanning/__init__.py +0 -0
  56. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/scanning/manifest_scanner.py +0 -0
  57. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/scanning/md_scanner.py +0 -0
  58. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/scanning/repo_mapper.py +0 -0
  59. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/condensation/session_vector_store.py +0 -0
  60. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/coupling/__init__.py +0 -0
  61. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/coupling/domain.py +0 -0
  62. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/coupling/graph.py +0 -0
  63. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/coupling/layer2_gate.py +0 -0
  64. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/coupling/projector.py +0 -0
  65. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/coupling/resolver.py +0 -0
  66. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/__init__.py +0 -0
  67. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/pipeline/__init__.py +0 -0
  68. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/pipeline/execute_semantic.py +0 -0
  69. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/pipeline/filesystem_reorg.py +0 -0
  70. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/pipeline/patch_generator.py +0 -0
  71. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/pipeline/patch_validator.py +0 -0
  72. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/semantic/__init__.py +0 -0
  73. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/semantic/anchors.py +0 -0
  74. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/semantic/applicability.py +0 -0
  75. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/semantic/edit_planner.py +0 -0
  76. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/semantic/materializer.py +0 -0
  77. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/semantic/merger.py +0 -0
  78. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/semantic/ops/__init__.py +0 -0
  79. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/semantic/ops/add_import.py +0 -0
  80. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/semantic/ops/append_argument.py +0 -0
  81. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/semantic/ops/insert_literal.py +0 -0
  82. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/semantic/ops/remove_import.py +0 -0
  83. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/semantic/ops/remove_statement_unique.py +0 -0
  84. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/semantic/ops/rename_symbol_local.py +0 -0
  85. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/semantic/region_resolver.py +0 -0
  86. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/semantic/synthesizer.py +0 -0
  87. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/semantic/target_locator.py +0 -0
  88. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/semantic/validator.py +0 -0
  89. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/snippet/__init__.py +0 -0
  90. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/snippet/assembler.py +0 -0
  91. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/materialization/snippet/loader.py +0 -0
  92. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/retrieval/__init__.py +0 -0
  93. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/retrieval/graph_walk.py +0 -0
  94. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/retrieval/hybrid.py +0 -0
  95. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/retrieval/rerank_worker.py +0 -0
  96. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/retrieval/reranker.py +0 -0
  97. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/watcher/__init__.py +0 -0
  98. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codepreproc_client/layer2_tooling/watcher/fs_watcher.py +0 -0
  99. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codrspot_processor_mcp.egg-info/SOURCES.txt +0 -0
  100. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codrspot_processor_mcp.egg-info/dependency_links.txt +0 -0
  101. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codrspot_processor_mcp.egg-info/entry_points.txt +0 -0
  102. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codrspot_processor_mcp.egg-info/requires.txt +0 -0
  103. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/codrspot_processor_mcp.egg-info/top_level.txt +0 -0
  104. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/contracts/__init__.py +0 -0
  105. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/contracts/dtos.py +0 -0
  106. {codrspot_processor_mcp-0.1.6 → codrspot_processor_mcp-0.1.7}/src/contracts/ir.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codrspot-processor-mcp
3
- Version: 0.1.6
3
+ Version: 0.1.7
4
4
  Summary: Local MCP server exposing codepreproc's code-context tools to Claude Code
5
5
  Author-email: alexlqi <alexlqi@gmail.com>
6
6
  License: Copyright (c) 2026 alexlqi (alexlqi@gmail.com)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "codrspot-processor-mcp"
7
- version = "0.1.6"
7
+ version = "0.1.7"
8
8
  description = "Local MCP server exposing codepreproc's code-context tools to Claude Code"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12,<3.13"
@@ -11,6 +11,7 @@ from logging.handlers import RotatingFileHandler
11
11
  from pathlib import Path
12
12
  from urllib.parse import urlparse
13
13
  from urllib.request import url2pathname
14
+ from weakref import WeakKeyDictionary
14
15
 
15
16
  # GitPython raises ImportError at import time if no `git` executable is on
16
17
  # PATH; downgrade to a warning so a missing/unusual PATH doesn't take down
@@ -236,7 +237,15 @@ async def main() -> None:
236
237
  snippet_loader=snippet_loader,
237
238
  jwt_provider=_project_jwt_provider,
238
239
  )
239
- sessions: dict[int, SessionState] = {}
240
+ # Keyed by the session object itself (not id(session)): id() is only
241
+ # unique among objects simultaneously alive, and a plain dict here would
242
+ # let a garbage-collected session's id be reused by an unrelated later
243
+ # session, handing it a stale SessionState (active_project, cached
244
+ # per-project indexers, etc.) - which is how one project's file paths
245
+ # leaked into another project's map_context results. WeakKeyDictionary
246
+ # also evicts entries once a session is collected instead of growing
247
+ # unbounded for the life of the process.
248
+ sessions: "WeakKeyDictionary[object, SessionState]" = WeakKeyDictionary()
240
249
  # NOTE (Phase 4/5 follow-up): once lease_client.lease_world_model() is called
241
250
  # against a real deployed server, each SessionState should own a
242
251
  # WorldModelLeaseGuard (mcp/lifecycle.py) populated from that response, and
@@ -554,7 +563,7 @@ async def main() -> None:
554
563
  async def call_tool(name: str, arguments: dict | None) -> types.CallToolResult:
555
564
  session = server.request_context.session
556
565
  request_context = server.request_context
557
- state = sessions.setdefault(id(session), SessionState())
566
+ state = sessions.setdefault(session, SessionState())
558
567
  root_uris = await resolve_session_roots(
559
568
  session=session,
560
569
  lifecycle_logger=lifecycle_logger,
@@ -467,7 +467,7 @@ class CodepreprocTools:
467
467
  full_path.write_text(full_path.read_text(encoding="utf-8").replace("\n", "\r\n"), encoding="utf-8", newline="")
468
468
 
469
469
  # Transactional SuperKG write: fires only after disk mutation succeeds
470
- superkg_system_id, _ = await self._ensure_superkg_system(project)
470
+ superkg_system_id, superkg_error = await self._ensure_superkg_system(project)
471
471
  if superkg_system_id:
472
472
  plan = item.pack.semantic_plan
473
473
  bld = bld_from_plan(plan) if plan else None
@@ -481,7 +481,12 @@ class CodepreprocTools:
481
481
  bld=bld,
482
482
  )
483
483
 
484
- return {"applied": True, "files_changed": touched, "error": None}
484
+ return {
485
+ "applied": True,
486
+ "files_changed": touched,
487
+ "error": None,
488
+ "superkg_status": {"bootstrapped": superkg_system_id is not None, "error": superkg_error},
489
+ }
485
490
 
486
491
  async def apply_filesystem_plan(self, session: SessionState, arguments: dict, monitor: ActionMonitor | None = None) -> dict:
487
492
  payload = ApplyFilesystemPlanInput.model_validate(arguments)
@@ -539,7 +544,7 @@ class CodepreprocTools:
539
544
  result = stats.model_dump(mode="json")
540
545
 
541
546
  # Log indexing activity in SuperKG (fire-and-forget)
542
- superkg_system_id, _ = await self._ensure_superkg_system(project)
547
+ superkg_system_id, superkg_error = await self._ensure_superkg_system(project)
543
548
  if superkg_system_id:
544
549
  await self.superkg.log_activity(
545
550
  project_id=project.project_id,
@@ -554,6 +559,7 @@ class CodepreprocTools:
554
559
  },
555
560
  )
556
561
 
562
+ result["superkg_status"] = {"bootstrapped": superkg_system_id is not None, "error": superkg_error}
557
563
  return result
558
564
 
559
565
  async def project_status(self, session: SessionState, arguments: dict) -> dict:
@@ -563,6 +569,11 @@ class CodepreprocTools:
563
569
  repo = Repo(project.root)
564
570
  current_sha = get_current_sha(repo)
565
571
  status = indexer.get_index_status()
572
+ # Attempt (not just read) bootstrap here, since this is the tool someone
573
+ # would naturally call to check why superkg_system_id/kg_snapshot are
574
+ # null - it must actually try and report the reason, not just echo the
575
+ # cached (possibly forever-null) field.
576
+ superkg_system_id, superkg_error = await self._ensure_superkg_system(project)
566
577
  result: dict = {
567
578
  "project": project.project_id,
568
579
  "git_sha": current_sha,
@@ -573,11 +584,12 @@ class CodepreprocTools:
573
584
  "llm_policy": session.policy_overrides.get(project.project_id, project.llm_policy),
574
585
  "index_state": status["index_state"],
575
586
  "last_index_error": status.get("last_index_error"),
576
- "superkg_system_id": project.superkg_system_id,
587
+ "superkg_system_id": superkg_system_id,
588
+ "superkg_status": {"bootstrapped": superkg_system_id is not None, "error": superkg_error},
577
589
  "kg_snapshot": None,
578
590
  }
579
- if project.superkg_system_id:
580
- result["kg_snapshot"] = await self.superkg.get_snapshot(project.project_id, project.superkg_system_id)
591
+ if superkg_system_id:
592
+ result["kg_snapshot"] = await self.superkg.get_snapshot(project.project_id, superkg_system_id)
581
593
  return result
582
594
 
583
595
  async def search_context(self, session: SessionState, arguments: dict, monitor: ActionMonitor | None = None) -> dict:
@@ -607,7 +619,7 @@ class CodepreprocTools:
607
619
  reranked = await self.reranker.rerank(payload.query, retrieved, top_k)
608
620
 
609
621
  enrich_result: EnrichResult | None = None
610
- superkg_system_id, _ = await self._ensure_superkg_system(project)
622
+ superkg_system_id, superkg_error = await self._ensure_superkg_system(project)
611
623
  if superkg_system_id:
612
624
  candidates = [
613
625
  {"chunk_id": item.chunk.chunk_id, "file_path": item.chunk.file_path, "score": item.score}
@@ -655,6 +667,7 @@ class CodepreprocTools:
655
667
  result["pattern_suggestions"] = enrich_result.pattern_suggestions
656
668
  if enrich_result and enrich_result.warnings:
657
669
  result["kg_warnings"] = enrich_result.warnings
670
+ result["superkg_status"] = {"bootstrapped": superkg_system_id is not None, "error": superkg_error}
658
671
  return result
659
672
 
660
673
  async def map_context(self, session: SessionState, arguments: dict, monitor: ActionMonitor | None = None) -> dict:
@@ -688,7 +701,7 @@ class CodepreprocTools:
688
701
  reranked = await self.reranker.rerank(payload.query, retrieved, top_k)
689
702
 
690
703
  enrich_result: EnrichResult | None = None
691
- superkg_system_id, _ = await self._ensure_superkg_system(project)
704
+ superkg_system_id, superkg_error = await self._ensure_superkg_system(project)
692
705
  if superkg_system_id:
693
706
  candidates = [
694
707
  {"chunk_id": item.chunk.chunk_id, "file_path": item.chunk.file_path, "score": item.score}
@@ -825,6 +838,7 @@ class CodepreprocTools:
825
838
  map_result["pattern_suggestions"] = enrich_result.pattern_suggestions
826
839
  if enrich_result.warnings:
827
840
  map_result["kg_warnings"] = enrich_result.warnings
841
+ map_result["superkg_status"] = {"bootstrapped": superkg_system_id is not None, "error": superkg_error}
828
842
  return map_result
829
843
 
830
844
  async def generate_document(self, session: SessionState, arguments: dict, monitor: ActionMonitor | None = None) -> dict:
@@ -878,7 +892,7 @@ class CodepreprocTools:
878
892
 
879
893
  # Enrich with SuperKG narrative context if available (fire-and-forget)
880
894
  kg_narrative = ""
881
- superkg_system_id, _ = await self._ensure_superkg_system(project)
895
+ superkg_system_id, superkg_error = await self._ensure_superkg_system(project)
882
896
  if superkg_system_id:
883
897
  kg_data = await self.superkg.get_context(project.project_id, superkg_system_id, mode="narrative")
884
898
  if isinstance(kg_data, dict):
@@ -928,6 +942,7 @@ class CodepreprocTools:
928
942
  "bytes_written": len(content.encode("utf-8")),
929
943
  "chunks_used": len(all_chunks),
930
944
  "llm_usage": usage.model_dump(mode="json"),
945
+ "superkg_status": {"bootstrapped": superkg_system_id is not None, "error": superkg_error},
931
946
  }
932
947
 
933
948
  async def generate_business_logic(self, session: SessionState, arguments: dict, monitor: ActionMonitor | None = None) -> dict:
@@ -982,7 +997,7 @@ class CodepreprocTools:
982
997
  context_text = self._format_doc_context(all_chunks)
983
998
 
984
999
  kg_narrative = ""
985
- superkg_system_id, _ = await self._ensure_superkg_system(project)
1000
+ superkg_system_id, superkg_error = await self._ensure_superkg_system(project)
986
1001
  if superkg_system_id:
987
1002
  kg_data = await self.superkg.get_context(project.project_id, superkg_system_id, mode="narrative")
988
1003
  if isinstance(kg_data, dict):
@@ -1029,6 +1044,7 @@ class CodepreprocTools:
1029
1044
  "chunks_used": len(all_chunks),
1030
1045
  "overwritten": full_path.exists(),
1031
1046
  "llm_usage": usage.model_dump(mode="json"),
1047
+ "superkg_status": {"bootstrapped": superkg_system_id is not None, "error": superkg_error},
1032
1048
  }
1033
1049
 
1034
1050
  async def list_snippets(self, session: SessionState, arguments: dict) -> dict:
@@ -1256,7 +1272,7 @@ class CodepreprocTools:
1256
1272
  if monitor is not None:
1257
1273
  await monitor.stage("annotate", "generate_repo_map: enriqueciendo con KG y LLM")
1258
1274
 
1259
- superkg_system_id, _ = await self._ensure_superkg_system(project)
1275
+ superkg_system_id, superkg_error = await self._ensure_superkg_system(project)
1260
1276
  policy = session.policy_overrides.get(project.project_id, project.llm_policy)
1261
1277
  annotator = RepoMapAnnotator(
1262
1278
  router=self.llm_runtime.router,
@@ -1304,6 +1320,7 @@ class CodepreprocTools:
1304
1320
  "project_id": project.project_id,
1305
1321
  "output_path": str(output_path),
1306
1322
  "stats": final_map["stats"],
1323
+ "superkg_status": {"bootstrapped": superkg_system_id is not None, "error": superkg_error},
1307
1324
  **({"warnings": [f"LLM extraction failed for {len(failed_modules)} module(s), left empty: {failed_modules}"]} if failed_modules else {}),
1308
1325
  }
1309
1326
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codrspot-processor-mcp
3
- Version: 0.1.6
3
+ Version: 0.1.7
4
4
  Summary: Local MCP server exposing codepreproc's code-context tools to Claude Code
5
5
  Author-email: alexlqi <alexlqi@gmail.com>
6
6
  License: Copyright (c) 2026 alexlqi (alexlqi@gmail.com)