🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

posecode-mcp

Package Overview
Dependencies
Maintainers
1
Versions
7
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

posecode-mcp - npm Package Compare versions

Comparing version
0.3.0
to
0.4.0
+4
-0
dist/guide.js

@@ -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

@@ -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 @@

@@ -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")

@@ -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;

@@ -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"}
{
"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 @@ },

@@ -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.