@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.
- package/CHANGELOG.md +32 -0
- package/README.md +21 -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 +11 -1
- 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/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-pack-audit.d.ts +22 -1
- package/dist/src/tools/skill-pack-audit.d.ts.map +1 -1
- package/dist/src/tools/skill-pack-audit.helpers.d.ts +53 -0
- package/dist/src/tools/skill-pack-audit.helpers.d.ts.map +1 -0
- package/dist/src/tools/skill-pack-audit.helpers.js +181 -0
- package/dist/src/tools/skill-pack-audit.helpers.js.map +1 -0
- package/dist/src/tools/skill-pack-audit.js +122 -5
- package/dist/src/tools/skill-pack-audit.js.map +1 -1
- package/dist/src/tools/skill-pack-audit.types.d.ts +70 -0
- package/dist/src/tools/skill-pack-audit.types.d.ts.map +1 -0
- package/dist/src/tools/skill-pack-audit.types.js +8 -0
- package/dist/src/tools/skill-pack-audit.types.js.map +1 -0
- 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.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/validate.helpers.d.ts.map +1 -1
- package/dist/src/tools/validate.helpers.js +15 -0
- package/dist/src/tools/validate.helpers.js.map +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/dist/tests/unit/skill-pack-audit.test.js +225 -0
- package/dist/tests/unit/skill-pack-audit.test.js.map +1 -1
- package/package.json +3 -3
- package/server.json +2 -2
- package/dist/vitest.config.d.ts +0 -6
- package/dist/vitest.config.d.ts.map +0 -1
- package/dist/vitest.config.js +0 -23
- package/dist/vitest.config.js.map +0 -1
|
@@ -42,7 +42,17 @@ export function formatSearchResults(response) {
|
|
|
42
42
|
response.results.forEach((skill, index) => {
|
|
43
43
|
const trustBadge = getTrustBadge(skill.trustTier);
|
|
44
44
|
lines.push(index + 1 + '. ' + skill.name + ' ' + trustBadge);
|
|
45
|
-
|
|
45
|
+
const securityStatus = skill.security?.passed === true
|
|
46
|
+
? 'PASS'
|
|
47
|
+
: skill.security?.passed === false
|
|
48
|
+
? 'FAIL (' + (skill.security.riskScore ?? '?') + '/100)'
|
|
49
|
+
: 'N/A';
|
|
50
|
+
lines.push(' Author: ' +
|
|
51
|
+
skill.author +
|
|
52
|
+
' | Score: ' +
|
|
53
|
+
skill.score +
|
|
54
|
+
'/100 | Security: ' +
|
|
55
|
+
securityStatus);
|
|
46
56
|
lines.push(' ' + skill.description);
|
|
47
57
|
lines.push(' ID: ' + skill.id);
|
|
48
58
|
// SMI-2734: Surface registry install ID so models can use owner/name directly
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.formatter.js","sourceRoot":"","sources":["../../../src/tools/search.formatter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAEtD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAwB;IAC1D,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,CAAC,IAAI,CAAC,4BAA4B,GAAG,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,CAAA;IAErE,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;QAClD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC1B,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAA;QACxC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAA;QACtD,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;IAClC,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,KAAK,GAAG,cAAc,CAAC,CAAA;QAEtD,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACxC,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YACjD,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,GAAG,GAAG,UAAU,CAAC,CAAA;YAC5D,KAAK,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"search.formatter.js","sourceRoot":"","sources":["../../../src/tools/search.formatter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAEtD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAwB;IAC1D,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,CAAC,IAAI,CAAC,4BAA4B,GAAG,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,CAAA;IAErE,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;QAClD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC1B,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAA;QACxC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAA;QACtD,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;IAClC,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,KAAK,GAAG,cAAc,CAAC,CAAA;QAEtD,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACxC,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YACjD,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,GAAG,GAAG,UAAU,CAAC,CAAA;YAC5D,MAAM,cAAc,GAClB,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI;gBAC7B,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,KAAK;oBAChC,CAAC,CAAC,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,OAAO;oBACxD,CAAC,CAAC,KAAK,CAAA;YACb,KAAK,CAAC,IAAI,CACR,aAAa;gBACX,KAAK,CAAC,MAAM;gBACZ,YAAY;gBACZ,KAAK,CAAC,KAAK;gBACX,mBAAmB;gBACnB,cAAc,CACjB,CAAA;YACD,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,CAAA;YACrC,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,EAAE,CAAC,CAAA;YAChC,8EAA8E;YAC9E,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC,CAAA;YAChD,CAAC;YACD,4DAA4D;YAC5D,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,UAAU,CAAC,CAAA;YAClD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAChB,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,kBAAkB;IAClB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACjB,KAAK,CAAC,IAAI,CACR,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,GAAG,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CACxF,CAAA;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* @see SMI-skill-version-tracking Wave 3
|
|
5
5
|
*
|
|
6
6
|
* Returns a summary of active security advisories for installed skills.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* Advisories are published by the Skillsmith team as security issues
|
|
8
|
+
* are identified.
|
|
9
9
|
*
|
|
10
10
|
* Tier gate: Team (skill_security_audit feature flag).
|
|
11
11
|
* Community and Individual users receive a graceful license error response.
|
|
@@ -55,7 +55,7 @@ export interface AdvisorySummary {
|
|
|
55
55
|
export interface SkillAuditResponse {
|
|
56
56
|
/** Whether advisories data is available */
|
|
57
57
|
advisoriesAvailable: boolean;
|
|
58
|
-
/**
|
|
58
|
+
/** Message when no advisories are in the database */
|
|
59
59
|
message?: string;
|
|
60
60
|
/** Counts by severity (only present when advisoriesAvailable: true) */
|
|
61
61
|
summary?: AdvisorySummary;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-audit.d.ts","sourceRoot":"","sources":["../../../src/tools/skill-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAMhD;;GAEG;AACH,eAAO,MAAM,qBAAqB;IAChC,2DAA2D;;;;;;EAK3D,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEnE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,wBAAwB;IACxB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAA;IAChD,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAA;IACV,6CAA6C;IAC7C,YAAY,EAAE,OAAO,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,2CAA2C;IAC3C,mBAAmB,EAAE,OAAO,CAAA;IAC5B,
|
|
1
|
+
{"version":3,"file":"skill-audit.d.ts","sourceRoot":"","sources":["../../../src/tools/skill-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAMhD;;GAEG;AACH,eAAO,MAAM,qBAAqB;IAChC,2DAA2D;;;;;;EAK3D,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEnE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,wBAAwB;IACxB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAA;IAChD,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAA;IACV,6CAA6C;IAC7C,YAAY,EAAE,OAAO,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,2CAA2C;IAC3C,mBAAmB,EAAE,OAAO,CAAA;IAC5B,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,uEAAuE;IACvE,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,yEAAyE;IACzE,UAAU,CAAC,EAAE,aAAa,EAAE,CAAA;CAC7B;AAMD;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;CAmBhC,CAAA;AAMD;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,kBAAkB,CAAC,CA0C7B"}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* @see SMI-skill-version-tracking Wave 3
|
|
5
5
|
*
|
|
6
6
|
* Returns a summary of active security advisories for installed skills.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* Advisories are published by the Skillsmith team as security issues
|
|
8
|
+
* are identified.
|
|
9
9
|
*
|
|
10
10
|
* Tier gate: Team (skill_security_audit feature flag).
|
|
11
11
|
* Community and Individual users receive a graceful license error response.
|
|
@@ -74,12 +74,12 @@ export async function executeSkillAudit(input, context) {
|
|
|
74
74
|
else {
|
|
75
75
|
advisories = advisoryRepo.getActiveAdvisories();
|
|
76
76
|
}
|
|
77
|
-
// No advisories in DB
|
|
77
|
+
// No advisories in DB
|
|
78
78
|
if (advisories.length === 0) {
|
|
79
79
|
return {
|
|
80
80
|
advisoriesAvailable: false,
|
|
81
|
-
message: '
|
|
82
|
-
'
|
|
81
|
+
message: 'No advisories have been published yet. This does not indicate installed ' +
|
|
82
|
+
'skills have been reviewed. Run `skillsmith sync` to fetch the latest.',
|
|
83
83
|
};
|
|
84
84
|
}
|
|
85
85
|
// Build summary counts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-audit.js","sourceRoot":"","sources":["../../../src/tools/skill-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAGrD,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,2DAA2D;IAC3D,QAAQ,EAAE,CAAC;SACR,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACxB,QAAQ,EAAE;SACV,QAAQ,CAAC,wEAAwE,CAAC;CACtF,CAAC,CAAA;AA6CF,+EAA+E;AAC/E,oCAAoC;AACpC,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,aAAsB;IAC5B,WAAW,EACT,wDAAwD;QACxD,+DAA+D;QAC/D,oFAAoF;QACpF,0FAA0F;IAC5F,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EACT,iFAAiF;aACpF;SACF;QACD,QAAQ,EAAE,EAAE;KACb;CACF,CAAA;AAED,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAsB,EACtB,OAAoB;IAEpB,MAAM,YAAY,GAAG,IAAI,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAEvD,oDAAoD;IACpD,IAAI,UAAU,CAAA;IACd,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAA;IACrF,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,YAAY,CAAC,mBAAmB,EAAE,CAAA;IACjD,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"skill-audit.js","sourceRoot":"","sources":["../../../src/tools/skill-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAGrD,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,2DAA2D;IAC3D,QAAQ,EAAE,CAAC;SACR,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACxB,QAAQ,EAAE;SACV,QAAQ,CAAC,wEAAwE,CAAC;CACtF,CAAC,CAAA;AA6CF,+EAA+E;AAC/E,oCAAoC;AACpC,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,aAAsB;IAC5B,WAAW,EACT,wDAAwD;QACxD,+DAA+D;QAC/D,oFAAoF;QACpF,0FAA0F;IAC5F,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EACT,iFAAiF;aACpF;SACF;QACD,QAAQ,EAAE,EAAE;KACb;CACF,CAAA;AAED,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAsB,EACtB,OAAoB;IAEpB,MAAM,YAAY,GAAG,IAAI,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAEvD,oDAAoD;IACpD,IAAI,UAAU,CAAA;IACd,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAA;IACrF,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,YAAY,CAAC,mBAAmB,EAAE,CAAA;IACjD,CAAC;IAED,sBAAsB;IACtB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,mBAAmB,EAAE,KAAK;YAC1B,OAAO,EACL,0EAA0E;gBAC1E,uEAAuE;SAC1E,CAAA;IACH,CAAC;IAED,uBAAuB;IACvB,MAAM,OAAO,GAAoB,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;IACtF,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAA;QACvB,OAAO,CAAC,KAAK,EAAE,CAAA;IACjB,CAAC;IAED,6BAA6B;IAC7B,MAAM,OAAO,GAAoB,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxD,SAAS,EAAE,GAAG,CAAC,OAAO;QACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;KAC3C,CAAC,CAAC,CAAA;IAEH,OAAO;QACL,mBAAmB,EAAE,IAAI;QACzB,OAAO;QACP,UAAU,EAAE,OAAO;KACpB,CAAA;AACH,CAAC"}
|
|
@@ -37,12 +37,12 @@ describe('executeSkillAudit', () => {
|
|
|
37
37
|
closeDatabase(db);
|
|
38
38
|
});
|
|
39
39
|
// --------------------------------------------------------------------------
|
|
40
|
-
// Empty database —
|
|
40
|
+
// Empty database — no advisories message
|
|
41
41
|
// --------------------------------------------------------------------------
|
|
42
|
-
it('returns advisoriesAvailable: false with
|
|
42
|
+
it('returns advisoriesAvailable: false with no-advisories message when DB has no advisories', async () => {
|
|
43
43
|
const result = await executeSkillAudit({}, makeContext(db));
|
|
44
44
|
expect(result.advisoriesAvailable).toBe(false);
|
|
45
|
-
expect(result.message).toContain('
|
|
45
|
+
expect(result.message).toContain('No advisories have been published yet');
|
|
46
46
|
expect(result.message).toContain('skillsmith sync');
|
|
47
47
|
expect(result.summary).toBeUndefined();
|
|
48
48
|
expect(result.advisories).toBeUndefined();
|
|
@@ -85,11 +85,11 @@ describe('executeSkillAudit', () => {
|
|
|
85
85
|
expect(result.advisories).toHaveLength(1);
|
|
86
86
|
expect(result.advisories[0].skillName).toBe('community/skill-a');
|
|
87
87
|
});
|
|
88
|
-
it('returns
|
|
88
|
+
it('returns no-advisories message when skillIds filter matches no advisories', async () => {
|
|
89
89
|
advisoryRepo.upsertAdvisory(makeAdvisory({ skillId: 'community/skill-a' }));
|
|
90
90
|
const result = await executeSkillAudit({ skillIds: ['community/nonexistent'] }, makeContext(db));
|
|
91
91
|
expect(result.advisoriesAvailable).toBe(false);
|
|
92
|
-
expect(result.message).toContain('
|
|
92
|
+
expect(result.message).toContain('No advisories have been published yet');
|
|
93
93
|
});
|
|
94
94
|
// --------------------------------------------------------------------------
|
|
95
95
|
// Withdrawn advisories excluded
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-audit.test.js","sourceRoot":"","sources":["../../../src/tools/skill-audit.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,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAKpD,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,SAAS,YAAY,CAAC,YAAoC,EAAE;IAC1D,OAAO;QACL,EAAE,EAAE,cAAc;QAClB,OAAO,EAAE,yBAAyB;QAClC,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,mCAAmC;QAC1C,WAAW,EAAE,kCAAkC;QAC/C,WAAW,EAAE,sBAAsB;QACnC,GAAG,SAAS;KACb,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,EAAgB;IACnC,OAAO,EAAE,EAAE,EAA4B,CAAA;AACzC,CAAC;AAED,+EAA+E;AAC/E,QAAQ;AACR,+EAA+E;AAE/E,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,EAAgB,CAAA;IACpB,IAAI,YAAgC,CAAA;IAEpC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,GAAG,kBAAkB,EAAE,CAAA;QACzB,YAAY,GAAG,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,aAAa,CAAC,EAAE,CAAC,CAAA;IACnB,CAAC,CAAC,CAAA;IAEF,6EAA6E;IAC7E,
|
|
1
|
+
{"version":3,"file":"skill-audit.test.js","sourceRoot":"","sources":["../../../src/tools/skill-audit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,18 +18,22 @@
|
|
|
18
18
|
* Community users see a graceful license error response, never a hard throw.
|
|
19
19
|
*/
|
|
20
20
|
import { z } from 'zod';
|
|
21
|
+
import type { NamespaceFlag, TriggerQuality } from './skill-pack-audit.types.js';
|
|
21
22
|
import type { ToolContext } from '../context.js';
|
|
22
23
|
/**
|
|
23
24
|
* Input schema for skill_pack_audit tool
|
|
24
25
|
*/
|
|
25
26
|
export declare const skillPackAuditInputSchema: z.ZodObject<{
|
|
26
27
|
pack_path: z.ZodString;
|
|
28
|
+
check_trigger_quality: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
27
29
|
}, "strip", z.ZodTypeAny, {
|
|
28
30
|
pack_path: string;
|
|
31
|
+
check_trigger_quality: boolean;
|
|
29
32
|
}, {
|
|
30
33
|
pack_path: string;
|
|
34
|
+
check_trigger_quality?: boolean | undefined;
|
|
31
35
|
}>;
|
|
32
|
-
export type SkillPackAuditInput = z.
|
|
36
|
+
export type SkillPackAuditInput = z.input<typeof skillPackAuditInputSchema>;
|
|
33
37
|
/**
|
|
34
38
|
* Drift status for a single skill in the pack
|
|
35
39
|
*/
|
|
@@ -63,6 +67,18 @@ export interface SkillPackAuditResponse {
|
|
|
63
67
|
noRegistryDataCount: number;
|
|
64
68
|
/** Per-skill audit results, sorted alphabetically by name */
|
|
65
69
|
skills: PackSkillEntry[];
|
|
70
|
+
/**
|
|
71
|
+
* SMI-4124: Trigger-quality analysis across the pack (generic trigger words
|
|
72
|
+
* in skill names/descriptions). Present when `check_trigger_quality` is `true`
|
|
73
|
+
* (default). Omitted when the caller explicitly opts out.
|
|
74
|
+
*/
|
|
75
|
+
triggerQuality?: TriggerQuality;
|
|
76
|
+
/**
|
|
77
|
+
* SMI-4124: Namespace-quality flag on the pack itself. Present (possibly
|
|
78
|
+
* `null`) when `check_trigger_quality` is `true`. `null` = clean pack name.
|
|
79
|
+
* Omitted when the caller opts out.
|
|
80
|
+
*/
|
|
81
|
+
namespaceQuality?: NamespaceFlag | null;
|
|
66
82
|
}
|
|
67
83
|
/**
|
|
68
84
|
* MCP tool definition for skill_pack_audit
|
|
@@ -77,6 +93,11 @@ export declare const skillPackAuditToolSchema: {
|
|
|
77
93
|
type: string;
|
|
78
94
|
description: string;
|
|
79
95
|
};
|
|
96
|
+
check_trigger_quality: {
|
|
97
|
+
type: string;
|
|
98
|
+
default: boolean;
|
|
99
|
+
description: string;
|
|
100
|
+
};
|
|
80
101
|
};
|
|
81
102
|
required: string[];
|
|
82
103
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-pack-audit.d.ts","sourceRoot":"","sources":["../../../src/tools/skill-pack-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"skill-pack-audit.d.ts","sourceRoot":"","sources":["../../../src/tools/skill-pack-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAUvB,OAAO,KAAK,EAEV,aAAa,EACb,cAAc,EAEf,MAAM,6BAA6B,CAAA;AACpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAMhD;;GAEG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;EAiBpC,CAAA;AAEF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAE3E;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,UAAU,GACV,OAAO,GACP,kBAAkB,GAClB,iBAAiB,CAAA;AAErB;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAA;IACZ,6EAA6E;IAC7E,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,0EAA0E;IAC1E,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,gFAAgF;IAChF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,mBAAmB;IACnB,MAAM,EAAE,eAAe,CAAA;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAA;IAChB,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAA;IAClB,sFAAsF;IACtF,UAAU,EAAE,MAAM,CAAA;IAClB,6DAA6D;IAC7D,mBAAmB,EAAE,MAAM,CAAA;IAC3B,6DAA6D;IAC7D,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB;;;;OAIG;IACH,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;CACxC;AAMD;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;CA6BpC,CAAA;AA4BD;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,mBAAmB,EAC1B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,sBAAsB,CAAC,CAkNjC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Generic trigger-word + namespace detection helpers for
|
|
3
|
+
* `skill_pack_audit`.
|
|
4
|
+
* @module @skillsmith/mcp-server/tools/skill-pack-audit.helpers
|
|
5
|
+
* @see SMI-4124
|
|
6
|
+
*
|
|
7
|
+
* Pure functions — no I/O, no database access. Tested via
|
|
8
|
+
* `tests/unit/skill-pack-audit.test.ts`.
|
|
9
|
+
*/
|
|
10
|
+
import type { GenericTriggersStoplist } from '@skillsmith/core';
|
|
11
|
+
import type { GenericWordFlag, NamespaceFlag } from './skill-pack-audit.types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Detect generic trigger words in a skill's name and description.
|
|
14
|
+
*
|
|
15
|
+
* - Skill-name hits produce `severity: 'error'` (unconditional false-trigger magnet).
|
|
16
|
+
* - Description hits produce `severity: 'warning'`.
|
|
17
|
+
* - `suggested` is `${packDomain}-${token}` when a pack domain is available,
|
|
18
|
+
* otherwise `null`.
|
|
19
|
+
*
|
|
20
|
+
* @param description - Raw description value from frontmatter (may be string
|
|
21
|
+
* or string[] from block-scalar parsing, or other).
|
|
22
|
+
* @param skillName - Skill's `name` frontmatter value (falls back to dir name).
|
|
23
|
+
* @param packDomain - Inferred pack domain, or `null` when indeterminate.
|
|
24
|
+
* @param stoplist - Curated stoplist from `@skillsmith/core`.
|
|
25
|
+
* @returns Flags (name errors first, then description warnings).
|
|
26
|
+
*/
|
|
27
|
+
export declare function detectGenericTriggerWords(description: unknown, skillName: string, packDomain: string | null, stoplist: GenericTriggersStoplist): GenericWordFlag[];
|
|
28
|
+
/**
|
|
29
|
+
* Aggregate per-skill `tags` across a pack to derive a pack domain.
|
|
30
|
+
*
|
|
31
|
+
* Priority:
|
|
32
|
+
* 1. If `packName` ends with `-skills` and is not itself generic, strip the
|
|
33
|
+
* suffix and return the prefix (e.g. `planning-skills` → `planning`).
|
|
34
|
+
* 2. Otherwise, compute the mode of non-generic tags across all skills.
|
|
35
|
+
* 3. Returns `null` when no domain can be inferred with confidence.
|
|
36
|
+
*
|
|
37
|
+
* @param packName - Pack directory name.
|
|
38
|
+
* @param allSkills - Per-skill tag arrays (undefined / non-array → ignored).
|
|
39
|
+
* @param stoplist - Curated stoplist (for generic-tag filtering).
|
|
40
|
+
*/
|
|
41
|
+
export declare function derivePackDomain(packName: string, allSkills: Array<{
|
|
42
|
+
tags?: unknown;
|
|
43
|
+
}>, stoplist: GenericTriggersStoplist): string | null;
|
|
44
|
+
/**
|
|
45
|
+
* Detect a generic pack namespace.
|
|
46
|
+
*
|
|
47
|
+
* @returns NamespaceFlag when the pack name matches a generic namespace,
|
|
48
|
+
* otherwise null.
|
|
49
|
+
*/
|
|
50
|
+
export declare function detectGenericNamespace(packName: string, allSkills: Array<{
|
|
51
|
+
tags?: unknown;
|
|
52
|
+
}>, stoplist: GenericTriggersStoplist): NamespaceFlag | null;
|
|
53
|
+
//# sourceMappingURL=skill-pack-audit.helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-pack-audit.helpers.d.ts","sourceRoot":"","sources":["../../../src/tools/skill-pack-audit.helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAE/D,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AA4BjF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,OAAO,EACpB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,QAAQ,EAAE,uBAAuB,GAChC,eAAe,EAAE,CAqDnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,KAAK,CAAC;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EACpC,QAAQ,EAAE,uBAAuB,GAChC,MAAM,GAAG,IAAI,CAyCf;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,KAAK,CAAC;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EACpC,QAAQ,EAAE,uBAAuB,GAChC,aAAa,GAAG,IAAI,CAqBtB"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Generic trigger-word + namespace detection helpers for
|
|
3
|
+
* `skill_pack_audit`.
|
|
4
|
+
* @module @skillsmith/mcp-server/tools/skill-pack-audit.helpers
|
|
5
|
+
* @see SMI-4124
|
|
6
|
+
*
|
|
7
|
+
* Pure functions — no I/O, no database access. Tested via
|
|
8
|
+
* `tests/unit/skill-pack-audit.test.ts`.
|
|
9
|
+
*/
|
|
10
|
+
import { FIELD_LIMITS } from './validate.types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Coerce a description value into a plain string. `parseYamlFrontmatter` returns
|
|
13
|
+
* block-scalar (`description: |`) values as `string[]`, so we join with spaces.
|
|
14
|
+
* Non-string/non-string-array values yield an empty string.
|
|
15
|
+
*/
|
|
16
|
+
function coerceDescription(description) {
|
|
17
|
+
if (typeof description === 'string')
|
|
18
|
+
return description;
|
|
19
|
+
if (Array.isArray(description)) {
|
|
20
|
+
return description.filter((item) => typeof item === 'string').join(' ');
|
|
21
|
+
}
|
|
22
|
+
return '';
|
|
23
|
+
}
|
|
24
|
+
/** Split cleaned description text into lowercase word tokens. */
|
|
25
|
+
function tokenizeForTriggers(text) {
|
|
26
|
+
// Clamp to the same limit `validate` enforces to prevent quadratic scans
|
|
27
|
+
// on malicious oversized frontmatter.
|
|
28
|
+
const clamped = text.slice(0, FIELD_LIMITS.description);
|
|
29
|
+
// Strip common punctuation / markdown, collapse whitespace.
|
|
30
|
+
return clamped
|
|
31
|
+
.toLowerCase()
|
|
32
|
+
.replace(/[^a-z0-9\s-]/g, ' ')
|
|
33
|
+
.split(/\s+/)
|
|
34
|
+
.filter((t) => t.length > 0);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Detect generic trigger words in a skill's name and description.
|
|
38
|
+
*
|
|
39
|
+
* - Skill-name hits produce `severity: 'error'` (unconditional false-trigger magnet).
|
|
40
|
+
* - Description hits produce `severity: 'warning'`.
|
|
41
|
+
* - `suggested` is `${packDomain}-${token}` when a pack domain is available,
|
|
42
|
+
* otherwise `null`.
|
|
43
|
+
*
|
|
44
|
+
* @param description - Raw description value from frontmatter (may be string
|
|
45
|
+
* or string[] from block-scalar parsing, or other).
|
|
46
|
+
* @param skillName - Skill's `name` frontmatter value (falls back to dir name).
|
|
47
|
+
* @param packDomain - Inferred pack domain, or `null` when indeterminate.
|
|
48
|
+
* @param stoplist - Curated stoplist from `@skillsmith/core`.
|
|
49
|
+
* @returns Flags (name errors first, then description warnings).
|
|
50
|
+
*/
|
|
51
|
+
export function detectGenericTriggerWords(description, skillName, packDomain, stoplist) {
|
|
52
|
+
const flags = [];
|
|
53
|
+
const triggerSet = new Set(stoplist.triggerWords.map((w) => w.toLowerCase()));
|
|
54
|
+
// Name check (error): tokenize on non-alphanumerics so "spec-builder" flags both.
|
|
55
|
+
const nameTokens = new Set(skillName
|
|
56
|
+
.toLowerCase()
|
|
57
|
+
.split(/[^a-z0-9]+/)
|
|
58
|
+
.filter((t) => t.length > 0));
|
|
59
|
+
for (const token of nameTokens) {
|
|
60
|
+
if (triggerSet.has(token)) {
|
|
61
|
+
flags.push({
|
|
62
|
+
token,
|
|
63
|
+
location: 'name',
|
|
64
|
+
severity: 'error',
|
|
65
|
+
suggested: packDomain ? `${packDomain}-${token}` : null,
|
|
66
|
+
reason: `Skill name contains generic trigger word "${token}". ` +
|
|
67
|
+
`This causes Claude's skill-trigger heuristic to misfire on unrelated prompts. ` +
|
|
68
|
+
(packDomain
|
|
69
|
+
? `Rename to "${packDomain}-${token}" to qualify the scope.`
|
|
70
|
+
: `Qualify with a domain prefix (e.g. "planning-${token}").`),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Description check (warning): full-text tokenization.
|
|
75
|
+
const descText = coerceDescription(description);
|
|
76
|
+
if (descText.length > 0) {
|
|
77
|
+
const descTokens = tokenizeForTriggers(descText);
|
|
78
|
+
const seen = new Set();
|
|
79
|
+
for (const token of descTokens) {
|
|
80
|
+
if (seen.has(token))
|
|
81
|
+
continue;
|
|
82
|
+
if (nameTokens.has(token))
|
|
83
|
+
continue; // already flagged as name error
|
|
84
|
+
if (triggerSet.has(token)) {
|
|
85
|
+
seen.add(token);
|
|
86
|
+
flags.push({
|
|
87
|
+
token,
|
|
88
|
+
location: 'description',
|
|
89
|
+
severity: 'warning',
|
|
90
|
+
suggested: packDomain ? `${packDomain}-${token}` : null,
|
|
91
|
+
reason: `Description contains generic trigger word "${token}". ` +
|
|
92
|
+
`Consider rewording or qualifying the skill's activation phrasing to ` +
|
|
93
|
+
`avoid false-positive skill triggers.`,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return flags;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Aggregate per-skill `tags` across a pack to derive a pack domain.
|
|
102
|
+
*
|
|
103
|
+
* Priority:
|
|
104
|
+
* 1. If `packName` ends with `-skills` and is not itself generic, strip the
|
|
105
|
+
* suffix and return the prefix (e.g. `planning-skills` → `planning`).
|
|
106
|
+
* 2. Otherwise, compute the mode of non-generic tags across all skills.
|
|
107
|
+
* 3. Returns `null` when no domain can be inferred with confidence.
|
|
108
|
+
*
|
|
109
|
+
* @param packName - Pack directory name.
|
|
110
|
+
* @param allSkills - Per-skill tag arrays (undefined / non-array → ignored).
|
|
111
|
+
* @param stoplist - Curated stoplist (for generic-tag filtering).
|
|
112
|
+
*/
|
|
113
|
+
export function derivePackDomain(packName, allSkills, stoplist) {
|
|
114
|
+
const genericNamespaces = new Set(stoplist.namespaces.map((n) => n.toLowerCase()));
|
|
115
|
+
const genericWords = new Set(stoplist.triggerWords.map((w) => w.toLowerCase()));
|
|
116
|
+
// Strategy 1: strip `-skills` suffix from non-generic pack name.
|
|
117
|
+
const lowerPack = packName.toLowerCase();
|
|
118
|
+
if (lowerPack.endsWith('-skills') && !genericNamespaces.has(lowerPack)) {
|
|
119
|
+
const prefix = lowerPack.slice(0, -'-skills'.length);
|
|
120
|
+
if (prefix.length > 0 && !genericNamespaces.has(prefix) && !genericWords.has(prefix)) {
|
|
121
|
+
return prefix;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Strategy 2: mode of per-skill tags.
|
|
125
|
+
const counts = new Map();
|
|
126
|
+
for (const skill of allSkills) {
|
|
127
|
+
if (!Array.isArray(skill.tags))
|
|
128
|
+
continue;
|
|
129
|
+
for (const raw of skill.tags) {
|
|
130
|
+
if (typeof raw !== 'string')
|
|
131
|
+
continue;
|
|
132
|
+
const tag = raw.toLowerCase().trim();
|
|
133
|
+
if (tag.length === 0)
|
|
134
|
+
continue;
|
|
135
|
+
if (genericNamespaces.has(tag) || genericWords.has(tag))
|
|
136
|
+
continue;
|
|
137
|
+
counts.set(tag, (counts.get(tag) ?? 0) + 1);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (counts.size === 0)
|
|
141
|
+
return null;
|
|
142
|
+
let bestTag = null;
|
|
143
|
+
let bestCount = 0;
|
|
144
|
+
for (const [tag, count] of counts) {
|
|
145
|
+
if (count > bestCount) {
|
|
146
|
+
bestTag = tag;
|
|
147
|
+
bestCount = count;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Require the mode to cover at least 2 skills (or the only skill) to avoid
|
|
151
|
+
// picking random one-offs.
|
|
152
|
+
const minSkills = allSkills.length >= 2 ? 2 : 1;
|
|
153
|
+
return bestCount >= minSkills ? bestTag : null;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Detect a generic pack namespace.
|
|
157
|
+
*
|
|
158
|
+
* @returns NamespaceFlag when the pack name matches a generic namespace,
|
|
159
|
+
* otherwise null.
|
|
160
|
+
*/
|
|
161
|
+
export function detectGenericNamespace(packName, allSkills, stoplist) {
|
|
162
|
+
const lowerPack = packName.toLowerCase();
|
|
163
|
+
const genericNamespaces = new Set(stoplist.namespaces.map((n) => n.toLowerCase()));
|
|
164
|
+
if (!genericNamespaces.has(lowerPack))
|
|
165
|
+
return null;
|
|
166
|
+
const domain = derivePackDomain(packName, allSkills, stoplist);
|
|
167
|
+
const suggested = domain ? `${domain}-skills` : null;
|
|
168
|
+
const reason = suggested
|
|
169
|
+
? `Pack name "${packName}" is a generic namespace. Rename to "${suggested}" ` +
|
|
170
|
+
`to reflect its domain (inferred from per-skill tags).`
|
|
171
|
+
: `Pack name "${packName}" is a generic namespace and per-skill tags do not ` +
|
|
172
|
+
`converge on a clear domain. Rename to "<domain>-skills" where <domain> is ` +
|
|
173
|
+
`a specific scope (e.g. "planning-skills", "cicd-skills").`;
|
|
174
|
+
return {
|
|
175
|
+
packName,
|
|
176
|
+
severity: 'warning',
|
|
177
|
+
suggested,
|
|
178
|
+
reason,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=skill-pack-audit.helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-pack-audit.helpers.js","sourceRoot":"","sources":["../../../src/tools/skill-pack-audit.helpers.ts"],"names":[],"mappings":"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"}
|