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.
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/PKG-INFO +277 -10
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/README.md +272 -9
- forge_cpp_mcp-0.5.0/frontend/admin.html +12 -0
- forge_cpp_mcp-0.5.0/frontend/debugger-result.html +12 -0
- forge_cpp_mcp-0.5.0/frontend/git-result.html +12 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/package-lock.json +1 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/package.json +2 -1
- forge_cpp_mcp-0.5.0/frontend/sandbox.html +11 -0
- forge_cpp_mcp-0.5.0/frontend/src/admin-form.js +388 -0
- forge_cpp_mcp-0.5.0/frontend/src/admin-resource.js +260 -0
- forge_cpp_mcp-0.5.0/frontend/src/admin-sandbox.js +43 -0
- forge_cpp_mcp-0.5.0/frontend/src/admin-widget.js +133 -0
- forge_cpp_mcp-0.5.0/frontend/src/admin.css +146 -0
- forge_cpp_mcp-0.5.0/frontend/src/admin.js +966 -0
- forge_cpp_mcp-0.5.0/frontend/src/debugger-result.js +37 -0
- forge_cpp_mcp-0.5.0/frontend/src/git-result.js +9 -0
- forge_cpp_mcp-0.5.0/frontend/src/git-view.js +510 -0
- forge_cpp_mcp-0.5.0/frontend/src/git.css +99 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/shared/result-view.js +1 -1
- forge_cpp_mcp-0.5.0/frontend/tests/admin-widget.test.js +170 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/vite.config.js +6 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/hatch_build.py +3 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/pyproject.toml +5 -1
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/__init__.py +1 -1
- forge_cpp_mcp-0.5.0/src/forgemcp/admin/__init__.py +1 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/admin/errors.py +10 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/admin/history.py +157 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/admin/instance.py +479 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/admin/service.py +558 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/clangd/errors.py +3 -1
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/clangd/service.py +107 -13
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/clangd/session.py +29 -7
- forge_cpp_mcp-0.5.0/src/forgemcp/cmake/build_tree.py +221 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/cmake/file_api.py +59 -13
- forge_cpp_mcp-0.5.0/src/forgemcp/cmake/profiles.py +298 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/cmake/service.py +304 -299
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/cmake/workspace.py +11 -11
- forge_cpp_mcp-0.5.0/src/forgemcp/debugger/__init__.py +1 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/debugger/errors.py +34 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/debugger/lldb_dap.py +1524 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/debugger/models.py +451 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/debugger/service.py +657 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/debugger/session.py +184 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/debugger/text.py +52 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/diagnostics.py +58 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/git/__init__.py +1 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/git/errors.py +9 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/git/models.py +199 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/git/parsers.py +173 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/git/service.py +1258 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/git/text.py +167 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/icons/debugger.svg +6 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/icons/git.svg +1 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/local_ipc/__init__.py +23 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/local_ipc/errors.py +21 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/local_ipc/service.py +159 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/local_ipc/unix.py +295 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/local_ipc/windows.py +316 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/process/host.py +147 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/process/models.py +8 -2
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/process/service.py +127 -18
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/progress.py +7 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/server.py +624 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/service.py +36 -13
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/clangd.py +7 -3
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/cmake.py +23 -4
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/ctest.py +34 -5
- forge_cpp_mcp-0.5.0/src/forgemcp/toolchain/tools/git.py +231 -0
- forge_cpp_mcp-0.5.0/src/forgemcp/toolchain/tools/lldb_dap.py +339 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/path.py +35 -7
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/service.py +283 -61
- forge_cpp_mcp-0.2.5/src/forgemcp/cmake/build_tree.py +0 -67
- forge_cpp_mcp-0.2.5/src/forgemcp/cmake/profiles.py +0 -119
- forge_cpp_mcp-0.2.5/src/forgemcp/server.py +0 -200
- forge_cpp_mcp-0.2.5/src/forgemcp/toolchain/tools/git.py +0 -65
- forge_cpp_mcp-0.2.5/src/forgemcp/toolchain/tools/lldb_dap.py +0 -28
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/.gitignore +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/LICENSE +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/clangd-result.html +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/cmake-build.html +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/cmake-configure.html +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/cmake-profiles.html +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/cmake-run-test.html +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/cmake-test.html +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/process-details.html +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/process-overview.html +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/clangd-navigation-view.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/clangd-result.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/clangd-view.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/cmake-build.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/cmake-configure.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/cmake-profiles.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/cmake-run-test.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/cmake-test.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/cmake-view.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/process-details.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/process-overview.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/process-status.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/process.css +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/shared/app.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/shared/copy-icon.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/shared/presentation.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/shared/result-resources.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/shared/widget.css +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/source-view.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/toolsets.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/workspace-file.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/workspace-result.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/workspace-search.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/workspace-tree.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/src/workspace-view.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/tests/result-resources.test.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/tests/result-view.test.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/tests/workspace.test.js +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/toolsets.html +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/workspace-file.html +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/workspace-result.html +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/workspace-search.html +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/frontend/workspace-tree.html +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/assets.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/clangd/__init__.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/clangd/models.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/clangd/text.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/cmake/__init__.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/cmake/errors.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/cmake/models.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/cmake/text.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/completion.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/clangd.LICENSE +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/clangd.svg +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/cmake.svg +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/process.svg +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/toolchain.svg +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/workspace-edit.svg +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/workspace-file.svg +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/workspace-search.svg +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/icons/workspace.svg +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/markdown.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/process/__init__.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/process/errors.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/process/text.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/process/transcript.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/text.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/__init__.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/discovery.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/errors.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/loader.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/providers/__init__.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/providers/system.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/providers/user.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/providers/visual_studio.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/spec.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/__init__.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/clang.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/clang_cl.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/clangxx.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/cppvsdbg.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/gcc.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/gdb.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/gxx.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/link.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/lld.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/lld_link.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/make.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/msbuild.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/msvc.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/toolchain/tools/ninja.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/__init__.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/diff.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/errors.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/metadata.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/models.py +0 -0
- {forge_cpp_mcp-0.2.5 → forge_cpp_mcp-0.5.0}/src/forgemcp/workspace/providers.py +0 -0
- {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.
|
|
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.
|
|
32
|
-
debugger
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
330
|
-
|
|
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`,
|
|
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
|