local-coding-agent 1.1.0__tar.gz → 1.1.1__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 (169) hide show
  1. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/PKG-INFO +10 -7
  2. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/README.md +8 -6
  3. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/__init__.py +1 -1
  4. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/cli/_handlers2.py +5 -1
  5. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/mcp_server.py +5 -4
  6. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/service.py +5 -1
  7. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/skill_config.py +1 -1
  8. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/tasks.py +3 -1
  9. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent.egg-info/PKG-INFO +10 -7
  10. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent.egg-info/requires.txt +1 -0
  11. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/pyproject.toml +3 -1
  12. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_cli.py +15 -0
  13. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_mcp_server.py +26 -0
  14. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_service.py +17 -0
  15. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_tasks.py +2 -0
  16. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_version_consistency.py +22 -1
  17. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/LICENSE +0 -0
  18. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/__main__.py +0 -0
  19. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/acp_server/__init__.py +0 -0
  20. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/acp_server/_codec.py +0 -0
  21. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/acp_server/_protocol.py +0 -0
  22. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/acp_server/_server.py +0 -0
  23. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/acp_server/_session.py +0 -0
  24. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/acp_server/_tools.py +0 -0
  25. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/ast_compactor.py +0 -0
  26. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/atomizer.py +0 -0
  27. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/benchmark/__init__.py +0 -0
  28. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/benchmark/_cases.py +0 -0
  29. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/benchmark/_judge.py +0 -0
  30. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/benchmark/_oracles.py +0 -0
  31. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/benchmark/_runner.py +0 -0
  32. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/benchmark/_stats.py +0 -0
  33. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/benchmark/_summary.py +0 -0
  34. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/benchmark_oracle_worker.py +0 -0
  35. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/calibration.py +0 -0
  36. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/capability.py +0 -0
  37. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/chat_compaction.py +0 -0
  38. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/cli/__init__.py +0 -0
  39. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/cli/_dispatch.py +0 -0
  40. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/cli/_handlers.py +0 -0
  41. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/cli/_input.py +0 -0
  42. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/cli/_main.py +0 -0
  43. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/cli/_parser.py +0 -0
  44. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/context_manager.py +0 -0
  45. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/controller/__init__.py +0 -0
  46. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/controller/_constants.py +0 -0
  47. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/controller/_controller.py +0 -0
  48. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/controller/_post_apply.py +0 -0
  49. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/delegator.py +0 -0
  50. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/desktop/__init__.py +0 -0
  51. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/desktop/app.py +0 -0
  52. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/desktop/assets/lucide.min.js +0 -0
  53. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/desktop/assets/tailwind.css +0 -0
  54. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/desktop/client_js.py +0 -0
  55. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/desktop/components.py +0 -0
  56. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/desktop/server/__init__.py +0 -0
  57. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/desktop/server/_handlers.py +0 -0
  58. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/desktop/server/_models.py +0 -0
  59. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/desktop/server/_server.py +0 -0
  60. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/desktop/server/_telemetry.py +0 -0
  61. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/desktop/styles.py +0 -0
  62. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/desktop/ui.py +0 -0
  63. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/doctor.py +0 -0
  64. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/hooks/__init__.py +0 -0
  65. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/hooks/_adapters.py +0 -0
  66. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/hooks/_bridge.py +0 -0
  67. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/hooks/_decision.py +0 -0
  68. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/lsp/__init__.py +0 -0
  69. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/lsp/_client.py +0 -0
  70. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/lsp/_fallback.py +0 -0
  71. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/lsp/_manager.py +0 -0
  72. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/lsp/_mock.py +0 -0
  73. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/lsp/_types.py +0 -0
  74. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/mcp_config.py +0 -0
  75. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/memory.py +0 -0
  76. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/mode_router.py +0 -0
  77. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/model_scanner.py +0 -0
  78. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/monitor.py +0 -0
  79. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/observation_policy.py +0 -0
  80. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/ollama_adapter.py +0 -0
  81. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/plan_mode.py +0 -0
  82. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/prescriptions.py +0 -0
  83. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/profiles.py +0 -0
  84. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/repository_tools.py +0 -0
  85. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/ripgrep.py +0 -0
  86. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/semantic_linter.py +0 -0
  87. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/session_events.py +0 -0
  88. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/session_query.py +0 -0
  89. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/smoke.py +0 -0
  90. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/speculative_racing.py +0 -0
  91. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/spill.py +0 -0
  92. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/stats.py +0 -0
  93. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/stdio.py +0 -0
  94. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/subagent.py +0 -0
  95. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/task.py +0 -0
  96. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/task_store.py +0 -0
  97. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/terminal/__init__.py +0 -0
  98. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/terminal/_manager.py +0 -0
  99. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/terminal/_process.py +0 -0
  100. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/terminal/_session.py +0 -0
  101. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/terminal/_tools.py +0 -0
  102. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/terminal/_types.py +0 -0
  103. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/tool_call_parser.py +0 -0
  104. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/validators.py +0 -0
  105. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/vram_fit.py +0 -0
  106. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent/worker_pool.py +0 -0
  107. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent.egg-info/SOURCES.txt +0 -0
  108. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent.egg-info/dependency_links.txt +0 -0
  109. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent.egg-info/entry_points.txt +0 -0
  110. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/local_coding_agent.egg-info/top_level.txt +0 -0
  111. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/setup.cfg +0 -0
  112. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_acp_server.py +0 -0
  113. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_adversarial_session.py +0 -0
  114. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_ast_compactor.py +0 -0
  115. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_atomizer.py +0 -0
  116. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_benchmark.py +0 -0
  117. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_calibration.py +0 -0
  118. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_capability.py +0 -0
  119. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_chat_compaction.py +0 -0
  120. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_context_manager.py +0 -0
  121. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_controller.py +0 -0
  122. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_ctx_preflight.py +0 -0
  123. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_delegator.py +0 -0
  124. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_desktop_app.py +0 -0
  125. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_desktop_http_framing.py +0 -0
  126. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_desktop_release_gate.py +0 -0
  127. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_doctor.py +0 -0
  128. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_doctor_fix.py +0 -0
  129. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_e2e_functional_scenario.py +0 -0
  130. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_edits.py +0 -0
  131. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_hooks.py +0 -0
  132. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_lsp.py +0 -0
  133. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_mcp_config.py +0 -0
  134. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_mediated_apply.py +0 -0
  135. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_memory_manager.py +0 -0
  136. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_mode_router.py +0 -0
  137. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_model_scanner.py +0 -0
  138. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_monitor.py +0 -0
  139. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_observation_policy.py +0 -0
  140. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_ollama_adapter.py +0 -0
  141. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_openai_adapter.py +0 -0
  142. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_plan_mode.py +0 -0
  143. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_prescriptions.py +0 -0
  144. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_profiles.py +0 -0
  145. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_progress_telemetry.py +0 -0
  146. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_r30_adversarial.py +0 -0
  147. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_repository_tools.py +0 -0
  148. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_ripgrep.py +0 -0
  149. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_semantic_linter.py +0 -0
  150. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_session_events.py +0 -0
  151. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_session_query.py +0 -0
  152. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_skill_config.py +0 -0
  153. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_skill_parity.py +0 -0
  154. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_smoke.py +0 -0
  155. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_speculative_racing.py +0 -0
  156. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_spill.py +0 -0
  157. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_stats.py +0 -0
  158. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_stdio.py +0 -0
  159. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_subagent.py +0 -0
  160. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_task.py +0 -0
  161. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_task_store.py +0 -0
  162. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_telemetry.py +0 -0
  163. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_terminal.py +0 -0
  164. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_tool_call_parser.py +0 -0
  165. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_ui_app.py +0 -0
  166. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_ux_audit_fixes.py +0 -0
  167. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_validators.py +0 -0
  168. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_vram_fit.py +0 -0
  169. {local_coding_agent-1.1.0 → local_coding_agent-1.1.1}/tests/test_worker_pool.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: local-coding-agent
