@yinuo-ngm/mcp-server 0.1.1 → 0.1.3
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/README.md +225 -188
- package/lib/audit/audit-event.d.ts +14 -0
- package/lib/audit/audit-event.js +2 -0
- package/lib/audit/audit-log.service.d.ts +7 -0
- package/lib/audit/audit-log.service.js +187 -0
- package/lib/audit/redact.d.ts +3 -0
- package/lib/audit/redact.js +28 -0
- package/lib/catalog/capabilities/blocked-local-actions.d.ts +1 -0
- package/lib/catalog/capabilities/blocked-local-actions.js +18 -0
- package/lib/catalog/capabilities/frontend-standard.d.ts +2 -0
- package/lib/catalog/capabilities/frontend-standard.js +36 -0
- package/lib/catalog/capabilities/hub-v2.d.ts +2 -0
- package/lib/catalog/capabilities/hub-v2.js +34 -0
- package/lib/catalog/capabilities/nginx.d.ts +2 -0
- package/lib/catalog/capabilities/nginx.js +23 -0
- package/lib/catalog/capabilities/project.d.ts +2 -0
- package/lib/catalog/capabilities/project.js +23 -0
- package/lib/catalog/capabilities/router.d.ts +2 -0
- package/lib/catalog/capabilities/router.js +11 -0
- package/lib/catalog/capabilities/runtime.d.ts +2 -0
- package/lib/catalog/capabilities/runtime.js +17 -0
- package/lib/catalog/capabilities/workspace.d.ts +2 -0
- package/lib/catalog/capabilities/workspace.js +23 -0
- package/lib/catalog/helpers.d.ts +3 -0
- package/lib/catalog/helpers.js +42 -0
- package/lib/catalog/index.d.ts +4 -0
- package/lib/catalog/index.js +23 -0
- package/lib/catalog/tools/frontend-standard.d.ts +2 -0
- package/lib/catalog/tools/frontend-standard.js +166 -0
- package/lib/catalog/tools/hub-v2-api.d.ts +2 -0
- package/lib/catalog/tools/hub-v2-api.js +124 -0
- package/lib/catalog/tools/hub-v2-docs.d.ts +2 -0
- package/lib/catalog/tools/hub-v2-docs.js +40 -0
- package/lib/catalog/tools/nginx.d.ts +2 -0
- package/lib/catalog/tools/nginx.js +96 -0
- package/lib/catalog/tools/project.d.ts +2 -0
- package/lib/catalog/tools/project.js +138 -0
- package/lib/catalog/tools/router.d.ts +2 -0
- package/lib/catalog/tools/router.js +26 -0
- package/lib/catalog/tools/runtime.d.ts +2 -0
- package/lib/catalog/tools/runtime.js +47 -0
- package/lib/catalog/tools/workspace.d.ts +2 -0
- package/lib/catalog/tools/workspace.js +75 -0
- package/lib/catalog/types.d.ts +15 -0
- package/lib/catalog/types.js +2 -0
- package/lib/context/create-tool-context.js +11 -10
- package/lib/context/local-server-client.d.ts +2 -0
- package/lib/context/local-server-client.js +174 -0
- package/lib/context/tool-context.d.ts +36 -0
- package/lib/doctor.d.ts +8 -0
- package/lib/doctor.js +221 -0
- package/lib/errors/error-codes.d.ts +12 -0
- package/lib/errors/error-codes.js +14 -0
- package/lib/errors/mcp-tool-error.d.ts +8 -0
- package/lib/errors/mcp-tool-error.js +14 -0
- package/lib/filesystem/project-files.d.ts +18 -0
- package/lib/filesystem/project-files.js +112 -0
- package/lib/git/local-git-read-service.d.ts +2 -0
- package/lib/git/local-git-read-service.js +96 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +4 -0
- package/lib/policy/assert-tool-policy.js +10 -1
- package/lib/register-tools.js +70 -9
- package/lib/registry/tool-names.d.ts +95 -0
- package/lib/registry/tool-names.js +97 -0
- package/lib/services/path-guard.service.d.ts +4 -0
- package/lib/services/path-guard.service.js +75 -0
- package/lib/services/permission.service.d.ts +5 -0
- package/lib/services/permission.service.js +38 -0
- package/lib/services/project-resolver.service.d.ts +32 -0
- package/lib/services/project-resolver.service.js +95 -0
- package/lib/standard/frontend-standard.default.d.ts +2 -0
- package/lib/standard/frontend-standard.default.js +51 -0
- package/lib/standard/frontend-standard.schema.d.ts +196 -0
- package/lib/standard/frontend-standard.schema.js +61 -0
- package/lib/standard/frontend-standard.service.d.ts +79 -0
- package/lib/standard/frontend-standard.service.js +115 -0
- package/lib/standard/project-scan.d.ts +9 -0
- package/lib/standard/project-scan.js +91 -0
- package/lib/standard/validators/angular-structure.validator.d.ts +4 -0
- package/lib/standard/validators/angular-structure.validator.js +75 -0
- package/lib/standard/validators/component.validator.d.ts +4 -0
- package/lib/standard/validators/component.validator.js +94 -0
- package/lib/standard/validators/git.validator.d.ts +8 -0
- package/lib/standard/validators/git.validator.js +32 -0
- package/lib/standard/validators/review.validator.d.ts +15 -0
- package/lib/standard/validators/review.validator.js +67 -0
- package/lib/standard/validators/test.validator.d.ts +19 -0
- package/lib/standard/validators/test.validator.js +89 -0
- package/lib/tool-catalog.d.ts +2 -0
- package/lib/tool-catalog.js +6 -0
- package/lib/tools/angular/angular-standard.tools.d.ts +2 -0
- package/lib/tools/angular/angular-standard.tools.js +53 -0
- package/lib/tools/angular/index.d.ts +1 -0
- package/lib/tools/angular/index.js +5 -0
- package/lib/tools/capability.tools.d.ts +2 -0
- package/lib/tools/capability.tools.js +205 -0
- package/lib/tools/controlled/index.d.ts +2 -0
- package/lib/tools/controlled/index.js +13 -0
- package/lib/tools/controlled/local-server.d.ts +6 -0
- package/lib/tools/controlled/local-server.js +17 -0
- package/lib/tools/controlled/operation-policy.d.ts +22 -0
- package/lib/tools/controlled/operation-policy.js +50 -0
- package/lib/tools/controlled/operation-result.d.ts +30 -0
- package/lib/tools/controlled/operation-result.js +33 -0
- package/lib/tools/controlled/schemas.d.ts +159 -0
- package/lib/tools/controlled/schemas.js +49 -0
- package/lib/tools/controlled.tools.d.ts +1 -0
- package/lib/tools/controlled.tools.js +5 -0
- package/lib/tools/file-write.tools.d.ts +2 -0
- package/lib/tools/file-write.tools.js +70 -0
- package/lib/tools/git.tools.js +109 -8
- package/lib/tools/hub-v2/client.d.ts +20 -0
- package/lib/tools/hub-v2/client.js +112 -0
- package/lib/tools/hub-v2/config/config-paths.d.ts +2 -0
- package/lib/tools/hub-v2/config/config-paths.js +17 -0
- package/lib/tools/hub-v2/config/env.d.ts +1 -0
- package/lib/tools/hub-v2/config/env.js +12 -0
- package/lib/tools/hub-v2/config/index.d.ts +8 -0
- package/lib/tools/hub-v2/config/index.js +18 -0
- package/lib/tools/hub-v2/config/jsonc.d.ts +5 -0
- package/lib/tools/hub-v2/config/jsonc.js +86 -0
- package/lib/tools/hub-v2/config/load-config.d.ts +18 -0
- package/lib/tools/hub-v2/config/load-config.js +93 -0
- package/lib/tools/hub-v2/config/project-selector.d.ts +5 -0
- package/lib/tools/hub-v2/config/project-selector.js +92 -0
- package/lib/tools/hub-v2/config/resolve-context.d.ts +13 -0
- package/lib/tools/hub-v2/config/resolve-context.js +33 -0
- package/lib/tools/hub-v2/docs.tools.d.ts +2 -0
- package/lib/tools/hub-v2/docs.tools.js +215 -0
- package/lib/tools/hub-v2/errors.d.ts +8 -0
- package/lib/tools/hub-v2/errors.js +27 -0
- package/lib/tools/hub-v2/index.d.ts +2 -0
- package/lib/tools/hub-v2/index.js +19 -0
- package/lib/tools/hub-v2/issues-workflow.tools.d.ts +2 -0
- package/lib/tools/hub-v2/issues-workflow.tools.js +199 -0
- package/lib/tools/hub-v2/issues.tools.d.ts +2 -0
- package/lib/tools/hub-v2/issues.tools.js +244 -0
- package/lib/tools/hub-v2/projects.tools.d.ts +2 -0
- package/lib/tools/hub-v2/projects.tools.js +41 -0
- package/lib/tools/hub-v2/raw.d.ts +8 -0
- package/lib/tools/hub-v2/raw.js +33 -0
- package/lib/tools/hub-v2/rd.tools.d.ts +2 -0
- package/lib/tools/hub-v2/rd.tools.js +361 -0
- package/lib/tools/hub-v2/schemas.d.ts +1182 -0
- package/lib/tools/hub-v2/schemas.js +318 -0
- package/lib/tools/hub-v2/upload.tools.d.ts +2 -0
- package/lib/tools/hub-v2/upload.tools.js +198 -0
- package/lib/tools/index.d.ts +3 -0
- package/lib/tools/index.js +24 -0
- package/lib/tools/log.tools.js +33 -6
- package/lib/tools/nginx/index.d.ts +1 -0
- package/lib/tools/nginx/index.js +5 -0
- package/lib/tools/nginx/nginx-control.tools.d.ts +2 -0
- package/lib/tools/nginx/nginx-control.tools.js +133 -0
- package/lib/tools/nginx/nginx-proxy.d.ts +24 -0
- package/lib/tools/nginx/nginx-proxy.js +154 -0
- package/lib/tools/nginx.tools.d.ts +2 -0
- package/lib/tools/nginx.tools.js +111 -0
- package/lib/tools/project/index.d.ts +2 -0
- package/lib/tools/project/index.js +7 -0
- package/lib/tools/project/launch-status.d.ts +10 -0
- package/lib/tools/project/launch-status.js +78 -0
- package/lib/tools/project/local-diagnostics.d.ts +19 -0
- package/lib/tools/project/local-diagnostics.js +97 -0
- package/lib/tools/project/observe-redaction.d.ts +3 -0
- package/lib/tools/project/observe-redaction.js +25 -0
- package/lib/tools/project/observe-runtime.d.ts +72 -0
- package/lib/tools/project/observe-runtime.js +147 -0
- package/lib/tools/project/project-control.tools.d.ts +2 -0
- package/lib/tools/project/project-control.tools.js +216 -0
- package/lib/tools/project/project-observe.tools.d.ts +2 -0
- package/lib/tools/project/project-observe.tools.js +191 -0
- package/lib/tools/project/runtime-config.d.ts +7 -0
- package/lib/tools/project/runtime-config.js +50 -0
- package/lib/tools/project-observe.tools.d.ts +1 -0
- package/lib/tools/project-observe.tools.js +5 -0
- package/lib/tools/project.tools.d.ts +8 -0
- package/lib/tools/project.tools.js +97 -6
- package/lib/tools/proxy.tools.js +4 -4
- package/lib/tools/review/index.d.ts +1 -0
- package/lib/tools/review/index.js +5 -0
- package/lib/tools/review/review.tools.d.ts +2 -0
- package/lib/tools/review/review.tools.js +152 -0
- package/lib/tools/runtime/index.d.ts +1 -0
- package/lib/tools/runtime/index.js +5 -0
- package/lib/tools/runtime/runtime-control.tools.d.ts +2 -0
- package/lib/tools/runtime/runtime-control.tools.js +89 -0
- package/lib/tools/runtime.tools.js +41 -4
- package/lib/tools/standard/index.d.ts +1 -0
- package/lib/tools/standard/index.js +5 -0
- package/lib/tools/standard/standard.tools.d.ts +2 -0
- package/lib/tools/standard/standard.tools.js +91 -0
- package/lib/tools/task.tools.js +44 -9
- package/lib/tools/test/index.d.ts +1 -0
- package/lib/tools/test/index.js +5 -0
- package/lib/tools/test/test-standard.tools.d.ts +2 -0
- package/lib/tools/test/test-standard.tools.js +51 -0
- package/lib/tools/tool-catalog.d.ts +2 -0
- package/lib/tools/tool-catalog.js +7 -0
- package/lib/tools/workflow/frontend-workflow.tools.d.ts +2 -0
- package/lib/tools/workflow/frontend-workflow.tools.js +364 -0
- package/lib/tools/workflow/index.d.ts +1 -0
- package/lib/tools/workflow/index.js +5 -0
- package/lib/tools/workspace-package.d.ts +22 -0
- package/lib/tools/workspace-package.js +130 -0
- package/lib/tools/workspace.tools.d.ts +7 -0
- package/lib/tools/workspace.tools.js +336 -0
- package/lib/utils/errors.d.ts +5 -0
- package/lib/utils/errors.js +17 -0
- package/lib/utils/result.d.ts +20 -2
- package/lib/utils/result.js +108 -3
- package/lib/workflow/frontend-task.schema.d.ts +83 -0
- package/lib/workflow/frontend-task.schema.js +25 -0
- package/lib/workflow/frontend-task.service.d.ts +57 -0
- package/lib/workflow/frontend-task.service.js +195 -0
- package/lib/workflow/workflow-status.d.ts +2 -0
- package/lib/workflow/workflow-status.js +14 -0
- package/lib/workflow/workflow-transition.d.ts +9 -0
- package/lib/workflow/workflow-transition.js +38 -0
- package/package.json +10 -4
package/lib/register-tools.js
CHANGED
|
@@ -6,22 +6,83 @@ const tool_policy_1 = require("./policy/tool-policy");
|
|
|
6
6
|
const tools_1 = require("./tools");
|
|
7
7
|
const errors_1 = require("./utils/errors");
|
|
8
8
|
const result_1 = require("./utils/result");
|
|
9
|
+
const audit_log_service_1 = require("./audit/audit-log.service");
|
|
10
|
+
function resultOperationStatus(result) {
|
|
11
|
+
if (!result?.ok || typeof result.data !== "object" || result.data === null)
|
|
12
|
+
return undefined;
|
|
13
|
+
const operation = result.data.operation;
|
|
14
|
+
if (!operation || typeof operation !== "object")
|
|
15
|
+
return undefined;
|
|
16
|
+
const status = operation.status;
|
|
17
|
+
return typeof status === "string" ? status : undefined;
|
|
18
|
+
}
|
|
19
|
+
function shouldWriteAudit(tool, confirmed, result) {
|
|
20
|
+
if (!(0, audit_log_service_1.shouldAuditTool)(tool.name, tool.riskLevel))
|
|
21
|
+
return false;
|
|
22
|
+
if (!confirmed)
|
|
23
|
+
return false;
|
|
24
|
+
const status = resultOperationStatus(result);
|
|
25
|
+
return status === "executed" || status === "failed";
|
|
26
|
+
}
|
|
27
|
+
function registerMcpTool(server, tool, handler) {
|
|
28
|
+
const compatibleServer = server;
|
|
29
|
+
compatibleServer.registerTool(tool.name, {
|
|
30
|
+
description: tool.description,
|
|
31
|
+
inputSchema: tool.inputSchema,
|
|
32
|
+
}, async (args) => handler(args));
|
|
33
|
+
}
|
|
9
34
|
function registerTools(server, context) {
|
|
10
35
|
const policy = (0, tool_policy_1.createDefaultToolPolicy)();
|
|
11
|
-
const registerTool = server.registerTool.bind(server);
|
|
12
36
|
for (const tool of (0, tools_1.allTools)()) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
37
|
+
registerMcpTool(server, tool, async (args) => {
|
|
38
|
+
const startedAt = Date.now();
|
|
39
|
+
let parsed;
|
|
40
|
+
let result;
|
|
41
|
+
let confirmed = true;
|
|
17
42
|
try {
|
|
18
|
-
|
|
19
|
-
const
|
|
20
|
-
|
|
43
|
+
parsed = tool.inputSchema.parse(args);
|
|
44
|
+
const parsedArgs = parsed;
|
|
45
|
+
confirmed = tool.isConfirmed?.(parsedArgs) ?? true;
|
|
46
|
+
const isAllowedPreview = tool.allowPreviewWhenBlocked === true && (!confirmed || tool.deferPolicyToHandler === true);
|
|
47
|
+
if (!isAllowedPreview) {
|
|
48
|
+
(0, assert_tool_policy_1.assertToolPolicy)(policy, tool.name, tool.riskLevel);
|
|
49
|
+
}
|
|
50
|
+
result = await tool.handler(parsedArgs, context);
|
|
51
|
+
result = { ...result, tool: tool.name };
|
|
52
|
+
if (shouldWriteAudit(tool, confirmed, result)) {
|
|
53
|
+
try {
|
|
54
|
+
await (0, audit_log_service_1.writeAuditLog)(context, {
|
|
55
|
+
tool: tool.name,
|
|
56
|
+
riskLevel: tool.riskLevel,
|
|
57
|
+
args: parsed,
|
|
58
|
+
result,
|
|
59
|
+
durationMs: Date.now() - startedAt,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (auditError) {
|
|
63
|
+
result = (0, result_1.withAuditWarning)(result, (0, audit_log_service_1.auditWarning)(auditError));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
21
66
|
return (0, result_1.toMcpTextResult)(result);
|
|
22
67
|
}
|
|
23
68
|
catch (error) {
|
|
24
|
-
|
|
69
|
+
result = (0, result_1.fail)(tool.name, (0, errors_1.errorMessage)(error), (0, errors_1.errorMetadata)(error));
|
|
70
|
+
if (shouldWriteAudit(tool, confirmed, result)) {
|
|
71
|
+
try {
|
|
72
|
+
await (0, audit_log_service_1.writeAuditLog)(context, {
|
|
73
|
+
tool: tool.name,
|
|
74
|
+
riskLevel: tool.riskLevel,
|
|
75
|
+
args: parsed ?? args,
|
|
76
|
+
result,
|
|
77
|
+
error,
|
|
78
|
+
durationMs: Date.now() - startedAt,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch (auditError) {
|
|
82
|
+
result = (0, result_1.withAuditWarning)(result, (0, audit_log_service_1.auditWarning)(auditError));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return (0, result_1.toMcpTextResult)(result);
|
|
25
86
|
}
|
|
26
87
|
});
|
|
27
88
|
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
export declare const MCP_TOOL_NAMES: {
|
|
2
|
+
readonly HUB_V2_DOCS_CREATE: "hub_v2_docs_create";
|
|
3
|
+
readonly HUB_V2_DOCS_GET: "hub_v2_docs_get";
|
|
4
|
+
readonly HUB_V2_DOCS_GET_BY_SLUG: "hub_v2_docs_get_by_slug";
|
|
5
|
+
readonly HUB_V2_DOCS_LIST: "hub_v2_docs_list";
|
|
6
|
+
readonly HUB_V2_DOCS_UPDATE: "hub_v2_docs_update";
|
|
7
|
+
readonly HUB_V2_ISSUES_ASSIGN: "hub_v2_issues_assign";
|
|
8
|
+
readonly HUB_V2_ISSUES_COMMENT: "hub_v2_issues_comment";
|
|
9
|
+
readonly HUB_V2_ISSUES_CREATE: "hub_v2_issues_create";
|
|
10
|
+
readonly HUB_V2_ISSUES_GET: "hub_v2_issues_get";
|
|
11
|
+
readonly HUB_V2_ISSUES_LIST: "hub_v2_issues_list";
|
|
12
|
+
readonly HUB_V2_ISSUES_UPDATE: "hub_v2_issues_update";
|
|
13
|
+
readonly HUB_V2_PROJECT_MEMBERS_LIST: "hub_v2_project_members_list";
|
|
14
|
+
readonly HUB_V2_PROJECTS_GET: "hub_v2_projects_get";
|
|
15
|
+
readonly HUB_V2_PROJECTS_LIST: "hub_v2_projects_list";
|
|
16
|
+
readonly HUB_V2_RD_ADVANCE_STAGE: "hub_v2_rd_advance_stage";
|
|
17
|
+
readonly HUB_V2_RD_CREATE: "hub_v2_rd_create";
|
|
18
|
+
readonly HUB_V2_RD_GET: "hub_v2_rd_get";
|
|
19
|
+
readonly HUB_V2_RD_LIST: "hub_v2_rd_list";
|
|
20
|
+
readonly HUB_V2_RD_STAGE_TASKS_CREATE: "hub_v2_rd_stage_tasks_create";
|
|
21
|
+
readonly HUB_V2_RD_STAGE_TASKS_LIST: "hub_v2_rd_stage_tasks_list";
|
|
22
|
+
readonly HUB_V2_RD_UPDATE_PROGRESS: "hub_v2_rd_update_progress";
|
|
23
|
+
readonly HUB_V2_UPLOAD_MARKDOWN_IMAGE: "hub_v2_upload_markdown_image";
|
|
24
|
+
readonly NGM_ANGULAR_VALIDATE_COMPONENT_BOUNDARY: "ngm_angular_validate_component_boundary";
|
|
25
|
+
readonly NGM_ANGULAR_VALIDATE_COMPONENT_NAMING: "ngm_angular_validate_component_naming";
|
|
26
|
+
readonly NGM_ANGULAR_VALIDATE_STRUCTURE: "ngm_angular_validate_structure";
|
|
27
|
+
readonly NGM_CAPABILITIES: "ngm_capabilities";
|
|
28
|
+
readonly NGM_DOCTOR: "ngm_doctor";
|
|
29
|
+
readonly NGM_FILE_WRITE: "ngm_file_write";
|
|
30
|
+
readonly NGM_GIT_DIFF: "ngm_git_diff";
|
|
31
|
+
readonly NGM_GIT_GENERATE_COMMIT_MESSAGE: "ngm_git_generate_commit_message";
|
|
32
|
+
readonly NGM_GIT_GENERATE_REVIEW_SUMMARY: "ngm_git_generate_review_summary";
|
|
33
|
+
readonly NGM_GIT_STATUS: "ngm_git_status";
|
|
34
|
+
readonly NGM_GIT_VALIDATE_BRANCH_NAME: "ngm_git_validate_branch_name";
|
|
35
|
+
readonly NGM_GIT_VALIDATE_COMMIT_MESSAGE: "ngm_git_validate_commit_message";
|
|
36
|
+
readonly NGM_LOG_SEARCH: "ngm_log_search";
|
|
37
|
+
readonly NGM_LOG_TAIL: "ngm_log_tail";
|
|
38
|
+
readonly NGM_NGINX_CONFIG_GET_MAIN: "ngm_nginx_config_get_main";
|
|
39
|
+
readonly NGM_NGINX_CONFIG_VALIDATE: "ngm_nginx_config_validate";
|
|
40
|
+
readonly NGM_NGINX_LOGS_TAIL: "ngm_nginx_logs_tail";
|
|
41
|
+
readonly NGM_NGINX_PROXY_SAVE: "ngm_nginx_proxy_save";
|
|
42
|
+
readonly NGM_NGINX_RELOAD: "ngm_nginx_reload";
|
|
43
|
+
readonly NGM_NGINX_SERVER_GET: "ngm_nginx_server_get";
|
|
44
|
+
readonly NGM_NGINX_SERVERS_LIST: "ngm_nginx_servers_list";
|
|
45
|
+
readonly NGM_NGINX_STATUS: "ngm_nginx_status";
|
|
46
|
+
readonly NGM_NGINX_UPSTREAMS_LIST: "ngm_nginx_upstreams_list";
|
|
47
|
+
readonly NGM_PROJECT_FIND: "ngm_project_find";
|
|
48
|
+
readonly NGM_PROJECT_GET: "ngm_project_get";
|
|
49
|
+
readonly NGM_PROJECT_GET_SCRIPTS: "ngm_project_get_scripts";
|
|
50
|
+
readonly NGM_PROJECT_HEALTH_CHECK: "ngm_project_health_check";
|
|
51
|
+
readonly NGM_PROJECT_LIST: "ngm_project_list";
|
|
52
|
+
readonly NGM_PROJECT_LIST_TASKS: "ngm_project_list_tasks";
|
|
53
|
+
readonly NGM_PROJECT_MANAGED_LIST: "ngm_project_managed_list";
|
|
54
|
+
readonly NGM_PROJECT_PORT_CHECK: "ngm_project_port_check";
|
|
55
|
+
readonly NGM_PROJECT_READ_PACKAGE_JSON: "ngm_project_read_package_json";
|
|
56
|
+
readonly NGM_PROJECT_RUN_SCRIPT: "ngm_project_run_script";
|
|
57
|
+
readonly NGM_PROJECT_STOP: "ngm_project_stop";
|
|
58
|
+
readonly NGM_PROJECT_TASK_LOGS: "ngm_project_task_logs";
|
|
59
|
+
readonly NGM_PROJECT_TASK_STATUS: "ngm_project_task_status";
|
|
60
|
+
readonly NGM_PROXY_LIST: "ngm_proxy_list";
|
|
61
|
+
readonly NGM_PROXY_VALIDATE: "ngm_proxy_validate";
|
|
62
|
+
readonly NGM_REVIEW_DETECT_RISKS: "ngm_review_detect_risks";
|
|
63
|
+
readonly NGM_REVIEW_GENERATE_CHECKLIST: "ngm_review_generate_checklist";
|
|
64
|
+
readonly NGM_REVIEW_GENERATE_REPORT: "ngm_review_generate_report";
|
|
65
|
+
readonly NGM_REVIEW_SCAN_CHANGED_FILES: "ngm_review_scan_changed_files";
|
|
66
|
+
readonly NGM_ROUTE_TASK: "ngm_route_task";
|
|
67
|
+
readonly NGM_RUNTIME_CURRENT: "ngm_runtime_current";
|
|
68
|
+
readonly NGM_RUNTIME_DETECT_REQUIREMENT: "ngm_runtime_detect_requirement";
|
|
69
|
+
readonly NGM_RUNTIME_LIST: "ngm_runtime_list";
|
|
70
|
+
readonly NGM_RUNTIME_RESOLVE_FOR_PROJECT: "ngm_runtime_resolve_for_project";
|
|
71
|
+
readonly NGM_RUNTIME_SET_FOR_PROJECT: "ngm_runtime_set_for_project";
|
|
72
|
+
readonly NGM_STANDARD_GET: "ngm_standard_get";
|
|
73
|
+
readonly NGM_STANDARD_INIT: "ngm_standard_init";
|
|
74
|
+
readonly NGM_STANDARD_VALIDATE_PROJECT: "ngm_standard_validate_project";
|
|
75
|
+
readonly NGM_TASK_GET_STATUS: "ngm_task_get_status";
|
|
76
|
+
readonly NGM_TASK_LIST: "ngm_task_list";
|
|
77
|
+
readonly NGM_TEST_DETECT_MISSING_SPECS: "ngm_test_detect_missing_specs";
|
|
78
|
+
readonly NGM_TEST_GENERATE_SPEC_PLAN: "ngm_test_generate_spec_plan";
|
|
79
|
+
readonly NGM_TEST_VALIDATE_NAMING: "ngm_test_validate_naming";
|
|
80
|
+
readonly NGM_WORKFLOW_ADVANCE_STATUS: "ngm_workflow_advance_status";
|
|
81
|
+
readonly NGM_WORKFLOW_CREATE_FRONTEND_TASK: "ngm_workflow_create_frontend_task";
|
|
82
|
+
readonly NGM_WORKFLOW_GENERATE_DELIVERY_REPORT: "ngm_workflow_generate_delivery_report";
|
|
83
|
+
readonly NGM_WORKFLOW_GENERATE_DEV_PLAN: "ngm_workflow_generate_dev_plan";
|
|
84
|
+
readonly NGM_WORKFLOW_VALIDATE_BEFORE_COMMIT: "ngm_workflow_validate_before_commit";
|
|
85
|
+
readonly NGM_WORKFLOW_VALIDATE_BEFORE_WRITE: "ngm_workflow_validate_before_write";
|
|
86
|
+
readonly NGM_WORKSPACE_APPLY_PATCH_PREVIEW: "ngm_workspace_apply_patch_preview";
|
|
87
|
+
readonly NGM_WORKSPACE_CAPABILITY_MAP: "ngm_workspace_capability_map";
|
|
88
|
+
readonly NGM_WORKSPACE_DIFF: "ngm_workspace_diff";
|
|
89
|
+
readonly NGM_WORKSPACE_GET_PACKAGE: "ngm_workspace_get_package";
|
|
90
|
+
readonly NGM_WORKSPACE_LIST_PACKAGES: "ngm_workspace_list_packages";
|
|
91
|
+
readonly NGM_WORKSPACE_MCP_TOOLS: "ngm_workspace_mcp_tools";
|
|
92
|
+
readonly NGM_WORKSPACE_SUMMARY: "ngm_workspace_summary";
|
|
93
|
+
};
|
|
94
|
+
export type McpToolName = (typeof MCP_TOOL_NAMES)[keyof typeof MCP_TOOL_NAMES];
|
|
95
|
+
export declare const MCP_TOOL_NAME_SET: Set<string>;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MCP_TOOL_NAME_SET = exports.MCP_TOOL_NAMES = void 0;
|
|
4
|
+
exports.MCP_TOOL_NAMES = {
|
|
5
|
+
HUB_V2_DOCS_CREATE: "hub_v2_docs_create",
|
|
6
|
+
HUB_V2_DOCS_GET: "hub_v2_docs_get",
|
|
7
|
+
HUB_V2_DOCS_GET_BY_SLUG: "hub_v2_docs_get_by_slug",
|
|
8
|
+
HUB_V2_DOCS_LIST: "hub_v2_docs_list",
|
|
9
|
+
HUB_V2_DOCS_UPDATE: "hub_v2_docs_update",
|
|
10
|
+
HUB_V2_ISSUES_ASSIGN: "hub_v2_issues_assign",
|
|
11
|
+
HUB_V2_ISSUES_COMMENT: "hub_v2_issues_comment",
|
|
12
|
+
HUB_V2_ISSUES_CREATE: "hub_v2_issues_create",
|
|
13
|
+
HUB_V2_ISSUES_GET: "hub_v2_issues_get",
|
|
14
|
+
HUB_V2_ISSUES_LIST: "hub_v2_issues_list",
|
|
15
|
+
HUB_V2_ISSUES_UPDATE: "hub_v2_issues_update",
|
|
16
|
+
HUB_V2_PROJECT_MEMBERS_LIST: "hub_v2_project_members_list",
|
|
17
|
+
HUB_V2_PROJECTS_GET: "hub_v2_projects_get",
|
|
18
|
+
HUB_V2_PROJECTS_LIST: "hub_v2_projects_list",
|
|
19
|
+
HUB_V2_RD_ADVANCE_STAGE: "hub_v2_rd_advance_stage",
|
|
20
|
+
HUB_V2_RD_CREATE: "hub_v2_rd_create",
|
|
21
|
+
HUB_V2_RD_GET: "hub_v2_rd_get",
|
|
22
|
+
HUB_V2_RD_LIST: "hub_v2_rd_list",
|
|
23
|
+
HUB_V2_RD_STAGE_TASKS_CREATE: "hub_v2_rd_stage_tasks_create",
|
|
24
|
+
HUB_V2_RD_STAGE_TASKS_LIST: "hub_v2_rd_stage_tasks_list",
|
|
25
|
+
HUB_V2_RD_UPDATE_PROGRESS: "hub_v2_rd_update_progress",
|
|
26
|
+
HUB_V2_UPLOAD_MARKDOWN_IMAGE: "hub_v2_upload_markdown_image",
|
|
27
|
+
NGM_ANGULAR_VALIDATE_COMPONENT_BOUNDARY: "ngm_angular_validate_component_boundary",
|
|
28
|
+
NGM_ANGULAR_VALIDATE_COMPONENT_NAMING: "ngm_angular_validate_component_naming",
|
|
29
|
+
NGM_ANGULAR_VALIDATE_STRUCTURE: "ngm_angular_validate_structure",
|
|
30
|
+
NGM_CAPABILITIES: "ngm_capabilities",
|
|
31
|
+
NGM_DOCTOR: "ngm_doctor",
|
|
32
|
+
NGM_FILE_WRITE: "ngm_file_write",
|
|
33
|
+
NGM_GIT_DIFF: "ngm_git_diff",
|
|
34
|
+
NGM_GIT_GENERATE_COMMIT_MESSAGE: "ngm_git_generate_commit_message",
|
|
35
|
+
NGM_GIT_GENERATE_REVIEW_SUMMARY: "ngm_git_generate_review_summary",
|
|
36
|
+
NGM_GIT_STATUS: "ngm_git_status",
|
|
37
|
+
NGM_GIT_VALIDATE_BRANCH_NAME: "ngm_git_validate_branch_name",
|
|
38
|
+
NGM_GIT_VALIDATE_COMMIT_MESSAGE: "ngm_git_validate_commit_message",
|
|
39
|
+
NGM_LOG_SEARCH: "ngm_log_search",
|
|
40
|
+
NGM_LOG_TAIL: "ngm_log_tail",
|
|
41
|
+
NGM_NGINX_CONFIG_GET_MAIN: "ngm_nginx_config_get_main",
|
|
42
|
+
NGM_NGINX_CONFIG_VALIDATE: "ngm_nginx_config_validate",
|
|
43
|
+
NGM_NGINX_LOGS_TAIL: "ngm_nginx_logs_tail",
|
|
44
|
+
NGM_NGINX_PROXY_SAVE: "ngm_nginx_proxy_save",
|
|
45
|
+
NGM_NGINX_RELOAD: "ngm_nginx_reload",
|
|
46
|
+
NGM_NGINX_SERVER_GET: "ngm_nginx_server_get",
|
|
47
|
+
NGM_NGINX_SERVERS_LIST: "ngm_nginx_servers_list",
|
|
48
|
+
NGM_NGINX_STATUS: "ngm_nginx_status",
|
|
49
|
+
NGM_NGINX_UPSTREAMS_LIST: "ngm_nginx_upstreams_list",
|
|
50
|
+
NGM_PROJECT_FIND: "ngm_project_find",
|
|
51
|
+
NGM_PROJECT_GET: "ngm_project_get",
|
|
52
|
+
NGM_PROJECT_GET_SCRIPTS: "ngm_project_get_scripts",
|
|
53
|
+
NGM_PROJECT_HEALTH_CHECK: "ngm_project_health_check",
|
|
54
|
+
NGM_PROJECT_LIST: "ngm_project_list",
|
|
55
|
+
NGM_PROJECT_LIST_TASKS: "ngm_project_list_tasks",
|
|
56
|
+
NGM_PROJECT_MANAGED_LIST: "ngm_project_managed_list",
|
|
57
|
+
NGM_PROJECT_PORT_CHECK: "ngm_project_port_check",
|
|
58
|
+
NGM_PROJECT_READ_PACKAGE_JSON: "ngm_project_read_package_json",
|
|
59
|
+
NGM_PROJECT_RUN_SCRIPT: "ngm_project_run_script",
|
|
60
|
+
NGM_PROJECT_STOP: "ngm_project_stop",
|
|
61
|
+
NGM_PROJECT_TASK_LOGS: "ngm_project_task_logs",
|
|
62
|
+
NGM_PROJECT_TASK_STATUS: "ngm_project_task_status",
|
|
63
|
+
NGM_PROXY_LIST: "ngm_proxy_list",
|
|
64
|
+
NGM_PROXY_VALIDATE: "ngm_proxy_validate",
|
|
65
|
+
NGM_REVIEW_DETECT_RISKS: "ngm_review_detect_risks",
|
|
66
|
+
NGM_REVIEW_GENERATE_CHECKLIST: "ngm_review_generate_checklist",
|
|
67
|
+
NGM_REVIEW_GENERATE_REPORT: "ngm_review_generate_report",
|
|
68
|
+
NGM_REVIEW_SCAN_CHANGED_FILES: "ngm_review_scan_changed_files",
|
|
69
|
+
NGM_ROUTE_TASK: "ngm_route_task",
|
|
70
|
+
NGM_RUNTIME_CURRENT: "ngm_runtime_current",
|
|
71
|
+
NGM_RUNTIME_DETECT_REQUIREMENT: "ngm_runtime_detect_requirement",
|
|
72
|
+
NGM_RUNTIME_LIST: "ngm_runtime_list",
|
|
73
|
+
NGM_RUNTIME_RESOLVE_FOR_PROJECT: "ngm_runtime_resolve_for_project",
|
|
74
|
+
NGM_RUNTIME_SET_FOR_PROJECT: "ngm_runtime_set_for_project",
|
|
75
|
+
NGM_STANDARD_GET: "ngm_standard_get",
|
|
76
|
+
NGM_STANDARD_INIT: "ngm_standard_init",
|
|
77
|
+
NGM_STANDARD_VALIDATE_PROJECT: "ngm_standard_validate_project",
|
|
78
|
+
NGM_TASK_GET_STATUS: "ngm_task_get_status",
|
|
79
|
+
NGM_TASK_LIST: "ngm_task_list",
|
|
80
|
+
NGM_TEST_DETECT_MISSING_SPECS: "ngm_test_detect_missing_specs",
|
|
81
|
+
NGM_TEST_GENERATE_SPEC_PLAN: "ngm_test_generate_spec_plan",
|
|
82
|
+
NGM_TEST_VALIDATE_NAMING: "ngm_test_validate_naming",
|
|
83
|
+
NGM_WORKFLOW_ADVANCE_STATUS: "ngm_workflow_advance_status",
|
|
84
|
+
NGM_WORKFLOW_CREATE_FRONTEND_TASK: "ngm_workflow_create_frontend_task",
|
|
85
|
+
NGM_WORKFLOW_GENERATE_DELIVERY_REPORT: "ngm_workflow_generate_delivery_report",
|
|
86
|
+
NGM_WORKFLOW_GENERATE_DEV_PLAN: "ngm_workflow_generate_dev_plan",
|
|
87
|
+
NGM_WORKFLOW_VALIDATE_BEFORE_COMMIT: "ngm_workflow_validate_before_commit",
|
|
88
|
+
NGM_WORKFLOW_VALIDATE_BEFORE_WRITE: "ngm_workflow_validate_before_write",
|
|
89
|
+
NGM_WORKSPACE_APPLY_PATCH_PREVIEW: "ngm_workspace_apply_patch_preview",
|
|
90
|
+
NGM_WORKSPACE_CAPABILITY_MAP: "ngm_workspace_capability_map",
|
|
91
|
+
NGM_WORKSPACE_DIFF: "ngm_workspace_diff",
|
|
92
|
+
NGM_WORKSPACE_GET_PACKAGE: "ngm_workspace_get_package",
|
|
93
|
+
NGM_WORKSPACE_LIST_PACKAGES: "ngm_workspace_list_packages",
|
|
94
|
+
NGM_WORKSPACE_MCP_TOOLS: "ngm_workspace_mcp_tools",
|
|
95
|
+
NGM_WORKSPACE_SUMMARY: "ngm_workspace_summary",
|
|
96
|
+
};
|
|
97
|
+
exports.MCP_TOOL_NAME_SET = new Set(Object.values(exports.MCP_TOOL_NAMES));
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.PathGuardService = void 0;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const error_codes_1 = require("../errors/error-codes");
|
|
39
|
+
const mcp_tool_error_1 = require("../errors/mcp-tool-error");
|
|
40
|
+
function isAbsolutePath(value) {
|
|
41
|
+
return path.isAbsolute(value) || path.win32.isAbsolute(value) || path.posix.isAbsolute(value);
|
|
42
|
+
}
|
|
43
|
+
function isInside(parent, child) {
|
|
44
|
+
const relative = path.relative(parent, child);
|
|
45
|
+
return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
|
|
46
|
+
}
|
|
47
|
+
class PathGuardService {
|
|
48
|
+
assertSafeRelativePath(relativePath) {
|
|
49
|
+
const normalized = relativePath.trim().replace(/\\/g, "/");
|
|
50
|
+
if (!normalized || normalized.includes("\0")) {
|
|
51
|
+
throw new mcp_tool_error_1.McpToolError(error_codes_1.McpErrorCodes.TOOL_INPUT_INVALID, "relativePath is required");
|
|
52
|
+
}
|
|
53
|
+
if (isAbsolutePath(normalized)) {
|
|
54
|
+
throw new mcp_tool_error_1.McpToolError(error_codes_1.McpErrorCodes.ABSOLUTE_PATH_DENIED, "relativePath must not be absolute", { relativePath });
|
|
55
|
+
}
|
|
56
|
+
const parts = normalized.split("/").filter(Boolean);
|
|
57
|
+
if (!parts.length || parts.includes("..")) {
|
|
58
|
+
throw new mcp_tool_error_1.McpToolError(error_codes_1.McpErrorCodes.PATH_ESCAPE_DENIED, "relativePath must stay inside the project directory", {
|
|
59
|
+
relativePath,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
resolveInsideProject(projectRoot, relativePath) {
|
|
64
|
+
this.assertSafeRelativePath(relativePath);
|
|
65
|
+
const target = path.resolve(projectRoot, ...relativePath.replace(/\\/g, "/").split("/").filter(Boolean));
|
|
66
|
+
if (!isInside(path.resolve(projectRoot), target)) {
|
|
67
|
+
throw new mcp_tool_error_1.McpToolError(error_codes_1.McpErrorCodes.PATH_ESCAPE_DENIED, "resolved path escapes project root", {
|
|
68
|
+
projectRoot,
|
|
69
|
+
relativePath,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return target;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.PathGuardService = PathGuardService;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PermissionService = void 0;
|
|
4
|
+
const error_codes_1 = require("../errors/error-codes");
|
|
5
|
+
const mcp_tool_error_1 = require("../errors/mcp-tool-error");
|
|
6
|
+
const requiredEnvByAction = {
|
|
7
|
+
read: [],
|
|
8
|
+
write: ["NGM_MCP_ALLOW_WRITE"],
|
|
9
|
+
execute: ["NGM_MCP_ALLOW_EXECUTE"],
|
|
10
|
+
external: ["NGM_MCP_ALLOW_HUB"],
|
|
11
|
+
};
|
|
12
|
+
function isEnabled(name) {
|
|
13
|
+
return String(process.env[name] ?? "").trim().toLowerCase() === "true";
|
|
14
|
+
}
|
|
15
|
+
class PermissionService {
|
|
16
|
+
assertAllowed(actionType) {
|
|
17
|
+
const missing = this.getRequiredEnv(actionType).filter((name) => !isEnabled(name));
|
|
18
|
+
if (missing.length === 0)
|
|
19
|
+
return;
|
|
20
|
+
const errorCode = actionType === "write"
|
|
21
|
+
? error_codes_1.McpErrorCodes.WRITE_NOT_ALLOWED
|
|
22
|
+
: actionType === "execute"
|
|
23
|
+
? error_codes_1.McpErrorCodes.EXECUTE_NOT_ALLOWED
|
|
24
|
+
: error_codes_1.McpErrorCodes.TOOL_INPUT_INVALID;
|
|
25
|
+
throw new mcp_tool_error_1.McpToolError(errorCode, `${missing.join(", ")}=true is required before confirmed ${actionType} operations can run`, {
|
|
26
|
+
requires: missing,
|
|
27
|
+
policy: missing.map((name) => ({
|
|
28
|
+
env: name,
|
|
29
|
+
requiredValue: "true",
|
|
30
|
+
currentValue: process.env[name] ? "[set-but-not-enabled]" : "[unset]",
|
|
31
|
+
})),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
getRequiredEnv(actionType) {
|
|
35
|
+
return requiredEnvByAction[actionType];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.PermissionService = PermissionService;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface ResolvedProject {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
root: string;
|
|
5
|
+
type?: string;
|
|
6
|
+
createdAt?: number;
|
|
7
|
+
updatedAt?: number;
|
|
8
|
+
framework?: string;
|
|
9
|
+
scripts?: Record<string, string>;
|
|
10
|
+
packageManager?: string;
|
|
11
|
+
runtime?: any;
|
|
12
|
+
nodeVersion?: string;
|
|
13
|
+
isFavorite?: boolean;
|
|
14
|
+
repoUrl?: string;
|
|
15
|
+
repoPageUrl?: string;
|
|
16
|
+
env?: unknown;
|
|
17
|
+
assets?: unknown;
|
|
18
|
+
lastOpened?: unknown;
|
|
19
|
+
}
|
|
20
|
+
type ProjectRegistry = {
|
|
21
|
+
list?: () => Promise<any[]>;
|
|
22
|
+
get?: (projectId: string) => Promise<any>;
|
|
23
|
+
};
|
|
24
|
+
export declare class ProjectResolverService {
|
|
25
|
+
private readonly projectRegistry;
|
|
26
|
+
constructor(projectRegistry: ProjectRegistry);
|
|
27
|
+
listProjects(): Promise<ResolvedProject[]>;
|
|
28
|
+
resolveProject(projectId: string): Promise<ResolvedProject>;
|
|
29
|
+
private getProject;
|
|
30
|
+
private normalizeProject;
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ProjectResolverService = void 0;
|
|
37
|
+
const fs_1 = require("fs");
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const error_codes_1 = require("../errors/error-codes");
|
|
40
|
+
const mcp_tool_error_1 = require("../errors/mcp-tool-error");
|
|
41
|
+
class ProjectResolverService {
|
|
42
|
+
constructor(projectRegistry) {
|
|
43
|
+
this.projectRegistry = projectRegistry;
|
|
44
|
+
}
|
|
45
|
+
async listProjects() {
|
|
46
|
+
if (typeof this.projectRegistry.list !== "function") {
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
const projects = await this.projectRegistry.list();
|
|
50
|
+
return projects.map((project) => this.normalizeProject(project));
|
|
51
|
+
}
|
|
52
|
+
async resolveProject(projectId) {
|
|
53
|
+
const id = projectId.trim();
|
|
54
|
+
if (!id) {
|
|
55
|
+
throw new mcp_tool_error_1.McpToolError(error_codes_1.McpErrorCodes.TOOL_INPUT_INVALID, "projectId is required");
|
|
56
|
+
}
|
|
57
|
+
const listed = await this.listProjects();
|
|
58
|
+
const fromList = listed.find((project) => project.id === id);
|
|
59
|
+
const project = fromList ?? await this.getProject(id);
|
|
60
|
+
if (!project) {
|
|
61
|
+
throw new mcp_tool_error_1.McpToolError(error_codes_1.McpErrorCodes.PROJECT_NOT_FOUND, `Project not found: ${id}`, { projectId: id });
|
|
62
|
+
}
|
|
63
|
+
const normalized = this.normalizeProject(project);
|
|
64
|
+
if (!(0, fs_1.existsSync)(normalized.root)) {
|
|
65
|
+
throw new mcp_tool_error_1.McpToolError(error_codes_1.McpErrorCodes.PROJECT_ROOT_NOT_FOUND, "registered project root does not exist", {
|
|
66
|
+
project: { id: normalized.id, name: normalized.name, root: normalized.root },
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return normalized;
|
|
70
|
+
}
|
|
71
|
+
async getProject(projectId) {
|
|
72
|
+
if (typeof this.projectRegistry.get !== "function") {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
return await this.projectRegistry.get(projectId);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
throw new mcp_tool_error_1.McpToolError(error_codes_1.McpErrorCodes.PROJECT_NOT_FOUND, `Project not found: ${projectId}`, {
|
|
80
|
+
projectId,
|
|
81
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
normalizeProject(project) {
|
|
86
|
+
return {
|
|
87
|
+
...project,
|
|
88
|
+
id: String(project.id),
|
|
89
|
+
name: String(project.name),
|
|
90
|
+
root: path.resolve(String(project.root)),
|
|
91
|
+
type: project.type ?? (typeof project.framework === "string" ? project.framework : undefined),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
exports.ProjectResolverService = ProjectResolverService;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.defaultFrontendStandard = void 0;
|
|
4
|
+
exports.defaultFrontendStandard = {
|
|
5
|
+
framework: {
|
|
6
|
+
name: "Angular",
|
|
7
|
+
},
|
|
8
|
+
uiLibrary: {
|
|
9
|
+
name: "NG-ZORRO",
|
|
10
|
+
componentPrefix: "nz",
|
|
11
|
+
},
|
|
12
|
+
style: {
|
|
13
|
+
language: "Less",
|
|
14
|
+
fileExtension: ".less",
|
|
15
|
+
},
|
|
16
|
+
naming: {
|
|
17
|
+
branchPatterns: [
|
|
18
|
+
"feature/{issueId}-{short-name}",
|
|
19
|
+
"fix/{issueId}-{short-name}",
|
|
20
|
+
"refactor/{module}-{short-name}",
|
|
21
|
+
"hotfix/{date}-{short-name}",
|
|
22
|
+
],
|
|
23
|
+
commitTypes: ["feat", "fix", "refactor", "docs", "test", "chore"],
|
|
24
|
+
componentSuffixes: ["page", "component", "dialog", "drawer", "table", "form"],
|
|
25
|
+
},
|
|
26
|
+
structure: {
|
|
27
|
+
pagesDir: "src/app/pages",
|
|
28
|
+
componentsDir: "src/app/components",
|
|
29
|
+
servicesDir: "src/app/services",
|
|
30
|
+
modelsDir: "src/app/models",
|
|
31
|
+
maxComponentFileLines: 400,
|
|
32
|
+
},
|
|
33
|
+
git: {
|
|
34
|
+
branchPatterns: [
|
|
35
|
+
"^feature/[A-Za-z0-9]+-[a-z0-9][a-z0-9-]*$",
|
|
36
|
+
"^fix/[A-Za-z0-9]+-[a-z0-9][a-z0-9-]*$",
|
|
37
|
+
"^refactor/[a-z0-9][a-z0-9-]*-[a-z0-9][a-z0-9-]*$",
|
|
38
|
+
"^hotfix/\\d{8}-[a-z0-9][a-z0-9-]*$",
|
|
39
|
+
],
|
|
40
|
+
commitPattern: "^(feat|fix|refactor|docs|test|chore)\\([a-z0-9-]+\\): .+",
|
|
41
|
+
},
|
|
42
|
+
testing: {
|
|
43
|
+
requireServiceSpec: true,
|
|
44
|
+
requireUtilSpec: true,
|
|
45
|
+
suggestComponentSpec: true,
|
|
46
|
+
},
|
|
47
|
+
review: {
|
|
48
|
+
requireChecklist: true,
|
|
49
|
+
riskKeywords: ["auth", "permission", "token", "password", "delete", "migration", "runtime", "process"],
|
|
50
|
+
},
|
|
51
|
+
};
|