@skillsmith/mcp-server 0.4.7 → 0.4.9

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 (213) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +21 -0
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/src/__tests__/tool-dispatch.test.d.ts +8 -0
  5. package/dist/src/__tests__/tool-dispatch.test.d.ts.map +1 -0
  6. package/dist/src/__tests__/tool-dispatch.test.js +144 -0
  7. package/dist/src/__tests__/tool-dispatch.test.js.map +1 -0
  8. package/dist/src/index.js +31 -2
  9. package/dist/src/index.js.map +1 -1
  10. package/dist/src/middleware/license.d.ts +23 -0
  11. package/dist/src/middleware/license.d.ts.map +1 -1
  12. package/dist/src/middleware/license.js +28 -0
  13. package/dist/src/middleware/license.js.map +1 -1
  14. package/dist/src/middleware/toolFeatureMapping.d.ts.map +1 -1
  15. package/dist/src/middleware/toolFeatureMapping.js +4 -1
  16. package/dist/src/middleware/toolFeatureMapping.js.map +1 -1
  17. package/dist/src/supabase-client.d.ts +24 -0
  18. package/dist/src/supabase-client.d.ts.map +1 -0
  19. package/dist/src/supabase-client.js +63 -0
  20. package/dist/src/supabase-client.js.map +1 -0
  21. package/dist/src/tool-dispatch.d.ts.map +1 -1
  22. package/dist/src/tool-dispatch.js +71 -62
  23. package/dist/src/tool-dispatch.js.map +1 -1
  24. package/dist/src/tools/analytics.d.ts +155 -0
  25. package/dist/src/tools/analytics.d.ts.map +1 -0
  26. package/dist/src/tools/analytics.js +321 -0
  27. package/dist/src/tools/analytics.js.map +1 -0
  28. package/dist/src/tools/analytics.service.d.ts +46 -0
  29. package/dist/src/tools/analytics.service.d.ts.map +1 -0
  30. package/dist/src/tools/analytics.service.js +69 -0
  31. package/dist/src/tools/analytics.service.js.map +1 -0
  32. package/dist/src/tools/analytics.service.test.d.ts +6 -0
  33. package/dist/src/tools/analytics.service.test.d.ts.map +1 -0
  34. package/dist/src/tools/analytics.service.test.js +151 -0
  35. package/dist/src/tools/analytics.service.test.js.map +1 -0
  36. package/dist/src/tools/analytics.stub.d.ts +27 -0
  37. package/dist/src/tools/analytics.stub.d.ts.map +1 -0
  38. package/dist/src/tools/analytics.stub.js +200 -0
  39. package/dist/src/tools/analytics.stub.js.map +1 -0
  40. package/dist/src/tools/analytics.test.d.ts +6 -0
  41. package/dist/src/tools/analytics.test.d.ts.map +1 -0
  42. package/dist/src/tools/analytics.test.js +146 -0
  43. package/dist/src/tools/analytics.test.js.map +1 -0
  44. package/dist/src/tools/analyze.d.ts.map +1 -1
  45. package/dist/src/tools/analyze.js +7 -1
  46. package/dist/src/tools/analyze.js.map +1 -1
  47. package/dist/src/tools/audit-tools.d.ts +172 -0
  48. package/dist/src/tools/audit-tools.d.ts.map +1 -0
  49. package/dist/src/tools/audit-tools.js +187 -0
  50. package/dist/src/tools/audit-tools.js.map +1 -0
  51. package/dist/src/tools/audit-tools.test.d.ts +10 -0
  52. package/dist/src/tools/audit-tools.test.d.ts.map +1 -0
  53. package/dist/src/tools/audit-tools.test.js +147 -0
  54. package/dist/src/tools/audit-tools.test.js.map +1 -0
  55. package/dist/src/tools/compliance-tools.d.ts +103 -0
  56. package/dist/src/tools/compliance-tools.d.ts.map +1 -0
  57. package/dist/src/tools/compliance-tools.js +257 -0
  58. package/dist/src/tools/compliance-tools.js.map +1 -0
  59. package/dist/src/tools/compliance-tools.service.d.ts +19 -0
  60. package/dist/src/tools/compliance-tools.service.d.ts.map +1 -0
  61. package/dist/src/tools/compliance-tools.service.js +107 -0
  62. package/dist/src/tools/compliance-tools.service.js.map +1 -0
  63. package/dist/src/tools/compliance-tools.service.test.d.ts +6 -0
  64. package/dist/src/tools/compliance-tools.service.test.d.ts.map +1 -0
  65. package/dist/src/tools/compliance-tools.service.test.js +140 -0
  66. package/dist/src/tools/compliance-tools.service.test.js.map +1 -0
  67. package/dist/src/tools/compliance-tools.test.d.ts +6 -0
  68. package/dist/src/tools/compliance-tools.test.d.ts.map +1 -0
  69. package/dist/src/tools/compliance-tools.test.js +136 -0
  70. package/dist/src/tools/compliance-tools.test.js.map +1 -0
  71. package/dist/src/tools/get-skill.d.ts.map +1 -1
  72. package/dist/src/tools/get-skill.js +24 -1
  73. package/dist/src/tools/get-skill.js.map +1 -1
  74. package/dist/src/tools/index-local.d.ts.map +1 -1
  75. package/dist/src/tools/index-local.js +4 -0
  76. package/dist/src/tools/index-local.js.map +1 -1
  77. package/dist/src/tools/install.d.ts.map +1 -1
  78. package/dist/src/tools/install.js +11 -1
  79. package/dist/src/tools/install.js.map +1 -1
  80. package/dist/src/tools/install.tool.d.ts +4 -0
  81. package/dist/src/tools/install.tool.d.ts.map +1 -1
  82. package/dist/src/tools/install.tool.js +4 -0
  83. package/dist/src/tools/install.tool.js.map +1 -1
  84. package/dist/src/tools/install.types.d.ts +4 -0
  85. package/dist/src/tools/install.types.d.ts.map +1 -1
  86. package/dist/src/tools/install.types.js +5 -0
  87. package/dist/src/tools/install.types.js.map +1 -1
  88. package/dist/src/tools/integration-tools.d.ts +210 -0
  89. package/dist/src/tools/integration-tools.d.ts.map +1 -0
  90. package/dist/src/tools/integration-tools.js +264 -0
  91. package/dist/src/tools/integration-tools.js.map +1 -0
  92. package/dist/src/tools/integration-tools.service.d.ts +54 -0
  93. package/dist/src/tools/integration-tools.service.d.ts.map +1 -0
  94. package/dist/src/tools/integration-tools.service.js +299 -0
  95. package/dist/src/tools/integration-tools.service.js.map +1 -0
  96. package/dist/src/tools/integration-tools.service.test.d.ts +8 -0
  97. package/dist/src/tools/integration-tools.service.test.d.ts.map +1 -0
  98. package/dist/src/tools/integration-tools.service.test.js +401 -0
  99. package/dist/src/tools/integration-tools.service.test.js.map +1 -0
  100. package/dist/src/tools/integration-tools.stub.d.ts +13 -0
  101. package/dist/src/tools/integration-tools.stub.d.ts.map +1 -0
  102. package/dist/src/tools/integration-tools.stub.js +133 -0
  103. package/dist/src/tools/integration-tools.stub.js.map +1 -0
  104. package/dist/src/tools/integration-tools.test.d.ts +6 -0
  105. package/dist/src/tools/integration-tools.test.d.ts.map +1 -0
  106. package/dist/src/tools/integration-tools.test.js +259 -0
  107. package/dist/src/tools/integration-tools.test.js.map +1 -0
  108. package/dist/src/tools/publish-private.d.ts +60 -0
  109. package/dist/src/tools/publish-private.d.ts.map +1 -0
  110. package/dist/src/tools/publish-private.js +85 -0
  111. package/dist/src/tools/publish-private.js.map +1 -0
  112. package/dist/src/tools/publish-private.test.d.ts +6 -0
  113. package/dist/src/tools/publish-private.test.d.ts.map +1 -0
  114. package/dist/src/tools/publish-private.test.js +118 -0
  115. package/dist/src/tools/publish-private.test.js.map +1 -0
  116. package/dist/src/tools/publish.types.d.ts +2 -2
  117. package/dist/src/tools/rbac-tools.d.ts +180 -0
  118. package/dist/src/tools/rbac-tools.d.ts.map +1 -0
  119. package/dist/src/tools/rbac-tools.js +300 -0
  120. package/dist/src/tools/rbac-tools.js.map +1 -0
  121. package/dist/src/tools/rbac-tools.test.d.ts +6 -0
  122. package/dist/src/tools/rbac-tools.test.d.ts.map +1 -0
  123. package/dist/src/tools/rbac-tools.test.js +299 -0
  124. package/dist/src/tools/rbac-tools.test.js.map +1 -0
  125. package/dist/src/tools/rbac-tools.types.d.ts +70 -0
  126. package/dist/src/tools/rbac-tools.types.d.ts.map +1 -0
  127. package/dist/src/tools/rbac-tools.types.js +119 -0
  128. package/dist/src/tools/rbac-tools.types.js.map +1 -0
  129. package/dist/src/tools/recommend.helpers.d.ts.map +1 -1
  130. package/dist/src/tools/recommend.helpers.js +2 -1
  131. package/dist/src/tools/recommend.helpers.js.map +1 -1
  132. package/dist/src/tools/recommend.js +3 -3
  133. package/dist/src/tools/recommend.js.map +1 -1
  134. package/dist/src/tools/registry-tools.d.ts +133 -0
  135. package/dist/src/tools/registry-tools.d.ts.map +1 -0
  136. package/dist/src/tools/registry-tools.js +246 -0
  137. package/dist/src/tools/registry-tools.js.map +1 -0
  138. package/dist/src/tools/registry-tools.test.d.ts +6 -0
  139. package/dist/src/tools/registry-tools.test.d.ts.map +1 -0
  140. package/dist/src/tools/registry-tools.test.js +167 -0
  141. package/dist/src/tools/registry-tools.test.js.map +1 -0
  142. package/dist/src/tools/search.formatter.d.ts.map +1 -1
  143. package/dist/src/tools/search.formatter.js +11 -1
  144. package/dist/src/tools/search.formatter.js.map +1 -1
  145. package/dist/src/tools/skill-audit.d.ts +3 -3
  146. package/dist/src/tools/skill-audit.d.ts.map +1 -1
  147. package/dist/src/tools/skill-audit.js +5 -5
  148. package/dist/src/tools/skill-audit.js.map +1 -1
  149. package/dist/src/tools/skill-audit.test.js +5 -5
  150. package/dist/src/tools/skill-audit.test.js.map +1 -1
  151. package/dist/src/tools/skill-pack-audit.d.ts +22 -1
  152. package/dist/src/tools/skill-pack-audit.d.ts.map +1 -1
  153. package/dist/src/tools/skill-pack-audit.helpers.d.ts +53 -0
  154. package/dist/src/tools/skill-pack-audit.helpers.d.ts.map +1 -0
  155. package/dist/src/tools/skill-pack-audit.helpers.js +181 -0
  156. package/dist/src/tools/skill-pack-audit.helpers.js.map +1 -0
  157. package/dist/src/tools/skill-pack-audit.js +122 -5
  158. package/dist/src/tools/skill-pack-audit.js.map +1 -1
  159. package/dist/src/tools/skill-pack-audit.types.d.ts +70 -0
  160. package/dist/src/tools/skill-pack-audit.types.d.ts.map +1 -0
  161. package/dist/src/tools/skill-pack-audit.types.js +8 -0
  162. package/dist/src/tools/skill-pack-audit.types.js.map +1 -0
  163. package/dist/src/tools/skill-rescan.d.ts.map +1 -1
  164. package/dist/src/tools/skill-rescan.js +2 -3
  165. package/dist/src/tools/skill-rescan.js.map +1 -1
  166. package/dist/src/tools/skill-rescan.test.js +2 -2
  167. package/dist/src/tools/skill-rescan.test.js.map +1 -1
  168. package/dist/src/tools/sso-tools.d.ts +136 -0
  169. package/dist/src/tools/sso-tools.d.ts.map +1 -0
  170. package/dist/src/tools/sso-tools.js +214 -0
  171. package/dist/src/tools/sso-tools.js.map +1 -0
  172. package/dist/src/tools/sso-tools.test.d.ts +6 -0
  173. package/dist/src/tools/sso-tools.test.d.ts.map +1 -0
  174. package/dist/src/tools/sso-tools.test.js +167 -0
  175. package/dist/src/tools/sso-tools.test.js.map +1 -0
  176. package/dist/src/tools/suggest.d.ts.map +1 -1
  177. package/dist/src/tools/suggest.js +7 -1
  178. package/dist/src/tools/suggest.js.map +1 -1
  179. package/dist/src/tools/team-workspace.d.ts +179 -0
  180. package/dist/src/tools/team-workspace.d.ts.map +1 -0
  181. package/dist/src/tools/team-workspace.js +243 -0
  182. package/dist/src/tools/team-workspace.js.map +1 -0
  183. package/dist/src/tools/team-workspace.stub.d.ts +13 -0
  184. package/dist/src/tools/team-workspace.stub.d.ts.map +1 -0
  185. package/dist/src/tools/team-workspace.stub.js +76 -0
  186. package/dist/src/tools/team-workspace.stub.js.map +1 -0
  187. package/dist/src/tools/team-workspace.test.d.ts +7 -0
  188. package/dist/src/tools/team-workspace.test.d.ts.map +1 -0
  189. package/dist/src/tools/team-workspace.test.js +273 -0
  190. package/dist/src/tools/team-workspace.test.js.map +1 -0
  191. package/dist/src/tools/validate.helpers.d.ts.map +1 -1
  192. package/dist/src/tools/validate.helpers.js +15 -0
  193. package/dist/src/tools/validate.helpers.js.map +1 -1
  194. package/dist/src/utils/team-resolver.d.ts +20 -0
  195. package/dist/src/utils/team-resolver.d.ts.map +1 -0
  196. package/dist/src/utils/team-resolver.js +52 -0
  197. package/dist/src/utils/team-resolver.js.map +1 -0
  198. package/dist/src/utils/url-validator.d.ts +24 -0
  199. package/dist/src/utils/url-validator.d.ts.map +1 -0
  200. package/dist/src/utils/url-validator.js +59 -0
  201. package/dist/src/utils/url-validator.js.map +1 -0
  202. package/dist/tests/integration/recommend.integration.test.js +1 -1
  203. package/dist/tests/integration/recommend.integration.test.js.map +1 -1
  204. package/dist/tests/recommend.test.js +1 -1
  205. package/dist/tests/recommend.test.js.map +1 -1
  206. package/dist/tests/unit/skill-pack-audit.test.js +225 -0
  207. package/dist/tests/unit/skill-pack-audit.test.js.map +1 -1
  208. package/package.json +3 -3
  209. package/server.json +2 -2
  210. package/dist/vitest.config.d.ts +0 -6
  211. package/dist/vitest.config.d.ts.map +0 -1
  212. package/dist/vitest.config.js +0 -23
  213. package/dist/vitest.config.js.map +0 -1
