@withpica/mcp-server 2.100.0 → 2.102.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 +80 -0
- package/README.md +1 -1
- package/dist/lib/changelog.generated.d.ts +2 -2
- package/dist/lib/changelog.generated.d.ts.map +1 -1
- package/dist/lib/changelog.generated.js +2 -2
- package/dist/lib/changelog.generated.js.map +1 -1
- package/dist/prompts/index.js +2 -2
- package/dist/resources/index.d.ts +23 -3
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +119 -64
- package/dist/resources/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +9 -0
- package/dist/server.js.map +1 -1
- package/dist/skills/index.d.ts +5 -3
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +11 -9
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/sep2640.d.ts +71 -0
- package/dist/skills/sep2640.d.ts.map +1 -0
- package/dist/skills/sep2640.js +198 -0
- package/dist/skills/sep2640.js.map +1 -0
- package/dist/skills/skills.generated.js +1 -1
- package/dist/skills/skills.generated.js.map +1 -1
- package/dist/tools/credits.d.ts.map +1 -1
- package/dist/tools/credits.js +8 -2
- package/dist/tools/credits.js.map +1 -1
- package/dist/tools/dashboard.js +1 -1
- package/dist/tools/dashboard.js.map +1 -1
- package/dist/tools/directory.d.ts.map +1 -1
- package/dist/tools/directory.js +21 -10
- package/dist/tools/directory.js.map +1 -1
- package/dist/tools/discovery.js +1 -1
- package/dist/tools/discovery.js.map +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/people.d.ts +1 -1
- package/dist/tools/people.d.ts.map +1 -1
- package/dist/tools/people.js +1 -1
- package/dist/tools/people.js.map +1 -1
- package/dist/tools/profile-claims.d.ts.map +1 -1
- package/dist/tools/profile-claims.js +6 -3
- package/dist/tools/profile-claims.js.map +1 -1
- package/dist/tools/recovery-hints.js +1 -1
- package/dist/tools/recovery-hints.js.map +1 -1
- package/dist/tools/rights.d.ts.map +1 -1
- package/dist/tools/rights.js +8 -1
- package/dist/tools/rights.js.map +1 -1
- package/dist/tools/skills.d.ts +3 -4
- package/dist/tools/skills.d.ts.map +1 -1
- package/dist/tools/skills.js.map +1 -1
- package/dist/tools/split-sheets.d.ts.map +1 -1
- package/dist/tools/split-sheets.js +13 -7
- package/dist/tools/split-sheets.js.map +1 -1
- package/package.json +6 -4
- package/server.json +2 -2
package/dist/skills/index.js
CHANGED
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Skills Registry — ADR-140 Phase 2b
|
|
4
4
|
*
|
|
5
|
-
* Exposes PICA's named methodologies as MCP-loadable skills
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Exposes PICA's named methodologies as MCP-loadable skills. Each skill is
|
|
6
|
+
* reachable as a `skill://` Resource, through the SEP-2640 skills extension
|
|
7
|
+
* (skills/list, skills/get — ./sep2640.ts, ADR-328), and as MCP tools
|
|
8
|
+
* (pica_skill_list + pica_skill_get).
|
|
8
9
|
*
|
|
9
10
|
* Bodies are bundled at build time by `scripts/build-skills.ts`. The registry
|
|
10
11
|
* is intentionally thin — list returns a metadata-only summary (tiny handshake
|
|
@@ -25,7 +26,7 @@ export class SkillsRegistry {
|
|
|
25
26
|
for (const s of extraSkills) {
|
|
26
27
|
if (!s?.name)
|
|
27
28
|
continue;
|
|
28
|
-
if (s.name
|
|
29
|
+
if (Object.hasOwn(SKILLS, s.name))
|
|
29
30
|
continue; // built-in wins
|
|
30
31
|
if (this.extra.has(s.name))
|
|
31
32
|
continue; // first wins on dup
|
|
@@ -66,9 +67,8 @@ export class SkillsRegistry {
|
|
|
66
67
|
* Throws when name is unknown so callers can return a RecoveryHint.
|
|
67
68
|
*/
|
|
68
69
|
getSkill(name) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return builtin;
|
|
70
|
+
if (Object.hasOwn(SKILLS, name))
|
|
71
|
+
return SKILLS[name];
|
|
72
72
|
const org = this.extra.get(name);
|
|
73
73
|
if (org)
|
|
74
74
|
return org;
|
|
@@ -76,7 +76,7 @@ export class SkillsRegistry {
|
|
|
76
76
|
}
|
|
77
77
|
/** "builtin" | "org" | "user" | null (null = not registered). */
|
|
78
78
|
originOf(name) {
|
|
79
|
-
if (name
|
|
79
|
+
if (Object.hasOwn(SKILLS, name))
|
|
80
80
|
return "builtin";
|
|
81
81
|
const extra = this.extra.get(name);
|
|
82
82
|
if (extra)
|
|
@@ -84,7 +84,7 @@ export class SkillsRegistry {
|
|
|
84
84
|
return null;
|
|
85
85
|
}
|
|
86
86
|
has(name) {
|
|
87
|
-
return name
|
|
87
|
+
return Object.hasOwn(SKILLS, name) || this.extra.has(name);
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
90
|
export class SkillNotFoundError extends Error {
|
|
@@ -96,4 +96,6 @@ export class SkillNotFoundError extends Error {
|
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
export { SKILLS, SKILL_NAMES };
|
|
99
|
+
// ADR-328 — SEP-2640 skills extension (skills/list, skills/get, served SKILL.md).
|
|
100
|
+
export * from "./sep2640.js";
|
|
99
101
|
//# sourceMappingURL=index.js.map
|
package/dist/skills/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Skill } from "./skills.generated.js";
|
|
3
|
+
import type { SkillsRegistry, SkillOrigin } from "./index.js";
|
|
4
|
+
export declare const SKILLS_EXTENSION_ID = "io.modelcontextprotocol/skills";
|
|
5
|
+
/** Spread into `capabilities.extensions`. No `directoryRead`: every skill is one file. */
|
|
6
|
+
export declare const SKILLS_EXTENSION_CAPABILITY: {
|
|
7
|
+
"io.modelcontextprotocol/skills": {};
|
|
8
|
+
};
|
|
9
|
+
export interface SkillFrontmatter {
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
compatibility: string;
|
|
13
|
+
metadata: Record<string, string>;
|
|
14
|
+
}
|
|
15
|
+
export interface SkillResourceRef {
|
|
16
|
+
uri: string;
|
|
17
|
+
digest: string;
|
|
18
|
+
size: number;
|
|
19
|
+
}
|
|
20
|
+
export interface SkillEntry {
|
|
21
|
+
uri: string;
|
|
22
|
+
frontmatter: SkillFrontmatter;
|
|
23
|
+
resources: SkillResourceRef[];
|
|
24
|
+
}
|
|
25
|
+
export declare class SkillEntryNotFoundError extends Error {
|
|
26
|
+
readonly uri: string;
|
|
27
|
+
constructor(uri: string);
|
|
28
|
+
}
|
|
29
|
+
export declare function skillUri(name: string): string;
|
|
30
|
+
/** Skill name from a `skill://withpica/<name>/SKILL.md` URI, or null. */
|
|
31
|
+
export declare function skillNameFromUri(uri: string): string | null;
|
|
32
|
+
export declare function skillFrontmatter(skill: Skill, origin: SkillOrigin): SkillFrontmatter;
|
|
33
|
+
/** The exact text served by `resources/read` for this skill's SKILL.md. */
|
|
34
|
+
export declare function renderSkillMd(skill: Skill, origin: SkillOrigin): string;
|
|
35
|
+
/**
|
|
36
|
+
* Entries for `skills/list`. A skill whose name or description breaks the
|
|
37
|
+
* Agent Skills rules (custom-skill names allow `--` and a trailing hyphen —
|
|
38
|
+
* lib/services/custom-skills.ts NAME_RE) is left out of the
|
|
39
|
+
* listing — SEP-2640 permits a partial listing — but stays gettable by URI.
|
|
40
|
+
*/
|
|
41
|
+
export declare function listSkillEntries(registry: SkillsRegistry): SkillEntry[];
|
|
42
|
+
/** Entry for `skills/get`. Throws SkillEntryNotFoundError (→ -32602). */
|
|
43
|
+
export declare function getSkillEntry(registry: SkillsRegistry, uri: string): SkillEntry;
|
|
44
|
+
export declare const SkillsListRequestSchema: z.ZodObject<{
|
|
45
|
+
method: z.ZodLiteral<"skills/list">;
|
|
46
|
+
params: z.ZodOptional<z.ZodObject<{
|
|
47
|
+
cursor: z.ZodOptional<z.ZodString>;
|
|
48
|
+
}, z.core.$loose>>;
|
|
49
|
+
}, z.core.$strip>;
|
|
50
|
+
export declare const SkillsGetRequestSchema: z.ZodObject<{
|
|
51
|
+
method: z.ZodLiteral<"skills/get">;
|
|
52
|
+
params: z.ZodOptional<z.ZodObject<{
|
|
53
|
+
uri: z.ZodUnknown;
|
|
54
|
+
}, z.core.$loose>>;
|
|
55
|
+
}, z.core.$strip>;
|
|
56
|
+
/** `skills/list` result. One page: PICA's catalog is small and fixed per caller. */
|
|
57
|
+
export declare function skillsListResult(entries: SkillEntry[]): {
|
|
58
|
+
resultType: "complete";
|
|
59
|
+
skills: SkillEntry[];
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* `skills/get` result. A missing, unknown or malformed URI is -32602 (Invalid
|
|
63
|
+
* params), the code SEP-2640 requires; pinned by sep2640-protocol.test.ts.
|
|
64
|
+
* (PICA's resources/read still answers -32603 for an unknown URI: ResourceError
|
|
65
|
+
* carries a string code, which the SDK maps to InternalError.)
|
|
66
|
+
*/
|
|
67
|
+
export declare function skillsGetResult(uri: unknown, get: (uri: string) => SkillEntry): {
|
|
68
|
+
resultType: "complete";
|
|
69
|
+
skill: SkillEntry;
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=sep2640.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sep2640.d.ts","sourceRoot":"","sources":["../../src/skills/sep2640.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9D,eAAO,MAAM,mBAAmB,mCAAmC,CAAC;AAEpE,0FAA0F;AAC1F,eAAO,MAAM,2BAA2B;;CAAgC,CAAC;AAWzE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,gBAAgB,CAAC;IAC9B,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED,qBAAa,uBAAwB,SAAQ,KAAK;aACpB,GAAG,EAAE,MAAM;gBAAX,GAAG,EAAE,MAAM;CAIxC;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE3D;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,WAAW,GAClB,gBAAgB,CAoBlB;AA+DD,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAEvE;AA0BD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,GAAG,UAAU,EAAE,CAMvE;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,MAAM,GACV,UAAU,CAKZ;AAED,eAAO,MAAM,uBAAuB;;;;;iBAGlC,CAAC;AAIH,eAAO,MAAM,sBAAsB;;;;;iBAGjC,CAAC;AAEH,oFAAoF;AACpF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE;;;EAErD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,UAAU;;;EAajC"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
// Copyright (c) 2025-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
/**
|
|
3
|
+
* SEP-2640 skills extension — ADR-328.
|
|
4
|
+
*
|
|
5
|
+
* The one place that decides what a served `skill://withpica/<name>/SKILL.md`
|
|
6
|
+
* says, and the `skills/list` / `skills/get` entry that describes it. Both
|
|
7
|
+
* transports (stdio `resources/index.ts`, HTTP `app/api/mcp/route.ts`) read
|
|
8
|
+
* skill text through `renderSkillMd`, and build entries through `skillEntry`,
|
|
9
|
+
* so the digest and the bytes it covers come from the same function.
|
|
10
|
+
*
|
|
11
|
+
* The entry's `frontmatter` and the served YAML are serialised from one
|
|
12
|
+
* object; `__tests__/skills/sep2640.test.ts` parses the served text back and
|
|
13
|
+
* hashes it to check the two agree.
|
|
14
|
+
*
|
|
15
|
+
* Served frontmatter follows the Agent Skills spec (agentskills.io): only
|
|
16
|
+
* name / description / compatibility at the top level; PICA's own fields go
|
|
17
|
+
* under `metadata` as strings. The source SKILL.md files and the
|
|
18
|
+
* `org_custom_skills` table keep their own shape — this is the served form.
|
|
19
|
+
*/
|
|
20
|
+
import { createHash } from "node:crypto";
|
|
21
|
+
import { z } from "zod";
|
|
22
|
+
import { ErrorCode, McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
23
|
+
export const SKILLS_EXTENSION_ID = "io.modelcontextprotocol/skills";
|
|
24
|
+
/** Spread into `capabilities.extensions`. No `directoryRead`: every skill is one file. */
|
|
25
|
+
export const SKILLS_EXTENSION_CAPABILITY = { [SKILLS_EXTENSION_ID]: {} };
|
|
26
|
+
const URI_PREFIX = "skill://withpica/";
|
|
27
|
+
const URI_RE = /^skill:\/\/withpica\/([a-z0-9-]+)\/SKILL\.md$/;
|
|
28
|
+
/** Agent Skills naming rule: 1–64 chars, a-z0-9 and single inner hyphens. */
|
|
29
|
+
const AGENT_SKILLS_NAME_RE = /^(?=.{1,64}$)[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
30
|
+
const MAX_DESCRIPTION = 1024;
|
|
31
|
+
const COMPATIBILITY = "Requires the withPICA MCP server (pica_* tools).";
|
|
32
|
+
export class SkillEntryNotFoundError extends Error {
|
|
33
|
+
uri;
|
|
34
|
+
constructor(uri) {
|
|
35
|
+
super(`Not a served skill: ${uri}`);
|
|
36
|
+
this.uri = uri;
|
|
37
|
+
this.name = "SkillEntryNotFoundError";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export function skillUri(name) {
|
|
41
|
+
return `${URI_PREFIX}${name}/SKILL.md`;
|
|
42
|
+
}
|
|
43
|
+
/** Skill name from a `skill://withpica/<name>/SKILL.md` URI, or null. */
|
|
44
|
+
export function skillNameFromUri(uri) {
|
|
45
|
+
return uri.match(URI_RE)?.[1] ?? null;
|
|
46
|
+
}
|
|
47
|
+
export function skillFrontmatter(skill, origin) {
|
|
48
|
+
const metadata = {
|
|
49
|
+
"pica-audience": skill.audience,
|
|
50
|
+
"pica-output": skill.output,
|
|
51
|
+
"pica-triggers": skill.triggers.join("\n"),
|
|
52
|
+
"pica-tools-required": skill.tools_required.join("\n"),
|
|
53
|
+
};
|
|
54
|
+
if (skill.definition_of_done) {
|
|
55
|
+
metadata["pica-definition-of-done"] = skill.definition_of_done;
|
|
56
|
+
}
|
|
57
|
+
if (skill.when_not_to_use) {
|
|
58
|
+
metadata["pica-when-not-to-use"] = skill.when_not_to_use;
|
|
59
|
+
}
|
|
60
|
+
metadata["pica-origin"] = origin;
|
|
61
|
+
return {
|
|
62
|
+
name: skill.name,
|
|
63
|
+
description: skill.description,
|
|
64
|
+
compatibility: COMPATIBILITY,
|
|
65
|
+
metadata,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Characters JSON.stringify leaves raw that YAML forbids or reads differently:
|
|
70
|
+
* DEL and the C1 controls (NEL U+0085 is a line break in YAML 1.1), the line /
|
|
71
|
+
* paragraph separators, BOM and the non-characters U+FFFE / U+FFFF.
|
|
72
|
+
*/
|
|
73
|
+
const YAML_UNSAFE = /[\u007F-\u009F\u2028\u2029\uFEFF\uFFFE\uFFFF]/g;
|
|
74
|
+
/** A JSON string literal with YAML-unsafe characters as \uXXXX escapes. */
|
|
75
|
+
function quote(value) {
|
|
76
|
+
return JSON.stringify(value).replace(YAML_UNSAFE, (c) => "\\u" + c.charCodeAt(0).toString(16).padStart(4, "0"));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* A skill name that YAML reads back as the same string when written plain:
|
|
80
|
+
* starts with a letter (so never a number or date) and is not one of the
|
|
81
|
+
* YAML 1.1 / 1.2 boolean or null words.
|
|
82
|
+
*/
|
|
83
|
+
const PLAIN_SAFE_NAME = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;
|
|
84
|
+
const YAML_RESERVED_WORDS = new Set([
|
|
85
|
+
"y",
|
|
86
|
+
"n",
|
|
87
|
+
"yes",
|
|
88
|
+
"no",
|
|
89
|
+
"on",
|
|
90
|
+
"off",
|
|
91
|
+
"true",
|
|
92
|
+
"false",
|
|
93
|
+
"null",
|
|
94
|
+
]);
|
|
95
|
+
/**
|
|
96
|
+
* `name` is written plain when PLAIN_SAFE_NAME allows it, as the Agent Skills
|
|
97
|
+
* examples do. Clients that read `name:` out of the text with a pattern, not a
|
|
98
|
+
* YAML parser, then still find it. Every other scalar goes through `quote`: a
|
|
99
|
+
* JSON string with the YAML-unsafe characters escaped, which is a valid YAML
|
|
100
|
+
* double-quoted scalar. sep2640.test.ts parses the served text with a YAML
|
|
101
|
+
* parser and compares it to the entry, including those characters and the
|
|
102
|
+
* reserved-word names.
|
|
103
|
+
*/
|
|
104
|
+
function yamlName(name) {
|
|
105
|
+
return PLAIN_SAFE_NAME.test(name) && !YAML_RESERVED_WORDS.has(name)
|
|
106
|
+
? name
|
|
107
|
+
: quote(name);
|
|
108
|
+
}
|
|
109
|
+
function toYaml(fm) {
|
|
110
|
+
const lines = [
|
|
111
|
+
`name: ${yamlName(fm.name)}`,
|
|
112
|
+
`description: ${quote(fm.description)}`,
|
|
113
|
+
`compatibility: ${quote(fm.compatibility)}`,
|
|
114
|
+
"metadata:",
|
|
115
|
+
...Object.entries(fm.metadata).map(([k, v]) => ` ${quote(k)}: ${quote(v)}`),
|
|
116
|
+
];
|
|
117
|
+
return lines.join("\n") + "\n";
|
|
118
|
+
}
|
|
119
|
+
/** The exact text served by `resources/read` for this skill's SKILL.md. */
|
|
120
|
+
export function renderSkillMd(skill, origin) {
|
|
121
|
+
return `---\n${toYaml(skillFrontmatter(skill, origin))}---\n\n${skill.body}`;
|
|
122
|
+
}
|
|
123
|
+
function skillEntry(skill, origin) {
|
|
124
|
+
const bytes = Buffer.from(renderSkillMd(skill, origin), "utf8");
|
|
125
|
+
const uri = skillUri(skill.name);
|
|
126
|
+
return {
|
|
127
|
+
uri,
|
|
128
|
+
frontmatter: skillFrontmatter(skill, origin),
|
|
129
|
+
resources: [
|
|
130
|
+
{
|
|
131
|
+
uri,
|
|
132
|
+
digest: `sha256:${createHash("sha256").update(bytes).digest("hex")}`,
|
|
133
|
+
size: bytes.length,
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
function isListable(skill) {
|
|
139
|
+
return (AGENT_SKILLS_NAME_RE.test(skill.name) &&
|
|
140
|
+
skill.description.length > 0 &&
|
|
141
|
+
skill.description.length <= MAX_DESCRIPTION);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Entries for `skills/list`. A skill whose name or description breaks the
|
|
145
|
+
* Agent Skills rules (custom-skill names allow `--` and a trailing hyphen —
|
|
146
|
+
* lib/services/custom-skills.ts NAME_RE) is left out of the
|
|
147
|
+
* listing — SEP-2640 permits a partial listing — but stays gettable by URI.
|
|
148
|
+
*/
|
|
149
|
+
export function listSkillEntries(registry) {
|
|
150
|
+
return registry
|
|
151
|
+
.listNames()
|
|
152
|
+
.map((name) => registry.getSkill(name))
|
|
153
|
+
.filter(isListable)
|
|
154
|
+
.map((skill) => skillEntry(skill, registry.originOf(skill.name)));
|
|
155
|
+
}
|
|
156
|
+
/** Entry for `skills/get`. Throws SkillEntryNotFoundError (→ -32602). */
|
|
157
|
+
export function getSkillEntry(registry, uri) {
|
|
158
|
+
const name = skillNameFromUri(uri);
|
|
159
|
+
const origin = name ? registry.originOf(name) : null;
|
|
160
|
+
if (!name || !origin)
|
|
161
|
+
throw new SkillEntryNotFoundError(uri);
|
|
162
|
+
return skillEntry(registry.getSkill(name), origin);
|
|
163
|
+
}
|
|
164
|
+
export const SkillsListRequestSchema = z.object({
|
|
165
|
+
method: z.literal("skills/list"),
|
|
166
|
+
params: z.object({ cursor: z.string().optional() }).passthrough().optional(),
|
|
167
|
+
});
|
|
168
|
+
// `uri` is checked in skillsGetResult, not here: a schema failure surfaces as
|
|
169
|
+
// -32603 from the SDK, and SEP-2640 wants -32602 for a bad request.
|
|
170
|
+
export const SkillsGetRequestSchema = z.object({
|
|
171
|
+
method: z.literal("skills/get"),
|
|
172
|
+
params: z.object({ uri: z.unknown() }).passthrough().optional(),
|
|
173
|
+
});
|
|
174
|
+
/** `skills/list` result. One page: PICA's catalog is small and fixed per caller. */
|
|
175
|
+
export function skillsListResult(entries) {
|
|
176
|
+
return { resultType: "complete", skills: entries };
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* `skills/get` result. A missing, unknown or malformed URI is -32602 (Invalid
|
|
180
|
+
* params), the code SEP-2640 requires; pinned by sep2640-protocol.test.ts.
|
|
181
|
+
* (PICA's resources/read still answers -32603 for an unknown URI: ResourceError
|
|
182
|
+
* carries a string code, which the SDK maps to InternalError.)
|
|
183
|
+
*/
|
|
184
|
+
export function skillsGetResult(uri, get) {
|
|
185
|
+
if (typeof uri !== "string") {
|
|
186
|
+
throw new McpError(ErrorCode.InvalidParams, "skills/get requires a uri");
|
|
187
|
+
}
|
|
188
|
+
try {
|
|
189
|
+
return { resultType: "complete", skill: get(uri) };
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
if (error instanceof SkillEntryNotFoundError) {
|
|
193
|
+
throw new McpError(ErrorCode.InvalidParams, error.message);
|
|
194
|
+
}
|
|
195
|
+
throw error;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=sep2640.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sep2640.js","sourceRoot":"","sources":["../../src/skills/sep2640.ts"],"names":[],"mappings":"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"}
|
|
@@ -138,7 +138,7 @@ export const SKILLS = {
|
|
|
138
138
|
audience: "producer / artist / label / manager",
|
|
139
139
|
tools_required: ["pica_recording_splits_list", "pica_recording_splits_create", "pica_recording_splits_verify", "pica_recordings_query", "pica_people_query", "pica_collaborators_invite", "pica_split_sheet_generate", "pica_split_sheet_send"],
|
|
140
140
|
output: "Confirmed + verified recording_splits rows totalling 100%, with the option to generate and send a split sheet PDF for signatures.",
|
|
141
|
-
body: "# set-recording-splits\n\nHelp the user set master ownership splits on a recording. These are master-side royalty shares — distinct from publishing splits, which are credits on a work. Splits flow into payments, so the skill prioritises accuracy over speed: propose → dry-run → confirm → commit → verify.\n\n## Pre-flight\n\nRead `pica://schemas/recording-splits-required` before any write. The canonical shape is `recording_id`, `person_id`, `percentage`, `split_type`, `role`. **Active shares for one `split_type` + territory may not pass 100%, and a person holds at most one share there** — the database refuses anything else (`RECORDING_SPLIT_TOTAL_EXCEEDED` / `RECORDING_SPLIT_EXISTS`).\n\n## Step 1 — Pick the recording\n\nIf the user names a recording or gives an ID, use it. Otherwise, call `pica_recordings_query` and let the user pick from recent recordings.\n\n## Step 2 — Show current state\n\nCall `pica_recording_splits_list` for the recording. Three states:\n\n- **Empty** — no splits set yet. Proceed to step 3.\n- **Partial** — some splits exist but don't total 100%. Ask the user whether they want to add the missing shares.\n- **Complete** — splits total 100%. Ask whether the user wants to verify (mark agreed-upon) what's there.\n\n`pica_recording_splits_create` only adds. It refuses a second share for the same person with `RECORDING_SPLIT_EXISTS
|
|
141
|
+
body: "# set-recording-splits\n\nHelp the user set master ownership splits on a recording. These are master-side royalty shares — distinct from publishing splits, which are credits on a work. Splits flow into payments, so the skill prioritises accuracy over speed: propose → dry-run → confirm → commit → verify.\n\n## Pre-flight\n\nRead `pica://schemas/recording-splits-required` before any write. The canonical shape is `recording_id`, `person_id`, `percentage`, `split_type`, `role`. **Active shares for one `split_type` + territory may not pass 100%, and a person holds at most one ACTIVE share there (an ended share is history: it neither counts nor blocks a new one)** — the database refuses anything else (`RECORDING_SPLIT_TOTAL_EXCEEDED` / `RECORDING_SPLIT_EXISTS`).\n\n## Step 1 — Pick the recording\n\nIf the user names a recording or gives an ID, use it. Otherwise, call `pica_recordings_query` and let the user pick from recent recordings.\n\n## Step 2 — Show current state\n\nCall `pica_recording_splits_list` for the recording. Three states:\n\n- **Empty** — no splits set yet. Proceed to step 3.\n- **Partial** — some splits exist but don't total 100%. Ask the user whether they want to add the missing shares.\n- **Complete** — splits total 100%. Ask whether the user wants to verify (mark agreed-upon) what's there.\n\n`pica_recording_splits_create` only adds. It refuses a second ACTIVE share for the same person with `RECORDING_SPLIT_EXISTS` (a person whose share has ended can be given a new one), and a share that would take the active total past 100% with `RECORDING_SPLIT_TOTAL_EXCEEDED`. When a recorded share is wrong — a holder-less \"unknown\" row, the wrong percentage or role — fix that row instead of adding around it: `pica_recording_splits_update` (recording_id + split_id + what changes; `person_id` relinks an unknown holder) or, if it should stop counting, `pica_recording_splits_end` (keeps the row as history). Confirm the change with the user first, as in step 5. If the result says `verification_cleared: true`, tell the user the holder's confirmation was cleared and they need to confirm again.\n\nAlways summarise the current state plainly: \"right now this recording has [N] splits totalling [X]%, with [A] holding [P]%...\"\n\n## Step 3 — Capture proposed splits\n\nFor each split row, capture:\n\n- **Who owns this share?** — `person_id` from `pica_people_query`. If the person isn't on PICA yet, offer `pica_collaborators_invite` to bring them in before writing the split.\n- **What percentage?** — together with the shares already recorded, at most 100% for that `split_type` + territory.\n- **What kind?** — `split_type` is one of `master`, `mechanical`, `performance`, `sync` (master ownership is `master`); `role` is one of `owner`, `performer`, `producer`, `engineer`, `mixer`, `masterer`, `label`, `other`.\n\nSum the percentages out loud as you go. If they're not totalling 100% when the user finishes describing them, stop and ask them to adjust before proceeding.\n\n## Step 4 — Dry-run preview\n\nCall `pica_recording_splits_create` with `dry_run: true` for each proposed row. It writes nothing and returns the row that would land, the shares already recorded (`existing_shares`, `active_total`) and `likely_refusal`. Surface that to the user.\n\n- **If `likely_refusal` is set, stop** and tell the user what it says — the write would be refused.\n- **If `existing_shares_checked` is false**, the preview could not read the recorded shares and predicts nothing — say so; do not present it as a clean preview.\n- Each dry run checks one row against what is already recorded, not against the other rows you are proposing — sum the proposed rows yourself. **If they would pass 100% with what is recorded, stop.** Do not proceed to commit.\n\n## Step 5 — Explicit confirmation\n\nSay something like:\n\n> \"I'm about to set [N] splits on this recording totalling 100%:\n> - [A] — [P]% ([type])\n> - [B] — [Q]% ([type])\n> Reply 'yes' to commit, or tell me what to change.\"\n\nWait for the user's explicit \"yes\" (or equivalent). Don't write on ambiguous signals.\n\n## Step 6 — Commit\n\nFor each split, call `pica_recording_splits_create` (this time without `dry_run`). Report each row back as it lands. If any write fails, stop the loop — don't partially commit.\n\n## Step 7 — Verify\n\nVerification marks a split as agreed-upon — a separate state from \"exists in the database.\" It records WHICH PERSON agreed, so it is the split holder's own act: `pica_recording_splits_verify` refuses an agent (`VERIFICATION_REQUIRES_HUMAN_SESSION`) and you cannot do it for them. Tell each holder where to do it: signed in, \"confirm my share\" under ownership splits on the recording's page, `/inspect/recordings/<recording_id>#ownership-splits`. If a holder is someone other than the user, `pica_notify_person` with the `recording_id` sends them a link to that page.\n\n## Step 8 — Offer next moves\n\n- \"Want me to generate a split sheet PDF for signatures?\" → `pica_split_sheet_generate`\n- \"Want me to send the split sheet to the parties?\" → `pica_split_sheet_send`\n- \"Want me to set splits on another recording?\"\n\n## What not to do\n\n- Don't write splits without an explicit \"yes\" from the user\n- Don't proceed if the totals don't equal 100% — re-prompt instead\n- Don't skip telling holders how to verify, and don't retry `pica_recording_splits_verify` after it refuses. Verification is a deliberate moment for the holder, not for you.\n- Don't speculate about typical splits by genre or scene — if the user doesn't know what % someone deserves, that's a business conversation outside this skill\n- Don't conflate with writer splits — those are credits on a work, set via `pica_credits_update`. Different table, different semantics.\n\n## Follow-on skills\n\n- `close-the-loop` — recording splits are usually one gap among several on a work; close-the-loop fits the others\n- `register-my-works` — registered works pair with recordings that have clear ownership chains\n- `audit-credits` — splits health-check across the whole catalog\n",
|
|
142
142
|
},
|
|
143
143
|
"set-up-workspace": {
|
|
144
144
|
name: "set-up-workspace",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.generated.js","sourceRoot":"","sources":["../../src/skills/skills.generated.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"skills.generated.js","sourceRoot":"","sources":["../../src/skills/skills.generated.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credits.d.ts","sourceRoot":"","sources":["../../src/tools/credits.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AA2JtE,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAAa;gBAEb,IAAI,EAAE,UAAU;IAI5B,QAAQ,IAAI,KAAK,CAAC;QAAE,UAAU,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;YA4sB3D,kBAAkB;
|
|
1
|
+
{"version":3,"file":"credits.d.ts","sourceRoot":"","sources":["../../src/tools/credits.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AA2JtE,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAAa;gBAEb,IAAI,EAAE,UAAU;IAI5B,QAAQ,IAAI,KAAK,CAAC;QAAE,UAAU,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;YA4sB3D,kBAAkB;YA2FlB,WAAW;YA2BX,aAAa;IAkS3B;;;;;;;;;;;;;OAaG;YACW,sBAAsB;IAuJpC;;;;;;;;;;;;OAYG;YACW,0BAA0B;IA+DxC;;;;;;;;;OASG;IACH;;;;;;;;;;;OAWG;YACW,YAAY;YAsHZ,SAAS;IA2LvB;;;;;;;;OAQG;YACW,YAAY;CAmE3B"}
|
package/dist/tools/credits.js
CHANGED
|
@@ -262,7 +262,7 @@ export class CreditsTools {
|
|
|
262
262
|
},
|
|
263
263
|
splits: {
|
|
264
264
|
type: "number",
|
|
265
|
-
description: "Percentage split (0-100). For composition credits it is the writer/publisher share on work_collaborators, and those must total 100%. For an 'owner' entry it is the master ownership share on the work's sole recording and is not part of that 100%: active owner shares may not pass 100% (RECORDING_SPLIT_TOTAL_EXCEEDED), re-sending the share already recorded changes nothing, and a different share for an owner already
|
|
265
|
+
description: "Percentage split (0-100). For composition credits it is the writer/publisher share on work_collaborators, and those must total 100%. For an 'owner' entry it is the master ownership share on the work's sole recording and is not part of that 100%: active owner shares may not pass 100% (RECORDING_SPLIT_TOTAL_EXCEEDED), re-sending the share already recorded changes nothing, and a different share for an owner who already holds an ACTIVE share is refused (RECORDING_SPLIT_EXISTS), never replaced; an owner whose share has ended is given a new one.",
|
|
266
266
|
},
|
|
267
267
|
is_primary: {
|
|
268
268
|
type: "boolean",
|
|
@@ -773,8 +773,11 @@ export class CreditsTools {
|
|
|
773
773
|
const of = (o) => rows.filter((r) => r.outcome === o);
|
|
774
774
|
const sent = of("sent");
|
|
775
775
|
const held = of("held");
|
|
776
|
+
// Both are reached by the collaborator invite, not by this ask.
|
|
777
|
+
const inviteInstead = (r) => r.reason === "not_a_pica_user" || r.reason === "not_in_this_catalogue";
|
|
776
778
|
const notPicaUsers = rows.filter((r) => r.outcome === "no_channel" && r.reason === "not_a_pica_user");
|
|
777
|
-
const
|
|
779
|
+
const elsewhere = rows.filter((r) => r.outcome === "no_channel" && r.reason === "not_in_this_catalogue");
|
|
780
|
+
const noEmail = rows.filter((r) => r.outcome === "no_channel" && !inviteInstead(r));
|
|
778
781
|
const failed = of("failed");
|
|
779
782
|
const summary = [
|
|
780
783
|
`Asked ${sent.length + held.length}/${rows.length} credited people`,
|
|
@@ -785,6 +788,9 @@ export class CreditsTools {
|
|
|
785
788
|
notPicaUsers.length > 0
|
|
786
789
|
? `Not PICA users (use pica_collaborators_invite): ${notPicaUsers.map(name).join(", ")}`
|
|
787
790
|
: null,
|
|
791
|
+
elsewhere.length > 0
|
|
792
|
+
? `On PICA but not in this catalogue (use pica_collaborators_invite): ${elsewhere.map(name).join(", ")}`
|
|
793
|
+
: null,
|
|
788
794
|
noEmail.length > 0
|
|
789
795
|
? `No email on file (add one to their person record): ${noEmail.map(name).join(", ")}`
|
|
790
796
|
: null,
|