@yinuo-ngm/mcp-server 0.1.2 → 0.1.4

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 (214) hide show
  1. package/README.md +191 -208
  2. package/lib/audit/audit-event.d.ts +14 -0
  3. package/lib/audit/audit-event.js +2 -0
  4. package/lib/audit/audit-log.service.d.ts +7 -0
  5. package/lib/audit/audit-log.service.js +187 -0
  6. package/lib/audit/redact.d.ts +3 -0
  7. package/lib/audit/redact.js +28 -0
  8. package/lib/catalog/capabilities/blocked-local-actions.d.ts +1 -0
  9. package/lib/catalog/capabilities/blocked-local-actions.js +18 -0
  10. package/lib/catalog/capabilities/frontend-standard.d.ts +2 -0
  11. package/lib/catalog/capabilities/frontend-standard.js +36 -0
  12. package/lib/catalog/capabilities/hub-v2.d.ts +2 -0
  13. package/lib/catalog/capabilities/hub-v2.js +34 -0
  14. package/lib/catalog/capabilities/nginx.d.ts +2 -0
  15. package/lib/catalog/capabilities/nginx.js +23 -0
  16. package/lib/catalog/capabilities/project.d.ts +2 -0
  17. package/lib/catalog/capabilities/project.js +23 -0
  18. package/lib/catalog/capabilities/router.d.ts +2 -0
  19. package/lib/catalog/capabilities/router.js +11 -0
  20. package/lib/catalog/capabilities/runtime.d.ts +2 -0
  21. package/lib/catalog/capabilities/runtime.js +17 -0
  22. package/lib/catalog/capabilities/workspace.d.ts +2 -0
  23. package/lib/catalog/capabilities/workspace.js +23 -0
  24. package/lib/catalog/helpers.d.ts +3 -0
  25. package/lib/catalog/helpers.js +42 -0
  26. package/lib/catalog/index.d.ts +4 -0
  27. package/lib/catalog/index.js +23 -0
  28. package/lib/catalog/tools/frontend-standard.d.ts +2 -0
  29. package/lib/catalog/tools/frontend-standard.js +166 -0
  30. package/lib/catalog/tools/hub-v2-api.d.ts +2 -0
  31. package/lib/catalog/tools/hub-v2-api.js +124 -0
  32. package/lib/catalog/tools/hub-v2-docs.d.ts +2 -0
  33. package/lib/catalog/tools/hub-v2-docs.js +40 -0
  34. package/lib/catalog/tools/nginx.d.ts +2 -0
  35. package/lib/catalog/tools/nginx.js +82 -0
  36. package/lib/catalog/tools/project.d.ts +2 -0
  37. package/lib/catalog/tools/project.js +124 -0
  38. package/lib/catalog/tools/router.d.ts +2 -0
  39. package/lib/catalog/tools/router.js +26 -0
  40. package/lib/catalog/tools/runtime.d.ts +2 -0
  41. package/lib/catalog/tools/runtime.js +40 -0
  42. package/lib/catalog/tools/workspace.d.ts +2 -0
  43. package/lib/catalog/tools/workspace.js +75 -0
  44. package/lib/catalog/types.d.ts +15 -0
  45. package/lib/catalog/types.js +2 -0
  46. package/lib/context/create-tool-context.js +11 -10
  47. package/lib/context/local-server-client.d.ts +2 -0
  48. package/lib/context/local-server-client.js +174 -0
  49. package/lib/context/tool-context.d.ts +36 -0
  50. package/lib/doctor.d.ts +8 -0
  51. package/lib/doctor.js +194 -0
  52. package/lib/errors/error-codes.d.ts +12 -0
  53. package/lib/errors/error-codes.js +14 -0
  54. package/lib/errors/mcp-tool-error.d.ts +8 -0
  55. package/lib/errors/mcp-tool-error.js +14 -0
  56. package/lib/filesystem/project-files.d.ts +18 -0
  57. package/lib/filesystem/project-files.js +112 -0
  58. package/lib/git/local-git-read-service.d.ts +2 -0
  59. package/lib/git/local-git-read-service.js +96 -0
  60. package/lib/index.d.ts +1 -0
  61. package/lib/index.js +4 -0
  62. package/lib/policy/assert-tool-policy.js +10 -1
  63. package/lib/register-tools.js +67 -10
  64. package/lib/registry/tool-names.d.ts +95 -0
  65. package/lib/registry/tool-names.js +97 -0
  66. package/lib/services/path-guard.service.d.ts +4 -0
  67. package/lib/services/path-guard.service.js +75 -0
  68. package/lib/services/permission.service.d.ts +5 -0
  69. package/lib/services/permission.service.js +38 -0
  70. package/lib/services/project-resolver.service.d.ts +32 -0
  71. package/lib/services/project-resolver.service.js +95 -0
  72. package/lib/standard/frontend-standard.default.d.ts +2 -0
  73. package/lib/standard/frontend-standard.default.js +51 -0
  74. package/lib/standard/frontend-standard.schema.d.ts +196 -0
  75. package/lib/standard/frontend-standard.schema.js +61 -0
  76. package/lib/standard/frontend-standard.service.d.ts +79 -0
  77. package/lib/standard/frontend-standard.service.js +115 -0
  78. package/lib/standard/project-scan.d.ts +9 -0
  79. package/lib/standard/project-scan.js +91 -0
  80. package/lib/standard/validators/angular-structure.validator.d.ts +4 -0
  81. package/lib/standard/validators/angular-structure.validator.js +75 -0
  82. package/lib/standard/validators/component.validator.d.ts +4 -0
  83. package/lib/standard/validators/component.validator.js +94 -0
  84. package/lib/standard/validators/git.validator.d.ts +8 -0
  85. package/lib/standard/validators/git.validator.js +32 -0
  86. package/lib/standard/validators/review.validator.d.ts +15 -0
  87. package/lib/standard/validators/review.validator.js +67 -0
  88. package/lib/standard/validators/test.validator.d.ts +19 -0
  89. package/lib/standard/validators/test.validator.js +89 -0
  90. package/lib/tool-catalog.d.ts +2 -0
  91. package/lib/tool-catalog.js +6 -0
  92. package/lib/tools/angular/angular-standard.tools.d.ts +2 -0
  93. package/lib/tools/angular/angular-standard.tools.js +53 -0
  94. package/lib/tools/angular/index.d.ts +1 -0
  95. package/lib/tools/angular/index.js +5 -0
  96. package/lib/tools/capability.tools.d.ts +2 -0
  97. package/lib/tools/capability.tools.js +205 -0
  98. package/lib/tools/controlled/index.d.ts +2 -0
  99. package/lib/tools/controlled/index.js +13 -0
  100. package/lib/tools/controlled/local-server.d.ts +6 -0
  101. package/lib/tools/controlled/local-server.js +17 -0
  102. package/lib/tools/controlled/operation-policy.d.ts +22 -0
  103. package/lib/tools/controlled/operation-policy.js +50 -0
  104. package/lib/tools/controlled/operation-result.d.ts +30 -0
  105. package/lib/tools/controlled/operation-result.js +33 -0
  106. package/lib/tools/controlled/schemas.d.ts +159 -0
  107. package/lib/tools/controlled/schemas.js +49 -0
  108. package/lib/tools/controlled.tools.d.ts +1 -0
  109. package/lib/tools/controlled.tools.js +5 -0
  110. package/lib/tools/file-write.tools.d.ts +2 -0
  111. package/lib/tools/file-write.tools.js +70 -0
  112. package/lib/tools/git.tools.js +109 -8
  113. package/lib/tools/hub-v2/client.d.ts +6 -1
  114. package/lib/tools/hub-v2/client.js +15 -0
  115. package/lib/tools/hub-v2/config/config-paths.d.ts +2 -0
  116. package/lib/tools/hub-v2/config/config-paths.js +17 -0
  117. package/lib/tools/hub-v2/config/env.d.ts +1 -0
  118. package/lib/tools/hub-v2/config/env.js +12 -0
  119. package/lib/tools/hub-v2/config/index.d.ts +8 -0
  120. package/lib/tools/hub-v2/config/index.js +18 -0
  121. package/lib/tools/hub-v2/config/jsonc.d.ts +5 -0
  122. package/lib/tools/hub-v2/config/jsonc.js +86 -0
  123. package/lib/tools/hub-v2/config/load-config.d.ts +18 -0
  124. package/lib/tools/hub-v2/config/load-config.js +93 -0
  125. package/lib/tools/hub-v2/config/project-selector.d.ts +5 -0
  126. package/lib/tools/hub-v2/config/project-selector.js +92 -0
  127. package/lib/tools/hub-v2/config/resolve-context.d.ts +13 -0
  128. package/lib/tools/hub-v2/config/resolve-context.js +33 -0
  129. package/lib/tools/hub-v2/docs.tools.js +138 -4
  130. package/lib/tools/hub-v2/index.js +2 -0
  131. package/lib/tools/hub-v2/issues-workflow.tools.d.ts +2 -0
  132. package/lib/tools/hub-v2/issues-workflow.tools.js +199 -0
  133. package/lib/tools/hub-v2/issues.tools.js +96 -6
  134. package/lib/tools/hub-v2/projects.tools.js +16 -3
  135. package/lib/tools/hub-v2/raw.d.ts +8 -0
  136. package/lib/tools/hub-v2/raw.js +33 -0
  137. package/lib/tools/hub-v2/rd.tools.js +167 -8
  138. package/lib/tools/hub-v2/schemas.d.ts +668 -71
  139. package/lib/tools/hub-v2/schemas.js +152 -1
  140. package/lib/tools/hub-v2/upload.tools.js +53 -5
  141. package/lib/tools/index.d.ts +1 -0
  142. package/lib/tools/index.js +22 -0
  143. package/lib/tools/log.tools.js +33 -6
  144. package/lib/tools/nginx/index.d.ts +1 -0
  145. package/lib/tools/nginx/index.js +5 -0
  146. package/lib/tools/nginx/nginx-control.tools.d.ts +2 -0
  147. package/lib/tools/nginx/nginx-control.tools.js +133 -0
  148. package/lib/tools/nginx/nginx-proxy.d.ts +24 -0
  149. package/lib/tools/nginx/nginx-proxy.js +154 -0
  150. package/lib/tools/nginx.tools.d.ts +2 -0
  151. package/lib/tools/nginx.tools.js +111 -0
  152. package/lib/tools/project/index.d.ts +2 -0
  153. package/lib/tools/project/index.js +7 -0
  154. package/lib/tools/project/launch-status.d.ts +10 -0
  155. package/lib/tools/project/launch-status.js +78 -0
  156. package/lib/tools/project/local-diagnostics.d.ts +19 -0
  157. package/lib/tools/project/local-diagnostics.js +97 -0
  158. package/lib/tools/project/observe-redaction.d.ts +3 -0
  159. package/lib/tools/project/observe-redaction.js +25 -0
  160. package/lib/tools/project/observe-runtime.d.ts +72 -0
  161. package/lib/tools/project/observe-runtime.js +147 -0
  162. package/lib/tools/project/project-control.tools.d.ts +2 -0
  163. package/lib/tools/project/project-control.tools.js +216 -0
  164. package/lib/tools/project/project-observe.tools.d.ts +2 -0
  165. package/lib/tools/project/project-observe.tools.js +191 -0
  166. package/lib/tools/project/runtime-config.d.ts +7 -0
  167. package/lib/tools/project/runtime-config.js +50 -0
  168. package/lib/tools/project-observe.tools.d.ts +1 -0
  169. package/lib/tools/project-observe.tools.js +5 -0
  170. package/lib/tools/project.tools.d.ts +8 -0
  171. package/lib/tools/project.tools.js +97 -6
  172. package/lib/tools/proxy.tools.js +4 -4
  173. package/lib/tools/review/index.d.ts +1 -0
  174. package/lib/tools/review/index.js +5 -0
  175. package/lib/tools/review/review.tools.d.ts +2 -0
  176. package/lib/tools/review/review.tools.js +152 -0
  177. package/lib/tools/runtime/index.d.ts +1 -0
  178. package/lib/tools/runtime/index.js +5 -0
  179. package/lib/tools/runtime/runtime-control.tools.d.ts +2 -0
  180. package/lib/tools/runtime/runtime-control.tools.js +89 -0
  181. package/lib/tools/runtime.tools.js +41 -4
  182. package/lib/tools/standard/index.d.ts +1 -0
  183. package/lib/tools/standard/index.js +5 -0
  184. package/lib/tools/standard/standard.tools.d.ts +2 -0
  185. package/lib/tools/standard/standard.tools.js +91 -0
  186. package/lib/tools/task.tools.js +44 -9
  187. package/lib/tools/test/index.d.ts +1 -0
  188. package/lib/tools/test/index.js +5 -0
  189. package/lib/tools/test/test-standard.tools.d.ts +2 -0
  190. package/lib/tools/test/test-standard.tools.js +51 -0
  191. package/lib/tools/tool-catalog.d.ts +2 -0
  192. package/lib/tools/tool-catalog.js +7 -0
  193. package/lib/tools/workflow/frontend-workflow.tools.d.ts +2 -0
  194. package/lib/tools/workflow/frontend-workflow.tools.js +364 -0
  195. package/lib/tools/workflow/index.d.ts +1 -0
  196. package/lib/tools/workflow/index.js +5 -0
  197. package/lib/tools/workspace-package.d.ts +22 -0
  198. package/lib/tools/workspace-package.js +130 -0
  199. package/lib/tools/workspace.tools.d.ts +7 -0
  200. package/lib/tools/workspace.tools.js +336 -0
  201. package/lib/utils/errors.js +6 -1
  202. package/lib/utils/result.d.ts +9 -0
  203. package/lib/utils/result.js +9 -0
  204. package/lib/workflow/frontend-task.schema.d.ts +83 -0
  205. package/lib/workflow/frontend-task.schema.js +25 -0
  206. package/lib/workflow/frontend-task.service.d.ts +57 -0
  207. package/lib/workflow/frontend-task.service.js +195 -0
  208. package/lib/workflow/workflow-status.d.ts +2 -0
  209. package/lib/workflow/workflow-status.js +14 -0
  210. package/lib/workflow/workflow-transition.d.ts +9 -0
  211. package/lib/workflow/workflow-transition.js +38 -0
  212. package/package.json +5 -3
  213. package/lib/tools/hub-v2/config.d.ts +0 -34
  214. package/lib/tools/hub-v2/config.js +0 -297
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.nginxTools = void 0;
4
+ exports.nginxTools = [
5
+ {
6
+ name: "ngm_nginx_status",
7
+ skill: "ngm-nginx",
8
+ capability: "nginx",
9
+ riskLevel: "read",
10
+ description: "Read local Nginx binding and process status.",
11
+ },
12
+ {
13
+ name: "ngm_nginx_servers_list",
14
+ skill: "ngm-nginx",
15
+ capability: "nginx",
16
+ riskLevel: "read",
17
+ description: "List local Nginx server blocks.",
18
+ },
19
+ {
20
+ name: "ngm_nginx_server_get",
21
+ skill: "ngm-nginx",
22
+ capability: "nginx",
23
+ riskLevel: "read",
24
+ description: "Get one local Nginx server block.",
25
+ },
26
+ {
27
+ name: "ngm_nginx_upstreams_list",
28
+ skill: "ngm-nginx",
29
+ capability: "nginx",
30
+ riskLevel: "read",
31
+ description: "List local Nginx upstream definitions.",
32
+ },
33
+ {
34
+ name: "ngm_nginx_config_validate",
35
+ skill: "ngm-nginx",
36
+ capability: "nginx",
37
+ riskLevel: "read",
38
+ description: "Validate current or supplied local Nginx config without reload.",
39
+ },
40
+ {
41
+ name: "ngm_nginx_config_get_main",
42
+ skill: "ngm-nginx",
43
+ capability: "nginx",
44
+ riskLevel: "read",
45
+ description: "Read local Nginx main config metadata and content.",
46
+ },
47
+ {
48
+ name: "ngm_nginx_logs_tail",
49
+ skill: "ngm-nginx",
50
+ capability: "nginx",
51
+ riskLevel: "read",
52
+ description: "Read recent local Nginx access or error log lines.",
53
+ },
54
+ {
55
+ name: "ngm_nginx_reload",
56
+ skill: "ngm-nginx",
57
+ capability: "nginx",
58
+ riskLevel: "execute",
59
+ description: "Validate and preview or reload the ng-manager managed local Nginx instance; preferred over direct nginx commands and audit logged when confirmed.",
60
+ },
61
+ {
62
+ name: "ngm_nginx_proxy_save",
63
+ skill: "ngm-nginx",
64
+ capability: "nginx",
65
+ riskLevel: "write",
66
+ description: "Preview or save a ng-manager managed Nginx proxy server block; validates inputs, avoids arbitrary file writes, and audit logs confirmed saves.",
67
+ },
68
+ {
69
+ name: "ngm_proxy_list",
70
+ skill: "ngm-nginx",
71
+ capability: "nginx",
72
+ riskLevel: "read",
73
+ description: "Compatibility tool for current ng-manager Nginx/proxy bindings.",
74
+ },
75
+ {
76
+ name: "ngm_proxy_validate",
77
+ skill: "ngm-nginx",
78
+ capability: "nginx",
79
+ riskLevel: "read",
80
+ description: "Compatibility tool for validating Nginx/proxy config.",
81
+ },
82
+ ];
@@ -0,0 +1,2 @@
1
+ import type { ToolCatalogEntry } from "../types";
2
+ export declare const projectTools: ToolCatalogEntry[];
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.projectTools = void 0;
4
+ exports.projectTools = [
5
+ {
6
+ name: "ngm_project_list",
7
+ skill: "ngm-project",
8
+ capability: "project",
9
+ riskLevel: "read",
10
+ description: "List registered ng-manager projects by projectId; prefer before shell discovery because it uses the project registry and does not scan arbitrary roots.",
11
+ },
12
+ {
13
+ name: "ngm_project_managed_list",
14
+ skill: "ngm-project",
15
+ capability: "project",
16
+ riskLevel: "read",
17
+ description: "List projects managed by ng-manager.",
18
+ },
19
+ {
20
+ name: "ngm_project_find",
21
+ skill: "ngm-project",
22
+ capability: "project",
23
+ riskLevel: "read",
24
+ description: "Find ng-manager local projects by name, path, framework, or package manager.",
25
+ },
26
+ {
27
+ name: "ngm_project_get",
28
+ skill: "ngm-project",
29
+ capability: "project",
30
+ riskLevel: "read",
31
+ description: "Get one ng-manager project by projectId or projectPath.",
32
+ },
33
+ {
34
+ name: "ngm_project_get_scripts",
35
+ skill: "ngm-project",
36
+ capability: "project",
37
+ riskLevel: "read",
38
+ description: "Get package scripts and runtime hints for one ng-manager project.",
39
+ },
40
+ {
41
+ name: "ngm_project_read_package_json",
42
+ skill: "ngm-project",
43
+ capability: "project",
44
+ riskLevel: "read",
45
+ description: "Read package.json metadata for one registered ng-manager local project.",
46
+ },
47
+ {
48
+ name: "ngm_project_run_script",
49
+ skill: "ngm-project",
50
+ capability: "project",
51
+ riskLevel: "execute",
52
+ description: "Preview or run an existing package.json script for a registered projectId through the local ng-manager server runtime; preferred over direct shell so task state, logs, and audit stay unified.",
53
+ },
54
+ {
55
+ name: "ngm_project_stop",
56
+ skill: "ngm-project",
57
+ capability: "project",
58
+ riskLevel: "execute",
59
+ description: "Preview or stop a ng-manager managed task by taskId or projectId through the local server runtime; preferred over killing PIDs and audit logged when confirmed.",
60
+ },
61
+ {
62
+ name: "ngm_file_write",
63
+ skill: "ngm-project",
64
+ capability: "project",
65
+ riskLevel: "write",
66
+ description: "Preview or write a text file inside a registered project using projectId and safe relativePath only; rejects absolute paths/traversal and audit logs confirmed writes.",
67
+ },
68
+ {
69
+ name: "ngm_project_list_tasks",
70
+ skill: "ngm-project",
71
+ capability: "project",
72
+ riskLevel: "read",
73
+ description: "List ng-manager managed project tasks from the shared local server runtime state.",
74
+ },
75
+ {
76
+ name: "ngm_project_task_status",
77
+ skill: "ngm-project",
78
+ capability: "project",
79
+ riskLevel: "read",
80
+ description: "Read structured runtime status for one ng-manager managed task.",
81
+ },
82
+ {
83
+ name: "ngm_project_task_logs",
84
+ skill: "ngm-project",
85
+ capability: "logs",
86
+ riskLevel: "read",
87
+ description: "Read a limited, redacted log tail for one ng-manager managed task or run.",
88
+ },
89
+ {
90
+ name: "ngm_project_port_check",
91
+ skill: "ngm-project",
92
+ capability: "project",
93
+ riskLevel: "read",
94
+ description: "Check whether one local host/port is listening without shell execution or range scanning.",
95
+ },
96
+ {
97
+ name: "ngm_project_health_check",
98
+ skill: "ngm-project",
99
+ capability: "project",
100
+ riskLevel: "read",
101
+ description: "Perform a short local HTTP health check by URL or managed task/project runtime URL.",
102
+ },
103
+ {
104
+ name: "ngm_task_list",
105
+ skill: "ngm-project",
106
+ capability: "project",
107
+ riskLevel: "read",
108
+ description: "List registered task views for a project, or active tasks when projectId is omitted.",
109
+ },
110
+ {
111
+ name: "ngm_task_get_status",
112
+ skill: "ngm-project",
113
+ capability: "project",
114
+ riskLevel: "read",
115
+ description: "Get the runtime status for a registered task.",
116
+ },
117
+ {
118
+ name: "ngm_log_tail",
119
+ skill: "ngm-project",
120
+ capability: "logs",
121
+ riskLevel: "read",
122
+ description: "Read recent task logs by runId or taskId.",
123
+ },
124
+ ];
@@ -0,0 +1,2 @@
1
+ import type { ToolCatalogEntry } from "../types";
2
+ export declare const routerTools: ToolCatalogEntry[];
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.routerTools = void 0;
4
+ exports.routerTools = [
5
+ {
6
+ name: "ngm_capabilities",
7
+ skill: "ngm-router",
8
+ capability: "discovery",
9
+ riskLevel: "read",
10
+ description: "List ng-manager MCP capability groups, skills, and tool coverage.",
11
+ },
12
+ {
13
+ name: "ngm_route_task",
14
+ skill: "ngm-router",
15
+ capability: "routing",
16
+ riskLevel: "read",
17
+ description: "Route a user request to Hub V2 or NGM local skills and read-only MCP tools.",
18
+ },
19
+ {
20
+ name: "ngm_doctor",
21
+ skill: "ngm-router",
22
+ capability: "discovery",
23
+ riskLevel: "read",
24
+ description: "Inspect MCP readiness, policy flags, Hub V2 config, and tool coverage through the controlled ng-manager MCP view.",
25
+ },
26
+ ];
@@ -0,0 +1,2 @@
1
+ import type { ToolCatalogEntry } from "../types";
2
+ export declare const runtimeTools: ToolCatalogEntry[];
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runtimeTools = void 0;
4
+ exports.runtimeTools = [
5
+ {
6
+ name: "ngm_runtime_current",
7
+ skill: "ngm-runtime",
8
+ capability: "runtime",
9
+ riskLevel: "read",
10
+ description: "Read current Node version manager information.",
11
+ },
12
+ {
13
+ name: "ngm_runtime_list",
14
+ skill: "ngm-runtime",
15
+ capability: "runtime",
16
+ riskLevel: "read",
17
+ description: "List Node runtimes known to ng-manager.",
18
+ },
19
+ {
20
+ name: "ngm_runtime_resolve_for_project",
21
+ skill: "ngm-runtime",
22
+ capability: "runtime",
23
+ riskLevel: "read",
24
+ description: "Resolve the Node runtime ng-manager would use for a project.",
25
+ },
26
+ {
27
+ name: "ngm_runtime_detect_requirement",
28
+ skill: "ngm-runtime",
29
+ capability: "runtime",
30
+ riskLevel: "read",
31
+ description: "Detect project Node version requirements from package metadata.",
32
+ },
33
+ {
34
+ name: "ngm_runtime_set_for_project",
35
+ skill: "ngm-runtime",
36
+ capability: "runtime",
37
+ riskLevel: "write",
38
+ description: "Preview or set a registered projectId's Node runtime binding through the local server; preferred over config/shell edits and audit logged when confirmed.",
39
+ },
40
+ ];
@@ -0,0 +1,2 @@
1
+ import type { ToolCatalogEntry } from "../types";
2
+ export declare const workspaceTools: ToolCatalogEntry[];
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.workspaceTools = void 0;
4
+ exports.workspaceTools = [
5
+ {
6
+ name: "ngm_workspace_summary",
7
+ skill: "ngm-workspace",
8
+ capability: "workspace",
9
+ riskLevel: "read",
10
+ description: "Summarize the local ng-manager workspace and major app/package areas.",
11
+ },
12
+ {
13
+ name: "ngm_workspace_list_packages",
14
+ skill: "ngm-workspace",
15
+ capability: "workspace",
16
+ riskLevel: "read",
17
+ description: "List local workspace package metadata from known ng-manager package roots.",
18
+ },
19
+ {
20
+ name: "ngm_workspace_get_package",
21
+ skill: "ngm-workspace",
22
+ capability: "workspace",
23
+ riskLevel: "read",
24
+ description: "Get package.json metadata for one local workspace package or app.",
25
+ },
26
+ {
27
+ name: "ngm_workspace_mcp_tools",
28
+ skill: "ngm-workspace",
29
+ capability: "workspace",
30
+ riskLevel: "read",
31
+ description: "List ng-manager MCP tools with capability and skill mapping.",
32
+ },
33
+ {
34
+ name: "ngm_workspace_capability_map",
35
+ skill: "ngm-workspace",
36
+ capability: "workspace",
37
+ riskLevel: "read",
38
+ description: "Map ng-manager workspace areas to local capability domains.",
39
+ },
40
+ {
41
+ name: "ngm_log_search",
42
+ skill: "ngm-workspace",
43
+ capability: "logs",
44
+ riskLevel: "read",
45
+ description: "Search recent ng-manager system logs by keyword.",
46
+ },
47
+ {
48
+ name: "ngm_git_status",
49
+ skill: "ngm-workspace",
50
+ capability: "workspace",
51
+ riskLevel: "read",
52
+ description: "Read Git working tree status for a project when the core Git service is available.",
53
+ },
54
+ {
55
+ name: "ngm_git_diff",
56
+ skill: "ngm-workspace",
57
+ capability: "workspace",
58
+ riskLevel: "read",
59
+ description: "Read Git diff for a project when the core Git service is available.",
60
+ },
61
+ {
62
+ name: "ngm_workspace_diff",
63
+ skill: "ngm-workspace",
64
+ capability: "workspace",
65
+ riskLevel: "read",
66
+ description: "Read a safe project diff summary without exposing forbidden workspace paths.",
67
+ },
68
+ {
69
+ name: "ngm_workspace_apply_patch_preview",
70
+ skill: "ngm-workspace",
71
+ capability: "workspace",
72
+ riskLevel: "read",
73
+ description: "Preview a unified patch without writing files.",
74
+ },
75
+ ];
@@ -0,0 +1,15 @@
1
+ import type { ToolRiskLevel } from "../policy/tool-policy";
2
+ export type ToolCatalogEntry = {
3
+ name: string;
4
+ skill: string;
5
+ capability: string;
6
+ riskLevel: ToolRiskLevel;
7
+ description: string;
8
+ };
9
+ export type CapabilityCatalogEntry = {
10
+ id: string;
11
+ label: string;
12
+ skills: string[];
13
+ tools: string[];
14
+ notes?: string[];
15
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -37,17 +37,14 @@ exports.createToolContext = createToolContext;
37
37
  const os = __importStar(require("os"));
38
38
  const path = __importStar(require("path"));
39
39
  const core_1 = require("@yinuo-ngm/core");
40
- const gitStub = {
41
- async status() {
42
- throw new Error("Git service is not implemented in core yet");
43
- },
44
- async diff() {
45
- throw new Error("Git service is not implemented in core yet");
46
- },
47
- };
40
+ const local_server_client_1 = require("./local-server-client");
41
+ const local_git_read_service_1 = require("../git/local-git-read-service");
42
+ const path_guard_service_1 = require("../services/path-guard.service");
43
+ const permission_service_1 = require("../services/permission.service");
44
+ const project_resolver_service_1 = require("../services/project-resolver.service");
48
45
  async function createToolContext() {
49
46
  const dataDir = process.env.NGM_DATA_DIR || path.join(os.homedir(), ".ng-manager");
50
- const workspaceRoot = process.env.NGM_WORKSPACE_ROOT || process.cwd();
47
+ const workspaceRoot = process.cwd();
51
48
  const core = await (0, core_1.createCoreApp)({
52
49
  dataDir,
53
50
  sysLogCapacity: 3000,
@@ -57,7 +54,11 @@ async function createToolContext() {
57
54
  dataDir,
58
55
  services: {
59
56
  core,
60
- git: gitStub,
57
+ git: (0, local_git_read_service_1.createLocalGitReadService)(workspaceRoot),
58
+ pathGuard: new path_guard_service_1.PathGuardService(),
59
+ permission: new permission_service_1.PermissionService(),
60
+ projectResolver: new project_resolver_service_1.ProjectResolverService(core.project),
61
+ localServer: (0, local_server_client_1.createLocalServerClient)(),
61
62
  },
62
63
  async dispose() {
63
64
  await core.dispose();
@@ -0,0 +1,2 @@
1
+ import type { LocalServerClient } from "./tool-context";
2
+ export declare function createLocalServerClient(): LocalServerClient;
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createLocalServerClient = createLocalServerClient;
4
+ const runtime_1 = require("@yinuo-ngm/runtime");
5
+ const error_codes_1 = require("../errors/error-codes");
6
+ function normalizeHostForValidation(host) {
7
+ return host.trim().toLowerCase().replace(/^\[|\]$/g, "");
8
+ }
9
+ function isAllowedLocalHost(host) {
10
+ const normalized = normalizeHostForValidation(host);
11
+ return normalized === "localhost" || normalized === "127.0.0.1" || normalized === "::1";
12
+ }
13
+ function validatePort(port) {
14
+ const value = Number(port);
15
+ return Number.isInteger(value) && value >= 1 && value <= 65535 ? value : null;
16
+ }
17
+ function validateServerUrl(value, source) {
18
+ let url;
19
+ try {
20
+ url = new URL(value);
21
+ }
22
+ catch {
23
+ throw new Error(`invalid ${source} local server URL`);
24
+ }
25
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
26
+ throw new Error(`${source} local server URL must use http or https`);
27
+ }
28
+ if (!isAllowedLocalHost(url.hostname)) {
29
+ throw new Error(`${source} local server host must be localhost, 127.0.0.1, or ::1`);
30
+ }
31
+ const port = validatePort(url.port || (url.protocol === "https:" ? 443 : 80));
32
+ if (!port) {
33
+ throw new Error(`${source} local server port must be 1-65535`);
34
+ }
35
+ return url.origin;
36
+ }
37
+ function envServerUrl() {
38
+ const value = process.env.NGM_MCP_SERVER_URL || process.env.NGM_SERVER_URL;
39
+ const trimmed = value?.trim();
40
+ return trimmed ? validateServerUrl(trimmed, "env") : undefined;
41
+ }
42
+ function lockServerUrl() {
43
+ const lock = (0, runtime_1.readLocalServerLock)();
44
+ if (!lock?.port)
45
+ return undefined;
46
+ const host = lock.host || "127.0.0.1";
47
+ if (!isAllowedLocalHost(host)) {
48
+ throw new Error("lock local server host must be localhost, 127.0.0.1, or ::1");
49
+ }
50
+ const port = validatePort(lock.port);
51
+ if (!port) {
52
+ throw new Error("lock local server port must be 1-65535");
53
+ }
54
+ const normalizedHost = normalizeHostForValidation(host);
55
+ const urlHost = normalizedHost === "::1" ? "[::1]" : normalizedHost;
56
+ return validateServerUrl(`http://${urlHost}:${port}`, "lock");
57
+ }
58
+ async function fetchWithTimeout(url, init = {}, timeoutMs = 1500) {
59
+ const controller = new AbortController();
60
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
61
+ try {
62
+ return await fetch(url, {
63
+ ...init,
64
+ signal: controller.signal,
65
+ });
66
+ }
67
+ finally {
68
+ clearTimeout(timer);
69
+ }
70
+ }
71
+ function unwrap(value) {
72
+ const envelope = value;
73
+ if (envelope && typeof envelope === "object" && "ok" in envelope) {
74
+ if (envelope.ok === false) {
75
+ throw new Error(envelope.error || "ng-manager server request failed");
76
+ }
77
+ if ("data" in envelope) {
78
+ return envelope.data;
79
+ }
80
+ return value;
81
+ }
82
+ return value;
83
+ }
84
+ function unavailableError(error) {
85
+ const message = error instanceof Error ? error.message : String(error);
86
+ const normalized = error instanceof Error && error.name === "AbortError"
87
+ ? "request timed out"
88
+ : message;
89
+ const out = new Error(`ng-manager local server is unavailable: ${normalized}`);
90
+ out.code = error_codes_1.McpErrorCodes.LOCAL_SERVER_UNAVAILABLE;
91
+ out.errorCode = error_codes_1.McpErrorCodes.LOCAL_SERVER_UNAVAILABLE;
92
+ return out;
93
+ }
94
+ function clampTail(tail) {
95
+ return Math.min(Math.max(Number.isInteger(tail) ? tail : 100, 1), 500);
96
+ }
97
+ function createLocalServerClient() {
98
+ async function baseUrl() {
99
+ const url = envServerUrl() || lockServerUrl();
100
+ if (!url) {
101
+ throw new Error(`ng-manager local server is not discoverable from ${(0, runtime_1.getLocalServerDataDir)()}; start ng-manager UI/server first`);
102
+ }
103
+ return url.replace(/\/+$/, "");
104
+ }
105
+ async function request(method, route, body) {
106
+ const url = `${await baseUrl()}${route}`;
107
+ let response;
108
+ try {
109
+ response = await fetchWithTimeout(url, {
110
+ method,
111
+ headers: body === undefined ? undefined : { "content-type": "application/json" },
112
+ body: body === undefined ? undefined : JSON.stringify(body),
113
+ });
114
+ }
115
+ catch (error) {
116
+ throw unavailableError(error);
117
+ }
118
+ const contentType = response.headers.get("content-type") || "";
119
+ const payload = contentType.includes("application/json") ? await response.json() : await response.text();
120
+ if (!response.ok) {
121
+ const envelope = payload;
122
+ throw new Error(envelope?.error || `ng-manager server request failed: ${response.status}`);
123
+ }
124
+ return unwrap(payload);
125
+ }
126
+ return {
127
+ async availability() {
128
+ let url;
129
+ try {
130
+ url = await baseUrl();
131
+ }
132
+ catch (error) {
133
+ return { available: false, reason: error instanceof Error ? error.message : String(error) };
134
+ }
135
+ try {
136
+ const health = await request("GET", "/health");
137
+ if (health?.name === "ngm-server" && typeof health.pid === "number") {
138
+ return { available: true, url };
139
+ }
140
+ return { available: false, url, reason: "health check did not identify ngm-server" };
141
+ }
142
+ catch (error) {
143
+ return { available: false, url, reason: error instanceof Error ? error.message : String(error) };
144
+ }
145
+ },
146
+ refreshTaskProject(projectId) {
147
+ return request("POST", `/api/tasks/refresh/${encodeURIComponent(projectId)}`);
148
+ },
149
+ refreshProjectScripts(projectId) {
150
+ return request("POST", `/api/projects/refreshScripts/${encodeURIComponent(projectId)}`);
151
+ },
152
+ updateProjectRuntime(projectId, runtime) {
153
+ return request("POST", `/api/projects/${encodeURIComponent(projectId)}/runtime`, { runtime });
154
+ },
155
+ listTaskViews(projectId) {
156
+ return request("GET", `/api/tasks/list/${encodeURIComponent(projectId)}`);
157
+ },
158
+ listActiveTasks() {
159
+ return request("GET", "/api/tasks/active");
160
+ },
161
+ startTask(taskId) {
162
+ return request("POST", "/api/tasks/start", { taskId });
163
+ },
164
+ stopTask(taskId) {
165
+ return request("POST", "/api/tasks/stop", { taskId });
166
+ },
167
+ getTaskStatus(taskId) {
168
+ return request("GET", `/api/tasks/status/${encodeURIComponent(taskId)}`);
169
+ },
170
+ getTaskLogTail(runId, tail) {
171
+ return request("GET", `/api/tasks/log/run/${encodeURIComponent(runId)}?tail=${encodeURIComponent(String(clampTail(tail)))}`);
172
+ },
173
+ };
174
+ }
@@ -1,4 +1,7 @@
1
1
  import type { CoreApp } from "@yinuo-ngm/core";
2
+ import type { PathGuardService } from "../services/path-guard.service";
3
+ import type { PermissionService } from "../services/permission.service";
4
+ import type { ProjectResolverService } from "../services/project-resolver.service";
2
5
  export type GitReadService = {
3
6
  status(input: {
4
7
  projectId?: string;
@@ -9,10 +12,43 @@ export type GitReadService = {
9
12
  projectPath?: string;
10
13
  maxBytes?: number;
11
14
  }): Promise<unknown>;
15
+ changedFiles?(input: {
16
+ projectId?: string;
17
+ projectPath?: string;
18
+ }): Promise<string[]>;
19
+ currentBranch?(input: {
20
+ projectId?: string;
21
+ projectPath?: string;
22
+ }): Promise<string>;
23
+ latestLog?(input: {
24
+ projectId?: string;
25
+ projectPath?: string;
26
+ }): Promise<string>;
27
+ };
28
+ export type LocalServerAvailability = {
29
+ available: boolean;
30
+ url?: string;
31
+ reason?: string;
32
+ };
33
+ export type LocalServerClient = {
34
+ availability(): Promise<LocalServerAvailability>;
35
+ refreshTaskProject(projectId: string): Promise<any[]>;
36
+ refreshProjectScripts(projectId: string): Promise<any>;
37
+ updateProjectRuntime(projectId: string, runtime: unknown): Promise<any>;
38
+ listTaskViews(projectId: string): Promise<any[]>;
39
+ listActiveTasks(): Promise<any[]>;
40
+ startTask(taskId: string): Promise<any>;
41
+ stopTask(taskId: string): Promise<any>;
42
+ getTaskStatus(taskId: string): Promise<any>;
43
+ getTaskLogTail(runId: string, tail: number): Promise<any[]>;
12
44
  };
13
45
  export type ToolServices = {
14
46
  core: CoreApp;
15
47
  git: GitReadService;
48
+ pathGuard: PathGuardService;
49
+ permission: PermissionService;
50
+ projectResolver: ProjectResolverService;
51
+ localServer?: LocalServerClient;
16
52
  };
17
53
  export type ToolContext = {
18
54
  workspaceRoot: string;
@@ -0,0 +1,8 @@
1
+ type DoctorStatus = "OK" | "WARN" | "ERROR";
2
+ type DoctorReport = {
3
+ status: DoctorStatus;
4
+ text: string;
5
+ };
6
+ export declare function createDoctorReport(): DoctorReport;
7
+ export declare function doctor(write?: (text: string) => void): Promise<void>;
8
+ export {};