forge-cpp-mcp 0.3.0__tar.gz → 0.5.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 (174) hide show
  1. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/PKG-INFO +204 -11
  2. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/README.md +203 -10
  3. forge_cpp_mcp-0.5.0/frontend/debugger-result.html +12 -0
  4. forge_cpp_mcp-0.5.0/frontend/git-result.html +12 -0
  5. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/package-lock.json +1 -0
  6. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/package.json +2 -1
  7. forge_cpp_mcp-0.5.0/frontend/src/admin-form.js +388 -0
  8. forge_cpp_mcp-0.5.0/frontend/src/admin-resource.js +260 -0
  9. forge_cpp_mcp-0.5.0/frontend/src/admin.css +146 -0
  10. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/admin.js +290 -117
  11. forge_cpp_mcp-0.5.0/frontend/src/debugger-result.js +37 -0
  12. forge_cpp_mcp-0.5.0/frontend/src/git-result.js +9 -0
  13. forge_cpp_mcp-0.5.0/frontend/src/git-view.js +510 -0
  14. forge_cpp_mcp-0.5.0/frontend/src/git.css +99 -0
  15. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/shared/result-view.js +1 -1
  16. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/vite.config.js +4 -0
  17. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/hatch_build.py +1 -0
  18. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/pyproject.toml +1 -1
  19. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/__init__.py +1 -1
  20. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/admin/instance.py +24 -3
  21. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/admin/service.py +10 -1
  22. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/clangd/errors.py +3 -1
  23. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/clangd/service.py +107 -13
  24. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/clangd/session.py +29 -7
  25. forge_cpp_mcp-0.5.0/src/forgemcp/cmake/build_tree.py +221 -0
  26. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/cmake/file_api.py +59 -13
  27. forge_cpp_mcp-0.5.0/src/forgemcp/cmake/profiles.py +298 -0
  28. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/cmake/service.py +304 -299
  29. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/cmake/workspace.py +11 -11
  30. forge_cpp_mcp-0.5.0/src/forgemcp/debugger/__init__.py +1 -0
  31. forge_cpp_mcp-0.5.0/src/forgemcp/debugger/errors.py +34 -0
  32. forge_cpp_mcp-0.5.0/src/forgemcp/debugger/lldb_dap.py +1524 -0
  33. forge_cpp_mcp-0.5.0/src/forgemcp/debugger/models.py +451 -0
  34. forge_cpp_mcp-0.5.0/src/forgemcp/debugger/service.py +657 -0
  35. forge_cpp_mcp-0.5.0/src/forgemcp/debugger/session.py +184 -0
  36. forge_cpp_mcp-0.5.0/src/forgemcp/debugger/text.py +52 -0
  37. forge_cpp_mcp-0.5.0/src/forgemcp/diagnostics.py +58 -0
  38. forge_cpp_mcp-0.5.0/src/forgemcp/git/__init__.py +1 -0
  39. forge_cpp_mcp-0.5.0/src/forgemcp/git/errors.py +9 -0
  40. forge_cpp_mcp-0.5.0/src/forgemcp/git/models.py +199 -0
  41. forge_cpp_mcp-0.5.0/src/forgemcp/git/parsers.py +173 -0
  42. forge_cpp_mcp-0.5.0/src/forgemcp/git/service.py +1258 -0
  43. forge_cpp_mcp-0.5.0/src/forgemcp/git/text.py +167 -0
  44. forge_cpp_mcp-0.5.0/src/forgemcp/icons/debugger.svg +6 -0
  45. forge_cpp_mcp-0.5.0/src/forgemcp/icons/git.svg +1 -0
  46. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/process/host.py +52 -0
  47. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/process/models.py +8 -2
  48. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/process/service.py +111 -18
  49. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/server.py +148 -10
  50. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/service.py +36 -13
  51. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/clangd.py +7 -3
  52. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/cmake.py +23 -4
  53. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/ctest.py +34 -5
  54. forge_cpp_mcp-0.5.0/src/forgemcp/toolchain/tools/git.py +231 -0
  55. forge_cpp_mcp-0.5.0/src/forgemcp/toolchain/tools/lldb_dap.py +339 -0
  56. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/path.py +35 -7
  57. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/service.py +283 -61
  58. forge_cpp_mcp-0.3.0/frontend/src/admin.css +0 -82
  59. forge_cpp_mcp-0.3.0/src/forgemcp/cmake/build_tree.py +0 -67
  60. forge_cpp_mcp-0.3.0/src/forgemcp/cmake/profiles.py +0 -119
  61. forge_cpp_mcp-0.3.0/src/forgemcp/toolchain/tools/git.py +0 -65
  62. forge_cpp_mcp-0.3.0/src/forgemcp/toolchain/tools/lldb_dap.py +0 -28
  63. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/.gitignore +0 -0
  64. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/LICENSE +0 -0
  65. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/admin.html +0 -0
  66. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/clangd-result.html +0 -0
  67. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/cmake-build.html +0 -0
  68. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/cmake-configure.html +0 -0
  69. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/cmake-profiles.html +0 -0
  70. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/cmake-run-test.html +0 -0
  71. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/cmake-test.html +0 -0
  72. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/process-details.html +0 -0
  73. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/process-overview.html +0 -0
  74. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/sandbox.html +0 -0
  75. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/admin-sandbox.js +0 -0
  76. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/admin-widget.js +0 -0
  77. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/clangd-navigation-view.js +0 -0
  78. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/clangd-result.js +0 -0
  79. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/clangd-view.js +0 -0
  80. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/cmake-build.js +0 -0
  81. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/cmake-configure.js +0 -0
  82. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/cmake-profiles.js +0 -0
  83. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/cmake-run-test.js +0 -0
  84. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/cmake-test.js +0 -0
  85. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/cmake-view.js +0 -0
  86. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/process-details.js +0 -0
  87. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/process-overview.js +0 -0
  88. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/process-status.js +0 -0
  89. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/process.css +0 -0
  90. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/shared/app.js +0 -0
  91. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/shared/copy-icon.js +0 -0
  92. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/shared/presentation.js +0 -0
  93. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/shared/result-resources.js +0 -0
  94. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/shared/widget.css +0 -0
  95. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/source-view.js +0 -0
  96. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/toolsets.js +0 -0
  97. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/workspace-file.js +0 -0
  98. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/workspace-result.js +0 -0
  99. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/workspace-search.js +0 -0
  100. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/workspace-tree.js +0 -0
  101. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/src/workspace-view.js +0 -0
  102. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/tests/admin-widget.test.js +0 -0
  103. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/tests/result-resources.test.js +0 -0
  104. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/tests/result-view.test.js +0 -0
  105. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/tests/workspace.test.js +0 -0
  106. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/toolsets.html +0 -0
  107. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/workspace-file.html +0 -0
  108. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/workspace-result.html +0 -0
  109. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/workspace-search.html +0 -0
  110. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/frontend/workspace-tree.html +0 -0
  111. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/admin/__init__.py +0 -0
  112. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/admin/errors.py +0 -0
  113. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/admin/history.py +0 -0
  114. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/assets.py +0 -0
  115. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/clangd/__init__.py +0 -0
  116. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/clangd/models.py +0 -0
  117. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/clangd/text.py +0 -0
  118. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/cmake/__init__.py +0 -0
  119. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/cmake/errors.py +0 -0
  120. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/cmake/models.py +0 -0
  121. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/cmake/text.py +0 -0
  122. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/completion.py +0 -0
  123. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/clangd.LICENSE +0 -0
  124. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/clangd.svg +0 -0
  125. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/cmake.svg +0 -0
  126. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/process.svg +0 -0
  127. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/toolchain.svg +0 -0
  128. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/workspace-edit.svg +0 -0
  129. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/workspace-file.svg +0 -0
  130. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/workspace-search.svg +0 -0
  131. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/workspace.svg +0 -0
  132. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/local_ipc/__init__.py +0 -0
  133. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/local_ipc/errors.py +0 -0
  134. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/local_ipc/service.py +0 -0
  135. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/local_ipc/unix.py +0 -0
  136. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/local_ipc/windows.py +0 -0
  137. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/markdown.py +0 -0
  138. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/process/__init__.py +0 -0
  139. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/process/errors.py +0 -0
  140. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/process/text.py +0 -0
  141. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/process/transcript.py +0 -0
  142. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/progress.py +0 -0
  143. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/text.py +0 -0
  144. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/__init__.py +0 -0
  145. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/discovery.py +0 -0
  146. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/errors.py +0 -0
  147. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/loader.py +0 -0
  148. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/providers/__init__.py +0 -0
  149. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/providers/system.py +0 -0
  150. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/providers/user.py +0 -0
  151. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/providers/visual_studio.py +0 -0
  152. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/spec.py +0 -0
  153. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/__init__.py +0 -0
  154. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/clang.py +0 -0
  155. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/clang_cl.py +0 -0
  156. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/clangxx.py +0 -0
  157. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/cppvsdbg.py +0 -0
  158. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/gcc.py +0 -0
  159. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/gdb.py +0 -0
  160. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/gxx.py +0 -0
  161. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/link.py +0 -0
  162. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/lld.py +0 -0
  163. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/lld_link.py +0 -0
  164. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/make.py +0 -0
  165. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/msbuild.py +0 -0
  166. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/msvc.py +0 -0
  167. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/ninja.py +0 -0
  168. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/__init__.py +0 -0
  169. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/diff.py +0 -0
  170. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/errors.py +0 -0
  171. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/metadata.py +0 -0
  172. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/models.py +0 -0
  173. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/providers.py +0 -0
  174. {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/text.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: forge-cpp-mcp
3
- Version: 0.3.0
3
+ Version: 0.5.0
4
4
  Summary: A safe MCP server for structured C++ project development workflows.
5
5
  Project-URL: Homepage, https://github.com/hardened-steel/ForgeMCP
6
6
  Project-URL: Repository, https://github.com/hardened-steel/ForgeMCP
@@ -32,8 +32,8 @@ Description-Content-Type: text/markdown
32
32
  ForgeMCP is a Python MCP server for structured C and C++ development workflows.
33
33
  The repository contains workspace, process, toolchain, and initial CMake services.
34
34
  Clangd tools provide read-only analysis across CMake configurations with a shared
35
- result widget. External file reads ask for confirmation through MCP elicitation. Quality and
36
- debugger modules are planned.
35
+ result widget. External file reads ask for confirmation through MCP elicitation.
36
+ The debugger uses LLDB-DAP for native program control and dump inspection; Quality remains planned.
37
37
 
38
38
  ## Current MCP surface
39
39
 
@@ -47,6 +47,13 @@ debugger modules are planned.
47
47
  definitions, references, document symbols, and workspace symbols. Empty
48
48
  configuration selections use all available contexts.
49
49
  - No prompts are currently registered.
50
+ - Debugger tools launch native programs, attach to local PIDs, and open user-mode
51
+ dumps through an explicitly selected LLDB-DAP toolset. They inspect threads,
52
+ stacks, variables, modules, exceptions, memory, and instructions with typed results.
53
+ - Git tools inspect and modify the repository rooted at the workspace: status,
54
+ diffs, history, blame, branches/tags/remotes, staging, commits, restore, stash,
55
+ fetch/pull/push, merge/rebase/cherry-pick/revert, and conflict stages and continuation.
56
+ Every tool has typed data, plain text, a shared Git App, and process provenance.
50
57
  - CMake tools list operator profiles, configure projects, build targets, and run
51
58
  CTest. `cmake_run_test` directly runs a project/storage test executable with
52
59
  literal command-line arguments. Each tool has its own widget with Fields/JSON views,
@@ -100,7 +107,7 @@ and install it in a virtual environment:
100
107
 
101
108
  ```powershell
102
109
  python -m venv .venv
103
- .\.venv\Scripts\python.exe -m pip install .\forge_cpp_mcp-0.3.0-py3-none-any.whl
110
+ .\.venv\Scripts\python.exe -m pip install .\forge_cpp_mcp-0.5.0-py3-none-any.whl
104
111
  .\.venv\Scripts\forgemcp.exe --help
105
112
  ```
106
113
 
@@ -113,7 +120,7 @@ The distribution name is `forge-cpp-mcp`; the Python module and server command a
113
120
  After the package is published to PyPI, the install command can instead be:
114
121
 
115
122
  ```powershell
116
- .\.venv\Scripts\python.exe -m pip install forge-cpp-mcp==0.3.0
123
+ .\.venv\Scripts\python.exe -m pip install forge-cpp-mcp==0.5.0
117
124
  ```
118
125
 
119
126
  ## Setup from source
@@ -187,11 +194,16 @@ Each instance tab offers:
187
194
  confirmation for commands initiated from the panel.
188
195
 
189
196
  Settings are read-only. Command controls start hidden; select **Enable command
190
- controls** to call an existing tool with literal JSON arguments; the catalog shows
191
- its input schema. These
197
+ controls** to call an existing tool using fields generated from its input schema.
198
+ JSON input remains available for complete arguments. Resource templates provide
199
+ parameter fields and native MCP completion suggestions, using other entered
200
+ parameters as context. These
192
201
  calls pass through the same SDK handlers, validation, and feature locks as stdio
193
202
  calls. There is no panel-wide execution queue. Existing modules decide which
194
203
  operations may run concurrently.
204
+ Debugger tools are excluded from the admin command catalog and rejected by the
205
+ admin bridge even when their names are submitted directly. They remain available
206
+ to MCP clients; completed MCP results can still be reviewed in history.
195
207
  The panel can cancel its own running commands; calls initiated by an MCP client
196
208
  remain owned by that client.
197
209
 
@@ -399,9 +411,19 @@ no source preview because explicit external reads require confirmation.
399
411
  CMake owns which configurations can supply clangd compilation contexts. After a
400
412
  successful configure/generate, ForgeMCP reads `cmakeFiles-v1` from a new CMake
401
413
  File API reply and records SHA-256 hashes of that build directory's configuration
402
- inputs in `project/` and `storage/`. Hashes and dependency lists live in memory;
403
- restart the server and run `cmake_configure` to confirm contexts again. Existing
404
- File API replies and `compile_commands.json` alone do not confirm current inputs.
414
+ inputs in `project/` and `storage/`. Hashes and dependency lists live in memory.
415
+ Each server startup configures all effective profiles once in the background after
416
+ toolset discovery and clangd subscription setup. MCP requests remain available;
417
+ clangd receives contexts as individual profiles finish. Existing File API replies
418
+ and `compile_commands.json` alone do not confirm current inputs.
419
+
420
+ Startup uses the same configure settings, build-directory ownership checks,
421
+ generator-change cleanup, and 600-second per-command timeout as `cmake_configure`.
422
+ One failed profile does not stop the remaining profiles or the server. The admin
423
+ panel's CMake monitor retains startup results, process IDs, and any batch error;
424
+ command transcripts remain available through `process_get`. A second client of
425
+ the same server does not repeat startup configuration. Server shutdown cancels
426
+ and awaits startup configure before closing clangd and managed processes.
405
427
 
406
428
  Workspace writes, edits, moves, deletions, and directory creation check known
407
429
  inputs at the operation boundary. Actual input changes withdraw affected contexts
@@ -520,6 +542,153 @@ The initial CMake slice does not yet include clean/project-inspection tools
520
542
  or syntax highlighting. Unit and in-process MCP tests cover profiles,
521
543
  command parsing, generator changes, result resources, and qualified paths.
522
544
 
545
+ ## Debugging
546
+
547
+ Install `lldb-dap` in a discovered toolset, or supply its absolute executable path
548
+ with the existing `--toolset NAME lldb-dap=PATH` operator option. Use
549
+ `debugger_adapters` to obtain the available adapter and toolset IDs. No adapter
550
+ starts until `debugger_launch`, `debugger_attach`, or `debugger_open_dump` is called.
551
+ Debugging does not require CMake or a compilation database and does not rebuild a program.
552
+
553
+ `debugger_launch` takes a `toolset_id`, `options`, and optional `initial` breakpoint
554
+ plan. `options.executable` and `options.cwd` are project/storage paths;
555
+ `arguments` are literal strings. `stop_on_entry` defaults to true. For example:
556
+
557
+ ```json
558
+ {
559
+ "toolset_id": "system",
560
+ "options": {
561
+ "executable": "storage/build/debug/app.exe",
562
+ "arguments": ["--example"],
563
+ "cwd": "project/"
564
+ },
565
+ "initial": {
566
+ "sources": [
567
+ {"source": "project/src/main.cpp", "points": [{"line": 20}]}
568
+ ]
569
+ }
570
+ }
571
+ ```
572
+
573
+ Attach supplies `options.pid`, an optional `expected_started_at` process birth
574
+ time, and an optional managed `executable`. Dump inspection supplies
575
+ `options.dump_file` and an optional matching executable. Both accept
576
+ `source_mappings` and `symbol_directories`. Dump and symbol inputs must stay in
577
+ project/storage. Source locations may name external `root/` files; the debugger
578
+ does not read them automatically. Source locations are marked unverified against
579
+ the loaded binary, so changed files are not presented as confirmed build-time source.
580
+ PDB, DWARF, and dump compatibility depend on the installed LLDB build and target.
581
+
582
+ Keep the returned `session_id`. `debugger_sessions` lists retained snapshots;
583
+ `debugger_get` reads one without contacting the adapter. Each snapshot has one
584
+ `status` field: null, `kind=stopped` with stop details, `kind=exited` with the
585
+ confirmed target exit code, or `kind=failed` with a session failure message.
586
+ Connection `phase` and `target_state` distinguish adapter failure, target execution,
587
+ partial thread stops, and dump inspection.
588
+ Each runtime retains at most 128 sessions, including closed sessions; restart it
589
+ to release that history when the limit is reached.
590
+
591
+ Launch, attach, `debugger_continue`, `debugger_step`, and `debugger_pause` return
592
+ an execution reference. Pass it to `debugger_wait` with the same session ID.
593
+ The wait returns a saved stop/terminal observation, or a timeout with the current
594
+ snapshot; timeout and cancellation of a wait leave the target running. Execution
595
+ observations are bounded and can expire. After an uncertain command outcome, read
596
+ state before deciding whether to repeat a control operation.
597
+
598
+ Construct a stop token from `session_id` and `inspection_generation` in a stopped
599
+ snapshot. Use `debugger_threads`, `debugger_stack`, `debugger_scopes`, and
600
+ `debugger_variables` to inspect state. Frame, variable, and memory handles belong
601
+ to that session and generation; continuing execution invalidates them. Stack,
602
+ variables, and modules accept bounded `page` windows. Memory and disassembly take
603
+ explicit bounded counts. `debugger_exception_info` supplies supported exception
604
+ details. Available operations and exception filters appear in `capabilities`.
605
+
606
+ Errors identify the affected JSON field and link retained session and adapter
607
+ process information. Use the suggested `debugger_get` and `process_get` calls to
608
+ inspect an unconfirmed command before deciding on further execution. Invalid initial
609
+ source paths are rejected before launching the target. Raw adapter error payloads,
610
+ argument text, and environment values are kept out of error messages.
611
+ Breakpoints are managed through `debugger_breakpoints`,
612
+ `debugger_function_breakpoints`, and `debugger_exception_breakpoints`.
613
+ Setting source or function breakpoints replaces the complete selected set.
614
+
615
+ `debugger_close` terminates a program launched by that session, detaches from an
616
+ attached program, or releases a dump. Its result distinguishes adapter closure
617
+ from the confirmed target disposition. Server shutdown closes all debugger
618
+ sessions before the process service. Each adapter's `adapter_process_id` identifies
619
+ its retained transport transcript for `process_get`; that transcript contains DAP
620
+ messages, including adapter output events. The module exposes no arbitrary
621
+ debugger console, expression execution, memory/variable writes, terminal input,
622
+ remote debugging, or kernel debugging.
623
+
624
+ Every debugger tool has readable text, typed structured data, progress, an icon,
625
+ and a result-only App. The App renders the saved invocation and performs no debugger
626
+ calls. Debugger commands cannot be run from the admin panel.
627
+
628
+ ## Git operations
629
+
630
+ Git uses the executable and environment of `--git-toolset ID_OR_NAME` (default:
631
+ `system`). It must be installed in that toolset. ForgeMCP does not initialize,
632
+ clone, create, move, or remove worktrees. Run one instance in each desired worktree;
633
+ the admin panel exposes their independent tools and histories in separate tabs.
634
+ The configured workspace must be the repository's worktree root. Linked worktrees
635
+ work normally: Git itself accesses their shared repository metadata, without
636
+ extending Workspace access to external source files.
637
+
638
+ Read tools are `git_status`, `git_diff`, `git_log`, `git_show`, `git_blame`,
639
+ `git_branches`, `git_tags`, `git_remotes`, and `git_conflicts`. `git_diff` selects
640
+ `unstaged`, `staged`, or `revision` comparisons; revision comparisons require `base`
641
+ and optionally `target`. Log pages return a resolved revision and `next_skip`;
642
+ reuse both to keep pagination anchored. Show uses the first parent for merges.
643
+ Conflict results include available base/ours/theirs object IDs, modes, and UTF-8
644
+ text; binary or gitlink stages retain metadata without invented text.
645
+
646
+ `git_stage(paths)`, `git_unstage(paths)`, and `git_restore(paths, source=null)` use
647
+ explicit literal project paths. Restore discards working-file changes using the
648
+ index or the selected committed source. `git_commit(message, amend=false)` commits
649
+ the current index. `git_branch` creates/deletes local branches; force deletion is
650
+ explicit. `git_switch` optionally creates a branch. `git_stash` supports list,
651
+ save, apply, pop, and drop, returning one consistent action-result schema.
652
+
653
+ `git_fetch` selects a configured remote and optionally prunes remote-tracking
654
+ refs. `git_pull` defaults to fast-forward only; `strategy=merge` or `rebase` is
655
+ explicit. These operations never automatically stash local changes. `git_push`
656
+ pushes HEAD to one destination branch; replacing published history requires
657
+ `expected_remote_oid`, used as an explicit force-with-lease expectation. No raw
658
+ force-push or arbitrary Git command tool is exposed. Credentials come from the
659
+ operator's Git/SSH configuration; tools do not accept passwords or tokens.
660
+
661
+ `git_merge`, `git_rebase`, `git_cherry_pick`, and `git_revert` preserve unfinished
662
+ operations. Cherry-pick/revert accept a mainline parent for merge commits.
663
+ Resolve conflicts using Workspace tools, stage the resolutions, then call
664
+ `git_continue(action=continue|abort|skip)`. Skip applies only to operations that
665
+ support it. Normal installed Git hooks remain enabled. A nonzero command may
666
+ leave conflicts or other partial changes: mutation results report `error`, actual
667
+ resulting HEAD, unfinished operation, conflicts, and `process_ids`. Inspect status
668
+ after interruption before deciding whether to retry. A secondary synchronization
669
+ failure is reported separately from a successfully completed Git operation.
670
+
671
+ Mutations share Workspace serialization and coordinate with CMake and clangd.
672
+ CMake alone determines compilation-context eligibility and notifies clangd through
673
+ its existing subscription. Source notifications combine Git dirty paths and
674
+ committed tree changes; unknown changes use conservative invalidation. No external
675
+ file watcher or cross-instance execution queue is added.
676
+
677
+ Git output is bounded to 4 MiB per command; narrow the request when the limit is
678
+ exceeded. Each command has a 300-second deadline and each request a 620-second
679
+ deadline. Machine names/metadata must be UTF-8; patches explicitly report decoding
680
+ replacement. Full process transcripts retain their existing ProcessService owner.
681
+ `forgemcp://git/status` is the last captured status, not a live scan.
682
+ `forgemcp://git/commits/{revision}` serves previously captured log/show metadata
683
+ with completion over retained revisions. These snapshots, the Git monitor, and
684
+ history disappear when the instance stops. The Git App displays one invocation:
685
+ status separates staged and working changes, history puts commit messages first,
686
+ and patches show file groups and line numbers with a wrap toggle. Blame keeps source
687
+ and attribution together; conflict views distinguish base, ours, theirs, missing
688
+ stages, and binary content. Errors and analysis-refresh warnings appear before
689
+ the current repository state. Local search, expandable details, individual copying,
690
+ and complete original JSON remain available; the widget never executes Git actions.
691
+
523
692
  ## Toolchain discovery
524
693
 
525
694
  Before serving requests, ForgeMCP discovers one System toolset from `PATH` and, on
@@ -553,7 +722,8 @@ Built-ins cover CMake, CTest, Ninja, Make, MSBuild, MSVC (`cl`), `link`, Clang,
553
722
  `cppvsdbg`. The last adapter may be found as `OpenDebugAD7.exe` or VS Code's bundled
554
723
  `vsdbg.exe`; it has no portable version probe. An unknown or failed version probe
555
724
  leaves the discovered path available with a null version. Version methods for `cl`,
556
- `link`, `cppvsdbg`, and `lldb-dap` are not implemented in this iteration.
725
+ `link`, and `cppvsdbg` are not implemented. LLDB-DAP has a version probe and a
726
+ typed framed connection used by debugger sessions.
557
727
 
558
728
  Toolsets are discovered once per server lifetime; restart to discover changed
559
729
  installations. Detail tools and resources query available versions on each request,
@@ -562,6 +732,29 @@ without caching them. Listing toolsets does not launch version probes. All probe
562
732
  overview and retain their transcripts. Toolset resources omit environments; the
563
733
  environment capture's stdout is retained in its ordinary process transcript.
564
734
 
735
+ ## Understanding tool errors
736
+
737
+ Expected tool errors name the invalid argument or missing prerequisite and explain
738
+ how to correct it. Small catalogs list available values; larger catalogs point to
739
+ an existing listing tool such as `toolsets_list`, `cmake_profiles`,
740
+ `clangd_configurations`, `processes_overview`, or `git_remotes`. Unknown argument
741
+ names are rejected instead of being silently ignored, with spelling suggestions
742
+ when possible. Process transcript selector errors describe their valid JSON forms.
743
+
744
+ For example, an unknown profile identifies `profiles` and either lists its valid
745
+ names or recommends `cmake_profiles()`. A bad edit identifies `old_text` and suggests
746
+ reading the current file or choosing a unique fragment, without repeating source
747
+ text. Toolset installation and profile configuration errors explicitly require
748
+ operator setup; toolsets are discovered once at startup.
749
+
750
+ When a command started, use its returned process ID with `process_get` to read its
751
+ transcript. CMake profile failures and Git mutation failures remain in the result's
752
+ `error` fields even when the MCP exchange itself succeeded. A mutation may have
753
+ partially completed; inspect the returned state and `git_status` before repeating
754
+ Git operations. A synchronization warning after a completed operation does not mean
755
+ the commit or push should be repeated. Retained process and result-resource IDs
756
+ belong to the current server process and disappear when it stops.
757
+
565
758
  ## Tests
566
759
 
567
760
  Tests that need a C/C++ workspace use the shared `cpp_acceptance_project` fixture from
@@ -3,8 +3,8 @@
3
3
  ForgeMCP is a Python MCP server for structured C and C++ development workflows.
4
4
  The repository contains workspace, process, toolchain, and initial CMake services.
5
5
  Clangd tools provide read-only analysis across CMake configurations with a shared
6
- result widget. External file reads ask for confirmation through MCP elicitation. Quality and
7
- debugger modules are planned.
6
+ result widget. External file reads ask for confirmation through MCP elicitation.
7
+ The debugger uses LLDB-DAP for native program control and dump inspection; Quality remains planned.
8
8
 
9
9
  ## Current MCP surface
10
10
 
@@ -18,6 +18,13 @@ debugger modules are planned.
18
18
  definitions, references, document symbols, and workspace symbols. Empty
19
19
  configuration selections use all available contexts.
20
20
  - No prompts are currently registered.
21
+ - Debugger tools launch native programs, attach to local PIDs, and open user-mode
22
+ dumps through an explicitly selected LLDB-DAP toolset. They inspect threads,
23
+ stacks, variables, modules, exceptions, memory, and instructions with typed results.
24
+ - Git tools inspect and modify the repository rooted at the workspace: status,
25
+ diffs, history, blame, branches/tags/remotes, staging, commits, restore, stash,
26
+ fetch/pull/push, merge/rebase/cherry-pick/revert, and conflict stages and continuation.
27
+ Every tool has typed data, plain text, a shared Git App, and process provenance.
21
28
  - CMake tools list operator profiles, configure projects, build targets, and run
22
29
  CTest. `cmake_run_test` directly runs a project/storage test executable with
23
30
  literal command-line arguments. Each tool has its own widget with Fields/JSON views,
@@ -71,7 +78,7 @@ and install it in a virtual environment:
71
78
 
72
79
  ```powershell
73
80
  python -m venv .venv
74
- .\.venv\Scripts\python.exe -m pip install .\forge_cpp_mcp-0.3.0-py3-none-any.whl
81
+ .\.venv\Scripts\python.exe -m pip install .\forge_cpp_mcp-0.5.0-py3-none-any.whl
75
82
  .\.venv\Scripts\forgemcp.exe --help
76
83
  ```
77
84
 
@@ -84,7 +91,7 @@ The distribution name is `forge-cpp-mcp`; the Python module and server command a
84
91
  After the package is published to PyPI, the install command can instead be:
85
92
 
86
93
  ```powershell
87
- .\.venv\Scripts\python.exe -m pip install forge-cpp-mcp==0.3.0
94
+ .\.venv\Scripts\python.exe -m pip install forge-cpp-mcp==0.5.0
88
95
  ```
89
96
 
90
97
  ## Setup from source
@@ -158,11 +165,16 @@ Each instance tab offers:
158
165
  confirmation for commands initiated from the panel.
159
166
 
160
167
  Settings are read-only. Command controls start hidden; select **Enable command
161
- controls** to call an existing tool with literal JSON arguments; the catalog shows
162
- its input schema. These
168
+ controls** to call an existing tool using fields generated from its input schema.
169
+ JSON input remains available for complete arguments. Resource templates provide
170
+ parameter fields and native MCP completion suggestions, using other entered
171
+ parameters as context. These
163
172
  calls pass through the same SDK handlers, validation, and feature locks as stdio
164
173
  calls. There is no panel-wide execution queue. Existing modules decide which
165
174
  operations may run concurrently.
175
+ Debugger tools are excluded from the admin command catalog and rejected by the
176
+ admin bridge even when their names are submitted directly. They remain available
177
+ to MCP clients; completed MCP results can still be reviewed in history.
166
178
  The panel can cancel its own running commands; calls initiated by an MCP client
167
179
  remain owned by that client.
168
180
 
@@ -370,9 +382,19 @@ no source preview because explicit external reads require confirmation.
370
382
  CMake owns which configurations can supply clangd compilation contexts. After a
371
383
  successful configure/generate, ForgeMCP reads `cmakeFiles-v1` from a new CMake
372
384
  File API reply and records SHA-256 hashes of that build directory's configuration
373
- inputs in `project/` and `storage/`. Hashes and dependency lists live in memory;
374
- restart the server and run `cmake_configure` to confirm contexts again. Existing
375
- File API replies and `compile_commands.json` alone do not confirm current inputs.
385
+ inputs in `project/` and `storage/`. Hashes and dependency lists live in memory.
386
+ Each server startup configures all effective profiles once in the background after
387
+ toolset discovery and clangd subscription setup. MCP requests remain available;
388
+ clangd receives contexts as individual profiles finish. Existing File API replies
389
+ and `compile_commands.json` alone do not confirm current inputs.
390
+
391
+ Startup uses the same configure settings, build-directory ownership checks,
392
+ generator-change cleanup, and 600-second per-command timeout as `cmake_configure`.
393
+ One failed profile does not stop the remaining profiles or the server. The admin
394
+ panel's CMake monitor retains startup results, process IDs, and any batch error;
395
+ command transcripts remain available through `process_get`. A second client of
396
+ the same server does not repeat startup configuration. Server shutdown cancels
397
+ and awaits startup configure before closing clangd and managed processes.
376
398
 
377
399
  Workspace writes, edits, moves, deletions, and directory creation check known
378
400
  inputs at the operation boundary. Actual input changes withdraw affected contexts
@@ -491,6 +513,153 @@ The initial CMake slice does not yet include clean/project-inspection tools
491
513
  or syntax highlighting. Unit and in-process MCP tests cover profiles,
492
514
  command parsing, generator changes, result resources, and qualified paths.
493
515
 
516
+ ## Debugging
517
+
518
+ Install `lldb-dap` in a discovered toolset, or supply its absolute executable path
519
+ with the existing `--toolset NAME lldb-dap=PATH` operator option. Use
520
+ `debugger_adapters` to obtain the available adapter and toolset IDs. No adapter
521
+ starts until `debugger_launch`, `debugger_attach`, or `debugger_open_dump` is called.
522
+ Debugging does not require CMake or a compilation database and does not rebuild a program.
523
+
524
+ `debugger_launch` takes a `toolset_id`, `options`, and optional `initial` breakpoint
525
+ plan. `options.executable` and `options.cwd` are project/storage paths;
526
+ `arguments` are literal strings. `stop_on_entry` defaults to true. For example:
527
+
528
+ ```json
529
+ {
530
+ "toolset_id": "system",
531
+ "options": {
532
+ "executable": "storage/build/debug/app.exe",
533
+ "arguments": ["--example"],
534
+ "cwd": "project/"
535
+ },
536
+ "initial": {
537
+ "sources": [
538
+ {"source": "project/src/main.cpp", "points": [{"line": 20}]}
539
+ ]
540
+ }
541
+ }
542
+ ```
543
+
544
+ Attach supplies `options.pid`, an optional `expected_started_at` process birth
545
+ time, and an optional managed `executable`. Dump inspection supplies
546
+ `options.dump_file` and an optional matching executable. Both accept
547
+ `source_mappings` and `symbol_directories`. Dump and symbol inputs must stay in
548
+ project/storage. Source locations may name external `root/` files; the debugger
549
+ does not read them automatically. Source locations are marked unverified against
550
+ the loaded binary, so changed files are not presented as confirmed build-time source.
551
+ PDB, DWARF, and dump compatibility depend on the installed LLDB build and target.
552
+
553
+ Keep the returned `session_id`. `debugger_sessions` lists retained snapshots;
554
+ `debugger_get` reads one without contacting the adapter. Each snapshot has one
555
+ `status` field: null, `kind=stopped` with stop details, `kind=exited` with the
556
+ confirmed target exit code, or `kind=failed` with a session failure message.
557
+ Connection `phase` and `target_state` distinguish adapter failure, target execution,
558
+ partial thread stops, and dump inspection.
559
+ Each runtime retains at most 128 sessions, including closed sessions; restart it
560
+ to release that history when the limit is reached.
561
+
562
+ Launch, attach, `debugger_continue`, `debugger_step`, and `debugger_pause` return
563
+ an execution reference. Pass it to `debugger_wait` with the same session ID.
564
+ The wait returns a saved stop/terminal observation, or a timeout with the current
565
+ snapshot; timeout and cancellation of a wait leave the target running. Execution
566
+ observations are bounded and can expire. After an uncertain command outcome, read
567
+ state before deciding whether to repeat a control operation.
568
+
569
+ Construct a stop token from `session_id` and `inspection_generation` in a stopped
570
+ snapshot. Use `debugger_threads`, `debugger_stack`, `debugger_scopes`, and
571
+ `debugger_variables` to inspect state. Frame, variable, and memory handles belong
572
+ to that session and generation; continuing execution invalidates them. Stack,
573
+ variables, and modules accept bounded `page` windows. Memory and disassembly take
574
+ explicit bounded counts. `debugger_exception_info` supplies supported exception
575
+ details. Available operations and exception filters appear in `capabilities`.
576
+
577
+ Errors identify the affected JSON field and link retained session and adapter
578
+ process information. Use the suggested `debugger_get` and `process_get` calls to
579
+ inspect an unconfirmed command before deciding on further execution. Invalid initial
580
+ source paths are rejected before launching the target. Raw adapter error payloads,
581
+ argument text, and environment values are kept out of error messages.
582
+ Breakpoints are managed through `debugger_breakpoints`,
583
+ `debugger_function_breakpoints`, and `debugger_exception_breakpoints`.
584
+ Setting source or function breakpoints replaces the complete selected set.
585
+
586
+ `debugger_close` terminates a program launched by that session, detaches from an
587
+ attached program, or releases a dump. Its result distinguishes adapter closure
588
+ from the confirmed target disposition. Server shutdown closes all debugger
589
+ sessions before the process service. Each adapter's `adapter_process_id` identifies
590
+ its retained transport transcript for `process_get`; that transcript contains DAP
591
+ messages, including adapter output events. The module exposes no arbitrary
592
+ debugger console, expression execution, memory/variable writes, terminal input,
593
+ remote debugging, or kernel debugging.
594
+
595
+ Every debugger tool has readable text, typed structured data, progress, an icon,
596
+ and a result-only App. The App renders the saved invocation and performs no debugger
597
+ calls. Debugger commands cannot be run from the admin panel.
598
+
599
+ ## Git operations
600
+
601
+ Git uses the executable and environment of `--git-toolset ID_OR_NAME` (default:
602
+ `system`). It must be installed in that toolset. ForgeMCP does not initialize,
603
+ clone, create, move, or remove worktrees. Run one instance in each desired worktree;
604
+ the admin panel exposes their independent tools and histories in separate tabs.
605
+ The configured workspace must be the repository's worktree root. Linked worktrees
606
+ work normally: Git itself accesses their shared repository metadata, without
607
+ extending Workspace access to external source files.
608
+
609
+ Read tools are `git_status`, `git_diff`, `git_log`, `git_show`, `git_blame`,
610
+ `git_branches`, `git_tags`, `git_remotes`, and `git_conflicts`. `git_diff` selects
611
+ `unstaged`, `staged`, or `revision` comparisons; revision comparisons require `base`
612
+ and optionally `target`. Log pages return a resolved revision and `next_skip`;
613
+ reuse both to keep pagination anchored. Show uses the first parent for merges.
614
+ Conflict results include available base/ours/theirs object IDs, modes, and UTF-8
615
+ text; binary or gitlink stages retain metadata without invented text.
616
+
617
+ `git_stage(paths)`, `git_unstage(paths)`, and `git_restore(paths, source=null)` use
618
+ explicit literal project paths. Restore discards working-file changes using the
619
+ index or the selected committed source. `git_commit(message, amend=false)` commits
620
+ the current index. `git_branch` creates/deletes local branches; force deletion is
621
+ explicit. `git_switch` optionally creates a branch. `git_stash` supports list,
622
+ save, apply, pop, and drop, returning one consistent action-result schema.
623
+
624
+ `git_fetch` selects a configured remote and optionally prunes remote-tracking
625
+ refs. `git_pull` defaults to fast-forward only; `strategy=merge` or `rebase` is
626
+ explicit. These operations never automatically stash local changes. `git_push`
627
+ pushes HEAD to one destination branch; replacing published history requires
628
+ `expected_remote_oid`, used as an explicit force-with-lease expectation. No raw
629
+ force-push or arbitrary Git command tool is exposed. Credentials come from the
630
+ operator's Git/SSH configuration; tools do not accept passwords or tokens.
631
+
632
+ `git_merge`, `git_rebase`, `git_cherry_pick`, and `git_revert` preserve unfinished
633
+ operations. Cherry-pick/revert accept a mainline parent for merge commits.
634
+ Resolve conflicts using Workspace tools, stage the resolutions, then call
635
+ `git_continue(action=continue|abort|skip)`. Skip applies only to operations that
636
+ support it. Normal installed Git hooks remain enabled. A nonzero command may
637
+ leave conflicts or other partial changes: mutation results report `error`, actual
638
+ resulting HEAD, unfinished operation, conflicts, and `process_ids`. Inspect status
639
+ after interruption before deciding whether to retry. A secondary synchronization
640
+ failure is reported separately from a successfully completed Git operation.
641
+
642
+ Mutations share Workspace serialization and coordinate with CMake and clangd.
643
+ CMake alone determines compilation-context eligibility and notifies clangd through
644
+ its existing subscription. Source notifications combine Git dirty paths and
645
+ committed tree changes; unknown changes use conservative invalidation. No external
646
+ file watcher or cross-instance execution queue is added.
647
+
648
+ Git output is bounded to 4 MiB per command; narrow the request when the limit is
649
+ exceeded. Each command has a 300-second deadline and each request a 620-second
650
+ deadline. Machine names/metadata must be UTF-8; patches explicitly report decoding
651
+ replacement. Full process transcripts retain their existing ProcessService owner.
652
+ `forgemcp://git/status` is the last captured status, not a live scan.
653
+ `forgemcp://git/commits/{revision}` serves previously captured log/show metadata
654
+ with completion over retained revisions. These snapshots, the Git monitor, and
655
+ history disappear when the instance stops. The Git App displays one invocation:
656
+ status separates staged and working changes, history puts commit messages first,
657
+ and patches show file groups and line numbers with a wrap toggle. Blame keeps source
658
+ and attribution together; conflict views distinguish base, ours, theirs, missing
659
+ stages, and binary content. Errors and analysis-refresh warnings appear before
660
+ the current repository state. Local search, expandable details, individual copying,
661
+ and complete original JSON remain available; the widget never executes Git actions.
662
+
494
663
  ## Toolchain discovery
495
664
 
496
665
  Before serving requests, ForgeMCP discovers one System toolset from `PATH` and, on
@@ -524,7 +693,8 @@ Built-ins cover CMake, CTest, Ninja, Make, MSBuild, MSVC (`cl`), `link`, Clang,
524
693
  `cppvsdbg`. The last adapter may be found as `OpenDebugAD7.exe` or VS Code's bundled
525
694
  `vsdbg.exe`; it has no portable version probe. An unknown or failed version probe
526
695
  leaves the discovered path available with a null version. Version methods for `cl`,
527
- `link`, `cppvsdbg`, and `lldb-dap` are not implemented in this iteration.
696
+ `link`, and `cppvsdbg` are not implemented. LLDB-DAP has a version probe and a
697
+ typed framed connection used by debugger sessions.
528
698
 
529
699
  Toolsets are discovered once per server lifetime; restart to discover changed
530
700
  installations. Detail tools and resources query available versions on each request,
@@ -533,6 +703,29 @@ without caching them. Listing toolsets does not launch version probes. All probe
533
703
  overview and retain their transcripts. Toolset resources omit environments; the
534
704
  environment capture's stdout is retained in its ordinary process transcript.
535
705
 
706
+ ## Understanding tool errors
707
+
708
+ Expected tool errors name the invalid argument or missing prerequisite and explain
709
+ how to correct it. Small catalogs list available values; larger catalogs point to
710
+ an existing listing tool such as `toolsets_list`, `cmake_profiles`,
711
+ `clangd_configurations`, `processes_overview`, or `git_remotes`. Unknown argument
712
+ names are rejected instead of being silently ignored, with spelling suggestions
713
+ when possible. Process transcript selector errors describe their valid JSON forms.
714
+
715
+ For example, an unknown profile identifies `profiles` and either lists its valid
716
+ names or recommends `cmake_profiles()`. A bad edit identifies `old_text` and suggests
717
+ reading the current file or choosing a unique fragment, without repeating source
718
+ text. Toolset installation and profile configuration errors explicitly require
719
+ operator setup; toolsets are discovered once at startup.
720
+
721
+ When a command started, use its returned process ID with `process_get` to read its
722
+ transcript. CMake profile failures and Git mutation failures remain in the result's
723
+ `error` fields even when the MCP exchange itself succeeded. A mutation may have
724
+ partially completed; inspect the returned state and `git_status` before repeating
725
+ Git operations. A synchronization warning after a completed operation does not mean
726
+ the commit or push should be repeated. Retained process and result-resource IDs
727
+ belong to the current server process and disappear when it stops.
728
+
536
729
  ## Tests
537
730
 
538
731
  Tests that need a C/C++ workspace use the shared `cpp_acceptance_project` fixture from
@@ -0,0 +1,12 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Debugger result</title>
7
+ </head>
8
+ <body>
9
+ <main id="widget" aria-label="Debugger result"></main>
10
+ <script type="module" src="/src/debugger-result.js"></script>
11
+ </body>
12
+ </html>
@@ -0,0 +1,12 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Git result</title>
7
+ </head>
8
+ <body>
9
+ <main id="widget" aria-label="Git result"></main>
10
+ <script type="module" src="/src/git-result.js"></script>
11
+ </body>
12
+ </html>
@@ -7,6 +7,7 @@
7
7
  "name": "forgemcp-widgets",
8
8
  "dependencies": {
9
9
  "@modelcontextprotocol/ext-apps": "^1.7.5",
10
+ "@modelcontextprotocol/sdk": "^1.30.0",
10
11
  "markdown-it": "^15.0.2"
11
12
  },
12
13
  "devDependencies": {
@@ -3,11 +3,12 @@
3
3
  "private": true,
4
4
  "type": "module",
5
5
  "scripts": {
6
- "build": "vite build --mode workspace && vite build --mode file && vite build --mode search && vite build --mode result && vite build --mode process && vite build --mode process-details && vite build --mode toolsets && vite build --mode cmake-profiles && vite build --mode cmake-configure && vite build --mode cmake-build && vite build --mode cmake-test && vite build --mode cmake-run-test && vite build --mode clangd && vite build --mode admin && vite build --mode sandbox",
6
+ "build": "vite build --mode workspace && vite build --mode file && vite build --mode search && vite build --mode result && vite build --mode process && vite build --mode process-details && vite build --mode toolsets && vite build --mode cmake-profiles && vite build --mode cmake-configure && vite build --mode cmake-build && vite build --mode cmake-test && vite build --mode cmake-run-test && vite build --mode clangd && vite build --mode git-result && vite build --mode debugger-result && vite build --mode admin && vite build --mode sandbox",
7
7
  "test": "node --test tests/*.test.js"
8
8
  },
9
9
  "dependencies": {
10
10
  "@modelcontextprotocol/ext-apps": "^1.7.5",
11
+ "@modelcontextprotocol/sdk": "^1.30.0",
11
12
  "markdown-it": "^15.0.2"
12
13
  },
13
14
  "devDependencies": {