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