mcp-garry-codes 1.0.0
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.
- package/LICENSE +21 -0
- package/README.md +133 -0
- package/dist/config/env.d.ts +4 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +27 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/schema.d.ts +28 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +12 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/contracts/common.d.ts +53 -0
- package/dist/contracts/common.d.ts.map +1 -0
- package/dist/contracts/common.js +30 -0
- package/dist/contracts/common.js.map +1 -0
- package/dist/contracts/linter_contracts.d.ts +79 -0
- package/dist/contracts/linter_contracts.d.ts.map +1 -0
- package/dist/contracts/linter_contracts.js +16 -0
- package/dist/contracts/linter_contracts.js.map +1 -0
- package/dist/contracts/scaffold_contracts.d.ts +84 -0
- package/dist/contracts/scaffold_contracts.d.ts.map +1 -0
- package/dist/contracts/scaffold_contracts.js +27 -0
- package/dist/contracts/scaffold_contracts.js.map +1 -0
- package/dist/contracts/security_contracts.d.ts +37 -0
- package/dist/contracts/security_contracts.d.ts.map +1 -0
- package/dist/contracts/security_contracts.js +6 -0
- package/dist/contracts/security_contracts.js.map +1 -0
- package/dist/contracts/test_contracts.d.ts +42 -0
- package/dist/contracts/test_contracts.d.ts.map +1 -0
- package/dist/contracts/test_contracts.js +10 -0
- package/dist/contracts/test_contracts.js.map +1 -0
- package/dist/contracts/wiki_contracts.d.ts +96 -0
- package/dist/contracts/wiki_contracts.d.ts.map +1 -0
- package/dist/contracts/wiki_contracts.js +17 -0
- package/dist/contracts/wiki_contracts.js.map +1 -0
- package/dist/core/cache.d.ts +9 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +56 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/errors.d.ts +37 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +52 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/file_utils.d.ts +13 -0
- package/dist/core/file_utils.d.ts.map +1 -0
- package/dist/core/file_utils.js +90 -0
- package/dist/core/file_utils.js.map +1 -0
- package/dist/core/logger.d.ts +18 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +46 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/process_runner.d.ts +15 -0
- package/dist/core/process_runner.d.ts.map +1 -0
- package/dist/core/process_runner.js +64 -0
- package/dist/core/process_runner.js.map +1 -0
- package/dist/domain/glua/ast.d.ts +12 -0
- package/dist/domain/glua/ast.d.ts.map +1 -0
- package/dist/domain/glua/ast.js +176 -0
- package/dist/domain/glua/ast.js.map +1 -0
- package/dist/domain/glua/lexer.d.ts +42 -0
- package/dist/domain/glua/lexer.d.ts.map +1 -0
- package/dist/domain/glua/lexer.js +232 -0
- package/dist/domain/glua/lexer.js.map +1 -0
- package/dist/domain/networking/net_auditor.d.ts +5 -0
- package/dist/domain/networking/net_auditor.d.ts.map +1 -0
- package/dist/domain/networking/net_auditor.js +188 -0
- package/dist/domain/networking/net_auditor.js.map +1 -0
- package/dist/domain/packaging/validator.d.ts +5 -0
- package/dist/domain/packaging/validator.d.ts.map +1 -0
- package/dist/domain/packaging/validator.js +121 -0
- package/dist/domain/packaging/validator.js.map +1 -0
- package/dist/domain/performance/hot_path_analyzer.d.ts +5 -0
- package/dist/domain/performance/hot_path_analyzer.d.ts.map +1 -0
- package/dist/domain/performance/hot_path_analyzer.js +127 -0
- package/dist/domain/performance/hot_path_analyzer.js.map +1 -0
- package/dist/domain/scaffolding/templates.d.ts +5 -0
- package/dist/domain/scaffolding/templates.d.ts.map +1 -0
- package/dist/domain/scaffolding/templates.js +219 -0
- package/dist/domain/scaffolding/templates.js.map +1 -0
- package/dist/domain/wiki/offline_db.d.ts +3 -0
- package/dist/domain/wiki/offline_db.d.ts.map +1 -0
- package/dist/domain/wiki/offline_db.js +534 -0
- package/dist/domain/wiki/offline_db.js.map +1 -0
- package/dist/domain/wiki/types.d.ts +29 -0
- package/dist/domain/wiki/types.d.ts.map +1 -0
- package/dist/domain/wiki/types.js +2 -0
- package/dist/domain/wiki/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/glualint_adapter.d.ts +6 -0
- package/dist/integrations/glualint_adapter.d.ts.map +1 -0
- package/dist/integrations/glualint_adapter.js +62 -0
- package/dist/integrations/glualint_adapter.js.map +1 -0
- package/dist/integrations/python_test_harness.d.ts +5 -0
- package/dist/integrations/python_test_harness.d.ts.map +1 -0
- package/dist/integrations/python_test_harness.js +67 -0
- package/dist/integrations/python_test_harness.js.map +1 -0
- package/dist/integrations/web_search_adapter.d.ts +6 -0
- package/dist/integrations/web_search_adapter.d.ts.map +1 -0
- package/dist/integrations/web_search_adapter.js +80 -0
- package/dist/integrations/web_search_adapter.js.map +1 -0
- package/dist/integrations/wiki_client.d.ts +13 -0
- package/dist/integrations/wiki_client.d.ts.map +1 -0
- package/dist/integrations/wiki_client.js +110 -0
- package/dist/integrations/wiki_client.js.map +1 -0
- package/dist/prompts/index.d.ts +73 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +127 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/resources/realms_resources.d.ts +2 -0
- package/dist/resources/realms_resources.d.ts.map +1 -0
- package/dist/resources/realms_resources.js +30 -0
- package/dist/resources/realms_resources.js.map +1 -0
- package/dist/resources/schema_resources.d.ts +2 -0
- package/dist/resources/schema_resources.d.ts.map +1 -0
- package/dist/resources/schema_resources.js +43 -0
- package/dist/resources/schema_resources.js.map +1 -0
- package/dist/resources/wiki_resources.d.ts +3 -0
- package/dist/resources/wiki_resources.d.ts.map +1 -0
- package/dist/resources/wiki_resources.js +31 -0
- package/dist/resources/wiki_resources.js.map +1 -0
- package/dist/security/path_guard.d.ts +8 -0
- package/dist/security/path_guard.d.ts.map +1 -0
- package/dist/security/path_guard.js +37 -0
- package/dist/security/path_guard.js.map +1 -0
- package/dist/security/process_guard.d.ts +8 -0
- package/dist/security/process_guard.d.ts.map +1 -0
- package/dist/security/process_guard.js +26 -0
- package/dist/security/process_guard.js.map +1 -0
- package/dist/security/redaction.d.ts +6 -0
- package/dist/security/redaction.d.ts.map +1 -0
- package/dist/security/redaction.js +49 -0
- package/dist/security/redaction.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +364 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/analyze_performance.d.ts +4 -0
- package/dist/tools/analyze_performance.d.ts.map +1 -0
- package/dist/tools/analyze_performance.js +20 -0
- package/dist/tools/analyze_performance.js.map +1 -0
- package/dist/tools/audit_net_security.d.ts +4 -0
- package/dist/tools/audit_net_security.d.ts.map +1 -0
- package/dist/tools/audit_net_security.js +19 -0
- package/dist/tools/audit_net_security.js.map +1 -0
- package/dist/tools/get_gmod_symbol.d.ts +4 -0
- package/dist/tools/get_gmod_symbol.d.ts.map +1 -0
- package/dist/tools/get_gmod_symbol.js +30 -0
- package/dist/tools/get_gmod_symbol.js.map +1 -0
- package/dist/tools/lint_glua.d.ts +4 -0
- package/dist/tools/lint_glua.d.ts.map +1 -0
- package/dist/tools/lint_glua.js +24 -0
- package/dist/tools/lint_glua.js.map +1 -0
- package/dist/tools/package_and_validate.d.ts +4 -0
- package/dist/tools/package_and_validate.d.ts.map +1 -0
- package/dist/tools/package_and_validate.js +23 -0
- package/dist/tools/package_and_validate.js.map +1 -0
- package/dist/tools/run_glua_test.d.ts +4 -0
- package/dist/tools/run_glua_test.d.ts.map +1 -0
- package/dist/tools/run_glua_test.js +15 -0
- package/dist/tools/run_glua_test.js.map +1 -0
- package/dist/tools/scaffold_gmod_component.d.ts +4 -0
- package/dist/tools/scaffold_gmod_component.d.ts.map +1 -0
- package/dist/tools/scaffold_gmod_component.js +16 -0
- package/dist/tools/scaffold_gmod_component.js.map +1 -0
- package/dist/tools/search_gmod_wiki.d.ts +4 -0
- package/dist/tools/search_gmod_wiki.d.ts.map +1 -0
- package/dist/tools/search_gmod_wiki.js +30 -0
- package/dist/tools/search_gmod_wiki.js.map +1 -0
- package/dist/tools/web_search_glua.d.ts +4 -0
- package/dist/tools/web_search_glua.d.ts.map +1 -0
- package/dist/tools/web_search_glua.js +15 -0
- package/dist/tools/web_search_glua.js.map +1 -0
- package/package.json +58 -0
- package/src/test_harness/lua/glua_mock.lua +383 -0
- package/src/test_harness/python/gmod_tester.py +156 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 M A R W A N
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# `mcp-garry-codes` — The Principal Garry's Mod Protocol Server
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/mcp-garry-codes)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](https://www.typescriptlang.org/)
|
|
6
|
+
[](https://modelcontextprotocol.io)
|
|
7
|
+
[](https://github.com/MarwanDevSpace)
|
|
8
|
+
|
|
9
|
+
> **`mcp-garry-codes`** is a specialized, production-grade [Model Context Protocol (MCP)](https://modelcontextprotocol.io) server engineered specifically for the Garry's Mod (GLua) ecosystem. It bridges AI coding agents with deep Source Engine awareness, static verification, net-security vulnerability auditing, zero-GC performance profiling, and headless testing.
|
|
10
|
+
|
|
11
|
+
**Created & Maintained by:** **M A R W A N**
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## ⚡ The Garry's Mod Engineering Dilemma
|
|
16
|
+
|
|
17
|
+
Garry's Mod development represents a notoriously hostile coding environment:
|
|
18
|
+
- **Three Rigid Execution Realms** (`SERVER`, `CLIENT`, and `MENU`) with strict serialization and transmission rules.
|
|
19
|
+
- **Micro-Allocation Garbage Collection Traps** inside high-frequency rendering and simulation hooks (`RenderScreenspaceEffects`, `HUDPaint`, `Think`, `Move`) triggering severe client FPS drops.
|
|
20
|
+
- **Pervasive Network Vulnerabilities** stemming from unvalidated client-authoritative net messages, rate-limit exploitation, SQL injections, and command execution backdoors.
|
|
21
|
+
- **Source Engine VGUI & Prediction Peculiarities** where standard desktop GUI mental models fail.
|
|
22
|
+
|
|
23
|
+
`mcp-garry-codes` equips LLMs and autonomous coding assistants with the deep domain knowledge and verification tools necessary to produce bulletproof GLua code.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 🛠️ Tool Suite (9 Core Tools)
|
|
28
|
+
|
|
29
|
+
| Tool Name | Realm Mode | Primary Function | Side Effects |
|
|
30
|
+
|---|---|---|---|
|
|
31
|
+
| `search_gmod_wiki` | Read-only | Query Facepunch Garry's Mod Wiki and indexed documentation filtered by realm and category. | Cached disk/memory |
|
|
32
|
+
| `get_gmod_symbol` | Read-only | Retrieve exact parameter signatures, return values, caveats, and official examples. | Cached |
|
|
33
|
+
| `web_search_glua` | Read-only | Targeted search across GitHub GLua repositories, Facepunch archives, and developer discussions. | HTTPS query |
|
|
34
|
+
| `lint_glua` | Read-only / Pure | Static analysis parsing GMod C-style syntax (`//`, `/* */`, `&&`, `||`, `!=`), realm mismatches, and global pollution. | None |
|
|
35
|
+
| `audit_net_security` | Read-only / Audit | Scan addon message graphs for unauthenticated receivers, SQL injections, and missing `util.AddNetworkString`. | None |
|
|
36
|
+
| `analyze_performance` | Read-only / Audit | Profile GLua code for Zero-GC hot-path violations (allocations in `HUDPaint`, `Think`, uncached fonts). | None |
|
|
37
|
+
| `scaffold_gmod_component` | Creation | Scaffold idiomatic, realm-separated SWEPs, SENTs, Derma VGUI panels, HUDs, or gamemodes. | File creation (Workspace only) |
|
|
38
|
+
| `run_glua_test` | Execution / Sandbox | Run headless GLua unit tests using the embedded Source Engine mock runtime via LuaJIT / Python. | Sandboxed subprocess |
|
|
39
|
+
| `package_and_validate` | Verification / Build | Validate `addon.json` and verify file structures against Steam Workshop & GMA packaging rules. | Optional `.gma` compilation |
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 📦 Addressable MCP Resources
|
|
44
|
+
|
|
45
|
+
Connect to rich contextual resources using standard MCP URIs:
|
|
46
|
+
- `gmod://wiki/hooks` — Authoritative list of Garry's Mod hooks across all realms.
|
|
47
|
+
- `gmod://wiki/libraries` — Core functions and libraries available in GLua.
|
|
48
|
+
- `gmod://realms/matrix` — Execution realm boundaries, powers, and restrictions.
|
|
49
|
+
- `gmod://schemas/addon_json` — Steam Workshop `addon.json` schema specification.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 🧭 Guided Workflow Prompts
|
|
54
|
+
|
|
55
|
+
- `audit_addon` — Comprehensive security and performance review of an addon folder.
|
|
56
|
+
- `fix_net_exploit` — Guided repair workflow for net message vulnerabilities and authorization checks.
|
|
57
|
+
- `scaffold_swep` — Interactive creation of a predicted, zero-latency weapon.
|
|
58
|
+
- `build_derma_menu` — Responsive, DPI-scaled VGUI Derma interface builder.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## 🚀 Quick Start & Installation
|
|
63
|
+
|
|
64
|
+
### Option 1: Run instantly with `npx` (Recommended)
|
|
65
|
+
```bash
|
|
66
|
+
npx -y mcp-garry-codes
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Option 2: Global installation via `npm`
|
|
70
|
+
```bash
|
|
71
|
+
npm install -g mcp-garry-codes
|
|
72
|
+
mcp-garry-codes
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## 💻 Client Configuration
|
|
78
|
+
|
|
79
|
+
### 1. Antigravity IDE & Cursor (`mcp_config.json`)
|
|
80
|
+
Add the server definition to your `mcp_config.json`:
|
|
81
|
+
```json
|
|
82
|
+
{
|
|
83
|
+
"mcpServers": {
|
|
84
|
+
"mcp-garry-codes": {
|
|
85
|
+
"command": "npx",
|
|
86
|
+
"args": ["-y", "mcp-garry-codes"],
|
|
87
|
+
"env": {
|
|
88
|
+
"WORKSPACE_ROOT": "${workspaceFolder}",
|
|
89
|
+
"PYTHON_PATH": "python"
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### 2. Claude Desktop (`claude_desktop_config.json`)
|
|
97
|
+
```json
|
|
98
|
+
{
|
|
99
|
+
"mcpServers": {
|
|
100
|
+
"garrys-mod": {
|
|
101
|
+
"command": "npx",
|
|
102
|
+
"args": ["-y", "mcp-garry-codes"]
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 🛡️ Security Architecture & Threat Model
|
|
111
|
+
|
|
112
|
+
1. **Workspace Path Jail**: All file queries, linter checks, and scaffolding operations are verified with `PathGuard` and strictly quarantined within the user's configured workspace.
|
|
113
|
+
2. **Subprocess Isolation**: External processes (`python`, `glualint`, `luajit`) execute via `child_process.execFile` with explicit argument arrays—no shell interpolation (`shell: false`) and strict execution timeouts (5,000ms default).
|
|
114
|
+
3. **Automated Credential Redaction**: Result envelopes pass through sanitization regexes that scrub Steam API keys, MySQL connection strings, and RCON passwords.
|
|
115
|
+
4. **Net Message Auditing**: Receivers executing mutations without checking `ply:IsAdmin()` or access privileges are flagged as critical vulnerabilities.
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## 🧪 Headless GLua Simulation Engine
|
|
120
|
+
|
|
121
|
+
`mcp-garry-codes` includes an embedded Source Engine mock runtime (`src/test_harness/lua/glua_mock.lua`) and Python test orchestrator (`src/test_harness/python/gmod_tester.py`). It enables running headless unit tests without launching the Garry's Mod 32-bit or 64-bit client executable:
|
|
122
|
+
- Full 3D `Vector` and `Angle` metatables (`Distance`, `Dot`, `Cross`, `Length2D`, `RotateAroundAxis`).
|
|
123
|
+
- Mock `Entity` and `Player` objects with health, inventory, and trace methods.
|
|
124
|
+
- In-memory FIFO bitstream queue verifying `net.Write*` and `net.Read*` alignment.
|
|
125
|
+
- Event bus verifying `hook.Add` and `hook.Run`.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 📄 License
|
|
130
|
+
|
|
131
|
+
This project is licensed under the [MIT License](LICENSE).
|
|
132
|
+
|
|
133
|
+
**Author:** [M A R W A N](https://github.com/MarwanDevSpace)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAI9D,wBAAgB,UAAU,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAmB1E;AAED,wBAAgB,SAAS,IAAI,YAAY,CAKxC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ConfigSchema } from "./schema.js";
|
|
2
|
+
let currentConfig = null;
|
|
3
|
+
export function loadConfig(overrides) {
|
|
4
|
+
const raw = {
|
|
5
|
+
WORKSPACE_ROOT: overrides?.WORKSPACE_ROOT ?? process.env.WORKSPACE_ROOT ?? process.cwd(),
|
|
6
|
+
GLUALINT_PATH: overrides?.GLUALINT_PATH ?? process.env.GLUALINT_PATH,
|
|
7
|
+
LUAJIT_PATH: overrides?.LUAJIT_PATH ?? process.env.LUAJIT_PATH,
|
|
8
|
+
PYTHON_PATH: overrides?.PYTHON_PATH ?? process.env.PYTHON_PATH ?? "python",
|
|
9
|
+
GMAD_PATH: overrides?.GMAD_PATH ?? process.env.GMAD_PATH,
|
|
10
|
+
WIKI_CACHE_DIR: overrides?.WIKI_CACHE_DIR ?? process.env.WIKI_CACHE_DIR,
|
|
11
|
+
LOG_LEVEL: overrides?.LOG_LEVEL ?? process.env.LOG_LEVEL ?? "info"
|
|
12
|
+
};
|
|
13
|
+
const parsed = ConfigSchema.safeParse(raw);
|
|
14
|
+
if (!parsed.success) {
|
|
15
|
+
const errorMsg = parsed.error.errors.map(e => `${e.path.join(".")}: ${e.message}`).join(", ");
|
|
16
|
+
throw new Error(`Failed to load server configuration: ${errorMsg}`);
|
|
17
|
+
}
|
|
18
|
+
currentConfig = parsed.data;
|
|
19
|
+
return currentConfig;
|
|
20
|
+
}
|
|
21
|
+
export function getConfig() {
|
|
22
|
+
if (!currentConfig) {
|
|
23
|
+
return loadConfig();
|
|
24
|
+
}
|
|
25
|
+
return currentConfig;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,aAAa,CAAC;AAE9D,IAAI,aAAa,GAAwB,IAAI,CAAC;AAE9C,MAAM,UAAU,UAAU,CAAC,SAAiC;IAC1D,MAAM,GAAG,GAAG;QACV,cAAc,EAAE,SAAS,EAAE,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,EAAE;QACxF,aAAa,EAAE,SAAS,EAAE,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa;QACpE,WAAW,EAAE,SAAS,EAAE,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW;QAC9D,WAAW,EAAE,SAAS,EAAE,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,QAAQ;QAC1E,SAAS,EAAE,SAAS,EAAE,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS;QACxD,cAAc,EAAE,SAAS,EAAE,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;QACvE,SAAS,EAAE,SAAS,EAAE,SAAS,IAAK,OAAO,CAAC,GAAG,CAAC,SAA6D,IAAI,MAAM;KACxH,CAAC;IAEF,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9F,MAAM,IAAI,KAAK,CAAC,wCAAwC,QAAQ,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC;IAC5B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,UAAU,EAAE,CAAC;IACtB,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const ConfigSchema: z.ZodObject<{
|
|
3
|
+
WORKSPACE_ROOT: z.ZodDefault<z.ZodString>;
|
|
4
|
+
GLUALINT_PATH: z.ZodOptional<z.ZodString>;
|
|
5
|
+
LUAJIT_PATH: z.ZodOptional<z.ZodString>;
|
|
6
|
+
PYTHON_PATH: z.ZodDefault<z.ZodString>;
|
|
7
|
+
GMAD_PATH: z.ZodOptional<z.ZodString>;
|
|
8
|
+
WIKI_CACHE_DIR: z.ZodDefault<z.ZodString>;
|
|
9
|
+
LOG_LEVEL: z.ZodDefault<z.ZodEnum<["debug", "info", "warn", "error"]>>;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
WORKSPACE_ROOT: string;
|
|
12
|
+
PYTHON_PATH: string;
|
|
13
|
+
WIKI_CACHE_DIR: string;
|
|
14
|
+
LOG_LEVEL: "debug" | "info" | "warn" | "error";
|
|
15
|
+
GLUALINT_PATH?: string | undefined;
|
|
16
|
+
LUAJIT_PATH?: string | undefined;
|
|
17
|
+
GMAD_PATH?: string | undefined;
|
|
18
|
+
}, {
|
|
19
|
+
WORKSPACE_ROOT?: string | undefined;
|
|
20
|
+
GLUALINT_PATH?: string | undefined;
|
|
21
|
+
LUAJIT_PATH?: string | undefined;
|
|
22
|
+
PYTHON_PATH?: string | undefined;
|
|
23
|
+
GMAD_PATH?: string | undefined;
|
|
24
|
+
WIKI_CACHE_DIR?: string | undefined;
|
|
25
|
+
LOG_LEVEL?: "debug" | "info" | "warn" | "error" | undefined;
|
|
26
|
+
}>;
|
|
27
|
+
export type ServerConfig = z.infer<typeof ConfigSchema>;
|
|
28
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;EAQvB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export const ConfigSchema = z.object({
|
|
4
|
+
WORKSPACE_ROOT: z.string().default(process.cwd()),
|
|
5
|
+
GLUALINT_PATH: z.string().optional(),
|
|
6
|
+
LUAJIT_PATH: z.string().optional(),
|
|
7
|
+
PYTHON_PATH: z.string().default("python"),
|
|
8
|
+
GMAD_PATH: z.string().optional(),
|
|
9
|
+
WIKI_CACHE_DIR: z.string().default(path.join(process.cwd(), ".cache", "wiki")),
|
|
10
|
+
LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]).default("info")
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACjD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;IACzC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9E,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;CACtE,CAAC,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standard Result Envelope and Common Interfaces for mcp-garry-codes.
|
|
3
|
+
*/
|
|
4
|
+
export interface GModToolResult<T = unknown> {
|
|
5
|
+
status: "success" | "partial" | "blocked" | "failed";
|
|
6
|
+
summary: string;
|
|
7
|
+
data: T;
|
|
8
|
+
warnings: string[];
|
|
9
|
+
evidence: {
|
|
10
|
+
inputsDigest?: string;
|
|
11
|
+
sources?: Array<{
|
|
12
|
+
label: string;
|
|
13
|
+
uri?: string;
|
|
14
|
+
retrievedAt?: string;
|
|
15
|
+
}>;
|
|
16
|
+
artifacts?: Array<{
|
|
17
|
+
label: string;
|
|
18
|
+
uri?: string;
|
|
19
|
+
sha256?: string;
|
|
20
|
+
}>;
|
|
21
|
+
};
|
|
22
|
+
nextActions?: string[];
|
|
23
|
+
}
|
|
24
|
+
export declare function createSuccessEnvelope<T>(summary: string, data: T, options?: {
|
|
25
|
+
warnings?: string[];
|
|
26
|
+
sources?: Array<{
|
|
27
|
+
label: string;
|
|
28
|
+
uri?: string;
|
|
29
|
+
retrievedAt?: string;
|
|
30
|
+
}>;
|
|
31
|
+
artifacts?: Array<{
|
|
32
|
+
label: string;
|
|
33
|
+
uri?: string;
|
|
34
|
+
sha256?: string;
|
|
35
|
+
}>;
|
|
36
|
+
nextActions?: string[];
|
|
37
|
+
}): GModToolResult<T>;
|
|
38
|
+
export declare function createErrorEnvelope<T = null>(summary: string, errorData?: T, options?: {
|
|
39
|
+
warnings?: string[];
|
|
40
|
+
sources?: Array<{
|
|
41
|
+
label: string;
|
|
42
|
+
uri?: string;
|
|
43
|
+
retrievedAt?: string;
|
|
44
|
+
}>;
|
|
45
|
+
artifacts?: Array<{
|
|
46
|
+
label: string;
|
|
47
|
+
uri?: string;
|
|
48
|
+
sha256?: string;
|
|
49
|
+
}>;
|
|
50
|
+
nextActions?: string[];
|
|
51
|
+
status?: "partial" | "blocked" | "failed";
|
|
52
|
+
}): GModToolResult<T | null>;
|
|
53
|
+
//# sourceMappingURL=common.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/contracts/common.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO;IACzC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,CAAC,CAAC;IACR,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE;QACR,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,GAAG,CAAC,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACvE,SAAS,CAAC,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,GAAG,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACrE,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EACrC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE;IACR,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB,GACA,cAAc,CAAC,CAAC,CAAC,CAYnB;AAED,wBAAgB,mBAAmB,CAAC,CAAC,GAAG,IAAI,EAC1C,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,CAAC,EACb,OAAO,CAAC,EAAE;IACR,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;CAC3C,GACA,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,CAY1B"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standard Result Envelope and Common Interfaces for mcp-garry-codes.
|
|
3
|
+
*/
|
|
4
|
+
export function createSuccessEnvelope(summary, data, options) {
|
|
5
|
+
return {
|
|
6
|
+
status: "success",
|
|
7
|
+
summary,
|
|
8
|
+
data,
|
|
9
|
+
warnings: options?.warnings ?? [],
|
|
10
|
+
evidence: {
|
|
11
|
+
sources: options?.sources ?? [],
|
|
12
|
+
artifacts: options?.artifacts ?? []
|
|
13
|
+
},
|
|
14
|
+
nextActions: options?.nextActions ?? []
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export function createErrorEnvelope(summary, errorData, options) {
|
|
18
|
+
return {
|
|
19
|
+
status: options?.status ?? "failed",
|
|
20
|
+
summary,
|
|
21
|
+
data: errorData ?? null,
|
|
22
|
+
warnings: options?.warnings ?? [],
|
|
23
|
+
evidence: {
|
|
24
|
+
sources: options?.sources ?? [],
|
|
25
|
+
artifacts: options?.artifacts ?? []
|
|
26
|
+
},
|
|
27
|
+
nextActions: options?.nextActions ?? []
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/contracts/common.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,MAAM,UAAU,qBAAqB,CACnC,OAAe,EACf,IAAO,EACP,OAKC;IAED,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,OAAO;QACP,IAAI;QACJ,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,EAAE;QACjC,QAAQ,EAAE;YACR,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;YAC/B,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,EAAE;SACpC;QACD,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,EAAE;KACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,OAAe,EACf,SAAa,EACb,OAMC;IAED,OAAO;QACL,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,QAAQ;QACnC,OAAO;QACP,IAAI,EAAE,SAAS,IAAI,IAAI;QACvB,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,EAAE;QACjC,QAAQ,EAAE;YACR,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;YAC/B,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,EAAE;SACpC;QACD,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,EAAE;KACxC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const LintGLuaInputSchema: z.ZodEffects<z.ZodObject<{
|
|
3
|
+
file_path: z.ZodOptional<z.ZodString>;
|
|
4
|
+
code_content: z.ZodOptional<z.ZodString>;
|
|
5
|
+
target_realm: z.ZodDefault<z.ZodEnum<["server", "client", "shared", "menu", "auto"]>>;
|
|
6
|
+
fix_formatting: z.ZodDefault<z.ZodBoolean>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
target_realm: "server" | "client" | "shared" | "menu" | "auto";
|
|
9
|
+
fix_formatting: boolean;
|
|
10
|
+
file_path?: string | undefined;
|
|
11
|
+
code_content?: string | undefined;
|
|
12
|
+
}, {
|
|
13
|
+
file_path?: string | undefined;
|
|
14
|
+
code_content?: string | undefined;
|
|
15
|
+
target_realm?: "server" | "client" | "shared" | "menu" | "auto" | undefined;
|
|
16
|
+
fix_formatting?: boolean | undefined;
|
|
17
|
+
}>, {
|
|
18
|
+
target_realm: "server" | "client" | "shared" | "menu" | "auto";
|
|
19
|
+
fix_formatting: boolean;
|
|
20
|
+
file_path?: string | undefined;
|
|
21
|
+
code_content?: string | undefined;
|
|
22
|
+
}, {
|
|
23
|
+
file_path?: string | undefined;
|
|
24
|
+
code_content?: string | undefined;
|
|
25
|
+
target_realm?: "server" | "client" | "shared" | "menu" | "auto" | undefined;
|
|
26
|
+
fix_formatting?: boolean | undefined;
|
|
27
|
+
}>;
|
|
28
|
+
export type LintGLuaInput = z.infer<typeof LintGLuaInputSchema>;
|
|
29
|
+
export interface GLuaDiagnostic {
|
|
30
|
+
line: number;
|
|
31
|
+
column: number;
|
|
32
|
+
severity: "error" | "warning" | "info";
|
|
33
|
+
code: string;
|
|
34
|
+
message: string;
|
|
35
|
+
suggestion?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface LintGLuaOutput {
|
|
38
|
+
valid: boolean;
|
|
39
|
+
error_count: number;
|
|
40
|
+
warning_count: number;
|
|
41
|
+
realm_detected: "server" | "client" | "shared" | "menu";
|
|
42
|
+
diagnostics: GLuaDiagnostic[];
|
|
43
|
+
formatted_code?: string;
|
|
44
|
+
}
|
|
45
|
+
export declare const AnalyzePerformanceInputSchema: z.ZodEffects<z.ZodObject<{
|
|
46
|
+
file_path: z.ZodOptional<z.ZodString>;
|
|
47
|
+
code_content: z.ZodOptional<z.ZodString>;
|
|
48
|
+
}, "strip", z.ZodTypeAny, {
|
|
49
|
+
file_path?: string | undefined;
|
|
50
|
+
code_content?: string | undefined;
|
|
51
|
+
}, {
|
|
52
|
+
file_path?: string | undefined;
|
|
53
|
+
code_content?: string | undefined;
|
|
54
|
+
}>, {
|
|
55
|
+
file_path?: string | undefined;
|
|
56
|
+
code_content?: string | undefined;
|
|
57
|
+
}, {
|
|
58
|
+
file_path?: string | undefined;
|
|
59
|
+
code_content?: string | undefined;
|
|
60
|
+
}>;
|
|
61
|
+
export type AnalyzePerformanceInput = z.infer<typeof AnalyzePerformanceInputSchema>;
|
|
62
|
+
export interface PerformanceIssue {
|
|
63
|
+
hook_name: string;
|
|
64
|
+
line: number;
|
|
65
|
+
severity: "critical" | "high" | "medium";
|
|
66
|
+
category: "allocation_in_render_hook" | "uncached_material" | "uncached_font" | "unlocalized_globals" | "expensive_entity_iteration";
|
|
67
|
+
description: string;
|
|
68
|
+
recommended_code: string;
|
|
69
|
+
}
|
|
70
|
+
export interface AnalyzePerformanceOutput {
|
|
71
|
+
performance_score: number;
|
|
72
|
+
issues: PerformanceIssue[];
|
|
73
|
+
metrics: {
|
|
74
|
+
allocations_in_hot_path: number;
|
|
75
|
+
global_calls_in_hot_path: number;
|
|
76
|
+
dynamic_draw_calls: number;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=linter_contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linter_contracts.d.ts","sourceRoot":"","sources":["../../src/contracts/linter_contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;EAO9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACxD,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;EAKxC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAEpF,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,QAAQ,EAAE,2BAA2B,GAAG,mBAAmB,GAAG,eAAe,GAAG,qBAAqB,GAAG,4BAA4B,CAAC;IACrI,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACvC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,OAAO,EAAE;QACP,uBAAuB,EAAE,MAAM,CAAC;QAChC,wBAAwB,EAAE,MAAM,CAAC;QACjC,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC;CACH"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const LintGLuaInputSchema = z.object({
|
|
3
|
+
file_path: z.string().optional().describe("Workspace-relative or absolute path to .lua file"),
|
|
4
|
+
code_content: z.string().optional().describe("Direct Lua code string to analyze (if file_path omitted)"),
|
|
5
|
+
target_realm: z.enum(["server", "client", "shared", "menu", "auto"]).default("auto").describe("Target realm context for analysis"),
|
|
6
|
+
fix_formatting: z.boolean().default(false).describe("Return pretty-printed or auto-fixed code if possible")
|
|
7
|
+
}).refine(data => data.file_path || data.code_content, {
|
|
8
|
+
message: "Either file_path or code_content must be provided."
|
|
9
|
+
});
|
|
10
|
+
export const AnalyzePerformanceInputSchema = z.object({
|
|
11
|
+
file_path: z.string().optional().describe("Workspace-relative or absolute path to .lua file"),
|
|
12
|
+
code_content: z.string().optional().describe("Direct Lua code snippet to analyze")
|
|
13
|
+
}).refine(data => data.file_path || data.code_content, {
|
|
14
|
+
message: "Either file_path or code_content must be provided."
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=linter_contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linter_contracts.js","sourceRoot":"","sources":["../../src/contracts/linter_contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;IAC7F,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;IACxG,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAClI,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,sDAAsD,CAAC;CAC5G,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,EAAE;IACrD,OAAO,EAAE,oDAAoD;CAC9D,CAAC,CAAC;AAsBH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IACpD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;IAC7F,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;CACnF,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,EAAE;IACrD,OAAO,EAAE,oDAAoD;CAC9D,CAAC,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const ScaffoldGModComponentInputSchema: z.ZodObject<{
|
|
3
|
+
component_type: z.ZodEnum<["swep", "sent", "vgui_panel", "custom_tool", "hud", "gamemode", "addon_skeleton"]>;
|
|
4
|
+
name: z.ZodString;
|
|
5
|
+
output_dir: z.ZodOptional<z.ZodString>;
|
|
6
|
+
options: z.ZodOptional<z.ZodObject<{
|
|
7
|
+
category: z.ZodOptional<z.ZodString>;
|
|
8
|
+
base: z.ZodOptional<z.ZodString>;
|
|
9
|
+
author: z.ZodOptional<z.ZodString>;
|
|
10
|
+
printable_name: z.ZodOptional<z.ZodString>;
|
|
11
|
+
vgui_type: z.ZodOptional<z.ZodEnum<["frame", "button", "scroll", "custom"]>>;
|
|
12
|
+
}, "strip", z.ZodTypeAny, {
|
|
13
|
+
category?: string | undefined;
|
|
14
|
+
base?: string | undefined;
|
|
15
|
+
author?: string | undefined;
|
|
16
|
+
printable_name?: string | undefined;
|
|
17
|
+
vgui_type?: "frame" | "button" | "scroll" | "custom" | undefined;
|
|
18
|
+
}, {
|
|
19
|
+
category?: string | undefined;
|
|
20
|
+
base?: string | undefined;
|
|
21
|
+
author?: string | undefined;
|
|
22
|
+
printable_name?: string | undefined;
|
|
23
|
+
vgui_type?: "frame" | "button" | "scroll" | "custom" | undefined;
|
|
24
|
+
}>>;
|
|
25
|
+
}, "strip", z.ZodTypeAny, {
|
|
26
|
+
name: string;
|
|
27
|
+
component_type: "swep" | "sent" | "vgui_panel" | "custom_tool" | "hud" | "gamemode" | "addon_skeleton";
|
|
28
|
+
options?: {
|
|
29
|
+
category?: string | undefined;
|
|
30
|
+
base?: string | undefined;
|
|
31
|
+
author?: string | undefined;
|
|
32
|
+
printable_name?: string | undefined;
|
|
33
|
+
vgui_type?: "frame" | "button" | "scroll" | "custom" | undefined;
|
|
34
|
+
} | undefined;
|
|
35
|
+
output_dir?: string | undefined;
|
|
36
|
+
}, {
|
|
37
|
+
name: string;
|
|
38
|
+
component_type: "swep" | "sent" | "vgui_panel" | "custom_tool" | "hud" | "gamemode" | "addon_skeleton";
|
|
39
|
+
options?: {
|
|
40
|
+
category?: string | undefined;
|
|
41
|
+
base?: string | undefined;
|
|
42
|
+
author?: string | undefined;
|
|
43
|
+
printable_name?: string | undefined;
|
|
44
|
+
vgui_type?: "frame" | "button" | "scroll" | "custom" | undefined;
|
|
45
|
+
} | undefined;
|
|
46
|
+
output_dir?: string | undefined;
|
|
47
|
+
}>;
|
|
48
|
+
export type ScaffoldGModComponentInput = z.infer<typeof ScaffoldGModComponentInputSchema>;
|
|
49
|
+
export interface ScaffoldGModComponentOutput {
|
|
50
|
+
component_type: string;
|
|
51
|
+
files_created: Array<{
|
|
52
|
+
path: string;
|
|
53
|
+
purpose: string;
|
|
54
|
+
}>;
|
|
55
|
+
code_manifest: Record<string, string>;
|
|
56
|
+
}
|
|
57
|
+
export declare const PackageAndValidateInputSchema: z.ZodObject<{
|
|
58
|
+
addon_dir: z.ZodOptional<z.ZodString>;
|
|
59
|
+
build_gma: z.ZodDefault<z.ZodBoolean>;
|
|
60
|
+
output_gma_path: z.ZodOptional<z.ZodString>;
|
|
61
|
+
}, "strip", z.ZodTypeAny, {
|
|
62
|
+
build_gma: boolean;
|
|
63
|
+
addon_dir?: string | undefined;
|
|
64
|
+
output_gma_path?: string | undefined;
|
|
65
|
+
}, {
|
|
66
|
+
addon_dir?: string | undefined;
|
|
67
|
+
build_gma?: boolean | undefined;
|
|
68
|
+
output_gma_path?: string | undefined;
|
|
69
|
+
}>;
|
|
70
|
+
export type PackageAndValidateInput = z.infer<typeof PackageAndValidateInputSchema>;
|
|
71
|
+
export interface IllegalFileWarning {
|
|
72
|
+
path: string;
|
|
73
|
+
reason: string;
|
|
74
|
+
}
|
|
75
|
+
export interface PackageAndValidateOutput {
|
|
76
|
+
valid: boolean;
|
|
77
|
+
addon_json_valid: boolean;
|
|
78
|
+
total_files: number;
|
|
79
|
+
total_size_bytes: number;
|
|
80
|
+
illegal_files: IllegalFileWarning[];
|
|
81
|
+
warnings: string[];
|
|
82
|
+
gma_path?: string;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=scaffold_contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold_contracts.d.ts","sourceRoot":"","sources":["../../src/contracts/scaffold_contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmB3C,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gCAAgC,CAAC,CAAC;AAE1F,MAAM,WAAW,2BAA2B;IAC1C,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED,eAAO,MAAM,6BAA6B;;;;;;;;;;;;EAIxC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAEpF,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,kBAAkB,EAAE,CAAC;IACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const ScaffoldGModComponentInputSchema = z.object({
|
|
3
|
+
component_type: z.enum([
|
|
4
|
+
"swep",
|
|
5
|
+
"sent",
|
|
6
|
+
"vgui_panel",
|
|
7
|
+
"custom_tool",
|
|
8
|
+
"hud",
|
|
9
|
+
"gamemode",
|
|
10
|
+
"addon_skeleton"
|
|
11
|
+
]).describe("Type of Garry's Mod component to scaffold"),
|
|
12
|
+
name: z.string().min(1).regex(/^[a-zA-Z0-9_-]+$/, "Identifier must be alphanumeric with underscores or dashes").describe("Component identifier (e.g. 'weapon_plasma_rifle', 'ent_crate', 'DPlayerRadial')"),
|
|
13
|
+
output_dir: z.string().optional().describe("Workspace folder to write generated files to (if omitted, files are returned in manifest only)"),
|
|
14
|
+
options: z.object({
|
|
15
|
+
category: z.string().optional().describe("Spawnmenu category (e.g. 'Custom Weapons')"),
|
|
16
|
+
base: z.string().optional().describe("Base class (e.g. 'weapon_base', 'base_anim')"),
|
|
17
|
+
author: z.string().optional().describe("Addon author name"),
|
|
18
|
+
printable_name: z.string().optional().describe("User-facing UI name"),
|
|
19
|
+
vgui_type: z.enum(["frame", "button", "scroll", "custom"]).optional().describe("Derma panel type")
|
|
20
|
+
}).optional()
|
|
21
|
+
});
|
|
22
|
+
export const PackageAndValidateInputSchema = z.object({
|
|
23
|
+
addon_dir: z.string().optional().describe("Root directory of addon (defaults to workspace root)"),
|
|
24
|
+
build_gma: z.boolean().default(false).describe("Compile .gma package if gmad is available"),
|
|
25
|
+
output_gma_path: z.string().optional().describe("Custom output path for compiled .gma file")
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=scaffold_contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold_contracts.js","sourceRoot":"","sources":["../../src/contracts/scaffold_contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,CAAC,MAAM,CAAC;IACvD,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC;QACrB,MAAM;QACN,MAAM;QACN,YAAY;QACZ,aAAa;QACb,KAAK;QACL,UAAU;QACV,gBAAgB;KACjB,CAAC,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IACxD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,EAAE,4DAA4D,CAAC,CAAC,QAAQ,CAAC,iFAAiF,CAAC;IAC3M,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gGAAgG,CAAC;IAC5I,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;QACtF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;QACpF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAC3D,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACrE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KACnG,CAAC,CAAC,QAAQ,EAAE;CACd,CAAC,CAAC;AAUH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IACpD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;IACjG,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IAC3F,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;CAC7F,CAAC,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const AuditNetSecurityInputSchema: z.ZodObject<{
|
|
3
|
+
addon_dir: z.ZodOptional<z.ZodString>;
|
|
4
|
+
file_paths: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
addon_dir?: string | undefined;
|
|
7
|
+
file_paths?: string[] | undefined;
|
|
8
|
+
}, {
|
|
9
|
+
addon_dir?: string | undefined;
|
|
10
|
+
file_paths?: string[] | undefined;
|
|
11
|
+
}>;
|
|
12
|
+
export type AuditNetSecurityInput = z.infer<typeof AuditNetSecurityInputSchema>;
|
|
13
|
+
export interface NetVulnerability {
|
|
14
|
+
severity: "critical" | "high" | "medium" | "low";
|
|
15
|
+
type: "unauthenticated_net_receiver" | "missing_network_string" | "sql_injection" | "runstring_exposure" | "bitstream_mismatch" | "unbounded_payload";
|
|
16
|
+
message_name: string;
|
|
17
|
+
file: string;
|
|
18
|
+
line: number;
|
|
19
|
+
description: string;
|
|
20
|
+
recommended_fix: string;
|
|
21
|
+
vulnerable_code: string;
|
|
22
|
+
}
|
|
23
|
+
export interface NetworkMessageGraphNode {
|
|
24
|
+
message: string;
|
|
25
|
+
sent_from: "client" | "server" | "unknown";
|
|
26
|
+
received_in: "client" | "server" | "unknown";
|
|
27
|
+
has_auth_check: boolean;
|
|
28
|
+
registered_on_server: boolean;
|
|
29
|
+
data_types: string[];
|
|
30
|
+
}
|
|
31
|
+
export interface AuditNetSecurityOutput {
|
|
32
|
+
messages_found: number;
|
|
33
|
+
registered_strings: string[];
|
|
34
|
+
vulnerabilities: NetVulnerability[];
|
|
35
|
+
network_graph: NetworkMessageGraphNode[];
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=security_contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security_contracts.d.ts","sourceRoot":"","sources":["../../src/contracts/security_contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,2BAA2B;;;;;;;;;EAGtC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,IAAI,EACA,8BAA8B,GAC9B,wBAAwB,GACxB,eAAe,GACf,oBAAoB,GACpB,oBAAoB,GACpB,mBAAmB,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC3C,WAAW,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC7C,cAAc,EAAE,OAAO,CAAC;IACxB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,eAAe,EAAE,gBAAgB,EAAE,CAAC;IACpC,aAAa,EAAE,uBAAuB,EAAE,CAAC;CAC1C"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const AuditNetSecurityInputSchema = z.object({
|
|
3
|
+
addon_dir: z.string().optional().describe("Root directory of addon to audit (defaults to workspace root)"),
|
|
4
|
+
file_paths: z.array(z.string()).optional().describe("Specific files to scan if targeting a slice")
|
|
5
|
+
});
|
|
6
|
+
//# sourceMappingURL=security_contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security_contracts.js","sourceRoot":"","sources":["../../src/contracts/security_contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+DAA+D,CAAC;IAC1G,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;CACnG,CAAC,CAAC"}
|