@@ -0,0 +1,257 @@
1
+ /**
2
+ * @fileoverview Compliance report MCP tool
3
+ * @module @skillsmith/mcp-server/tools/compliance-tools
4
+ * @see SMI-3906: Compliance Report MCP Tool
5
+ *
6
+ * Generates compliance reports in SOC2 (markdown), CycloneDX (JSON SBOM),
7
+ * or raw JSON format from local skill inventory and audit data.
8
+ *
9
+ * Scope: local inventory only. For server-side audit data, use audit_export.
10
+ *
11
+ * Tier gate: Enterprise (compliance_reports feature flag).
12
+ */
13
+ import { z } from 'zod';
14
+ import { isSupabaseConfigured } from '../supabase-client.js';
15
+ import { createRealComplianceService } from './compliance-tools.service.js';
16
+ // ============================================================================
17
+ // Input schemas
18
+ // ============================================================================
19
+ export const complianceReportInputSchema = z.object({
20
+ format: z.enum(['soc2', 'cyclonedx', 'json']),
21
+ period: z
22
+ .enum(['30d', '90d', '365d'])
23
+ .optional()
24
+ .default('90d')
25
+ .describe('Reporting period (default: 90d)'),
26
+ includeUserActivity: z
27
+ .boolean()
28
+ .optional()
29
+ .default(true)
30
+ .describe('Include user activity summary (default: true)'),
31
+ });
32
+ // ============================================================================
33
+ // Tool schema for MCP registration
34
+ // ============================================================================
35
+ export const complianceReportToolSchema = {
36
+ name: 'compliance_report',
37
+ description: 'Generate compliance reports: SOC2 (markdown), CycloneDX (JSON SBOM), or raw JSON. ' +
38
+ 'Scoped to local skill inventory. ' +
39
+ 'Requires Enterprise tier (compliance_reports feature).',
40
+ inputSchema: {
41
+ type: 'object',
42
+ properties: {
43
+ format: {
44
+ type: 'string',
45
+ enum: ['soc2', 'cyclonedx', 'json'],
46
+ description: 'Report format: soc2, cyclonedx, or json',
47
+ },
48
+ period: {
49
+ type: 'string',
50
+ enum: ['30d', '90d', '365d'],
51
+ description: 'Reporting period (default: 90d)',
52
+ },
53
+ includeUserActivity: {
54
+ type: 'boolean',
55
+ description: 'Include user activity summary (default: true)',
56
+ },
57
+ },
58
+ required: ['format'],
59
+ },
60
+ };
61
+ // ============================================================================
62
+ // Stub service
63
+ // ============================================================================
64
+ /** @internal Exported for testing */
65
+ export function createStubComplianceService() {
66
+ return {
67
+ async gatherData(periodDays, includeUserActivity) {
68
+ const now = new Date();
69
+ const periodStart = new Date(now.getTime() - periodDays * 24 * 60 * 60 * 1000);
70
+ return {
71
+ skills: [
72
+ {
73
+ skillId: 'skillsmith/commit',
74
+ version: '1.2.0',
75
+ trustTier: 'verified',
76
+ installedAt: '2026-02-15T10:00:00.000Z',
77
+ lastUpdated: '2026-03-20T14:30:00.000Z',
78
+ },
79
+ {
80
+ skillId: 'community/testing-helper',
81
+ version: '0.8.3',
82
+ trustTier: 'community',
83
+ installedAt: '2026-03-01T09:00:00.000Z',
84
+ lastUpdated: '2026-03-01T09:00:00.000Z',
85
+ },
86
+ ],
87
+ auditSummary: {
88
+ totalEvents: 1247,
89
+ installCount: 34,
90
+ uninstallCount: 8,
91
+ searchCount: 892,
92
+ periodStart: periodStart.toISOString(),
93
+ periodEnd: now.toISOString(),
94
+ },
95
+ userActivity: includeUserActivity
96
+ ? {
97
+ uniqueUsers: 12,
98
+ topTools: [
99
+ { tool: 'search', count: 892 },
100
+ { tool: 'install_skill', count: 34 },
101
+ { tool: 'skill_validate', count: 156 },
102
+ ],
103
+ activeDays: Math.min(periodDays, 67),
104
+ }
105
+ : null,
106
+ configState: {
107
+ ssoEnabled: false,
108
+ rbacEnabled: false,
109
+ auditLoggingEnabled: true,
110
+ webhooksConfigured: 0,
111
+ },
112
+ };
113
+ },
114
+ };
115
+ }
116
+ // Module-level singleton
117
+ let service = createStubComplianceService();
118
+ /** Replace the compliance service implementation */
119
+ export function setComplianceService(svc) {
120
+ service = svc;
121
+ }
122
+ // ============================================================================
123
+ // Formatters
124
+ // ============================================================================
125
+ function periodToDays(period) {
126
+ const match = period.match(/^(\d+)d$/);
127
+ return match ? parseInt(match[1], 10) : 90;
128
+ }
129
+ function formatSoc2(data, period) {
130
+ const lines = [
131
+ '# SOC 2 Compliance Report',
132
+ '',
133
+ `**Generated:** ${new Date().toISOString()}`,
134
+ `**Scope:** Local skill inventory`,
135
+ `**Period:** ${period}`,
136
+ '',
137
+ '---',
138
+ '',
139
+ '## 1. Access Controls',
140
+ '',
141
+ `- SSO Enabled: ${data.configState.ssoEnabled ? 'Yes' : 'No'}`,
142
+ `- RBAC Enabled: ${data.configState.rbacEnabled ? 'Yes' : 'No'}`,
143
+ `- Audit Logging: ${data.configState.auditLoggingEnabled ? 'Enabled' : 'Disabled'}`,
144
+ `- Webhooks Configured: ${data.configState.webhooksConfigured}`,
145
+ '',
146
+ '## 2. Skill Inventory',
147
+ '',
148
+ `| Skill | Version | Trust Tier | Installed | Last Updated |`,
149
+ `|-------|---------|------------|-----------|--------------|`,
150
+ ];
151
+ for (const s of data.skills) {
152
+ lines.push(`| ${s.skillId} | ${s.version} | ${s.trustTier} | ${s.installedAt} | ${s.lastUpdated} |`);
153
+ }
154
+ lines.push('', '## 3. Audit Summary', '');
155
+ lines.push(`- Total audit events: ${data.auditSummary.totalEvents}`);
156
+ lines.push(`- Skill installs: ${data.auditSummary.installCount}`);
157
+ lines.push(`- Skill uninstalls: ${data.auditSummary.uninstallCount}`);
158
+ lines.push(`- Search queries: ${data.auditSummary.searchCount}`);
159
+ lines.push(`- Period: ${data.auditSummary.periodStart} to ${data.auditSummary.periodEnd}`);
160
+ if (data.userActivity) {
161
+ lines.push('', '## 4. User Activity', '');
162
+ lines.push(`- Unique users: ${data.userActivity.uniqueUsers}`);
163
+ lines.push(`- Active days: ${data.userActivity.activeDays}`);
164
+ lines.push(`- Top tools:`);
165
+ for (const t of data.userActivity.topTools) {
166
+ lines.push(` - ${t.tool}: ${t.count} invocations`);
167
+ }
168
+ }
169
+ return lines.join('\n');
170
+ }
171
+ function formatCycloneDx(data) {
172
+ return {
173
+ bomFormat: 'CycloneDX',
174
+ specVersion: '1.5',
175
+ version: 1,
176
+ metadata: {
177
+ timestamp: new Date().toISOString(),
178
+ tools: [{ vendor: 'Skillsmith', name: 'compliance-report', version: '1.0.0' }],
179
+ component: {
180
+ type: 'application',
181
+ name: 'skillsmith-local-inventory',
182
+ version: '1.0.0',
183
+ },
184
+ },
185
+ components: data.skills.map((s) => ({
186
+ type: 'library',
187
+ name: s.skillId,
188
+ version: s.version,
189
+ properties: [
190
+ { name: 'skillsmith:trustTier', value: s.trustTier },
191
+ { name: 'skillsmith:installedAt', value: s.installedAt },
192
+ ],
193
+ })),
194
+ };
195
+ }
196
+ function formatJson(data, period) {
197
+ return {
198
+ generatedAt: new Date().toISOString(),
199
+ scope: 'local',
200
+ period,
201
+ skills: data.skills,
202
+ auditSummary: data.auditSummary,
203
+ userActivity: data.userActivity,
204
+ configState: data.configState,
205
+ };
206
+ }
207
+ // ============================================================================
208
+ // Handler
209
+ // ============================================================================
210
+ export async function executeComplianceReport(input, context) {
211
+ const period = input.period ?? '90d';
212
+ const days = periodToDays(period);
213
+ // Use real service when db is available, otherwise fall back to stub
214
+ let activeService = service;
215
+ let dataSource = isSupabaseConfigured() ? 'live' : 'stub';
216
+ try {
217
+ if (context.db && context.db.open) {
218
+ activeService = createRealComplianceService(context.db);
219
+ dataSource = 'live';
220
+ }
221
+ }
222
+ catch {
223
+ // Fall through to stub service
224
+ }
225
+ const data = await activeService.gatherData(days, input.includeUserActivity ?? true);
226
+ const generatedAt = new Date().toISOString();
227
+ switch (input.format) {
228
+ case 'soc2':
229
+ return {
230
+ format: 'soc2',
231
+ dataSource,
232
+ generatedAt,
233
+ scope: 'local',
234
+ period,
235
+ report: formatSoc2(data, period),
236
+ };
237
+ case 'cyclonedx':
238
+ return {
239
+ format: 'cyclonedx',
240
+ dataSource,
241
+ generatedAt,
242
+ scope: 'local',
243
+ period,
244
+ report: formatCycloneDx(data),
245
+ };
246
+ case 'json':
247
+ return {
248
+ format: 'json',
249
+ dataSource,
250
+ generatedAt,
251
+ scope: 'local',
252
+ period,
253
+ report: formatJson(data, period),
254
+ };
255
+ }
256
+ }
257
+ //# sourceMappingURL=compliance-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance-tools.js","sourceRoot":"","sources":["../../../src/tools/compliance-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @fileoverview Real compliance service — queries audit_logs + skills SQLite tables
3
+ * @module @skillsmith/mcp-server/tools/compliance-tools.service
4
+ * @see SMI-3916: Wave 2 — Compliance real queries
5
+ *
6
+ * Replaces stub compliance data with actual SQL queries against local
7
+ * audit_logs and skills tables. Returns data conforming to ComplianceData.
8
+ */
9
+ import type { Database } from '@skillsmith/core';
10
+ import type { ComplianceService } from './compliance-tools.js';
11
+ /**
12
+ * Create a compliance service backed by real SQLite queries.
13
+ *
14
+ * Tables queried:
15
+ * - audit_logs: event_type, timestamp, actor, resource, result
16
+ * - skills: id, name, author, version, trust_tier, quality_score, created_at, updated_at
17
+ */
18
+ export declare function createRealComplianceService(db: Database): ComplianceService;
19
+ //# sourceMappingURL=compliance-tools.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance-tools.service.d.ts","sourceRoot":"","sources":["../../../src/tools/compliance-tools.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAkB,MAAM,uBAAuB,CAAA;AAoC9E;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,QAAQ,GAAG,iBAAiB,CAiH3E"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * @fileoverview Real compliance service — queries audit_logs + skills SQLite tables
3
+ * @module @skillsmith/mcp-server/tools/compliance-tools.service
4
+ * @see SMI-3916: Wave 2 — Compliance real queries
5
+ *
6
+ * Replaces stub compliance data with actual SQL queries against local
7
+ * audit_logs and skills tables. Returns data conforming to ComplianceData.
8
+ */
9
+ // ============================================================================
10
+ // Service factory
11
+ // ============================================================================
12
+ /**
13
+ * Create a compliance service backed by real SQLite queries.
14
+ *
15
+ * Tables queried:
16
+ * - audit_logs: event_type, timestamp, actor, resource, result
17
+ * - skills: id, name, author, version, trust_tier, quality_score, created_at, updated_at
18
+ */
19
+ export function createRealComplianceService(db) {
20
+ return {
21
+ async gatherData(periodDays, includeUserActivity) {
22
+ const now = new Date();
23
+ const periodStart = new Date(now.getTime() - periodDays * 86_400_000);
24
+ const since = periodStart.toISOString();
25
+ // ----------------------------------------------------------------
26
+ // Audit summary from audit_logs
27
+ // ----------------------------------------------------------------
28
+ const totalEventsRow = db
29
+ .prepare('SELECT COUNT(*) as c FROM audit_logs WHERE timestamp >= ?')
30
+ .get(since);
31
+ const totalEvents = totalEventsRow?.c ?? 0;
32
+ const byEventType = db
33
+ .prepare('SELECT event_type, COUNT(*) as count FROM audit_logs ' +
34
+ 'WHERE timestamp >= ? GROUP BY event_type ORDER BY count DESC')
35
+ .all(since);
36
+ // Derive install/uninstall/search counts from event_type
37
+ const eventCounts = new Map(byEventType.map((r) => [r.event_type, r.count]));
38
+ const installCount = eventCounts.get('skill.install') ?? 0;
39
+ const uninstallCount = eventCounts.get('skill.uninstall') ?? 0;
40
+ const searchCount = eventCounts.get('skill.search') ?? 0;
41
+ // ----------------------------------------------------------------
42
+ // Skill inventory from skills table
43
+ // ----------------------------------------------------------------
44
+ const skills = db
45
+ .prepare('SELECT id, name, author, trust_tier, quality_score, ' +
46
+ 'created_at, updated_at FROM skills ORDER BY author, name')
47
+ .all()
48
+ .map((s) => ({
49
+ skillId: s.author ? `${s.author}/${s.name}` : s.id,
50
+ version: '0.0.0', // version lives in skill_versions table, not skills
51
+ trustTier: (s.trust_tier ?? 'unknown'),
52
+ installedAt: s.created_at,
53
+ lastUpdated: s.updated_at,
54
+ }));
55
+ // ----------------------------------------------------------------
56
+ // User activity (optional)
57
+ // ----------------------------------------------------------------
58
+ let userActivity = null;
59
+ if (includeUserActivity) {
60
+ const actors = db
61
+ .prepare('SELECT actor, COUNT(*) as actions, MAX(timestamp) as last_active ' +
62
+ 'FROM audit_logs WHERE timestamp >= ? AND actor IS NOT NULL ' +
63
+ 'GROUP BY actor ORDER BY actions DESC')
64
+ .all(since);
65
+ const topTools = db
66
+ .prepare('SELECT resource, COUNT(*) as count FROM audit_logs ' +
67
+ 'WHERE timestamp >= ? AND resource IS NOT NULL ' +
68
+ 'GROUP BY resource ORDER BY count DESC LIMIT 10')
69
+ .all(since)
70
+ .map((r) => ({ tool: r.resource, count: r.count }));
71
+ // Count distinct days with activity
72
+ const activeDaysRow = db
73
+ .prepare('SELECT COUNT(DISTINCT DATE(timestamp)) as days FROM audit_logs ' +
74
+ 'WHERE timestamp >= ?')
75
+ .get(since);
76
+ userActivity = {
77
+ uniqueUsers: actors.length,
78
+ topTools,
79
+ activeDays: activeDaysRow?.days ?? 0,
80
+ };
81
+ }
82
+ // ----------------------------------------------------------------
83
+ // Config state (static for now — SSO/RBAC tables don't exist locally)
84
+ // ----------------------------------------------------------------
85
+ const configState = {
86
+ ssoEnabled: false,
87
+ rbacEnabled: false,
88
+ auditLoggingEnabled: true,
89
+ webhooksConfigured: 0,
90
+ };
91
+ return {
92
+ skills,
93
+ auditSummary: {
94
+ totalEvents,
95
+ installCount,
96
+ uninstallCount,
97
+ searchCount,
98
+ periodStart: periodStart.toISOString(),
99
+ periodEnd: now.toISOString(),
100
+ },
101
+ userActivity,
102
+ configState,
103
+ };
104
+ },
105
+ };
106
+ }
107
+ //# sourceMappingURL=compliance-tools.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance-tools.service.js","sourceRoot":"","sources":["../../../src/tools/compliance-tools.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @fileoverview Tests for real compliance service (SQLite-backed)
3
+ * @see SMI-3916: Wave 2 — Compliance real queries
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=compliance-tools.service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance-tools.service.test.d.ts","sourceRoot":"","sources":["../../../src/tools/compliance-tools.service.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * @fileoverview Tests for real compliance service (SQLite-backed)
3
+ * @see SMI-3916: Wave 2 — Compliance real queries
4
+ */
5
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
6
+ import { createDatabase } from '@skillsmith/core';
7
+ import { createRealComplianceService } from './compliance-tools.service.js';
8
+ // ============================================================================
9
+ // Test helpers
10
+ // ============================================================================
11
+ function seedAuditLogs(db, rows) {
12
+ const stmt = db.prepare('INSERT INTO audit_logs (id, event_type, timestamp, actor, resource, action, result) ' +
13
+ 'VALUES (?, ?, ?, ?, ?, ?, ?)');
14
+ for (const row of rows) {
15
+ stmt.run(crypto.randomUUID(), row.event_type ?? 'tool.call', row.timestamp ?? new Date().toISOString(), row.actor ?? null, row.resource ?? null, 'execute', row.result ?? 'success');
16
+ }
17
+ }
18
+ function seedSkills(db, skills) {
19
+ const stmt = db.prepare('INSERT INTO skills (id, name, author, trust_tier) VALUES (?, ?, ?, ?)');
20
+ for (const s of skills) {
21
+ stmt.run(s.id, s.name, s.author ?? null, s.trust_tier ?? 'unknown');
22
+ }
23
+ }
24
+ function daysAgo(n) {
25
+ return new Date(Date.now() - n * 86_400_000).toISOString();
26
+ }
27
+ // ============================================================================
28
+ // Tests
29
+ // ============================================================================
30
+ describe('createRealComplianceService', () => {
31
+ let db;
32
+ let svc;
33
+ beforeEach(() => {
34
+ db = createDatabase(':memory:');
35
+ svc = createRealComplianceService(db);
36
+ });
37
+ afterEach(() => {
38
+ db.close();
39
+ });
40
+ describe('gatherData', () => {
41
+ it('returns empty data for an empty database', async () => {
42
+ const data = await svc.gatherData(90, false);
43
+ expect(data.skills).toEqual([]);
44
+ expect(data.auditSummary.totalEvents).toBe(0);
45
+ expect(data.auditSummary.installCount).toBe(0);
46
+ expect(data.auditSummary.uninstallCount).toBe(0);
47
+ expect(data.auditSummary.searchCount).toBe(0);
48
+ expect(data.userActivity).toBeNull();
49
+ expect(data.configState.auditLoggingEnabled).toBe(true);
50
+ });
51
+ it('counts audit events by type', async () => {
52
+ seedAuditLogs(db, [
53
+ { event_type: 'skill.install', timestamp: daysAgo(5) },
54
+ { event_type: 'skill.install', timestamp: daysAgo(10) },
55
+ { event_type: 'skill.uninstall', timestamp: daysAgo(3) },
56
+ { event_type: 'skill.search', timestamp: daysAgo(1) },
57
+ { event_type: 'skill.search', timestamp: daysAgo(2) },
58
+ { event_type: 'skill.search', timestamp: daysAgo(3) },
59
+ { event_type: 'skill.install', timestamp: daysAgo(100) }, // outside 90d
60
+ ]);
61
+ const data = await svc.gatherData(90, false);
62
+ expect(data.auditSummary.totalEvents).toBe(6); // 6 within 90d
63
+ expect(data.auditSummary.installCount).toBe(2); // 2 installs within 90d
64
+ expect(data.auditSummary.uninstallCount).toBe(1);
65
+ expect(data.auditSummary.searchCount).toBe(3);
66
+ });
67
+ it('returns skill inventory from skills table', async () => {
68
+ seedSkills(db, [
69
+ { id: 'skillsmith/commit', name: 'commit', author: 'skillsmith', trust_tier: 'verified' },
70
+ { id: 'community/test', name: 'test', author: 'community', trust_tier: 'community' },
71
+ ]);
72
+ const data = await svc.gatherData(90, false);
73
+ expect(data.skills).toHaveLength(2);
74
+ expect(data.skills[0].skillId).toBe('community/test');
75
+ expect(data.skills[0].trustTier).toBe('community');
76
+ expect(data.skills[1].skillId).toBe('skillsmith/commit');
77
+ expect(data.skills[1].trustTier).toBe('verified');
78
+ });
79
+ it('returns null userActivity when includeUserActivity=false', async () => {
80
+ seedAuditLogs(db, [{ actor: 'alice', resource: 'search', timestamp: daysAgo(1) }]);
81
+ const data = await svc.gatherData(90, false);
82
+ expect(data.userActivity).toBeNull();
83
+ });
84
+ it('returns user activity when includeUserActivity=true', async () => {
85
+ seedAuditLogs(db, [
86
+ { actor: 'alice', resource: 'search', timestamp: daysAgo(1) },
87
+ { actor: 'alice', resource: 'search', timestamp: daysAgo(2) },
88
+ { actor: 'bob', resource: 'install', timestamp: daysAgo(3) },
89
+ { actor: null, resource: 'search', timestamp: daysAgo(1) },
90
+ ]);
91
+ const data = await svc.gatherData(90, true);
92
+ expect(data.userActivity).not.toBeNull();
93
+ expect(data.userActivity.uniqueUsers).toBe(2); // alice and bob
94
+ expect(data.userActivity.topTools.length).toBeGreaterThanOrEqual(1);
95
+ expect(data.userActivity.activeDays).toBeGreaterThanOrEqual(1);
96
+ });
97
+ it('counts active days correctly', async () => {
98
+ // Events on 3 distinct days
99
+ seedAuditLogs(db, [
100
+ { actor: 'alice', timestamp: daysAgo(1) },
101
+ { actor: 'alice', timestamp: daysAgo(1) }, // same day
102
+ { actor: 'bob', timestamp: daysAgo(3) },
103
+ { actor: 'carol', timestamp: daysAgo(5) },
104
+ ]);
105
+ const data = await svc.gatherData(30, true);
106
+ expect(data.userActivity.activeDays).toBe(3);
107
+ });
108
+ it('includes period boundaries in audit summary', async () => {
109
+ const data = await svc.gatherData(30, false);
110
+ expect(data.auditSummary.periodStart).toBeDefined();
111
+ expect(data.auditSummary.periodEnd).toBeDefined();
112
+ const start = new Date(data.auditSummary.periodStart);
113
+ const end = new Date(data.auditSummary.periodEnd);
114
+ const diffDays = (end.getTime() - start.getTime()) / 86_400_000;
115
+ // Should be approximately 30 days
116
+ expect(diffDays).toBeGreaterThanOrEqual(29);
117
+ expect(diffDays).toBeLessThanOrEqual(31);
118
+ });
119
+ it('configState has expected defaults', async () => {
120
+ const data = await svc.gatherData(90, false);
121
+ expect(data.configState).toEqual({
122
+ ssoEnabled: false,
123
+ rbacEnabled: false,
124
+ auditLoggingEnabled: true,
125
+ webhooksConfigured: 0,
126
+ });
127
+ });
128
+ it('builds skillId from author/name when author is present', async () => {
129
+ seedSkills(db, [{ id: 'some-uuid', name: 'my-skill', author: 'acme' }]);
130
+ const data = await svc.gatherData(90, false);
131
+ expect(data.skills[0].skillId).toBe('acme/my-skill');
132
+ });
133
+ it('falls back to id when author is null', async () => {
134
+ seedSkills(db, [{ id: 'orphan-skill-id', name: 'orphan', author: undefined }]);
135
+ const data = await svc.gatherData(90, false);
136
+ expect(data.skills[0].skillId).toBe('orphan-skill-id');
137
+ });
138
+ });
139
+ });
140
+ //# sourceMappingURL=compliance-tools.service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance-tools.service.test.js","sourceRoot":"","sources":["../../../src/tools/compliance-tools.service.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAA;AAG3E,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E,SAAS,aAAa,CACpB,EAAY,EACZ,IAME;IAEF,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,sFAAsF;QACpF,8BAA8B,CACjC,CAAA;IACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CACN,MAAM,CAAC,UAAU,EAAE,EACnB,GAAG,CAAC,UAAU,IAAI,WAAW,EAC7B,GAAG,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EACzC,GAAG,CAAC,KAAK,IAAI,IAAI,EACjB,GAAG,CAAC,QAAQ,IAAI,IAAI,EACpB,SAAS,EACT,GAAG,CAAC,MAAM,IAAI,SAAS,CACxB,CAAA;IACH,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CACjB,EAAY,EACZ,MAKE;IAEF,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,uEAAuE,CAAC,CAAA;IAChG,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,UAAU,IAAI,SAAS,CAAC,CAAA;IACrE,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,CAAS;IACxB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,WAAW,EAAE,CAAA;AAC5D,CAAC;AAED,+EAA+E;AAC/E,QAAQ;AACR,+EAA+E;AAE/E,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,IAAI,EAAY,CAAA;IAChB,IAAI,GAAsB,CAAA;IAE1B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC,CAAA;QAC/B,GAAG,GAAG,2BAA2B,CAAC,EAAE,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,KAAK,EAAE,CAAA;IACZ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;YAE5C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YAC/B,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC7C,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC9C,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAChD,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC7C,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAA;YACpC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,aAAa,CAAC,EAAE,EAAE;gBAChB,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE;gBACtD,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE;gBACvD,EAAE,UAAU,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE;gBACxD,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE;gBACrD,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE;gBACrD,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE;gBACrD,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc;aACzE,CAAC,CAAA;YAEF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;YAC5C,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA,CAAC,eAAe;YAC7D,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA,CAAC,wBAAwB;YACvE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAChD,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,UAAU,CAAC,EAAE,EAAE;gBACb,EAAE,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE;gBACzF,EAAE,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE;aACrF,CAAC,CAAA;YAEF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;YAC5C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YACnC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;YACrD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAClD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;YACxD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,aAAa,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAElF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;YAC5C,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAA;QACtC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,aAAa,CAAC,EAAE,EAAE;gBAChB,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE;gBAC7D,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE;gBAC7D,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE;gBAC5D,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE;aAC3D,CAAC,CAAA;YAEF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;YAC3C,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;YACxC,MAAM,CAAC,IAAI,CAAC,YAAa,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA,CAAC,gBAAgB;YAC/D,MAAM,CAAC,IAAI,CAAC,YAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;YACpE,MAAM,CAAC,IAAI,CAAC,YAAa,CAAC,UAAU,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;QACjE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,4BAA4B;YAC5B,aAAa,CAAC,EAAE,EAAE;gBAChB,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE;gBACzC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,WAAW;gBACtD,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE;gBACvC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE;aAC1C,CAAC,CAAA;YAEF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;YAC3C,MAAM,CAAC,IAAI,CAAC,YAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;YAE5C,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAA;YACnD,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAA;YACjD,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAA;YACrD,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;YACjD,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,UAAU,CAAA;YAC/D,kCAAkC;YAClC,MAAM,CAAC,QAAQ,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAA;YAC3C,MAAM,CAAC,QAAQ,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;YAC5C,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC;gBAC/B,UAAU,EAAE,KAAK;gBACjB,WAAW,EAAE,KAAK;gBAClB,mBAAmB,EAAE,IAAI;gBACzB,kBAAkB,EAAE,CAAC;aACtB,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,UAAU,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;YAEvE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;YAC5C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,UAAU,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAA;YAE9E,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;YAC5C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QACxD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @fileoverview Tests for compliance report MCP tool
3
+ * @see SMI-3906: Compliance Report MCP Tool
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=compliance-tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance-tools.test.d.ts","sourceRoot":"","sources":["../../../src/tools/compliance-tools.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}