forge-cpp-mcp 0.2.5__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.2.5 → forge_cpp_mcp-0.5.0}/PKG-INFO +277 -10
  2. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/README.md +272 -9
  3. forge_cpp_mcp-0.5.0/frontend/admin.html +12 -0
  4. forge_cpp_mcp-0.5.0/frontend/debugger-result.html +12 -0
  5. forge_cpp_mcp-0.5.0/frontend/git-result.html +12 -0
  6. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/package-lock.json +1 -0
  7. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/package.json +2 -1
  8. forge_cpp_mcp-0.5.0/frontend/sandbox.html +11 -0
  9. forge_cpp_mcp-0.5.0/frontend/src/admin-form.js +388 -0
  10. forge_cpp_mcp-0.5.0/frontend/src/admin-resource.js +260 -0
  11. forge_cpp_mcp-0.5.0/frontend/src/admin-sandbox.js +43 -0
  12. forge_cpp_mcp-0.5.0/frontend/src/admin-widget.js +133 -0
  13. forge_cpp_mcp-0.5.0/frontend/src/admin.css +146 -0
  14. forge_cpp_mcp-0.5.0/frontend/src/admin.js +966 -0
  15. forge_cpp_mcp-0.5.0/frontend/src/debugger-result.js +37 -0
  16. forge_cpp_mcp-0.5.0/frontend/src/git-result.js +9 -0
  17. forge_cpp_mcp-0.5.0/frontend/src/git-view.js +510 -0
  18. forge_cpp_mcp-0.5.0/frontend/src/git.css +99 -0
  19. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/shared/result-view.js +1 -1
  20. forge_cpp_mcp-0.5.0/frontend/tests/admin-widget.test.js +170 -0
  21. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/vite.config.js +6 -0
  22. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/hatch_build.py +3 -0
  23. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/pyproject.toml +5 -1
  24. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/__init__.py +1 -1
  25. forge_cpp_mcp-0.5.0/src/forgemcp/admin/__init__.py +1 -0
  26. forge_cpp_mcp-0.5.0/src/forgemcp/admin/errors.py +10 -0
  27. forge_cpp_mcp-0.5.0/src/forgemcp/admin/history.py +157 -0
  28. forge_cpp_mcp-0.5.0/src/forgemcp/admin/instance.py +479 -0
  29. forge_cpp_mcp-0.5.0/src/forgemcp/admin/service.py +558 -0
  30. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/clangd/errors.py +3 -1
  31. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/clangd/service.py +107 -13
  32. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/clangd/session.py +29 -7
  33. forge_cpp_mcp-0.5.0/src/forgemcp/cmake/build_tree.py +221 -0
  34. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/cmake/file_api.py +59 -13
  35. forge_cpp_mcp-0.5.0/src/forgemcp/cmake/profiles.py +298 -0
  36. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/cmake/service.py +304 -299
  37. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/cmake/workspace.py +11 -11
  38. forge_cpp_mcp-0.5.0/src/forgemcp/debugger/__init__.py +1 -0
  39. forge_cpp_mcp-0.5.0/src/forgemcp/debugger/errors.py +34 -0
  40. forge_cpp_mcp-0.5.0/src/forgemcp/debugger/lldb_dap.py +1524 -0
  41. forge_cpp_mcp-0.5.0/src/forgemcp/debugger/models.py +451 -0
  42. forge_cpp_mcp-0.5.0/src/forgemcp/debugger/service.py +657 -0
  43. forge_cpp_mcp-0.5.0/src/forgemcp/debugger/session.py +184 -0
  44. forge_cpp_mcp-0.5.0/src/forgemcp/debugger/text.py +52 -0
  45. forge_cpp_mcp-0.5.0/src/forgemcp/diagnostics.py +58 -0
  46. forge_cpp_mcp-0.5.0/src/forgemcp/git/__init__.py +1 -0
  47. forge_cpp_mcp-0.5.0/src/forgemcp/git/errors.py +9 -0
  48. forge_cpp_mcp-0.5.0/src/forgemcp/git/models.py +199 -0
  49. forge_cpp_mcp-0.5.0/src/forgemcp/git/parsers.py +173 -0
  50. forge_cpp_mcp-0.5.0/src/forgemcp/git/service.py +1258 -0
  51. forge_cpp_mcp-0.5.0/src/forgemcp/git/text.py +167 -0
  52. forge_cpp_mcp-0.5.0/src/forgemcp/icons/debugger.svg +6 -0
  53. forge_cpp_mcp-0.5.0/src/forgemcp/icons/git.svg +1 -0
  54. forge_cpp_mcp-0.5.0/src/forgemcp/local_ipc/__init__.py +23 -0
  55. forge_cpp_mcp-0.5.0/src/forgemcp/local_ipc/errors.py +21 -0
  56. forge_cpp_mcp-0.5.0/src/forgemcp/local_ipc/service.py +159 -0
  57. forge_cpp_mcp-0.5.0/src/forgemcp/local_ipc/unix.py +295 -0
  58. forge_cpp_mcp-0.5.0/src/forgemcp/local_ipc/windows.py +316 -0
  59. forge_cpp_mcp-0.5.0/src/forgemcp/process/host.py +147 -0
  60. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/process/models.py +8 -2
  61. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/process/service.py +127 -18
  62. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/progress.py +7 -0
  63. forge_cpp_mcp-0.5.0/src/forgemcp/server.py +624 -0
  64. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/service.py +36 -13
  65. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/clangd.py +7 -3
  66. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/cmake.py +23 -4
  67. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/ctest.py +34 -5
  68. forge_cpp_mcp-0.5.0/src/forgemcp/toolchain/tools/git.py +231 -0
  69. forge_cpp_mcp-0.5.0/src/forgemcp/toolchain/tools/lldb_dap.py +339 -0
  70. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/path.py +35 -7
  71. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/service.py +283 -61
  72. forge_cpp_mcp-0.2.5/src/forgemcp/cmake/build_tree.py +0 -67
  73. forge_cpp_mcp-0.2.5/src/forgemcp/cmake/profiles.py +0 -119
  74. forge_cpp_mcp-0.2.5/src/forgemcp/server.py +0 -200
  75. forge_cpp_mcp-0.2.5/src/forgemcp/toolchain/tools/git.py +0 -65
  76. forge_cpp_mcp-0.2.5/src/forgemcp/toolchain/tools/lldb_dap.py +0 -28
  77. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/.gitignore +0 -0
  78. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/LICENSE +0 -0
  79. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/clangd-result.html +0 -0
  80. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/cmake-build.html +0 -0
  81. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/cmake-configure.html +0 -0
  82. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/cmake-profiles.html +0 -0
  83. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/cmake-run-test.html +0 -0
  84. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/cmake-test.html +0 -0
  85. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/process-details.html +0 -0
  86. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/process-overview.html +0 -0
  87. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/clangd-navigation-view.js +0 -0
  88. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/clangd-result.js +0 -0
  89. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/clangd-view.js +0 -0
  90. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/cmake-build.js +0 -0
  91. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/cmake-configure.js +0 -0
  92. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/cmake-profiles.js +0 -0
  93. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/cmake-run-test.js +0 -0
  94. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/cmake-test.js +0 -0
  95. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/cmake-view.js +0 -0
  96. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/process-details.js +0 -0
  97. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/process-overview.js +0 -0
  98. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/process-status.js +0 -0
  99. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/process.css +0 -0
  100. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/shared/app.js +0 -0
  101. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/shared/copy-icon.js +0 -0
  102. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/shared/presentation.js +0 -0
  103. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/shared/result-resources.js +0 -0
  104. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/shared/widget.css +0 -0
  105. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/source-view.js +0 -0
  106. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/toolsets.js +0 -0
  107. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/workspace-file.js +0 -0
  108. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/workspace-result.js +0 -0
  109. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/workspace-search.js +0 -0
  110. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/workspace-tree.js +0 -0
  111. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/workspace-view.js +0 -0
  112. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/tests/result-resources.test.js +0 -0
  113. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/tests/result-view.test.js +0 -0
  114. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/tests/workspace.test.js +0 -0
  115. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/toolsets.html +0 -0
  116. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/workspace-file.html +0 -0
  117. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/workspace-result.html +0 -0
  118. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/workspace-search.html +0 -0
  119. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/workspace-tree.html +0 -0
  120. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/assets.py +0 -0
  121. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/clangd/__init__.py +0 -0
  122. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/clangd/models.py +0 -0
  123. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/clangd/text.py +0 -0
  124. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/cmake/__init__.py +0 -0
  125. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/cmake/errors.py +0 -0
  126. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/cmake/models.py +0 -0
  127. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/cmake/text.py +0 -0
  128. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/completion.py +0 -0
  129. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/clangd.LICENSE +0 -0
  130. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/clangd.svg +0 -0
  131. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/cmake.svg +0 -0
  132. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/process.svg +0 -0
  133. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/toolchain.svg +0 -0
  134. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/workspace-edit.svg +0 -0
  135. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/workspace-file.svg +0 -0
  136. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/workspace-search.svg +0 -0
  137. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/workspace.svg +0 -0
  138. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/markdown.py +0 -0
  139. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/process/__init__.py +0 -0
  140. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/process/errors.py +0 -0
  141. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/process/text.py +0 -0
  142. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/process/transcript.py +0 -0
  143. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/text.py +0 -0
  144. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/__init__.py +0 -0
  145. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/discovery.py +0 -0
  146. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/errors.py +0 -0
  147. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/loader.py +0 -0
  148. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/providers/__init__.py +0 -0
  149. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/providers/system.py +0 -0
  150. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/providers/user.py +0 -0
  151. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/providers/visual_studio.py +0 -0
  152. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/spec.py +0 -0
  153. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/__init__.py +0 -0
  154. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/clang.py +0 -0
  155. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/clang_cl.py +0 -0
  156. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/clangxx.py +0 -0
  157. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/cppvsdbg.py +0 -0
  158. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/gcc.py +0 -0
  159. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/gdb.py +0 -0
  160. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/gxx.py +0 -0
  161. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/link.py +0 -0
  162. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/lld.py +0 -0
  163. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/lld_link.py +0 -0
  164. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/make.py +0 -0
  165. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/msbuild.py +0 -0
  166. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/msvc.py +0 -0
  167. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/ninja.py +0 -0
  168. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/__init__.py +0 -0
  169. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/diff.py +0 -0
  170. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/errors.py +0 -0
  171. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/metadata.py +0 -0
  172. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/models.py +0 -0
  173. {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/providers.py +0 -0
  174. {forge_cpp_mcp-0.2.5 → 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.2.5
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
@@ -12,8 +12,12 @@ License-File: LICENSE
12
12
  Requires-Python: >=3.13
13
13
  Requires-Dist: markdown-it-py>=4.0
14
14
  Requires-Dist: mcp[cli]==2.1.1
15
+ Requires-Dist: psutil<8,>=7.2
15
16
  Requires-Dist: pydantic>=2.13
17
+ Requires-Dist: pywin32>=311; sys_platform == 'win32'
16
18
  Requires-Dist: regex>=2024.11.6
19
+ Requires-Dist: starlette>=0.48.0
20
+ Requires-Dist: uvicorn>=0.31.1
17
21
  Provides-Extra: build
18
22
  Requires-Dist: build>=1.3; extra == 'build'
19
23
  Provides-Extra: dev
@@ -28,8 +32,8 @@ Description-Content-Type: text/markdown
28
32
  ForgeMCP is a Python MCP server for structured C and C++ development workflows.
29
33
  The repository contains workspace, process, toolchain, and initial CMake services.
30
34
  Clangd tools provide read-only analysis across CMake configurations with a shared
31
- result widget. External file reads ask for confirmation through MCP elicitation. Quality and
32
- 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.
33
37
 
34
38
  ## Current MCP surface
35
39
 
@@ -43,6 +47,13 @@ debugger modules are planned.
43
47
  definitions, references, document symbols, and workspace symbols. Empty
44
48
  configuration selections use all available contexts.
45
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.
46
57
  - CMake tools list operator profiles, configure projects, build targets, and run
47
58
  CTest. `cmake_run_test` directly runs a project/storage test executable with
48
59
  literal command-line arguments. Each tool has its own widget with Fields/JSON views,
@@ -96,19 +107,20 @@ and install it in a virtual environment:
96
107
 
97
108
  ```powershell
98
109
  python -m venv .venv
99
- .\.venv\Scripts\python.exe -m pip install .\forge_cpp_mcp-0.2.5-py3-none-any.whl
110
+ .\.venv\Scripts\python.exe -m pip install .\forge_cpp_mcp-0.5.0-py3-none-any.whl
100
111
  .\.venv\Scripts\forgemcp.exe --help
101
112
  ```
102
113
 
103
114
  The wheel includes the compiled HTML widgets and icons. No npm commands or separate
104
- frontend deployment are needed. CMake, Ninja, compilers, and clangd are external
115
+ frontend deployment are needed. It also packages the local admin panel and its
116
+ isolated widget host. CMake, Ninja, compilers, and clangd are external
105
117
  tools: install the ones needed by your workflows separately.
106
118
  The distribution name is `forge-cpp-mcp`; the Python module and server command are `forgemcp`.
107
119
 
108
120
  After the package is published to PyPI, the install command can instead be:
109
121
 
110
122
  ```powershell
111
- .\.venv\Scripts\python.exe -m pip install forge-cpp-mcp==0.2.5
123
+ .\.venv\Scripts\python.exe -m pip install forge-cpp-mcp==0.5.0
112
124
  ```
113
125
 
114
126
  ## Setup from source
@@ -152,6 +164,80 @@ builds the wheel first and then starts the server for this repository.
152
164
 
153
165
  All MCP traffic uses stdout. Operational logs must go to stderr.
154
166
 
167
+ ## Local admin panel
168
+
169
+ Normal CLI launches automatically join one admin Hub for the current OS user.
170
+ Each server remains an independent stdio process with its own workspace,
171
+ environment, toolsets, processes, and clangd sessions. The Hub presents them as
172
+ separate browser tabs; it does not move their services into a shared process.
173
+
174
+ Open the panel while at least one server is running:
175
+
176
+ ```powershell
177
+ forgemcp --open-admin
178
+ ```
179
+
180
+ This command retrieves the private browser URL through same-user local IPC and
181
+ opens the system browser, then exits. The startup message contains the public
182
+ address and this command; the authentication token is never printed. Opening the
183
+ public address in a new browser session alone does not authenticate that session.
184
+
185
+ Each instance tab offers:
186
+
187
+ - tool-call history from both MCP clients and the browser, with original arguments,
188
+ results, progress, timestamps, and errors;
189
+ - the original MCP App widget, text fallback, and complete JSON result;
190
+ - tool schemas, static resources, resource templates, and resource reading;
191
+ - startup settings, process status, discovered toolsets, CMake configurations,
192
+ and retained clangd sessions;
193
+ - browser responses to SDK elicitation requests, including external-file read
194
+ confirmation for commands initiated from the panel.
195
+
196
+ Settings are read-only. Command controls start hidden; select **Enable command
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
201
+ calls pass through the same SDK handlers, validation, and feature locks as stdio
202
+ calls. There is no panel-wide execution queue. Existing modules decide which
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.
207
+ The panel can cancel its own running commands; calls initiated by an MCP client
208
+ remain owned by that client.
209
+
210
+ The panel listens on `127.0.0.1`, preferring port 8765 and choosing a free port when
211
+ that port is unavailable. Widgets use a second loopback port for their isolated
212
+ host. The Hub stops shortly after the last server session ends; browser tabs do
213
+ not keep it running. A temporary IPC disconnect is shown as reconnecting while
214
+ the underlying server process remains alive. Lost tool calls are never replayed
215
+ automatically; read the instance history after reconnecting before repeating one.
216
+
217
+ History and linked widget result resources live only in the server's memory.
218
+ Stopping that server loses its history; there is no database or disk archive.
219
+ Process transcripts retain their existing in-memory lifecycle and are not copied
220
+ into a separate admin log.
221
+
222
+ Use these operator options when needed:
223
+
224
+ ```powershell
225
+ forgemcp --no-admin
226
+ forgemcp --admin-port 9000
227
+ forgemcp --admin-ipc forgemcp-other
228
+ forgemcp --open-admin --admin-ipc forgemcp-other
229
+ ```
230
+
231
+ `--no-admin` opts that instance out of the panel. `--admin-port` is a preference
232
+ when starting a new Hub; it does not change an already running Hub's port.
233
+ Instances using the same `--admin-ipc` name share a Hub; a different name creates
234
+ a separate group for the same OS user.
235
+
236
+ The normal wheel build includes `admin.html` and `sandbox.html` alongside the MCP
237
+ widgets. After changing frontend source, use the documented wheel build or
238
+ `npm run build --prefix frontend`. An unbuilt source checkout returns an explicit
239
+ missing-assets page until those files are generated.
240
+
155
241
  ## Connect Codex or Claude Code
156
242
 
157
243
  After [installation](#install-a-release) or [source setup](#setup-from-source), copy the appropriate example into the root of the C/C++
@@ -325,9 +411,19 @@ no source preview because explicit external reads require confirmation.
325
411
  CMake owns which configurations can supply clangd compilation contexts. After a
326
412
  successful configure/generate, ForgeMCP reads `cmakeFiles-v1` from a new CMake
327
413
  File API reply and records SHA-256 hashes of that build directory's configuration
328
- inputs in `project/` and `storage/`. Hashes and dependency lists live in memory;
329
- restart the server and run `cmake_configure` to confirm contexts again. Existing
330
- 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.
331
427
 
332
428
  Workspace writes, edits, moves, deletions, and directory creation check known
333
429
  inputs at the operation boundary. Actual input changes withdraw affected contexts
@@ -446,6 +542,153 @@ The initial CMake slice does not yet include clean/project-inspection tools
446
542
  or syntax highlighting. Unit and in-process MCP tests cover profiles,
447
543
  command parsing, generator changes, result resources, and qualified paths.
448
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
+
449
692
  ## Toolchain discovery
450
693
 
451
694
  Before serving requests, ForgeMCP discovers one System toolset from `PATH` and, on
@@ -479,7 +722,8 @@ Built-ins cover CMake, CTest, Ninja, Make, MSBuild, MSVC (`cl`), `link`, Clang,
479
722
  `cppvsdbg`. The last adapter may be found as `OpenDebugAD7.exe` or VS Code's bundled
480
723
  `vsdbg.exe`; it has no portable version probe. An unknown or failed version probe
481
724
  leaves the discovered path available with a null version. Version methods for `cl`,
482
- `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.
483
727
 
484
728
  Toolsets are discovered once per server lifetime; restart to discover changed
485
729
  installations. Detail tools and resources query available versions on each request,
@@ -488,6 +732,29 @@ without caching them. Listing toolsets does not launch version probes. All probe
488
732
  overview and retain their transcripts. Toolset resources omit environments; the
489
733
  environment capture's stdout is retained in its ordinary process transcript.
490
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
+
491
758
  ## Tests
492
759
 
493
760
  Tests that need a C/C++ workspace use the shared `cpp_acceptance_project` fixture from