3
- Version: 1.1.0
3
+ Version: 1.1.1
4
4
  Summary: Harness-agnostic controller delegating atomic coding tasks to local Ollama & llama.cpp models via MCP, Agent Skills, and direct CLI.
5
5
  Author: Local Coding Agent Contributors
6
6
  License: MIT
@@ -15,6 +15,7 @@ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
15
15
  Requires-Python: >=3.10
16
16
  Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
+ Requires-Dist: mcp==2.0.0
18
19
  Provides-Extra: mcp
19
20
  Requires-Dist: mcp==2.0.0; extra == "mcp"
20
21
  Provides-Extra: dev
@@ -25,10 +26,12 @@ Dynamic: license-file
25
26
 
26
27
  # Local Coding Agent
27
28
 
29
+ <!-- mcp-name: io.github.pvnc228/local-coding-agent -->
30
+
28
31
  Local execution and safety layer for delegating coding tasks from cloud agents to models on your own machine.
29
32
 
30
33
  [![CI](https://github.com/pvnc228/local-coding-agent/actions/workflows/ci.yml/badge.svg)](https://github.com/pvnc228/local-coding-agent/actions/workflows/ci.yml)
31
- [![Version](https://img.shields.io/badge/version-1.1.0-blue.svg)](pyproject.toml)
34
+ [![Version](https://img.shields.io/badge/version-1.1.1-blue.svg)](pyproject.toml)
32
35
  [![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/)
33
36
  [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
34
37
 
@@ -53,13 +56,13 @@ The same gate backs `apply_proposal`, `local-agent apply`, and the desktop apply
53
56
 
54
57
  ## Choose your download
55
58
 
56
- ### Current public release: v1.0.4
59
+ ### Current public release: v1.1.0
57
60
 
58
61
  Choose the CLI release for terminal workflows, scripts, CI, or integration with another AI coding environment. It provides the `local-agent` command, MCP server, Agent Skill, diagnostics, sessions, model tools, and task delegation.
59
62
 
60
- [Download the CLI wheel](https://github.com/pvnc228/local-coding-agent/releases/download/v1.0.4/local_coding_agent-1.0.4-py3-none-any.whl) or [CLI source archive](https://github.com/pvnc228/local-coding-agent/releases/download/v1.0.4/local_coding_agent-1.0.4.tar.gz). Windows users can [download the Desktop Harness installer](https://github.com/pvnc228/local-coding-agent/releases/download/v1.0.4/Local.AI.Coding.Harness_1.0.4_x64-setup.exe) and verify the published files with [SHA256SUMS.txt](https://github.com/pvnc228/local-coding-agent/releases/download/v1.0.4/SHA256SUMS.txt).
63
+ [Download the CLI wheel](https://github.com/pvnc228/local-coding-agent/releases/download/v1.1.0/local_coding_agent-1.1.0-py3-none-any.whl) or [CLI source archive](https://github.com/pvnc228/local-coding-agent/releases/download/v1.1.0/local_coding_agent-1.1.0.tar.gz). Windows users can [download the Desktop Harness installer](https://github.com/pvnc228/local-coding-agent/releases/download/v1.1.0/Local.AI.Coding.Harness_1.1.0_x64-setup.exe) and verify the published files with [SHA256SUMS.txt](https://github.com/pvnc228/local-coding-agent/releases/download/v1.1.0/SHA256SUMS.txt).
61
64
 
62
- The `v1.0.4` release contains the CLI archives and the Windows Desktop Harness installer. Local inference remains local; install [Ollama](https://ollama.com/) or run a compatible local model server before requesting live model responses.
65
+ The `v1.1.0` release contains the CLI archives and the Windows Desktop Harness installer. Local inference remains local; install [Ollama](https://ollama.com/) or run a compatible local model server before requesting live model responses.
63
66
 
64
67
  ## Desktop Harness
65
68
 
@@ -91,7 +94,7 @@ Requirements:
91
94
  Install the CLI package:
92
95
 
93
96
  ```bash
94
- pipx install "local-coding-agent[mcp]"
97
+ pipx install local-coding-agent
95
98
  ```
96
99
 
97
100
  Or install from a checkout:
@@ -99,7 +102,7 @@ Or install from a checkout:
99
102
  ```bash
100
103
  git clone https://github.com/pvnc228/local-coding-agent.git
101
104
  cd local-coding-agent
102
- python -m pip install -e ".[mcp]"
105
+ python -m pip install -e .
103
106
  ```
104
107
 
105
108
  Check the installation:
@@ -1,9 +1,11 @@
1
1
  # Local Coding Agent
2
2
 
3
+ <!-- mcp-name: io.github.pvnc228/local-coding-agent -->
4
+
3
5
  Local execution and safety layer for delegating coding tasks from cloud agents to models on your own machine.
4
6
 
5
7
  [![CI](https://github.com/pvnc228/local-coding-agent/actions/workflows/ci.yml/badge.svg)](https://github.com/pvnc228/local-coding-agent/actions/workflows/ci.yml)
6
- [![Version](https://img.shields.io/badge/version-1.1.0-blue.svg)](pyproject.toml)
8
+ [![Version](https://img.shields.io/badge/version-1.1.1-blue.svg)](pyproject.toml)
7
9
  [![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/)
8
10
  [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
9
11
 
@@ -28,13 +30,13 @@ The same gate backs `apply_proposal`, `local-agent apply`, and the desktop apply
28
30
 
29
31
  ## Choose your download
30
32
 
31
- ### Current public release: v1.0.4
33
+ ### Current public release: v1.1.0
32
34
 
33
35
  Choose the CLI release for terminal workflows, scripts, CI, or integration with another AI coding environment. It provides the `local-agent` command, MCP server, Agent Skill, diagnostics, sessions, model tools, and task delegation.
34
36
 
35
- [Download the CLI wheel](https://github.com/pvnc228/local-coding-agent/releases/download/v1.0.4/local_coding_agent-1.0.4-py3-none-any.whl) or [CLI source archive](https://github.com/pvnc228/local-coding-agent/releases/download/v1.0.4/local_coding_agent-1.0.4.tar.gz). Windows users can [download the Desktop Harness installer](https://github.com/pvnc228/local-coding-agent/releases/download/v1.0.4/Local.AI.Coding.Harness_1.0.4_x64-setup.exe) and verify the published files with [SHA256SUMS.txt](https://github.com/pvnc228/local-coding-agent/releases/download/v1.0.4/SHA256SUMS.txt).
37
+ [Download the CLI wheel](https://github.com/pvnc228/local-coding-agent/releases/download/v1.1.0/local_coding_agent-1.1.0-py3-none-any.whl) or [CLI source archive](https://github.com/pvnc228/local-coding-agent/releases/download/v1.1.0/local_coding_agent-1.1.0.tar.gz). Windows users can [download the Desktop Harness installer](https://github.com/pvnc228/local-coding-agent/releases/download/v1.1.0/Local.AI.Coding.Harness_1.1.0_x64-setup.exe) and verify the published files with [SHA256SUMS.txt](https://github.com/pvnc228/local-coding-agent/releases/download/v1.1.0/SHA256SUMS.txt).
36
38
 
37
- The `v1.0.4` release contains the CLI archives and the Windows Desktop Harness installer. Local inference remains local; install [Ollama](https://ollama.com/) or run a compatible local model server before requesting live model responses.
39
+ The `v1.1.0` release contains the CLI archives and the Windows Desktop Harness installer. Local inference remains local; install [Ollama](https://ollama.com/) or run a compatible local model server before requesting live model responses.
38
40
 
39
41
  ## Desktop Harness
40
42
 
@@ -66,7 +68,7 @@ Requirements:
66
68
  Install the CLI package:
67
69
 
68
70
  ```bash
69
- pipx install "local-coding-agent[mcp]"
71
+ pipx install local-coding-agent
70
72
  ```
71
73
 
72
74
  Or install from a checkout:
@@ -74,7 +76,7 @@ Or install from a checkout:
74
76
  ```bash
75
77
  git clone https://github.com/pvnc228/local-coding-agent.git
76
78
  cd local-coding-agent
77
- python -m pip install -e ".[mcp]"
79
+ python -m pip install -e .
78
80
  ```
79
81
 
80
82
  Check the installation:
@@ -1,6 +1,6 @@
1
1
  """Bounded controller components for delegating small coding tasks."""
2
2
 
3
- __version__ = "1.1.0"
3
+ __version__ = "1.1.1"
4
4
 
5
5
 
6
6
  from .acp_server import (
@@ -525,7 +525,11 @@ def _handle_serve_mcp(args: argparse.Namespace) -> int:
525
525
  from ..service import DelegationService
526
526
 
527
527
  ws_path = str(Path(args.workspace).resolve())
528
- service = DelegationService({args.workspace_ref: ws_path})
528
+ service = DelegationService(
529
+ {args.workspace_ref: ws_path},
530
+ default_profile=args.profile,
531
+ endpoint=args.endpoint,
532
+ )
529
533
  server = build_server(service, enable_tasks=args.enable_tasks)
530
534
  server.run(transport="stdio")
531
535
  return 0
@@ -33,7 +33,7 @@ except ImportError: # pragma: no cover - pydantic comes with mcp
33
33
 
34
34
  _CALLER_ID = "mcp-stdio"
35
35
  _SERVER_NAME = "local-coding-agent"
36
- _SERVER_VERSION = "1.1.0"
36
+ _SERVER_VERSION = "1.1.1"
37
37
 
38
38
 
39
39
 
@@ -205,7 +205,7 @@ def build_server(
205
205
  execution_gate=runtime_gate,
206
206
  task_store=task_store,
207
207
  )
208
- extensions.append(TasksExtension(pool, caller_id=_CALLER_ID))
208
+ extensions.append(TasksExtension(pool, caller_id=_CALLER_ID, default_profile=service.default_profile))
209
209
 
210
210
 
211
211
  server = MCPServer(
@@ -268,10 +268,11 @@ def build_server(
268
268
  async def delegate_code(
269
269
  request_id: str,
270
270
  workspace_ref: str,
271
- model_profile: str,
272
271
  task: dict[str, Any],
272
+ model_profile: str | None = None,
273
273
  ) -> CallToolResult:
274
- request = _delegate_request(request_id, workspace_ref, model_profile, task)
274
+ # An omitted profile falls back to the one the host started the server with (--profile).
275
+ request = _delegate_request(request_id, workspace_ref, model_profile or service.default_profile, task)
275
276
  try:
276
277
  result = await execution_gate.run(service.delegate, _CALLER_ID, request)
277
278
  except ExecutionOverload:
@@ -83,6 +83,8 @@ class DelegationService:
83
83
  max_turns: int = 4,
84
84
  max_cached_results: int = 256,
85
85
  preflight_budget: TaskBudget = TaskBudget(),
86
+ default_profile: str | None = None,
87
+ endpoint: str | None = None,
86
88
  ) -> None:
87
89
  if max_turns <= 0:
88
90
  raise ValueError("max_turns must be positive")
@@ -104,6 +106,8 @@ class DelegationService:
104
106
  self._max_turns = max_turns
105
107
  self._max_cached_results = max_cached_results
106
108
  self._preflight_budget = preflight_budget
109
+ self.default_profile = default_profile
110
+ self.endpoint = endpoint
107
111
  self._cache: OrderedDict[tuple[str, str, str], _CachedResult] = OrderedDict()
108
112
  self._cache_lock = RLock()
109
113
 
@@ -257,7 +261,7 @@ class DelegationService:
257
261
  if not report.accepted:
258
262
  return self._policy_failure("preflight_rejected", report.reason or "preflight_rejected")
259
263
  try:
260
- profile = get_profile(request.model_profile)
264
+ profile = get_profile(request.model_profile, **({"endpoint": self.endpoint} if self.endpoint else {}))
261
265
  except ValueError:
262
266
  return self._policy_failure(
263
267
  "unknown_model_profile",
@@ -56,7 +56,7 @@ Delegates one atomic, proposal-only coding task to a local Ollama model.
56
56
  #### Parameters:
57
57
  - `request_id` *(string, required)*: A unique caller-generated idempotency key (e.g. `task-fix-auth-01`).
58
58
  - `workspace_ref` *(string, required)*: The registered workspace identifier (usually `"workspace"`).
59
- - `model_profile` *(string, required)*: Named profile (e.g. `"qwen2.5-coder"`, `"qwen3-8b-q6k"`, `"devstral-small-2-24b"`).
59
+ - `model_profile` *(string, optional when the server was started with `--profile`)*: Named profile (e.g. `"qwen2.5-coder"`, `"qwen3-8b-q6k"`, `"devstral-small-2-24b"`).
60
60
  - `task` *(object, required)*: The structured task envelope:
61
61
  - `id` *(string)*: Short descriptive identifier (e.g. `"fix-null-dereference"`).
62
62
  - `goal` *(string)*: 1 concise sentence describing the goal.
@@ -147,9 +147,11 @@ if _MCP_AVAILABLE:
147
147
  caller_id: str,
148
148
  ttl_ms: int = _DEFAULT_TTL_MS,
149
149
  poll_interval_ms: int = _DEFAULT_POLL_INTERVAL_MS,
150
+ default_profile: str | None = None,
150
151
  ) -> None:
151
152
  self._pool = pool
152
153
  self._caller_id = caller_id
154
+ self._default_profile = default_profile
153
155
  self._ttl_ms = ttl_ms
154
156
  self._poll_interval_ms = poll_interval_ms
155
157
 
@@ -185,7 +187,7 @@ if _MCP_AVAILABLE:
185
187
  request = DelegationRequest(
186
188
  request_id=arguments.get("request_id"),
187
189
  workspace_ref=arguments.get("workspace_ref"),
188
- model_profile=arguments.get("model_profile"),
190
+ model_profile=arguments.get("model_profile") or self._default_profile,
189
191
  task=TaskEnvelope.from_mapping(arguments.get("task") or {}),
190
192
  )
191
193
  except (TypeError, ValueError):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: local-coding-agent
3
- Version: 1.1.0
3
+ Version: 1.1.1
4
4
  Summary: Harness-agnostic controller delegating atomic coding tasks to local Ollama & llama.cpp models via MCP, Agent Skills, and direct CLI.
5
5
  Author: Local Coding Agent Contributors
6
6
  License: MIT
@@ -15,6 +15,7 @@ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
15
15
  Requires-Python: >=3.10
16
16
  Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
+ Requires-Dist: mcp==2.0.0
18
19
  Provides-Extra: mcp
19
20
  Requires-Dist: mcp==2.0.0; extra == "mcp"
20
21
  Provides-Extra: dev
@@ -25,10 +26,12 @@ Dynamic: license-file
25
26
 
26
27
  # Local Coding Agent
27
28
 
29
+ <!-- mcp-name: io.github.pvnc228/local-coding-agent -->
30
+
28
31
  Local execution and safety layer for delegating coding tasks from cloud agents to models on your own machine.
29
32
 
30
33
  [![CI](https://github.com/pvnc228/local-coding-agent/actions/workflows/ci.yml/badge.svg)](https://github.com/pvnc228/local-coding-agent/actions/workflows/ci.yml)
31
- [![Version](https://img.shields.io/badge/version-1.1.0-blue.svg)](pyproject.toml)
34
+ [![Version](https://img.shields.io/badge/version-1.1.1-blue.svg)](pyproject.toml)
32
35
  [![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/)
33
36
  [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
34
37
 
@@ -53,13 +56,13 @@ The same gate backs `apply_proposal`, `local-agent apply`, and the desktop apply
53
56
 
54
57
  ## Choose your download
55
58
 
56
- ### Current public release: v1.0.4
59
+ ### Current public release: v1.1.0
57
60
 
58
61
  Choose the CLI release for terminal workflows, scripts, CI, or integration with another AI coding environment. It provides the `local-agent` command, MCP server, Agent Skill, diagnostics, sessions, model tools, and task delegation.
59
62
 
60
- [Download the CLI wheel](https://github.com/pvnc228/local-coding-agent/releases/download/v1.0.4/local_coding_agent-1.0.4-py3-none-any.whl) or [CLI source archive](https://github.com/pvnc228/local-coding-agent/releases/download/v1.0.4/local_coding_agent-1.0.4.tar.gz). Windows users can [download the Desktop Harness installer](https://github.com/pvnc228/local-coding-agent/releases/download/v1.0.4/Local.AI.Coding.Harness_1.0.4_x64-setup.exe) and verify the published files with [SHA256SUMS.txt](https://github.com/pvnc228/local-coding-agent/releases/download/v1.0.4/SHA256SUMS.txt).
63
+ [Download the CLI wheel](https://github.com/pvnc228/local-coding-agent/releases/download/v1.1.0/local_coding_agent-1.1.0-py3-none-any.whl) or [CLI source archive](https://github.com/pvnc228/local-coding-agent/releases/download/v1.1.0/local_coding_agent-1.1.0.tar.gz). Windows users can [download the Desktop Harness installer](https://github.com/pvnc228/local-coding-agent/releases/download/v1.1.0/Local.AI.Coding.Harness_1.1.0_x64-setup.exe) and verify the published files with [SHA256SUMS.txt](https://github.com/pvnc228/local-coding-agent/releases/download/v1.1.0/SHA256SUMS.txt).
61
64
 
62
- The `v1.0.4` release contains the CLI archives and the Windows Desktop Harness installer. Local inference remains local; install [Ollama](https://ollama.com/) or run a compatible local model server before requesting live model responses.
65
+ The `v1.1.0` release contains the CLI archives and the Windows Desktop Harness installer. Local inference remains local; install [Ollama](https://ollama.com/) or run a compatible local model server before requesting live model responses.
63
66
 
64
67
  ## Desktop Harness
65
68
 
@@ -91,7 +94,7 @@ Requirements:
91
94
  Install the CLI package:
92
95
 
93
96
  ```bash
94
- pipx install "local-coding-agent[mcp]"
97
+ pipx install local-coding-agent
95
98
  ```
96
99
 
97
100
  Or install from a checkout:
@@ -99,7 +102,7 @@ Or install from a checkout:
99
102
  ```bash
100
103
  git clone https://github.com/pvnc228/local-coding-agent.git
101
104
  cd local-coding-agent
102
- python -m pip install -e ".[mcp]"
105
+ python -m pip install -e .
103
106
  ```
104
107
 
105
108
  Check the installation:
@@ -1,3 +1,4 @@
1
+ mcp==2.0.0
1
2
 
2
3
  [desktop]
3
4
  pywebview>=5.0.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "local-coding-agent"
7
- version = "1.1.0"
7
+ version = "1.1.1"
8
8
 
9
9
  description = "Harness-agnostic controller delegating atomic coding tasks to local Ollama & llama.cpp models via MCP, Agent Skills, and direct CLI."
10
10
 
@@ -22,12 +22,14 @@ classifiers = [
22
22
  "Topic :: Software Development :: Code Generators",
23
23
  "Topic :: Scientific/Engineering :: Artificial Intelligence",
24
24
  ]
25
+ dependencies = ["mcp==2.0.0"]
25
26
 
26
27
  [project.scripts]
27
28
  local-agent = "local_coding_agent.cli:main"
28
29
  local-coding-agent = "local_coding_agent.cli:main"
29
30
 
30
31
  [project.optional-dependencies]
32
+ # Kept so existing `local-coding-agent[mcp]` installs keep resolving; the SDK is a core dependency.
31
33
  mcp = ["mcp==2.0.0"]
32
34
  dev = ["pytest"]
33
35
  desktop = ["pywebview>=5.0.0"]
@@ -108,6 +108,21 @@ class CliTests(unittest.TestCase):
108
108
  self.assertEqual(args.workspace, "c:/code")
109
109
  self.assertTrue(args.enable_tasks)
110
110
 
111
+ def test_serve_mcp_passes_profile_and_endpoint_to_service(self):
112
+ from local_coding_agent.cli._handlers2 import _handle_serve_mcp
113
+
114
+ with tempfile.TemporaryDirectory() as temp_dir:
115
+ args = build_parser().parse_args(
116
+ ["serve-mcp", "--workspace", temp_dir, "--profile", "qwen3-8b-q6k", "--endpoint", "http://127.0.0.1:8080"]
117
+ )
118
+ with mock.patch("local_coding_agent.mcp_server.build_server") as build_server:
119
+ self.assertEqual(_handle_serve_mcp(args), 0)
120
+
121
+ service = build_server.call_args.args[0]
122
+ self.assertEqual(service.default_profile, "qwen3-8b-q6k")
123
+ self.assertEqual(service.endpoint, "http://127.0.0.1:8080")
124
+ build_server.return_value.run.assert_called_once_with(transport="stdio")
125
+
111
126
  def test_cli_subcommand_monitor(self):
112
127
  args = build_parser().parse_args(["monitor", "--port", "9000"])
113
128
  self.assertEqual(args.subcommand, "monitor")
@@ -81,6 +81,32 @@ class McpSdkServerTests(unittest.TestCase):
81
81
  self.assertEqual(result.structured_content["status"], "accepted")
82
82
  self.assertFalse(result.structured_content.get("applied", False))
83
83
 
84
+ def test_delegate_code_uses_server_default_profile_when_omitted(self):
85
+ profiles = []
86
+ with tempfile.TemporaryDirectory() as temp_dir:
87
+ workspace = Path(temp_dir)
88
+ (workspace / "allowed.py").write_text("VALUE = 1\n", encoding="utf-8")
89
+ service = DelegationService(
90
+ {"fixture": workspace},
91
+ model_factory=lambda profile: profiles.append(profile.name) or FakeModel(),
92
+ default_profile="qwen2.5-1.5b",
93
+ )
94
+ server = build_server(service)
95
+ args = self._arguments()
96
+ del args["model_profile"]
97
+
98
+ async def run():
99
+ from mcp.client import Client
100
+
101
+ async with Client(server) as client:
102
+ return await client.call_tool("delegate_code", args)
103
+
104
+ result = asyncio.run(run())
105
+
106
+ self.assertFalse(result.is_error)
107
+ self.assertEqual(result.structured_content["status"], "accepted")
108
+ self.assertEqual(profiles, ["qwen2.5-1.5b"])
109
+
84
110
  def test_delegate_code_unknown_workspace_is_error(self):
85
111
  with tempfile.TemporaryDirectory() as temp_dir:
86
112
  server = build_server(self._service(Path(temp_dir)))
@@ -126,6 +126,23 @@ class DelegationServiceTests(unittest.TestCase):
126
126
  self.assertEqual(unknown_profile["error"]["kind"], "unknown_model_profile")
127
127
  self.assertEqual(calls, [])
128
128
 
129
+ def test_endpoint_override_applies_to_resolved_profile(self):
130
+ profiles = []
131
+ with tempfile.TemporaryDirectory() as temp_dir:
132
+ workspace = Path(temp_dir)
133
+ (workspace / "allowed.py").write_text("VALUE = 1\n", encoding="utf-8")
134
+ model = FakeModel(self._candidate())
135
+ service = DelegationService(
136
+ {"fixture": workspace},
137
+ model_factory=lambda profile: profiles.append(profile) or model,
138
+ endpoint="http://127.0.0.1:8080",
139
+ )
140
+
141
+ result = service.delegate("caller-a", self._request())
142
+
143
+ self.assertEqual(result["status"], "accepted")
144
+ self.assertEqual([profile.endpoint for profile in profiles], ["http://127.0.0.1:8080"])
145
+
129
146
  def test_rejects_reused_request_id_with_a_different_payload(self):
130
147
  with tempfile.TemporaryDirectory() as temp_dir:
131
148
  workspace = Path(temp_dir)
@@ -106,6 +106,8 @@ class FailingModel:
106
106
 
107
107
 
108
108
  class MixedBlockingService:
109
+ default_profile = None
110
+
109
111
  def __init__(self):
110
112
  self.started = Event()
111
113
  self.overlap = Event()
@@ -10,7 +10,7 @@ from pathlib import Path
10
10
 
11
11
 
12
12
  ROOT = Path(__file__).resolve().parents[1]
13
- PUBLIC_RELEASE_VERSION = "1.0.4"
13
+ PUBLIC_RELEASE_VERSION = "1.1.0"
14
14
 
15
15
 
16
16
  def _project_version() -> str:
@@ -54,6 +54,27 @@ def test_all_release_metadata_matches_pyproject_version():
54
54
  )
55
55
 
56
56
 
57
+ def test_mcp_registry_metadata_matches_the_pypi_package():
58
+ expected = _project_version()
59
+ server = json.loads((ROOT / "server.json").read_text(encoding="utf-8-sig"))
60
+ pyproject = (ROOT / "pyproject.toml").read_text(encoding="utf-8-sig")
61
+ readme = (ROOT / "README.md").read_text(encoding="utf-8-sig")
62
+ (package,) = server["packages"]
63
+
64
+ assert server["name"] == "io.github.pvnc228/local-coding-agent"
65
+ assert len(server["description"]) <= 100
66
+ assert server["version"] == expected
67
+ assert package["registryType"] == "pypi"
68
+ assert package["identifier"] == re.search(r'^name\s*=\s*"([^"]+)"', pyproject, re.MULTILINE).group(1)
69
+ assert package["version"] == expected
70
+ assert package["transport"] == {"type": "stdio"}
71
+ # The registry verifies PyPI ownership through this marker in the published README.
72
+ assert re.search(rf"mcp-name: {re.escape(server['name'])}(?:\s|-->)", readme)
73
+ # Registry clients launch the bare package, so the MCP SDK cannot be an optional extra.
74
+ dependencies = re.search(r"^dependencies\s*=\s*\[(.*?)\]", pyproject, re.MULTILINE | re.DOTALL)
75
+ assert dependencies and '"mcp==' in dependencies.group(1)
76
+
77
+
57
78
  def test_ci_and_release_workflows_gate_and_publish_the_windows_installer():
58
79
  ci = (ROOT / ".github" / "workflows" / "ci.yml").read_text(encoding="utf-8-sig")
59
80
  release = (ROOT / ".github" / "workflows" / "release.yml").read_text(encoding="utf-8-sig")