@skillsmith/mcp-server 0.4.6 → 0.4.8
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/CHANGELOG.md +26 -0
- package/README.md +20 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/__tests__/tool-dispatch.test.d.ts +8 -0
- package/dist/src/__tests__/tool-dispatch.test.d.ts.map +1 -0
- package/dist/src/__tests__/tool-dispatch.test.js +144 -0
- package/dist/src/__tests__/tool-dispatch.test.js.map +1 -0
- package/dist/src/index.js +31 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/middleware/license.d.ts +23 -0
- package/dist/src/middleware/license.d.ts.map +1 -1
- package/dist/src/middleware/license.js +28 -0
- package/dist/src/middleware/license.js.map +1 -1
- package/dist/src/middleware/toolFeatureMapping.d.ts.map +1 -1
- package/dist/src/middleware/toolFeatureMapping.js +4 -1
- package/dist/src/middleware/toolFeatureMapping.js.map +1 -1
- package/dist/src/supabase-client.d.ts +24 -0
- package/dist/src/supabase-client.d.ts.map +1 -0
- package/dist/src/supabase-client.js +63 -0
- package/dist/src/supabase-client.js.map +1 -0
- package/dist/src/tool-dispatch.d.ts.map +1 -1
- package/dist/src/tool-dispatch.js +71 -62
- package/dist/src/tool-dispatch.js.map +1 -1
- package/dist/src/tools/analytics.d.ts +155 -0
- package/dist/src/tools/analytics.d.ts.map +1 -0
- package/dist/src/tools/analytics.js +321 -0
- package/dist/src/tools/analytics.js.map +1 -0
- package/dist/src/tools/analytics.service.d.ts +46 -0
- package/dist/src/tools/analytics.service.d.ts.map +1 -0
- package/dist/src/tools/analytics.service.js +69 -0
- package/dist/src/tools/analytics.service.js.map +1 -0
- package/dist/src/tools/analytics.service.test.d.ts +6 -0
- package/dist/src/tools/analytics.service.test.d.ts.map +1 -0
- package/dist/src/tools/analytics.service.test.js +151 -0
- package/dist/src/tools/analytics.service.test.js.map +1 -0
- package/dist/src/tools/analytics.stub.d.ts +27 -0
- package/dist/src/tools/analytics.stub.d.ts.map +1 -0
- package/dist/src/tools/analytics.stub.js +200 -0
- package/dist/src/tools/analytics.stub.js.map +1 -0
- package/dist/src/tools/analytics.test.d.ts +6 -0
- package/dist/src/tools/analytics.test.d.ts.map +1 -0
- package/dist/src/tools/analytics.test.js +146 -0
- package/dist/src/tools/analytics.test.js.map +1 -0
- package/dist/src/tools/analyze.d.ts.map +1 -1
- package/dist/src/tools/analyze.js +7 -1
- package/dist/src/tools/analyze.js.map +1 -1
- package/dist/src/tools/audit-tools.d.ts +172 -0
- package/dist/src/tools/audit-tools.d.ts.map +1 -0
- package/dist/src/tools/audit-tools.js +187 -0
- package/dist/src/tools/audit-tools.js.map +1 -0
- package/dist/src/tools/audit-tools.test.d.ts +10 -0
- package/dist/src/tools/audit-tools.test.d.ts.map +1 -0
- package/dist/src/tools/audit-tools.test.js +147 -0
- package/dist/src/tools/audit-tools.test.js.map +1 -0
- package/dist/src/tools/compliance-tools.d.ts +103 -0
- package/dist/src/tools/compliance-tools.d.ts.map +1 -0
- package/dist/src/tools/compliance-tools.js +257 -0
- package/dist/src/tools/compliance-tools.js.map +1 -0
- package/dist/src/tools/compliance-tools.service.d.ts +19 -0
- package/dist/src/tools/compliance-tools.service.d.ts.map +1 -0
- package/dist/src/tools/compliance-tools.service.js +107 -0
- package/dist/src/tools/compliance-tools.service.js.map +1 -0
- package/dist/src/tools/compliance-tools.service.test.d.ts +6 -0
- package/dist/src/tools/compliance-tools.service.test.d.ts.map +1 -0
- package/dist/src/tools/compliance-tools.service.test.js +140 -0
- package/dist/src/tools/compliance-tools.service.test.js.map +1 -0
- package/dist/src/tools/compliance-tools.test.d.ts +6 -0
- package/dist/src/tools/compliance-tools.test.d.ts.map +1 -0
- package/dist/src/tools/compliance-tools.test.js +136 -0
- package/dist/src/tools/compliance-tools.test.js.map +1 -0
- package/dist/src/tools/get-skill.d.ts.map +1 -1
- package/dist/src/tools/get-skill.js +24 -1
- package/dist/src/tools/get-skill.js.map +1 -1
- package/dist/src/tools/index-local.d.ts.map +1 -1
- package/dist/src/tools/index-local.js +4 -0
- package/dist/src/tools/index-local.js.map +1 -1
- package/dist/src/tools/install.d.ts.map +1 -1
- package/dist/src/tools/install.js +2 -0
- package/dist/src/tools/install.js.map +1 -1
- package/dist/src/tools/install.tool.d.ts +4 -0
- package/dist/src/tools/install.tool.d.ts.map +1 -1
- package/dist/src/tools/install.tool.js +4 -0
- package/dist/src/tools/install.tool.js.map +1 -1
- package/dist/src/tools/install.types.d.ts +4 -0
- package/dist/src/tools/install.types.d.ts.map +1 -1
- package/dist/src/tools/install.types.js +5 -0
- package/dist/src/tools/install.types.js.map +1 -1
- package/dist/src/tools/integration-tools.d.ts +210 -0
- package/dist/src/tools/integration-tools.d.ts.map +1 -0
- package/dist/src/tools/integration-tools.js +264 -0
- package/dist/src/tools/integration-tools.js.map +1 -0
- package/dist/src/tools/integration-tools.service.d.ts +54 -0
- package/dist/src/tools/integration-tools.service.d.ts.map +1 -0
- package/dist/src/tools/integration-tools.service.js +299 -0
- package/dist/src/tools/integration-tools.service.js.map +1 -0
- package/dist/src/tools/integration-tools.service.test.d.ts +8 -0
- package/dist/src/tools/integration-tools.service.test.d.ts.map +1 -0
- package/dist/src/tools/integration-tools.service.test.js +401 -0
- package/dist/src/tools/integration-tools.service.test.js.map +1 -0
- package/dist/src/tools/integration-tools.stub.d.ts +13 -0
- package/dist/src/tools/integration-tools.stub.d.ts.map +1 -0
- package/dist/src/tools/integration-tools.stub.js +133 -0
- package/dist/src/tools/integration-tools.stub.js.map +1 -0
- package/dist/src/tools/integration-tools.test.d.ts +6 -0
- package/dist/src/tools/integration-tools.test.d.ts.map +1 -0
- package/dist/src/tools/integration-tools.test.js +259 -0
- package/dist/src/tools/integration-tools.test.js.map +1 -0
- package/dist/src/tools/publish-private.d.ts +60 -0
- package/dist/src/tools/publish-private.d.ts.map +1 -0
- package/dist/src/tools/publish-private.js +85 -0
- package/dist/src/tools/publish-private.js.map +1 -0
- package/dist/src/tools/publish-private.test.d.ts +6 -0
- package/dist/src/tools/publish-private.test.d.ts.map +1 -0
- package/dist/src/tools/publish-private.test.js +118 -0
- package/dist/src/tools/publish-private.test.js.map +1 -0
- package/dist/src/tools/publish.types.d.ts +2 -2
- package/dist/src/tools/rbac-tools.d.ts +180 -0
- package/dist/src/tools/rbac-tools.d.ts.map +1 -0
- package/dist/src/tools/rbac-tools.js +300 -0
- package/dist/src/tools/rbac-tools.js.map +1 -0
- package/dist/src/tools/rbac-tools.test.d.ts +6 -0
- package/dist/src/tools/rbac-tools.test.d.ts.map +1 -0
- package/dist/src/tools/rbac-tools.test.js +299 -0
- package/dist/src/tools/rbac-tools.test.js.map +1 -0
- package/dist/src/tools/rbac-tools.types.d.ts +70 -0
- package/dist/src/tools/rbac-tools.types.d.ts.map +1 -0
- package/dist/src/tools/rbac-tools.types.js +119 -0
- package/dist/src/tools/rbac-tools.types.js.map +1 -0
- package/dist/src/tools/recommend.helpers.d.ts.map +1 -1
- package/dist/src/tools/recommend.helpers.js +2 -1
- package/dist/src/tools/recommend.helpers.js.map +1 -1
- package/dist/src/tools/recommend.js +3 -3
- package/dist/src/tools/recommend.js.map +1 -1
- package/dist/src/tools/recommend.types.d.ts +3 -3
- package/dist/src/tools/registry-tools.d.ts +133 -0
- package/dist/src/tools/registry-tools.d.ts.map +1 -0
- package/dist/src/tools/registry-tools.js +246 -0
- package/dist/src/tools/registry-tools.js.map +1 -0
- package/dist/src/tools/registry-tools.test.d.ts +6 -0
- package/dist/src/tools/registry-tools.test.d.ts.map +1 -0
- package/dist/src/tools/registry-tools.test.js +167 -0
- package/dist/src/tools/registry-tools.test.js.map +1 -0
- package/dist/src/tools/search.formatter.d.ts.map +1 -1
- package/dist/src/tools/search.formatter.js +11 -1
- package/dist/src/tools/search.formatter.js.map +1 -1
- package/dist/src/tools/skill-audit.d.ts +3 -3
- package/dist/src/tools/skill-audit.d.ts.map +1 -1
- package/dist/src/tools/skill-audit.js +5 -5
- package/dist/src/tools/skill-audit.js.map +1 -1
- package/dist/src/tools/skill-audit.test.js +5 -5
- package/dist/src/tools/skill-audit.test.js.map +1 -1
- package/dist/src/tools/skill-diff.d.ts +2 -2
- package/dist/src/tools/skill-rescan.d.ts.map +1 -1
- package/dist/src/tools/skill-rescan.js +2 -3
- package/dist/src/tools/skill-rescan.js.map +1 -1
- package/dist/src/tools/skill-rescan.test.js +2 -2
- package/dist/src/tools/skill-rescan.test.js.map +1 -1
- package/dist/src/tools/sso-tools.d.ts +136 -0
- package/dist/src/tools/sso-tools.d.ts.map +1 -0
- package/dist/src/tools/sso-tools.js +214 -0
- package/dist/src/tools/sso-tools.js.map +1 -0
- package/dist/src/tools/sso-tools.test.d.ts +6 -0
- package/dist/src/tools/sso-tools.test.d.ts.map +1 -0
- package/dist/src/tools/sso-tools.test.js +167 -0
- package/dist/src/tools/sso-tools.test.js.map +1 -0
- package/dist/src/tools/suggest.d.ts +4 -4
- package/dist/src/tools/suggest.d.ts.map +1 -1
- package/dist/src/tools/suggest.js +7 -1
- package/dist/src/tools/suggest.js.map +1 -1
- package/dist/src/tools/team-workspace.d.ts +179 -0
- package/dist/src/tools/team-workspace.d.ts.map +1 -0
- package/dist/src/tools/team-workspace.js +243 -0
- package/dist/src/tools/team-workspace.js.map +1 -0
- package/dist/src/tools/team-workspace.stub.d.ts +13 -0
- package/dist/src/tools/team-workspace.stub.d.ts.map +1 -0
- package/dist/src/tools/team-workspace.stub.js +76 -0
- package/dist/src/tools/team-workspace.stub.js.map +1 -0
- package/dist/src/tools/team-workspace.test.d.ts +7 -0
- package/dist/src/tools/team-workspace.test.d.ts.map +1 -0
- package/dist/src/tools/team-workspace.test.js +273 -0
- package/dist/src/tools/team-workspace.test.js.map +1 -0
- package/dist/src/tools/uninstall.d.ts +1 -1
- package/dist/src/utils/team-resolver.d.ts +20 -0
- package/dist/src/utils/team-resolver.d.ts.map +1 -0
- package/dist/src/utils/team-resolver.js +52 -0
- package/dist/src/utils/team-resolver.js.map +1 -0
- package/dist/src/utils/url-validator.d.ts +24 -0
- package/dist/src/utils/url-validator.d.ts.map +1 -0
- package/dist/src/utils/url-validator.js +59 -0
- package/dist/src/utils/url-validator.js.map +1 -0
- package/dist/tests/integration/recommend.integration.test.js +1 -1
- package/dist/tests/integration/recommend.integration.test.js.map +1 -1
- package/dist/tests/recommend.test.js +1 -1
- package/dist/tests/recommend.test.js.map +1 -1
- package/package.json +3 -3
- package/server.json +2 -2
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview team_workspace and share_skill MCP tools
|
|
3
|
+
* @module @skillsmith/mcp-server/tools/team-workspace
|
|
4
|
+
* @see SMI-3895: Team Workspace + Share Skill MCP Tools
|
|
5
|
+
* @see SMI-3898: Skill Sharing Controls
|
|
6
|
+
*
|
|
7
|
+
* Registry-mediated architecture: workspace metadata lives in Supabase
|
|
8
|
+
* (server-side), not local SQLite. MCP tools call Supabase RPCs for
|
|
9
|
+
* workspace CRUD. License key resolves to team_id for auth.
|
|
10
|
+
*
|
|
11
|
+
* Tier gate: Team (team_workspaces feature flag).
|
|
12
|
+
*/
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
import type { ToolContext } from '../context.js';
|
|
15
|
+
export { createStubService } from './team-workspace.stub.js';
|
|
16
|
+
export declare const teamWorkspaceInputSchema: z.ZodObject<{
|
|
17
|
+
action: z.ZodEnum<["create", "list", "get", "delete"]>;
|
|
18
|
+
name: z.ZodOptional<z.ZodString>;
|
|
19
|
+
description: z.ZodOptional<z.ZodString>;
|
|
20
|
+
workspaceId: z.ZodOptional<z.ZodString>;
|
|
21
|
+
}, "strip", z.ZodTypeAny, {
|
|
22
|
+
action: "get" | "create" | "list" | "delete";
|
|
23
|
+
name?: string | undefined;
|
|
24
|
+
description?: string | undefined;
|
|
25
|
+
workspaceId?: string | undefined;
|
|
26
|
+
}, {
|
|
27
|
+
action: "get" | "create" | "list" | "delete";
|
|
28
|
+
name?: string | undefined;
|
|
29
|
+
description?: string | undefined;
|
|
30
|
+
workspaceId?: string | undefined;
|
|
31
|
+
}>;
|
|
32
|
+
export type TeamWorkspaceInput = z.infer<typeof teamWorkspaceInputSchema>;
|
|
33
|
+
export declare const shareSkillInputSchema: z.ZodObject<{
|
|
34
|
+
action: z.ZodEnum<["add", "remove", "list"]>;
|
|
35
|
+
workspaceId: z.ZodString;
|
|
36
|
+
skillId: z.ZodOptional<z.ZodString>;
|
|
37
|
+
}, "strip", z.ZodTypeAny, {
|
|
38
|
+
action: "remove" | "list" | "add";
|
|
39
|
+
workspaceId: string;
|
|
40
|
+
skillId?: string | undefined;
|
|
41
|
+
}, {
|
|
42
|
+
action: "remove" | "list" | "add";
|
|
43
|
+
workspaceId: string;
|
|
44
|
+
skillId?: string | undefined;
|
|
45
|
+
}>;
|
|
46
|
+
export type ShareSkillInput = z.infer<typeof shareSkillInputSchema>;
|
|
47
|
+
export interface Workspace {
|
|
48
|
+
id: string;
|
|
49
|
+
name: string;
|
|
50
|
+
description: string | null;
|
|
51
|
+
teamId: string;
|
|
52
|
+
settings: WorkspaceSettings;
|
|
53
|
+
createdAt: string;
|
|
54
|
+
updatedAt: string;
|
|
55
|
+
}
|
|
56
|
+
export interface WorkspaceSettings {
|
|
57
|
+
sharing?: SharingPolicy;
|
|
58
|
+
}
|
|
59
|
+
/** SMI-3898: Sharing policy for workspace skill sharing controls */
|
|
60
|
+
export interface SharingPolicy {
|
|
61
|
+
/** Whether adding a skill requires approval (stored, not enforced in MVP) */
|
|
62
|
+
requireApproval: boolean;
|
|
63
|
+
/** Glob patterns for allowed skills -- "author1/{star}", "{star}/skill-name" */
|
|
64
|
+
allowList: string[];
|
|
65
|
+
/** Glob patterns for denied skills -- "untrusted-author/{star}" */
|
|
66
|
+
denyList: string[];
|
|
67
|
+
}
|
|
68
|
+
export interface SharedSkill {
|
|
69
|
+
skillId: string;
|
|
70
|
+
addedBy: string;
|
|
71
|
+
addedAt: string;
|
|
72
|
+
}
|
|
73
|
+
export interface TeamWorkspaceResult {
|
|
74
|
+
success: boolean;
|
|
75
|
+
dataSource: 'stub' | 'live';
|
|
76
|
+
workspace?: Workspace;
|
|
77
|
+
workspaces?: Workspace[];
|
|
78
|
+
message?: string;
|
|
79
|
+
error?: string;
|
|
80
|
+
}
|
|
81
|
+
export interface ShareSkillResult {
|
|
82
|
+
success: boolean;
|
|
83
|
+
dataSource: 'stub' | 'live';
|
|
84
|
+
skills?: SharedSkill[];
|
|
85
|
+
message?: string;
|
|
86
|
+
error?: string;
|
|
87
|
+
}
|
|
88
|
+
export declare const teamWorkspaceToolSchema: {
|
|
89
|
+
name: string;
|
|
90
|
+
description: string;
|
|
91
|
+
inputSchema: {
|
|
92
|
+
type: "object";
|
|
93
|
+
properties: {
|
|
94
|
+
action: {
|
|
95
|
+
type: string;
|
|
96
|
+
enum: string[];
|
|
97
|
+
description: string;
|
|
98
|
+
};
|
|
99
|
+
name: {
|
|
100
|
+
type: string;
|
|
101
|
+
description: string;
|
|
102
|
+
};
|
|
103
|
+
description: {
|
|
104
|
+
type: string;
|
|
105
|
+
description: string;
|
|
106
|
+
};
|
|
107
|
+
workspaceId: {
|
|
108
|
+
type: string;
|
|
109
|
+
description: string;
|
|
110
|
+
};
|
|
111
|
+
};
|
|
112
|
+
required: string[];
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
export declare const shareSkillToolSchema: {
|
|
116
|
+
name: string;
|
|
117
|
+
description: string;
|
|
118
|
+
inputSchema: {
|
|
119
|
+
type: "object";
|
|
120
|
+
properties: {
|
|
121
|
+
action: {
|
|
122
|
+
type: string;
|
|
123
|
+
enum: string[];
|
|
124
|
+
description: string;
|
|
125
|
+
};
|
|
126
|
+
workspaceId: {
|
|
127
|
+
type: string;
|
|
128
|
+
description: string;
|
|
129
|
+
};
|
|
130
|
+
skillId: {
|
|
131
|
+
type: string;
|
|
132
|
+
description: string;
|
|
133
|
+
};
|
|
134
|
+
};
|
|
135
|
+
required: string[];
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
export interface TeamWorkspaceService {
|
|
139
|
+
resolveTeamId(licenseKey: string): Promise<string>;
|
|
140
|
+
createWorkspace(teamId: string, name: string, description?: string): Promise<Workspace>;
|
|
141
|
+
listWorkspaces(teamId: string): Promise<Workspace[]>;
|
|
142
|
+
getWorkspace(teamId: string, workspaceId: string): Promise<Workspace | null>;
|
|
143
|
+
deleteWorkspace(teamId: string, workspaceId: string): Promise<boolean>;
|
|
144
|
+
addSkill(teamId: string, workspaceId: string, skillId: string): Promise<SharedSkill>;
|
|
145
|
+
removeSkill(teamId: string, workspaceId: string, skillId: string): Promise<boolean>;
|
|
146
|
+
listSkills(teamId: string, workspaceId: string): Promise<SharedSkill[]>;
|
|
147
|
+
getWorkspaceSettings(teamId: string, workspaceId: string): Promise<WorkspaceSettings>;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Match a skill ID against a glob-like pattern.
|
|
151
|
+
* Supports star as a wildcard segment (e.g. "author/star", "star/name").
|
|
152
|
+
*/
|
|
153
|
+
export declare function matchesPattern(skillId: string, pattern: string): boolean;
|
|
154
|
+
/**
|
|
155
|
+
* Check if a skill ID is allowed by the sharing policy.
|
|
156
|
+
* Returns an error message if denied, or null if allowed.
|
|
157
|
+
*/
|
|
158
|
+
export declare function checkSharingPolicy(skillId: string, policy: SharingPolicy | undefined): string | null;
|
|
159
|
+
/** Replace the workspace service implementation (for testing or Supabase swap) */
|
|
160
|
+
export declare function setTeamWorkspaceService(svc: TeamWorkspaceService): void;
|
|
161
|
+
/** Get the current workspace service instance */
|
|
162
|
+
export declare function getTeamWorkspaceService(): TeamWorkspaceService;
|
|
163
|
+
/**
|
|
164
|
+
* Execute a team_workspace operation.
|
|
165
|
+
*
|
|
166
|
+
* @param input - Validated workspace input
|
|
167
|
+
* @param _context - Tool context (unused until Supabase integration)
|
|
168
|
+
*/
|
|
169
|
+
export declare function executeTeamWorkspace(input: TeamWorkspaceInput, _context: ToolContext): Promise<TeamWorkspaceResult>;
|
|
170
|
+
/**
|
|
171
|
+
* Execute a share_skill operation.
|
|
172
|
+
*
|
|
173
|
+
* SMI-3898: Checks allowList/denyList before adding a skill.
|
|
174
|
+
*
|
|
175
|
+
* @param input - Validated share input
|
|
176
|
+
* @param _context - Tool context (unused until Supabase integration)
|
|
177
|
+
*/
|
|
178
|
+
export declare function executeShareSkill(input: ShareSkillInput, _context: ToolContext): Promise<ShareSkillResult>;
|
|
179
|
+
//# sourceMappingURL=team-workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-workspace.d.ts","sourceRoot":"","sources":["../../../src/tools/team-workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview team_workspace and share_skill MCP tools
|
|
3
|
+
* @module @skillsmith/mcp-server/tools/team-workspace
|
|
4
|
+
* @see SMI-3895: Team Workspace + Share Skill MCP Tools
|
|
5
|
+
* @see SMI-3898: Skill Sharing Controls
|
|
6
|
+
*
|
|
7
|
+
* Registry-mediated architecture: workspace metadata lives in Supabase
|
|
8
|
+
* (server-side), not local SQLite. MCP tools call Supabase RPCs for
|
|
9
|
+
* workspace CRUD. License key resolves to team_id for auth.
|
|
10
|
+
*
|
|
11
|
+
* Tier gate: Team (team_workspaces feature flag).
|
|
12
|
+
*/
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
import { isSupabaseConfigured } from '../supabase-client.js';
|
|
15
|
+
import { createStubService } from './team-workspace.stub.js';
|
|
16
|
+
// Re-export stub factory for external consumers and tests
|
|
17
|
+
export { createStubService } from './team-workspace.stub.js';
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Input schemas
|
|
20
|
+
// ============================================================================
|
|
21
|
+
export const teamWorkspaceInputSchema = z.object({
|
|
22
|
+
action: z.enum(['create', 'list', 'get', 'delete']),
|
|
23
|
+
name: z.string().min(1).max(100).optional(),
|
|
24
|
+
description: z.string().max(500).optional(),
|
|
25
|
+
workspaceId: z.string().uuid().optional(),
|
|
26
|
+
});
|
|
27
|
+
export const shareSkillInputSchema = z.object({
|
|
28
|
+
action: z.enum(['add', 'remove', 'list']),
|
|
29
|
+
workspaceId: z.string().uuid(),
|
|
30
|
+
skillId: z
|
|
31
|
+
.string()
|
|
32
|
+
.regex(/^[^/]+\/[^/]+$/, 'Must be author/name format')
|
|
33
|
+
.optional(),
|
|
34
|
+
});
|
|
35
|
+
// ============================================================================
|
|
36
|
+
// Tool schemas for MCP registration
|
|
37
|
+
// ============================================================================
|
|
38
|
+
export const teamWorkspaceToolSchema = {
|
|
39
|
+
name: 'team_workspace',
|
|
40
|
+
description: 'Manage team workspaces (create, list, get, delete). Requires Team tier license.',
|
|
41
|
+
inputSchema: {
|
|
42
|
+
type: 'object',
|
|
43
|
+
properties: {
|
|
44
|
+
action: {
|
|
45
|
+
type: 'string',
|
|
46
|
+
enum: ['create', 'list', 'get', 'delete'],
|
|
47
|
+
description: 'Workspace operation to perform',
|
|
48
|
+
},
|
|
49
|
+
name: {
|
|
50
|
+
type: 'string',
|
|
51
|
+
description: 'Workspace name (required for create)',
|
|
52
|
+
},
|
|
53
|
+
description: {
|
|
54
|
+
type: 'string',
|
|
55
|
+
description: 'Workspace description (optional for create)',
|
|
56
|
+
},
|
|
57
|
+
workspaceId: {
|
|
58
|
+
type: 'string',
|
|
59
|
+
description: 'Workspace ID (required for get/delete)',
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
required: ['action'],
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
export const shareSkillToolSchema = {
|
|
66
|
+
name: 'share_skill',
|
|
67
|
+
description: 'Add, remove, or list skills in a team workspace. Requires Team tier license.',
|
|
68
|
+
inputSchema: {
|
|
69
|
+
type: 'object',
|
|
70
|
+
properties: {
|
|
71
|
+
action: {
|
|
72
|
+
type: 'string',
|
|
73
|
+
enum: ['add', 'remove', 'list'],
|
|
74
|
+
description: 'Sharing operation to perform',
|
|
75
|
+
},
|
|
76
|
+
workspaceId: {
|
|
77
|
+
type: 'string',
|
|
78
|
+
description: 'Workspace ID to share skill with',
|
|
79
|
+
},
|
|
80
|
+
skillId: {
|
|
81
|
+
type: 'string',
|
|
82
|
+
description: 'Skill ID in author/name format (required for add/remove)',
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
required: ['action', 'workspaceId'],
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
// ============================================================================
|
|
89
|
+
// SMI-3898: Sharing policy enforcement
|
|
90
|
+
// ============================================================================
|
|
91
|
+
/**
|
|
92
|
+
* Match a skill ID against a glob-like pattern.
|
|
93
|
+
* Supports star as a wildcard segment (e.g. "author/star", "star/name").
|
|
94
|
+
*/
|
|
95
|
+
export function matchesPattern(skillId, pattern) {
|
|
96
|
+
const [skillAuthor, skillName] = skillId.split('/');
|
|
97
|
+
const [patternAuthor, patternName] = pattern.split('/');
|
|
98
|
+
if (!patternAuthor || !patternName)
|
|
99
|
+
return false;
|
|
100
|
+
const authorMatch = patternAuthor === '*' || patternAuthor === skillAuthor;
|
|
101
|
+
const nameMatch = patternName === '*' || patternName === skillName;
|
|
102
|
+
return authorMatch && nameMatch;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Check if a skill ID is allowed by the sharing policy.
|
|
106
|
+
* Returns an error message if denied, or null if allowed.
|
|
107
|
+
*/
|
|
108
|
+
export function checkSharingPolicy(skillId, policy) {
|
|
109
|
+
if (!policy)
|
|
110
|
+
return null;
|
|
111
|
+
// Deny list takes precedence
|
|
112
|
+
if (policy.denyList.length > 0) {
|
|
113
|
+
const denied = policy.denyList.some((pattern) => matchesPattern(skillId, pattern));
|
|
114
|
+
if (denied) {
|
|
115
|
+
return `Skill "${skillId}" is blocked by the workspace deny list.`;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// If allow list is non-empty, skill must match at least one pattern
|
|
119
|
+
if (policy.allowList.length > 0) {
|
|
120
|
+
const allowed = policy.allowList.some((pattern) => matchesPattern(skillId, pattern));
|
|
121
|
+
if (!allowed) {
|
|
122
|
+
return `Skill "${skillId}" is not in the workspace allow list.`;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
// Module-level singleton (swapped when Supabase RPCs are ready)
|
|
128
|
+
let service = createStubService();
|
|
129
|
+
/** Replace the workspace service implementation (for testing or Supabase swap) */
|
|
130
|
+
export function setTeamWorkspaceService(svc) {
|
|
131
|
+
service = svc;
|
|
132
|
+
}
|
|
133
|
+
/** Get the current workspace service instance */
|
|
134
|
+
export function getTeamWorkspaceService() {
|
|
135
|
+
return service;
|
|
136
|
+
}
|
|
137
|
+
// ============================================================================
|
|
138
|
+
// Handlers
|
|
139
|
+
// ============================================================================
|
|
140
|
+
/**
|
|
141
|
+
* Execute a team_workspace operation.
|
|
142
|
+
*
|
|
143
|
+
* @param input - Validated workspace input
|
|
144
|
+
* @param _context - Tool context (unused until Supabase integration)
|
|
145
|
+
*/
|
|
146
|
+
export async function executeTeamWorkspace(input, _context) {
|
|
147
|
+
const dataSource = isSupabaseConfigured() ? 'live' : 'stub';
|
|
148
|
+
// TODO: Extract license key from context/env and resolve team_id via Supabase
|
|
149
|
+
const licenseKey = process.env.SKILLSMITH_LICENSE_KEY ?? '';
|
|
150
|
+
const teamId = await service.resolveTeamId(licenseKey);
|
|
151
|
+
switch (input.action) {
|
|
152
|
+
case 'create': {
|
|
153
|
+
if (!input.name) {
|
|
154
|
+
return { success: false, dataSource, error: 'Name is required for workspace creation.' };
|
|
155
|
+
}
|
|
156
|
+
const ws = await service.createWorkspace(teamId, input.name, input.description);
|
|
157
|
+
return {
|
|
158
|
+
success: true,
|
|
159
|
+
dataSource,
|
|
160
|
+
workspace: ws,
|
|
161
|
+
message: `Workspace "${ws.name}" created.`,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
case 'list': {
|
|
165
|
+
const list = await service.listWorkspaces(teamId);
|
|
166
|
+
return {
|
|
167
|
+
success: true,
|
|
168
|
+
dataSource,
|
|
169
|
+
workspaces: list,
|
|
170
|
+
message: `Found ${list.length} workspace(s).`,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
case 'get': {
|
|
174
|
+
if (!input.workspaceId) {
|
|
175
|
+
return { success: false, dataSource, error: 'workspaceId is required for get.' };
|
|
176
|
+
}
|
|
177
|
+
const ws = await service.getWorkspace(teamId, input.workspaceId);
|
|
178
|
+
if (!ws)
|
|
179
|
+
return { success: false, dataSource, error: 'Workspace not found.' };
|
|
180
|
+
return { success: true, dataSource, workspace: ws };
|
|
181
|
+
}
|
|
182
|
+
case 'delete': {
|
|
183
|
+
if (!input.workspaceId) {
|
|
184
|
+
return { success: false, dataSource, error: 'workspaceId is required for delete.' };
|
|
185
|
+
}
|
|
186
|
+
const deleted = await service.deleteWorkspace(teamId, input.workspaceId);
|
|
187
|
+
if (!deleted)
|
|
188
|
+
return { success: false, dataSource, error: 'Workspace not found.' };
|
|
189
|
+
return { success: true, dataSource, message: 'Workspace deleted.' };
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Execute a share_skill operation.
|
|
195
|
+
*
|
|
196
|
+
* SMI-3898: Checks allowList/denyList before adding a skill.
|
|
197
|
+
*
|
|
198
|
+
* @param input - Validated share input
|
|
199
|
+
* @param _context - Tool context (unused until Supabase integration)
|
|
200
|
+
*/
|
|
201
|
+
export async function executeShareSkill(input, _context) {
|
|
202
|
+
const dataSource = isSupabaseConfigured() ? 'live' : 'stub';
|
|
203
|
+
const licenseKey = process.env.SKILLSMITH_LICENSE_KEY ?? '';
|
|
204
|
+
const teamId = await service.resolveTeamId(licenseKey);
|
|
205
|
+
switch (input.action) {
|
|
206
|
+
case 'add': {
|
|
207
|
+
if (!input.skillId) {
|
|
208
|
+
return { success: false, dataSource, error: 'skillId is required for add.' };
|
|
209
|
+
}
|
|
210
|
+
// SMI-3898: Check sharing policy before adding
|
|
211
|
+
const settings = await service.getWorkspaceSettings(teamId, input.workspaceId);
|
|
212
|
+
const policyError = checkSharingPolicy(input.skillId, settings.sharing);
|
|
213
|
+
if (policyError) {
|
|
214
|
+
return { success: false, dataSource, error: policyError };
|
|
215
|
+
}
|
|
216
|
+
const skill = await service.addSkill(teamId, input.workspaceId, input.skillId);
|
|
217
|
+
return {
|
|
218
|
+
success: true,
|
|
219
|
+
dataSource,
|
|
220
|
+
skills: [skill],
|
|
221
|
+
message: `Skill "${input.skillId}" shared to workspace.`,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
case 'remove': {
|
|
225
|
+
if (!input.skillId) {
|
|
226
|
+
return { success: false, dataSource, error: 'skillId is required for remove.' };
|
|
227
|
+
}
|
|
228
|
+
const removed = await service.removeSkill(teamId, input.workspaceId, input.skillId);
|
|
229
|
+
if (!removed)
|
|
230
|
+
return { success: false, dataSource, error: 'Skill not found in workspace.' };
|
|
231
|
+
return {
|
|
232
|
+
success: true,
|
|
233
|
+
dataSource,
|
|
234
|
+
message: `Skill "${input.skillId}" removed from workspace.`,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
case 'list': {
|
|
238
|
+
const list = await service.listSkills(teamId, input.workspaceId);
|
|
239
|
+
return { success: true, dataSource, skills: list, message: `${list.length} shared skill(s).` };
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=team-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-workspace.js","sourceRoot":"","sources":["../../../src/tools/team-workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Stub service for team workspace MCP tools
|
|
3
|
+
* @module @skillsmith/mcp-server/tools/team-workspace.stub
|
|
4
|
+
* @see SMI-3895: Team Workspace + Share Skill MCP Tools
|
|
5
|
+
* @see SMI-3914: Wave 0 stub extraction
|
|
6
|
+
*
|
|
7
|
+
* Extracted from team-workspace.ts for file-size compliance.
|
|
8
|
+
* Provides in-memory stub implementation for workspace CRUD and skill sharing.
|
|
9
|
+
*/
|
|
10
|
+
import type { TeamWorkspaceService } from './team-workspace.js';
|
|
11
|
+
/** @internal Exported for testing */
|
|
12
|
+
export declare function createStubService(): TeamWorkspaceService;
|
|
13
|
+
//# sourceMappingURL=team-workspace.stub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-workspace.stub.d.ts","sourceRoot":"","sources":["../../../src/tools/team-workspace.stub.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,oBAAoB,EAIrB,MAAM,qBAAqB,CAAA;AAM5B,qCAAqC;AACrC,wBAAgB,iBAAiB,IAAI,oBAAoB,CAsExD"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Stub service for team workspace MCP tools
|
|
3
|
+
* @module @skillsmith/mcp-server/tools/team-workspace.stub
|
|
4
|
+
* @see SMI-3895: Team Workspace + Share Skill MCP Tools
|
|
5
|
+
* @see SMI-3914: Wave 0 stub extraction
|
|
6
|
+
*
|
|
7
|
+
* Extracted from team-workspace.ts for file-size compliance.
|
|
8
|
+
* Provides in-memory stub implementation for workspace CRUD and skill sharing.
|
|
9
|
+
*/
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Stub service factory
|
|
12
|
+
// ============================================================================
|
|
13
|
+
/** @internal Exported for testing */
|
|
14
|
+
export function createStubService() {
|
|
15
|
+
// In-memory store for stub data
|
|
16
|
+
const workspaces = new Map();
|
|
17
|
+
const skills = new Map();
|
|
18
|
+
return {
|
|
19
|
+
async resolveTeamId(_licenseKey) {
|
|
20
|
+
// TODO: Replace with Supabase RPC: license_key -> subscription -> team_id
|
|
21
|
+
return 'team_stub_00000000-0000-0000-0000-000000000000';
|
|
22
|
+
},
|
|
23
|
+
async createWorkspace(teamId, name, description) {
|
|
24
|
+
const id = crypto.randomUUID();
|
|
25
|
+
const now = new Date().toISOString();
|
|
26
|
+
const ws = {
|
|
27
|
+
id,
|
|
28
|
+
name,
|
|
29
|
+
description: description ?? null,
|
|
30
|
+
teamId,
|
|
31
|
+
settings: {},
|
|
32
|
+
createdAt: now,
|
|
33
|
+
updatedAt: now,
|
|
34
|
+
};
|
|
35
|
+
workspaces.set(id, ws);
|
|
36
|
+
return ws;
|
|
37
|
+
},
|
|
38
|
+
async listWorkspaces(teamId) {
|
|
39
|
+
return [...workspaces.values()].filter((ws) => ws.teamId === teamId);
|
|
40
|
+
},
|
|
41
|
+
async getWorkspace(_teamId, workspaceId) {
|
|
42
|
+
return workspaces.get(workspaceId) ?? null;
|
|
43
|
+
},
|
|
44
|
+
async deleteWorkspace(_teamId, workspaceId) {
|
|
45
|
+
const existed = workspaces.has(workspaceId);
|
|
46
|
+
workspaces.delete(workspaceId);
|
|
47
|
+
skills.delete(workspaceId);
|
|
48
|
+
return existed;
|
|
49
|
+
},
|
|
50
|
+
async addSkill(_teamId, workspaceId, skillId) {
|
|
51
|
+
const entry = {
|
|
52
|
+
skillId,
|
|
53
|
+
addedBy: 'current-user',
|
|
54
|
+
addedAt: new Date().toISOString(),
|
|
55
|
+
};
|
|
56
|
+
const list = skills.get(workspaceId) ?? [];
|
|
57
|
+
list.push(entry);
|
|
58
|
+
skills.set(workspaceId, list);
|
|
59
|
+
return entry;
|
|
60
|
+
},
|
|
61
|
+
async removeSkill(_teamId, workspaceId, skillId) {
|
|
62
|
+
const list = skills.get(workspaceId) ?? [];
|
|
63
|
+
const filtered = list.filter((s) => s.skillId !== skillId);
|
|
64
|
+
skills.set(workspaceId, filtered);
|
|
65
|
+
return filtered.length < list.length;
|
|
66
|
+
},
|
|
67
|
+
async listSkills(_teamId, workspaceId) {
|
|
68
|
+
return skills.get(workspaceId) ?? [];
|
|
69
|
+
},
|
|
70
|
+
async getWorkspaceSettings(_teamId, workspaceId) {
|
|
71
|
+
const ws = workspaces.get(workspaceId);
|
|
72
|
+
return ws?.settings ?? {};
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=team-workspace.stub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-workspace.stub.js","sourceRoot":"","sources":["../../../src/tools/team-workspace.stub.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-workspace.test.d.ts","sourceRoot":"","sources":["../../../src/tools/team-workspace.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|