posecode-mcp
Advanced tools
+4
-0
@@ -51,2 +51,3 @@ /** | ||
| pose start = <pose> # neutral | standing | first-position | plank | supine | prone | seated | ||
| # Or use \`pose start = <pose>:\` with indented, sparse joint overrides. | ||
| step "<Phase>" <Ns> <mode>: # mode = flow | settle | drive | snap | linear | ||
@@ -70,2 +71,5 @@ <joint>: <action> <degrees> | ||
| At zero degrees, \`pronate 0\` and \`supinate 0\` are the same absolute target. | ||
| To customize the opening shape, append \`:\` to \`pose start = <pose>\` and | ||
| indent joint targets beneath it. These ROM-clamped targets sparsely overlay the | ||
| built-in pose, consume no time, and become the deterministic loop-reset pose. | ||
| Use only joint/action pairs and declared prop anchors accepted by the validator. | ||
@@ -72,0 +76,0 @@ Author the gross pose before reach; a parsed reach is not proof of contact. |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"guide.js","sourceRoot":"","sources":["../src/guide.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,IAAI,MAAM,GAAkB,IAAI,CAAC;AAEjC,MAAM,UAAU,cAAc;IAC5B,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IACnC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,uEAAuE;IACvE,2EAA2E;IAC3E,4EAA4E;IAC5E,yEAAyE;IACzE,MAAM,UAAU,GAAG;QACjB,OAAO,CAAC,IAAI,EAAE,kBAAkB,CAAC;QACjC,OAAO,CAAC,IAAI,EAAE,gCAAgC,CAAC;KAChD,CAAC;IACF,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACnC,MAAM;QACR,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;IACH,CAAC;IACD,IAAI,CAAC,KAAK;QAAE,KAAK,GAAG,cAAc,CAAC;IACnC,MAAM,GAAG,KAAK,CAAC;IACf,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4EAmCqD,CAAC"} | ||
| {"version":3,"file":"guide.js","sourceRoot":"","sources":["../src/guide.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,IAAI,MAAM,GAAkB,IAAI,CAAC;AAEjC,MAAM,UAAU,cAAc;IAC5B,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IACnC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,uEAAuE;IACvE,2EAA2E;IAC3E,4EAA4E;IAC5E,yEAAyE;IACzE,MAAM,UAAU,GAAG;QACjB,OAAO,CAAC,IAAI,EAAE,kBAAkB,CAAC;QACjC,OAAO,CAAC,IAAI,EAAE,gCAAgC,CAAC;KAChD,CAAC;IACF,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACnC,MAAM;QACR,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;IACH,CAAC;IACD,IAAI,CAAC,KAAK;QAAE,KAAK,GAAG,cAAc,CAAC;IACnC,MAAM,GAAG,KAAK,CAAC;IACf,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4EAuCqD,CAAC"} |
@@ -7,2 +7,7 @@ # Authoring `.posecode` with an LLM | ||
| This is the task-oriented, pasteable authoring guide. The | ||
| [published Posecode Protocol Specification](https://posecode.org/spec.html) is the normative language and IR | ||
| contract. This guide stays self-contained so a model does not need to follow a | ||
| link, but the specification wins if the two ever disagree. | ||
| --- | ||
@@ -32,2 +37,5 @@ | ||
| pose start = <pose> # neutral | standing | first-position | plank | supine | prone | seated | ||
| # Or append `:` and indent sparse joint overrides beneath it: | ||
| pose start = <pose>: | ||
| <joint>: <action> <degrees> | ||
| step "<Phase name>" <Ns> <mode>: # mode = flow | settle | drive | snap | linear | ||
@@ -41,6 +49,32 @@ <joint>: <action> <degrees> | ||
| travel: <x> <z> # optional: move to this x z (metres) by phase end | ||
| cue "<short coaching cue>" | ||
| cue "<short coaching cue>" # display-only text; never changes the motion | ||
| repeat <count> | ||
| ``` | ||
| ## Contact mechanisms | ||
| | Directive | What moves | Use it for | | ||
| | --- | --- | --- | | ||
| | `ground-lock` | The solver preserves an existing floor support while the body moves. | A foot, hand, forearm, or the back is already planted. | | ||
| | `reach` | A limb endpoint moves toward a target through IK; the body root does not translate. | An additional floor, body-landmark, or declared-prop contact. | | ||
| | `pin` | The whole body translates around one primary fixed anchor. | A knee on the floor, a foot on a box, or another single body-moving support. | | ||
| | `grip` | The body translates, each arm solves to a bar/rail, and the fingers close. | One- or two-hand support on a declared `bar` or `dip-bars` prop. | | ||
| Use only one of the root-solving families (`ground-lock`, `pin`, or `grip`) in | ||
| a step. Add compatible secondary contacts with `reach`. For example, | ||
| `ground-lock: foot_right` plus `reach: knee_left floor` is valid; adding | ||
| `pin: knee_left floor` to that same step is a conflict and the parser rejects | ||
| it. | ||
| `cue` is display-only coaching text. It may appear next to the current phase in | ||
| a viewer, but it does not change joint targets, contacts, timing, validation, | ||
| or solver behavior. Never rely on a cue to create motion. | ||
| Use a start-pose override block only when none of the built-ins is the exact | ||
| opening shape. Its joint targets are ROM-clamped and layered sparsely over the | ||
| built-in pose; they do not consume time or create a phase. Omitted channels keep | ||
| the built-in value, and the composed pose is restored when the animation loops. | ||
| Do not put contacts, cues, turn, or travel inside a start-pose block. | ||
| Write exactly one `pose start` declaration; duplicate declarations are errors. | ||
| ## Joints | ||
@@ -47,0 +81,0 @@ |
+128
-36
@@ -189,2 +189,3 @@ #!/usr/bin/env node | ||
| startPose: z.enum(START_POSE_NAMES).optional(), | ||
| startPoseOverrides: z.array(jointTargetSchema), | ||
| props: z.array(z.enum(PROP_TYPES)), | ||
@@ -204,2 +205,5 @@ repeat: z.number().int().positive(), | ||
| function lineForIssue(ast, path) { | ||
| if (path[0] === "startPoseOverrides" && typeof path[1] === "number") { | ||
| return ast.startPoseOverrides[path[1]]?.line ?? 1; | ||
| } | ||
| if (path[0] === "steps" && typeof path[1] === "number") { | ||
@@ -434,2 +438,3 @@ return ast.steps[path[1]]?.line ?? 1; | ||
| rig: "humanoid", | ||
| startPoseOverrides: [], | ||
| props: [], | ||
@@ -440,12 +445,14 @@ repeat: 1, | ||
| let current = null; | ||
| let invalidStepIndent = null; | ||
| let invalidBlockIndent = null; | ||
| let topLevelIndent = null; | ||
| let currentStepIndent = null; | ||
| let currentChildIndent = null; | ||
| let startPoseBlockIndent = null; | ||
| let startPoseChildIndent = null; | ||
| for (let i = 1; i < lines.length; i++) { | ||
| const ln = lines[i]; | ||
| if (invalidStepIndent !== null) { | ||
| if (ln.indent > invalidStepIndent) | ||
| if (invalidBlockIndent !== null) { | ||
| if (ln.indent > invalidBlockIndent) | ||
| continue; | ||
| invalidStepIndent = null; | ||
| invalidBlockIndent = null; | ||
| } | ||
@@ -460,4 +467,6 @@ const head = word(ln.tokens[0]); | ||
| currentChildIndent = null; | ||
| startPoseBlockIndent = null; | ||
| startPoseChildIndent = null; | ||
| if (head === "step") | ||
| invalidStepIndent = ln.indent; | ||
| invalidBlockIndent = ln.indent; | ||
| continue; | ||
@@ -472,6 +481,10 @@ } | ||
| currentChildIndent = null; | ||
| startPoseBlockIndent = null; | ||
| startPoseChildIndent = null; | ||
| if (head === "step") | ||
| invalidStepIndent = ln.indent; | ||
| invalidBlockIndent = ln.indent; | ||
| continue; | ||
| } | ||
| startPoseBlockIndent = null; | ||
| startPoseChildIndent = null; | ||
| if (head !== "step") { | ||
@@ -483,3 +496,25 @@ current = null; | ||
| } else { | ||
| if (!current || currentStepIndent === null) { | ||
| if (current && currentStepIndent !== null) { | ||
| if (ln.indent <= currentStepIndent) { | ||
| errors.push({ line: ln.line, message: "step children must be indented beneath their `step` header" }); | ||
| continue; | ||
| } | ||
| if (currentChildIndent === null) | ||
| currentChildIndent = ln.indent; | ||
| if (ln.indent !== currentChildIndent) { | ||
| errors.push({ line: ln.line, message: `step children must use one indentation level (${currentChildIndent} spaces)` }); | ||
| continue; | ||
| } | ||
| } else if (startPoseBlockIndent !== null) { | ||
| if (ln.indent <= startPoseBlockIndent) { | ||
| errors.push({ line: ln.line, message: "start-pose overrides must be indented beneath their `pose start` header" }); | ||
| continue; | ||
| } | ||
| if (startPoseChildIndent === null) | ||
| startPoseChildIndent = ln.indent; | ||
| if (ln.indent !== startPoseChildIndent) { | ||
| errors.push({ line: ln.line, message: `start-pose overrides must use one indentation level (${startPoseChildIndent} spaces)` }); | ||
| continue; | ||
| } | ||
| } else { | ||
| const err = parseStepChild(ln, null); | ||
@@ -490,12 +525,2 @@ if (err) | ||
| } | ||
| if (ln.indent <= currentStepIndent) { | ||
| errors.push({ line: ln.line, message: "step children must be indented beneath their `step` header" }); | ||
| continue; | ||
| } | ||
| if (currentChildIndent === null) | ||
| currentChildIndent = ln.indent; | ||
| if (ln.indent !== currentChildIndent) { | ||
| errors.push({ line: ln.line, message: `step children must use one indentation level (${currentChildIndent} spaces)` }); | ||
| continue; | ||
| } | ||
| } | ||
@@ -538,3 +563,4 @@ switch (head) { | ||
| const name = word(t[3]); | ||
| if (t.length === 4 && word(t[1]) === "start" && t[2]?.type === "eq" && name) { | ||
| const block = t.length === 5 && t[4]?.type === "colon"; | ||
| if ((t.length === 4 || block) && word(t[1]) === "start" && t[2]?.type === "eq" && name) { | ||
| if (!isStartPoseName(name)) { | ||
@@ -545,7 +571,24 @@ errors.push({ | ||
| }); | ||
| if (block) | ||
| invalidBlockIndent = ln.indent; | ||
| break; | ||
| } | ||
| if (doc.startPose !== void 0) { | ||
| errors.push({ | ||
| line: ln.line, | ||
| message: "duplicate `pose start` declaration; a document may define exactly one start pose" | ||
| }); | ||
| if (block) | ||
| invalidBlockIndent = ln.indent; | ||
| break; | ||
| } | ||
| doc.startPose = name; | ||
| if (block) { | ||
| startPoseBlockIndent = ln.indent; | ||
| startPoseChildIndent = null; | ||
| } | ||
| } else { | ||
| errors.push({ line: ln.line, message: "expected `pose start = <name>`" }); | ||
| errors.push({ line: ln.line, message: "expected `pose start = <name>` or `pose start = <name>:`" }); | ||
| if (t.at(-1)?.type === "colon") | ||
| invalidBlockIndent = ln.indent; | ||
| } | ||
@@ -576,3 +619,3 @@ break; | ||
| currentChildIndent = null; | ||
| invalidStepIndent = ln.indent; | ||
| invalidBlockIndent = ln.indent; | ||
| break; | ||
@@ -597,3 +640,3 @@ } | ||
| default: { | ||
| const err = parseStepChild(ln, current); | ||
| const err = startPoseBlockIndent !== null ? parseStartPoseOverride(ln, doc) : parseStepChild(ln, current); | ||
| if (err) | ||
@@ -606,2 +649,9 @@ errors.push(err); | ||
| } | ||
| function parseStartPoseOverride(ln, doc) { | ||
| const parsed = parseJointTarget(ln); | ||
| if (parsed.error) | ||
| return parsed.error; | ||
| doc.startPoseOverrides.push(parsed.target); | ||
| return null; | ||
| } | ||
| function parseDuration(value) { | ||
@@ -713,4 +763,16 @@ return parseFloat(value.replace(/s$/, "")); | ||
| } | ||
| const parsed = parseJointTarget(ln); | ||
| if (parsed.error) | ||
| return parsed.error; | ||
| current.targets.push(parsed.target); | ||
| return null; | ||
| } | ||
| function parseJointTarget(ln) { | ||
| const t = ln.tokens; | ||
| const head = word(t[0]); | ||
| if (head === null || t[1]?.type !== "colon" || t[2]?.type !== "word") { | ||
| return { line: ln.line, message: "expected `<joint>: <action> <degrees>`" }; | ||
| return { | ||
| target: null, | ||
| error: { line: ln.line, message: "expected `<joint>: <action> <degrees>`" } | ||
| }; | ||
| } | ||
@@ -721,24 +783,34 @@ const action = t[2].value; | ||
| return { | ||
| line: ln.line, | ||
| message: "expected `<joint>: hold neutral` (no trailing angle)" | ||
| target: null, | ||
| error: { | ||
| line: ln.line, | ||
| message: "expected `<joint>: hold neutral` (no trailing angle)" | ||
| } | ||
| }; | ||
| } | ||
| current.targets.push({ joint: head, action, degrees: null, line: ln.line }); | ||
| return null; | ||
| return { | ||
| target: { joint: head, action, degrees: null, line: ln.line }, | ||
| error: null | ||
| }; | ||
| } | ||
| const degTok = t[3]; | ||
| if (t.length !== 4 || degTok?.type !== "num") { | ||
| return { line: ln.line, message: "expected `<joint>: <action> <degrees>`" }; | ||
| return { | ||
| target: null, | ||
| error: { line: ln.line, message: "expected `<joint>: <action> <degrees>`" } | ||
| }; | ||
| } | ||
| current.targets.push({ | ||
| joint: head, | ||
| action, | ||
| degrees: Number(degTok.value), | ||
| line: ln.line | ||
| }); | ||
| return null; | ||
| return { | ||
| target: { | ||
| joint: head, | ||
| action, | ||
| degrees: Number(degTok.value), | ||
| line: ln.line | ||
| }, | ||
| error: null | ||
| }; | ||
| } | ||
| // ../posecode-parser/dist/types.js | ||
| var POSECODE_VERSION = "0.2"; | ||
| var POSECODE_VERSION = "0.3"; | ||
@@ -887,2 +959,16 @@ // ../posecode-parser/dist/rom.js | ||
| const semanticState = initialSemanticState(ast.startPose); | ||
| const startOverrideStep = { | ||
| name: "start pose", | ||
| durationSec: 0, | ||
| easing: "linear", | ||
| targets: ast.startPoseOverrides, | ||
| groundLock: [], | ||
| reaches: [], | ||
| pins: [], | ||
| grips: [], | ||
| line: ast.startPoseOverrides[0]?.line ?? 1 | ||
| }; | ||
| const startOverridePhase = resolveStep(startOverrideStep, declaredAnchors, warnings, errors); | ||
| enforceHipHingeLimit(startOverrideStep, startOverridePhase, semanticState, warnings); | ||
| applyPhaseToState(semanticState, startOverridePhase); | ||
| const phases = []; | ||
@@ -901,2 +987,3 @@ for (const step of ast.steps) { | ||
| ...ast.startPose ? { startPose: ast.startPose } : {}, | ||
| ...startOverridePhase.targets.length > 0 ? { startPoseOverrides: startOverridePhase.targets } : {}, | ||
| props: ast.props, | ||
@@ -1435,2 +1522,3 @@ ...ast.clip ? { clip: ast.clip } : {}, | ||
| pose start = <pose> # neutral | standing | first-position | plank | supine | prone | seated | ||
| # Or use \`pose start = <pose>:\` with indented, sparse joint overrides. | ||
| step "<Phase>" <Ns> <mode>: # mode = flow | settle | drive | snap | linear | ||
@@ -1454,2 +1542,5 @@ <joint>: <action> <degrees> | ||
| At zero degrees, \`pronate 0\` and \`supinate 0\` are the same absolute target. | ||
| To customize the opening shape, append \`:\` to \`pose start = <pose>\` and | ||
| indent joint targets beneath it. These ROM-clamped targets sparsely overlay the | ||
| built-in pose, consume no time, and become the deterministic loop-reset pose. | ||
| Use only joint/action pairs and declared prop anchors accepted by the validator. | ||
@@ -1462,5 +1553,6 @@ Author the gross pose before reach; a parsed reach is not proof of contact. | ||
| // src/server.ts | ||
| var POSECODE_MCP_VERSION = "0.4.0"; | ||
| function createPosecodeServer(opts = {}) { | ||
| const baseUrl2 = opts.baseUrl ?? DEFAULT_BASE_URL; | ||
| const server2 = new McpServer({ name: "posecode", version: "0.2.0" }); | ||
| const server2 = new McpServer({ name: "posecode", version: POSECODE_MCP_VERSION }); | ||
| const sourceSchema = { | ||
@@ -1467,0 +1559,0 @@ source: z2.string().describe("The full .posecode document text") |
+2
-0
@@ -17,2 +17,4 @@ /** | ||
| } | ||
| /** Package/server identity kept in sync by `version-packages`. */ | ||
| export declare const POSECODE_MCP_VERSION = "0.4.0"; | ||
| export declare function createPosecodeServer(opts?: PosecodeServerOptions): McpServer; |
+3
-1
@@ -16,5 +16,7 @@ /** | ||
| import { authoringGuide } from "./guide.js"; | ||
| /** Package/server identity kept in sync by `version-packages`. */ | ||
| export const POSECODE_MCP_VERSION = "0.4.0"; | ||
| export function createPosecodeServer(opts = {}) { | ||
| const baseUrl = opts.baseUrl ?? DEFAULT_BASE_URL; | ||
| const server = new McpServer({ name: "posecode", version: "0.2.0" }); | ||
| const server = new McpServer({ name: "posecode", version: POSECODE_MCP_VERSION }); | ||
| const sourceSchema = { | ||
@@ -21,0 +23,0 @@ source: z.string().describe("The full .posecode document text"), |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAO5C,MAAM,UAAU,oBAAoB,CAAC,OAA8B,EAAE;IACnE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,gBAAgB,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAErE,MAAM,YAAY,GAAG;QACnB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;KAChE,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,KAAc,EAAE,OAAO,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAC1E,OAAO;KACR,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACT,iJAAiJ;QACnJ,WAAW,EAAE,EAAE;KAChB,EACD,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,CAC/E,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,8BAA8B;QACrC,WAAW,EACT,8MAA8M;QAChN,WAAW,EAAE,YAAY;KAC1B,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,sCAAsC;QAC7C,WAAW,EACT,kKAAkK;QACpK,WAAW,EAAE,YAAY;KAC1B,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"} | ||
| {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAO5C,kEAAkE;AAClE,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAE5C,MAAM,UAAU,oBAAoB,CAAC,OAA8B,EAAE;IACnE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,gBAAgB,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAElF,MAAM,YAAY,GAAG;QACnB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;KAChE,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,KAAc,EAAE,OAAO,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAC1E,OAAO;KACR,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACT,iJAAiJ;QACnJ,WAAW,EAAE,EAAE;KAChB,EACD,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,CAC/E,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,8BAA8B;QACrC,WAAW,EACT,8MAA8M;QAChN,WAAW,EAAE,YAAY;KAC1B,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,sCAAsC;QAC7C,WAAW,EACT,kKAAkK;QACpK,WAAW,EAAE,YAAY;KAC1B,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"} |
+3
-3
| { | ||
| "name": "posecode-mcp", | ||
| "version": "0.3.0", | ||
| "version": "0.4.0", | ||
| "description": "Model Context Protocol server for Posecode: let any LLM agent validate, ROM-check, and get a render link for a .posecode movement, natively.", | ||
@@ -49,4 +49,4 @@ "mcpName": "io.github.posecode-dev/posecode-mcp", | ||
| "@modelcontextprotocol/sdk": "^1.12.0", | ||
| "posecode-parser": "0.3.0", | ||
| "posecode-share": "0.3.0", | ||
| "posecode-parser": "0.4.0", | ||
| "posecode-share": "0.4.0", | ||
| "zod": "^3.24.1" | ||
@@ -53,0 +53,0 @@ }, |
+1
-1
@@ -67,2 +67,2 @@ # posecode-mcp | ||
| AGPL-3.0-only. A [separate commercial license](https://github.com/posecode-dev/posecode/blob/main/COMMERCIAL-LICENSE.md) is available for closed-source product use. | ||
| AGPL-3.0-only. A [separate commercial license](https://github.com/posecode-dev/posecode/blob/main/docs/legal/COMMERCIAL-LICENSE.md) is available for closed-source product use. |
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
126942
5.11%1869
5.65%+ Added
+ Added
- Removed
- Removed
Updated
Updated