@withpica/mcp-server-directory 1.0.0 → 1.1.0
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 +39 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +1 -0
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/prompts/index.d.ts +6 -5
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +136 -96
- package/dist/prompts/index.js.map +1 -1
- package/dist/resources/llms-primer.d.ts.map +1 -1
- package/dist/resources/llms-primer.js +1 -0
- package/dist/resources/llms-primer.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1 -0
- package/dist/server.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/people.d.ts.map +1 -1
- package/dist/tools/people.js +1 -0
- package/dist/tools/people.js.map +1 -1
- package/dist/tools/recordings.d.ts.map +1 -1
- package/dist/tools/recordings.js +1 -0
- package/dist/tools/recordings.js.map +1 -1
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +1 -0
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/works.d.ts.map +1 -1
- package/dist/tools/works.js +1 -0
- package/dist/tools/works.js.map +1 -1
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +1 -0
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/formatting.d.ts.map +1 -1
- package/dist/utils/formatting.js +1 -0
- package/dist/utils/formatting.js.map +1 -1
- package/jest.config.js +31 -0
- package/package.json +1 -1
- package/src/__tests__/prompts/index.test.ts +145 -0
- package/src/__tests__/prompts/prompt-eval-harness.test.ts +251 -0
- package/src/__tests__/tools/composability-chains.test.ts +98 -0
- package/src/__tests__/tools/people.test.ts +106 -0
- package/src/__tests__/tools/search.test.ts +94 -0
- package/src/__tests__/tools/works.test.ts +148 -0
- package/src/client.ts +128 -0
- package/src/config.ts +23 -0
- package/src/index.ts +36 -0
- package/src/prompts/index.ts +250 -0
- package/src/resources/llms-primer.ts +35 -0
- package/src/server.ts +134 -0
- package/src/tools/index.ts +71 -0
- package/src/tools/people.ts +215 -0
- package/src/tools/recordings.ts +145 -0
- package/src/tools/search.ts +63 -0
- package/src/tools/works.ts +273 -0
- package/src/utils/errors.ts +64 -0
- package/src/utils/formatting.ts +28 -0
- package/tsconfig.json +22 -0
package/dist/tools/search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAI7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,OAAO,oBAAoB;IACvB,MAAM,CAAkB;IAEhC,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,QAAQ;QACN,OAAO;YACL;gBACE,UAAU,EAAE;oBACV,IAAI,EAAE,kBAAkB;oBACxB,WAAW,EACT,8EAA8E;wBAC9E,0EAA0E;wBAC1E,uDAAuD;wBACvD,mGAAmG;oBACrG,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;gCACd,WAAW,EACT,iEAAiE;6BACpE;4BACD,IAAI,EAAE;gCACJ,IAAI,EAAE,QAAQ;gCACd,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;gCACzB,WAAW,EAAE,yCAAyC;6BACvD;yBACF;wBACD,QAAQ,EAAE,CAAC,OAAO,CAAC;qBACpB;iBACF;gBACD,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;aACjC;SACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,IAAyB;QAC5C,MAAM,MAAM,GAA2B;YACrC,CAAC,EAAE,IAAI,CAAC,KAAK;YACb,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,GAAG;SACZ,CAAC;QAEF,IAAI,IAAI,CAAC,IAAI;YAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAEvC,MAAM,QAAQ,GAAQ,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAEnE,OAAO,oBAAoB,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE;YACzD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK;YACxB,KAAK,EAAE,QAAQ,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"works.d.ts","sourceRoot":"","sources":["../../src/tools/works.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"works.d.ts","sourceRoot":"","sources":["../../src/tools/works.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1D,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,EAAE,eAAe;IAInC,QAAQ,IAAI,KAAK,CAAC;QAAE,UAAU,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;YAqG3D,SAAS;YAwBT,UAAU;YAQV,cAAc;YAkHd,UAAU;CAYzB"}
|
package/dist/tools/works.js
CHANGED
package/dist/tools/works.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"works.js","sourceRoot":"","sources":["../../src/tools/works.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"works.js","sourceRoot":"","sources":["../../src/tools/works.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAEA,qBAAa,cAAe,SAAQ,KAAK;IAG9B,IAAI,EAAE,MAAM;IACZ,OAAO,CAAC,EAAE,GAAG;gBAFpB,OAAO,EAAE,MAAM,EACR,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,GAAG,YAAA;CAMvB;AAED,qBAAa,kBAAmB,SAAQ,cAAc;gBACxC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;CAI3C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA+BtE;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI,CAS1D"}
|
package/dist/utils/errors.js
CHANGED
package/dist/utils/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAe,SAAQ,KAAK;IAG9B;IACA;IAHT,YACE,OAAe,EACR,IAAY,EACZ,OAAa;QAEpB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAJ,IAAI,CAAQ;QACZ,YAAO,GAAP,OAAO,CAAM;QAGpB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,cAAc;IACpD,YAAY,OAAe,EAAE,OAAa;QACxC,KAAK,CAAC,OAAO,EAAE,sBAAsB,EAAE,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,KAAU;IACpC,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EACrE,IAAI,EACJ,CAAC,CACF;SACF,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAClD,IAAI,EACJ,CAAC,CACF;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAClD,IAAI,EACJ,CAAC,CACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,KAAU;IAClD,MAAM,KAAK,GAA4B;QACrC,KAAK,EAAE,OAAO;QACd,OAAO;QACP,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAC/D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IACF,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,KAAK;QAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IACrE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AACvC,CAAC"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,MAAM,OAAO,cAAe,SAAQ,KAAK;IAG9B;IACA;IAHT,YACE,OAAe,EACR,IAAY,EACZ,OAAa;QAEpB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAJ,IAAI,CAAQ;QACZ,YAAO,GAAP,OAAO,CAAM;QAGpB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,cAAc;IACpD,YAAY,OAAe,EAAE,OAAa;QACxC,KAAK,CAAC,OAAO,EAAE,sBAAsB,EAAE,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,KAAU;IACpC,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EACrE,IAAI,EACJ,CAAC,CACF;SACF,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAClD,IAAI,EACJ,CAAC,CACF;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAClD,IAAI,EACJ,CAAC,CACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,KAAU;IAClD,MAAM,KAAK,GAA4B;QACrC,KAAK,EAAE,OAAO;QACd,OAAO;QACP,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAC/D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IACF,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,KAAK;QAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IACrE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,eAAe,CAKvD;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,KAAK,EAAE,CAAC,EAAE,EACV,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,eAAe,CASjB"}
|
package/dist/utils/formatting.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAO7D,MAAM,UAAU,YAAY,CAAC,IAAS;IACpC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAChE,iBAAiB,EAAE,IAA+B;KACnD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAU,EACV,UAAkB,EAClB,QAA8B;IAE9B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,MAAM,OAAO,GAAG,SAAS,KAAK,IAAI,UAAU,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GACnE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,cAAc,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EACtD,GAAG,CAAC;IACJ,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1C,iBAAiB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,QAAQ,EAA6B;KAC5E,CAAC;AACJ,CAAC"}
|
package/jest.config.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
preset: 'ts-jest/presets/default-esm',
|
|
5
|
+
testEnvironment: 'node',
|
|
6
|
+
extensionsToTreatAsEsm: ['.ts'],
|
|
7
|
+
moduleNameMapper: {
|
|
8
|
+
'^(\\.{1,2}/.*)\\.js$': '$1',
|
|
9
|
+
},
|
|
10
|
+
transform: {
|
|
11
|
+
'^.+\\.ts$': [
|
|
12
|
+
'ts-jest',
|
|
13
|
+
{
|
|
14
|
+
useESM: true,
|
|
15
|
+
tsconfig: {
|
|
16
|
+
module: 'ESNext',
|
|
17
|
+
moduleResolution: 'node',
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
},
|
|
22
|
+
roots: ['<rootDir>/src'],
|
|
23
|
+
testMatch: ['**/__tests__/**/*.ts', '**/*.test.ts'],
|
|
24
|
+
collectCoverageFrom: [
|
|
25
|
+
'src/**/*.ts',
|
|
26
|
+
'!src/**/*.d.ts',
|
|
27
|
+
'!src/index.ts',
|
|
28
|
+
],
|
|
29
|
+
coverageDirectory: 'coverage',
|
|
30
|
+
verbose: true,
|
|
31
|
+
};
|
package/package.json
CHANGED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Directory Skill Registry Tests
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { describe, it, expect, beforeAll } from "@jest/globals";
|
|
8
|
+
import { PromptRegistry } from "../../prompts/index";
|
|
9
|
+
|
|
10
|
+
describe("Directory Skill Registry", () => {
|
|
11
|
+
const registry = new PromptRegistry();
|
|
12
|
+
|
|
13
|
+
describe("listPrompts", () => {
|
|
14
|
+
it("returns 2 skills", () => {
|
|
15
|
+
const prompts = registry.listPrompts();
|
|
16
|
+
expect(prompts).toHaveLength(2);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it("includes all expected skills", () => {
|
|
20
|
+
const names = registry.listPrompts().map((p) => p.name);
|
|
21
|
+
expect(names).toContain("discover-music");
|
|
22
|
+
expect(names).toContain("research-creator");
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it("skill names are unique and kebab-case", () => {
|
|
26
|
+
const prompts = registry.listPrompts();
|
|
27
|
+
const names = prompts.map((p) => p.name);
|
|
28
|
+
expect(new Set(names).size).toBe(names.length);
|
|
29
|
+
for (const name of names) {
|
|
30
|
+
expect(name).toMatch(/^[a-z][a-z0-9-]*$/);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
describe("getPrompt", () => {
|
|
36
|
+
it("resolves all skills without error", async () => {
|
|
37
|
+
const prompts = registry.listPrompts();
|
|
38
|
+
for (const prompt of prompts) {
|
|
39
|
+
const result = await registry.getPrompt(prompt.name);
|
|
40
|
+
expect(result.messages).toBeInstanceOf(Array);
|
|
41
|
+
expect(result.messages.length).toBeGreaterThan(0);
|
|
42
|
+
expect(result.messages[0].content.type).toBe("text");
|
|
43
|
+
expect(result.messages[0].content.text).toBeTruthy();
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("throws on unknown prompt", async () => {
|
|
48
|
+
await expect(registry.getPrompt("nonexistent")).rejects.toThrow(
|
|
49
|
+
"Prompt not found",
|
|
50
|
+
);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it("every skill includes the shared preamble", async () => {
|
|
54
|
+
const prompts = registry.listPrompts();
|
|
55
|
+
for (const prompt of prompts) {
|
|
56
|
+
const result = await registry.getPrompt(prompt.name);
|
|
57
|
+
const text = result.messages[0].content.text;
|
|
58
|
+
expect(text).toContain("llms://primer");
|
|
59
|
+
expect(text).toContain("Discovery principle");
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
describe("discover-music skill", () => {
|
|
65
|
+
it("references audio search tool", async () => {
|
|
66
|
+
const result = await registry.getPrompt("discover-music");
|
|
67
|
+
const text = result.messages[0].content.text;
|
|
68
|
+
expect(text).toContain("directory_search_recordings");
|
|
69
|
+
expect(text).toContain("directory_lookup_work_full");
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("includes mood-to-parameter translation guide", async () => {
|
|
73
|
+
const result = await registry.getPrompt("discover-music");
|
|
74
|
+
const text = result.messages[0].content.text;
|
|
75
|
+
expect(text).toMatch(/upbeat|dark|chill/i);
|
|
76
|
+
expect(text).toContain("energy");
|
|
77
|
+
expect(text).toContain("BPM");
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("accepts optional brief argument", async () => {
|
|
81
|
+
const result = await registry.getPrompt("discover-music", {
|
|
82
|
+
brief: "dark moody piano",
|
|
83
|
+
});
|
|
84
|
+
const text = result.messages[0].content.text;
|
|
85
|
+
expect(text).toContain("dark moody piano");
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it("emphasises equal discovery principle", async () => {
|
|
89
|
+
const result = await registry.getPrompt("discover-music");
|
|
90
|
+
const text = result.messages[0].content.text;
|
|
91
|
+
expect(text).toMatch(/equal discovery/i);
|
|
92
|
+
expect(text).toMatch(/not.*popularity|not.*fame/i);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("includes reference track search path", async () => {
|
|
96
|
+
const result = await registry.getPrompt("discover-music");
|
|
97
|
+
const text = result.messages[0].content.text;
|
|
98
|
+
expect(text).toMatch(/reference track/i);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it("includes similarity exploration path", async () => {
|
|
102
|
+
const result = await registry.getPrompt("discover-music");
|
|
103
|
+
const text = result.messages[0].content.text;
|
|
104
|
+
expect(text).toMatch(/similar/i);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
describe("research-creator skill", () => {
|
|
109
|
+
it("references person lookup tools", async () => {
|
|
110
|
+
const result = await registry.getPrompt("research-creator");
|
|
111
|
+
const text = result.messages[0].content.text;
|
|
112
|
+
expect(text).toContain("directory_lookup_person_full");
|
|
113
|
+
expect(text).toContain("directory_lookup_work_full");
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it("accepts optional name argument", async () => {
|
|
117
|
+
const result = await registry.getPrompt("research-creator", {
|
|
118
|
+
name_or_id: "Max Martin",
|
|
119
|
+
});
|
|
120
|
+
const text = result.messages[0].content.text;
|
|
121
|
+
expect(text).toContain("Max Martin");
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it("handles identifier routing from old directory-autopilot", async () => {
|
|
125
|
+
const result = await registry.getPrompt("research-creator");
|
|
126
|
+
const text = result.messages[0].content.text;
|
|
127
|
+
expect(text).toContain("directory_lookup_isrc");
|
|
128
|
+
expect(text).toContain("directory_list_works");
|
|
129
|
+
expect(text).toContain("directory_list_people");
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it("includes collaborator network exploration", async () => {
|
|
133
|
+
const result = await registry.getPrompt("research-creator");
|
|
134
|
+
const text = result.messages[0].content.text;
|
|
135
|
+
expect(text).toMatch(/collaborator.*network/i);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
it("includes similarity search", async () => {
|
|
139
|
+
const result = await registry.getPrompt("research-creator");
|
|
140
|
+
const text = result.messages[0].content.text;
|
|
141
|
+
expect(text).toContain("directory_search_recordings");
|
|
142
|
+
expect(text).toMatch(/similar/i);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
});
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Directory Skill Eval Harness — ADR-140 Phase 3 + ADR-171 Skills
|
|
5
|
+
*
|
|
6
|
+
* Deterministic test suite that validates directory skill text produces
|
|
7
|
+
* correct workflow routing. Parses skill text for tool references,
|
|
8
|
+
* ordering, and routing conditions.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { describe, it, expect, beforeAll } from "@jest/globals";
|
|
12
|
+
import { PromptRegistry } from "../../prompts/index";
|
|
13
|
+
|
|
14
|
+
const registry = new PromptRegistry();
|
|
15
|
+
|
|
16
|
+
/** Extract all directory_* tool references from text in order of appearance */
|
|
17
|
+
function extractToolRefs(text: string): string[] {
|
|
18
|
+
return [...text.matchAll(/directory_\w+/g)].map((m) => m[0]);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Check if tool A appears before tool B in the text */
|
|
22
|
+
function appearsBeforeInText(
|
|
23
|
+
text: string,
|
|
24
|
+
toolA: string,
|
|
25
|
+
toolB: string,
|
|
26
|
+
): boolean {
|
|
27
|
+
const indexA = text.indexOf(toolA);
|
|
28
|
+
const indexB = text.indexOf(toolB);
|
|
29
|
+
return indexA !== -1 && indexB !== -1 && indexA < indexB;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
describe("Skill Eval Harness — Directory MCP", () => {
|
|
33
|
+
describe("Scenario 1: discover-music search then lookup workflow", () => {
|
|
34
|
+
let text: string;
|
|
35
|
+
let tools: string[];
|
|
36
|
+
|
|
37
|
+
beforeAll(async () => {
|
|
38
|
+
const result = await registry.getPrompt("discover-music");
|
|
39
|
+
text = result.messages[0].content.text;
|
|
40
|
+
tools = extractToolRefs(text);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("reads llms://primer in the shared preamble", () => {
|
|
44
|
+
expect(text).toContain("llms://primer");
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("uses directory_search_recordings as the primary search tool", () => {
|
|
48
|
+
expect(tools).toContain("directory_search_recordings");
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("chains to directory_lookup_work_full for detailed results", () => {
|
|
52
|
+
expect(tools).toContain("directory_lookup_work_full");
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("search comes before lookup (correct order)", () => {
|
|
56
|
+
expect(
|
|
57
|
+
appearsBeforeInText(
|
|
58
|
+
text,
|
|
59
|
+
"directory_search_recordings",
|
|
60
|
+
"directory_lookup_work_full",
|
|
61
|
+
),
|
|
62
|
+
).toBe(true);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it("includes mood-to-parameter translation guide", () => {
|
|
66
|
+
expect(text).toMatch(/energy/i);
|
|
67
|
+
expect(text).toMatch(/bpm/i);
|
|
68
|
+
expect(text).toMatch(/danceability/i);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it("covers all key audio search dimensions", () => {
|
|
72
|
+
const dimensions = [/energy/i, /bpm/i, /key/i, /mood/i, /duration/i];
|
|
73
|
+
for (const dim of dimensions) {
|
|
74
|
+
expect(text).toMatch(dim);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it("includes result presentation format with credits", () => {
|
|
79
|
+
expect(text).toMatch(/credits|who to contact/i);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("handles no-results case with broadening suggestions", () => {
|
|
83
|
+
expect(text).toMatch(/no results|broaden/i);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("emphasises equal discovery principle", () => {
|
|
87
|
+
expect(text).toMatch(/equal discovery/i);
|
|
88
|
+
expect(text).toMatch(/not.*popularity|not.*fame/i);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it("includes reference track search path", () => {
|
|
92
|
+
expect(text).toMatch(/reference track/i);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("includes similarity exploration path", () => {
|
|
96
|
+
expect(text).toMatch(/similar/i);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("mentions sync brief and playlist as use cases", () => {
|
|
100
|
+
expect(text).toMatch(/sync/i);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it("includes rights check path", () => {
|
|
104
|
+
expect(text).toMatch(/rights/i);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
describe("Scenario 2: research-creator references person then work lookup", () => {
|
|
109
|
+
let text: string;
|
|
110
|
+
let tools: string[];
|
|
111
|
+
|
|
112
|
+
beforeAll(async () => {
|
|
113
|
+
const result = await registry.getPrompt("research-creator");
|
|
114
|
+
text = result.messages[0].content.text;
|
|
115
|
+
tools = extractToolRefs(text);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it("references directory_lookup_person_full as primary lookup", () => {
|
|
119
|
+
expect(tools).toContain("directory_lookup_person_full");
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it("chains to directory_lookup_work_full for notable works", () => {
|
|
123
|
+
expect(tools).toContain("directory_lookup_work_full");
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it("person lookup comes before work lookup in the main flow", () => {
|
|
127
|
+
// After the routing section, lookup_person_full should appear before lookup_work_full
|
|
128
|
+
const mainFlowStart = text.indexOf("Lookup by name");
|
|
129
|
+
const subText = text.slice(mainFlowStart);
|
|
130
|
+
expect(
|
|
131
|
+
appearsBeforeInText(
|
|
132
|
+
subText,
|
|
133
|
+
"directory_lookup_person_full",
|
|
134
|
+
"directory_lookup_work_full",
|
|
135
|
+
),
|
|
136
|
+
).toBe(true);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it("checks identifiers (IPI, ISNI, MusicBrainz)", () => {
|
|
140
|
+
expect(text).toMatch(/ipi/i);
|
|
141
|
+
expect(text).toMatch(/isni/i);
|
|
142
|
+
expect(text).toMatch(/musicbrainz/i);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it("examines collaborator network", () => {
|
|
146
|
+
expect(text).toMatch(/collaborator.*network/i);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it("includes use cases for the research output", () => {
|
|
150
|
+
expect(text).toMatch(
|
|
151
|
+
/rights research|due diligence|licensing|publisher|acquisition/i,
|
|
152
|
+
);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it("accepts name_or_id argument and includes it in search", async () => {
|
|
156
|
+
const result = await registry.getPrompt("research-creator", {
|
|
157
|
+
name_or_id: "Diane Warren",
|
|
158
|
+
});
|
|
159
|
+
const argText = result.messages[0].content.text;
|
|
160
|
+
expect(argText).toContain("Diane Warren");
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
describe("Scenario 3: research-creator handles identifier routing (from old directory-autopilot)", () => {
|
|
165
|
+
let text: string;
|
|
166
|
+
|
|
167
|
+
beforeAll(async () => {
|
|
168
|
+
const result = await registry.getPrompt("research-creator");
|
|
169
|
+
text = result.messages[0].content.text;
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it("routes ISRC to directory_lookup_isrc", () => {
|
|
173
|
+
expect(text).toMatch(/isrc/i);
|
|
174
|
+
expect(text).toContain("directory_lookup_isrc");
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it("chains ISRC lookup to directory_lookup_work_full", () => {
|
|
178
|
+
const isrcBlock = text.slice(
|
|
179
|
+
text.search(/ISRC/),
|
|
180
|
+
text.search(/ISRC/) + 200,
|
|
181
|
+
);
|
|
182
|
+
expect(isrcBlock).toContain("directory_lookup_work_full");
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
it("routes IPI/ISNI to directory_lookup_person_full", () => {
|
|
186
|
+
expect(text).toMatch(/ipi|isni/i);
|
|
187
|
+
expect(text).toContain("directory_lookup_person_full");
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it("routes ISWC to directory_lookup_work_full", () => {
|
|
191
|
+
expect(text).toMatch(/iswc/i);
|
|
192
|
+
expect(text).toContain("directory_lookup_work_full");
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it("handles MusicBrainz IDs", () => {
|
|
196
|
+
expect(text).toMatch(/musicbrainz/i);
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
it("supports browsing via directory_search and list tools", () => {
|
|
200
|
+
expect(text).toContain("directory_search");
|
|
201
|
+
expect(text).toContain("directory_list_works");
|
|
202
|
+
expect(text).toContain("directory_list_people");
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
describe("Cross-skill integrity", () => {
|
|
207
|
+
it("all skills reference at least one directory_ tool", async () => {
|
|
208
|
+
const prompts = registry.listPrompts();
|
|
209
|
+
const noTools: string[] = [];
|
|
210
|
+
|
|
211
|
+
for (const prompt of prompts) {
|
|
212
|
+
const result = await registry.getPrompt(prompt.name);
|
|
213
|
+
const text = result.messages[0].content.text;
|
|
214
|
+
const tools = extractToolRefs(text);
|
|
215
|
+
|
|
216
|
+
if (tools.length === 0) {
|
|
217
|
+
noTools.push(prompt.name);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
expect(noTools).toEqual([]);
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
it("all skills include the shared preamble with discovery principle", async () => {
|
|
225
|
+
const prompts = registry.listPrompts();
|
|
226
|
+
|
|
227
|
+
for (const prompt of prompts) {
|
|
228
|
+
const result = await registry.getPrompt(prompt.name);
|
|
229
|
+
const text = result.messages[0].content.text;
|
|
230
|
+
expect(text).toContain("Discovery principle");
|
|
231
|
+
expect(text).toContain("llms://primer");
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
it("all skills are read-only (no create/modify tools)", async () => {
|
|
236
|
+
const prompts = registry.listPrompts();
|
|
237
|
+
|
|
238
|
+
for (const prompt of prompts) {
|
|
239
|
+
const result = await registry.getPrompt(prompt.name);
|
|
240
|
+
const text = result.messages[0].content.text;
|
|
241
|
+
expect(text).toMatch(/read-only/i);
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
it("discover-music includes similarity path to research-creator", async () => {
|
|
246
|
+
const result = await registry.getPrompt("discover-music");
|
|
247
|
+
const text = result.messages[0].content.text;
|
|
248
|
+
expect(text).toContain("research-creator");
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
});
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Directory MCP — Composability Chain Tests
|
|
5
|
+
* Verifies "→ then:" chains point to valid tools
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { describe, it, expect, beforeAll } from "@jest/globals";
|
|
9
|
+
import { DirectoryWorksTools } from "../../tools/works";
|
|
10
|
+
import { DirectoryPeopleTools } from "../../tools/people";
|
|
11
|
+
import { DirectorySearchTools } from "../../tools/search";
|
|
12
|
+
import { DirectoryRecordingsTools } from "../../tools/recordings";
|
|
13
|
+
|
|
14
|
+
const nullClient = null as any;
|
|
15
|
+
|
|
16
|
+
function getAllTools() {
|
|
17
|
+
const classes = [
|
|
18
|
+
new DirectoryWorksTools(nullClient),
|
|
19
|
+
new DirectoryPeopleTools(nullClient),
|
|
20
|
+
new DirectorySearchTools(nullClient),
|
|
21
|
+
new DirectoryRecordingsTools(nullClient),
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const tools: Array<{ name: string; description: string }> = [];
|
|
25
|
+
for (const cls of classes) {
|
|
26
|
+
for (const tool of cls.getTools()) {
|
|
27
|
+
tools.push({
|
|
28
|
+
name: tool.definition.name,
|
|
29
|
+
description: tool.definition.description,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return tools;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function parseChains(description: string): string[] {
|
|
37
|
+
const match = description.match(/→ then: (.+)$/);
|
|
38
|
+
if (!match) return [];
|
|
39
|
+
return [...match[1].matchAll(/directory_\w+/g)].map((m) => m[0]);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
describe("Directory Composability Chains", () => {
|
|
43
|
+
let allTools: Array<{ name: string; description: string }>;
|
|
44
|
+
let allNames: Set<string>;
|
|
45
|
+
|
|
46
|
+
beforeAll(() => {
|
|
47
|
+
allTools = getAllTools();
|
|
48
|
+
allNames = new Set(allTools.map((t) => t.name));
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("all 9 tools are registered", () => {
|
|
52
|
+
expect(allTools).toHaveLength(9);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("all tools have composability chains", () => {
|
|
56
|
+
const missing = allTools.filter((t) => !t.description.includes("→ then:"));
|
|
57
|
+
expect(missing.map((t) => t.name)).toEqual([]);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it("all chain references point to existing tools", () => {
|
|
61
|
+
const broken: string[] = [];
|
|
62
|
+
for (const tool of allTools) {
|
|
63
|
+
const refs = parseChains(tool.description);
|
|
64
|
+
for (const ref of refs) {
|
|
65
|
+
if (!allNames.has(ref)) {
|
|
66
|
+
broken.push(`${tool.name} → ${ref} (not found)`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
expect(broken).toEqual([]);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("no tool chains reference itself", () => {
|
|
74
|
+
const selfRefs = allTools.filter((t) =>
|
|
75
|
+
parseChains(t.description).includes(t.name),
|
|
76
|
+
);
|
|
77
|
+
expect(selfRefs.map((t) => t.name)).toEqual([]);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("every chain includes a reason hint", () => {
|
|
81
|
+
const missingReasons: string[] = [];
|
|
82
|
+
for (const tool of allTools) {
|
|
83
|
+
if (!tool.description.includes("→ then:")) continue;
|
|
84
|
+
const chainPart = tool.description.split("→ then:")[1];
|
|
85
|
+
const refs = [...chainPart.matchAll(/directory_\w+/g)];
|
|
86
|
+
for (const ref of refs) {
|
|
87
|
+
const afterRef = chainPart.slice(
|
|
88
|
+
(ref.index ?? 0) + ref[0].length,
|
|
89
|
+
(ref.index ?? 0) + ref[0].length + 50,
|
|
90
|
+
);
|
|
91
|
+
if (!afterRef.match(/^\s*\(/)) {
|
|
92
|
+
missingReasons.push(`${tool.name} → ${ref[0]} missing reason`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
expect(missingReasons).toEqual([]);
|
|
97
|
+
});
|
|
98
|
+
});
|