@pebbly/aseprite-ai-artist 0.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 +170 -0
- package/LICENSE +21 -0
- package/README.md +169 -0
- package/agents/animation-director.md +65 -0
- package/agents/palette-smith.md +57 -0
- package/agents/pixel-critic.md +69 -0
- package/agents/rig-builder.md +46 -0
- package/bin/aseprite-ai-artist +6 -0
- package/bin/aseprite-ai-artist.mjs +44 -0
- package/dist/bridge/bridge.d.ts +52 -0
- package/dist/bridge/bridge.js +230 -0
- package/dist/bridge/bridge.js.map +1 -0
- package/dist/bridge/client.d.ts +54 -0
- package/dist/bridge/client.js +214 -0
- package/dist/bridge/client.js.map +1 -0
- package/dist/cli.d.ts +10 -0
- package/dist/cli.js +272 -0
- package/dist/cli.js.map +1 -0
- package/dist/extension.d.ts +21 -0
- package/dist/extension.js +65 -0
- package/dist/extension.js.map +1 -0
- package/dist/install.d.ts +35 -0
- package/dist/install.js +185 -0
- package/dist/install.js.map +1 -0
- package/dist/lib/color.d.ts +66 -0
- package/dist/lib/color.js +170 -0
- package/dist/lib/color.js.map +1 -0
- package/dist/lib/protocol.d.ts +78 -0
- package/dist/lib/protocol.js +72 -0
- package/dist/lib/protocol.js.map +1 -0
- package/dist/lib/render.d.ts +62 -0
- package/dist/lib/render.js +134 -0
- package/dist/lib/render.js.map +1 -0
- package/dist/lib/skills.d.ts +43 -0
- package/dist/lib/skills.js +112 -0
- package/dist/lib/skills.js.map +1 -0
- package/dist/lib/version.d.ts +4 -0
- package/dist/lib/version.js +25 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.js +144 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/assets.d.ts +3 -0
- package/dist/tools/assets.js +181 -0
- package/dist/tools/assets.js.map +1 -0
- package/dist/tools/craft.d.ts +12 -0
- package/dist/tools/craft.js +143 -0
- package/dist/tools/craft.js.map +1 -0
- package/dist/tools/draw.d.ts +3 -0
- package/dist/tools/draw.js +256 -0
- package/dist/tools/draw.js.map +1 -0
- package/dist/tools/escape.d.ts +12 -0
- package/dist/tools/escape.js +49 -0
- package/dist/tools/escape.js.map +1 -0
- package/dist/tools/kit.d.ts +29 -0
- package/dist/tools/kit.js +85 -0
- package/dist/tools/kit.js.map +1 -0
- package/dist/tools/look.d.ts +7 -0
- package/dist/tools/look.js +215 -0
- package/dist/tools/look.js.map +1 -0
- package/dist/tools/palette.d.ts +3 -0
- package/dist/tools/palette.js +232 -0
- package/dist/tools/palette.js.map +1 -0
- package/dist/tools/session.d.ts +3 -0
- package/dist/tools/session.js +231 -0
- package/dist/tools/session.js.map +1 -0
- package/dist/tools/structure.d.ts +3 -0
- package/dist/tools/structure.js +218 -0
- package/dist/tools/structure.js.map +1 -0
- package/examples/mcp-configs/claude-code.json +9 -0
- package/examples/mcp-configs/codex.toml +13 -0
- package/examples/mcp-configs/cursor.json +9 -0
- package/examples/mcp-configs/gemini-cli.json +9 -0
- package/examples/mcp-configs/vscode.json +10 -0
- package/extension/ai-artist.lua +3291 -0
- package/extension/package.json +14 -0
- package/hooks/hooks.json +25 -0
- package/hooks/look-nudge.mjs +46 -0
- package/hooks/session-status.mjs +47 -0
- package/knowledge/palettes.json +60 -0
- package/package.json +69 -0
- package/rules/00-core-principles.md +57 -0
- package/rules/01-palette-and-color.md +51 -0
- package/rules/02-shading-and-light.md +56 -0
- package/rules/03-silhouette-and-form.md +60 -0
- package/rules/04-outlines-and-edges.md +46 -0
- package/rules/05-animation.md +62 -0
- package/rules/06-layers-and-rigging.md +52 -0
- package/rules/07-review-checklist.md +51 -0
- package/rules/README.md +16 -0
- package/skills/README.md +29 -0
- package/skills/pixel-animate/SKILL.md +91 -0
- package/skills/pixel-brief/SKILL.md +61 -0
- package/skills/pixel-draw/SKILL.md +93 -0
- package/skills/pixel-export/SKILL.md +80 -0
- package/skills/pixel-fix/SKILL.md +91 -0
- package/skills/pixel-new/SKILL.md +70 -0
- package/skills/pixel-palette/SKILL.md +80 -0
- package/skills/pixel-review/SKILL.md +81 -0
- package/skills/pixel-rig/SKILL.md +76 -0
- package/skills/pixel-shade/SKILL.md +77 -0
- package/skills/pixel-tileset/SKILL.md +104 -0
- package/templates/AGENTS.section.md +33 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { fail, ok, targetShape } from "./kit.js";
|
|
3
|
+
export function registerSessionTools(server, live) {
|
|
4
|
+
server.registerTool("preflight", {
|
|
5
|
+
title: "Preflight",
|
|
6
|
+
description: "Check that Aseprite is connected and report what this session can do. Call this FIRST in any pixel-art task and stop if `ready` is false — every editing tool writes into the user's open Aseprite window, and there is no useful fallback when that window is not there.",
|
|
7
|
+
inputSchema: {},
|
|
8
|
+
outputSchema: {
|
|
9
|
+
ready: z.boolean().describe("True only when Aseprite is attached and accepting commands."),
|
|
10
|
+
bridgeConnected: z.boolean(),
|
|
11
|
+
pluginConnected: z.boolean(),
|
|
12
|
+
asepriteVersion: z.string().nullish(),
|
|
13
|
+
extensionVersion: z.string().nullish(),
|
|
14
|
+
features: z.array(z.string()).describe("Optional capabilities this extension build supports."),
|
|
15
|
+
activeSprite: z
|
|
16
|
+
.object({
|
|
17
|
+
name: z.string(),
|
|
18
|
+
width: z.number().int(),
|
|
19
|
+
height: z.number().int(),
|
|
20
|
+
colorMode: z.string(),
|
|
21
|
+
frames: z.number().int(),
|
|
22
|
+
layers: z.number().int(),
|
|
23
|
+
})
|
|
24
|
+
.nullish(),
|
|
25
|
+
directive: z.string().describe("What to do next, in one sentence."),
|
|
26
|
+
},
|
|
27
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
28
|
+
}, async () => {
|
|
29
|
+
await live.waitForBridge(2_000);
|
|
30
|
+
if (!live.pluginConnected)
|
|
31
|
+
await live.waitForPlugin(1_500);
|
|
32
|
+
const base = {
|
|
33
|
+
bridgeConnected: live.bridgeConnected,
|
|
34
|
+
pluginConnected: live.pluginConnected,
|
|
35
|
+
asepriteVersion: live.hello?.asepriteVersion ?? null,
|
|
36
|
+
extensionVersion: live.hello?.extensionVersion ?? null,
|
|
37
|
+
features: live.features,
|
|
38
|
+
};
|
|
39
|
+
if (!live.pluginConnected) {
|
|
40
|
+
return ok({
|
|
41
|
+
...base,
|
|
42
|
+
ready: false,
|
|
43
|
+
activeSprite: null,
|
|
44
|
+
directive: live.bridgeConnected
|
|
45
|
+
? "The bridge is running but Aseprite is not attached. Ask the user to open Aseprite with the aseprite-ai-artist extension installed, then call preflight again."
|
|
46
|
+
: "The bridge is not running. Ask the user to run `npx @pebbly/aseprite-ai-artist doctor`.",
|
|
47
|
+
}, "NOT READY — Aseprite is not connected. Do not attempt to edit files on disk instead.");
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const site = await live.call("session.site");
|
|
51
|
+
const sprite = site.sprite;
|
|
52
|
+
return ok({
|
|
53
|
+
...base,
|
|
54
|
+
ready: true,
|
|
55
|
+
activeSprite: sprite
|
|
56
|
+
? {
|
|
57
|
+
name: String(sprite.name ?? "untitled"),
|
|
58
|
+
width: Number(sprite.width ?? 0),
|
|
59
|
+
height: Number(sprite.height ?? 0),
|
|
60
|
+
colorMode: String(sprite.colorMode ?? "rgb"),
|
|
61
|
+
frames: Number(sprite.frames ?? 0),
|
|
62
|
+
layers: Number(sprite.layers ?? 0),
|
|
63
|
+
}
|
|
64
|
+
: null,
|
|
65
|
+
directive: sprite
|
|
66
|
+
? "Ready. Call sprite_info before your first edit so you are working from the real layer, frame and palette state."
|
|
67
|
+
: "Ready, but no sprite is open. Use sprite_manage with op 'new' or 'open' first.",
|
|
68
|
+
}, sprite
|
|
69
|
+
? `READY — Aseprite ${base.asepriteVersion}, active sprite ${String(sprite.name)} (${String(sprite.width)}×${String(sprite.height)}).`
|
|
70
|
+
: "READY — Aseprite is connected but no sprite is open.");
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
return fail(err);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
server.registerTool("sprite_info", {
|
|
77
|
+
title: "Sprite info",
|
|
78
|
+
description: "Full structured state of a sprite: dimensions, colour mode, palette, every layer (with opacity, blend mode, visibility, group nesting), every frame with its duration, animation tags, slices and the current selection. Read this before editing — guessing at layer names or frame counts is the most common way an agent corrupts someone's file.",
|
|
79
|
+
inputSchema: {
|
|
80
|
+
sprite: targetShape.sprite,
|
|
81
|
+
includePalette: z.boolean().default(true).describe("Include the full palette as hex."),
|
|
82
|
+
includeSlices: z.boolean().default(false),
|
|
83
|
+
},
|
|
84
|
+
outputSchema: {
|
|
85
|
+
id: z.number().int().describe("Stable id for this open document. Pass it back as '#<id>'."),
|
|
86
|
+
name: z.string(),
|
|
87
|
+
filename: z.string().nullish(),
|
|
88
|
+
width: z.number().int(),
|
|
89
|
+
height: z.number().int(),
|
|
90
|
+
colorMode: z.enum(["rgb", "grayscale", "indexed"]),
|
|
91
|
+
transparentIndex: z.number().int().nullish(),
|
|
92
|
+
frameCount: z.number().int(),
|
|
93
|
+
layers: z.array(z.object({
|
|
94
|
+
name: z.string(),
|
|
95
|
+
index: z.number().int(),
|
|
96
|
+
visible: z.boolean(),
|
|
97
|
+
editable: z.boolean(),
|
|
98
|
+
opacity: z.number().int(),
|
|
99
|
+
blendMode: z.string(),
|
|
100
|
+
isGroup: z.boolean(),
|
|
101
|
+
isTilemap: z.boolean(),
|
|
102
|
+
parent: z.string().nullish(),
|
|
103
|
+
cels: z.array(z.number().int()).describe("1-based frames that have a cel on this layer."),
|
|
104
|
+
})),
|
|
105
|
+
frames: z.array(z.object({ number: z.number().int(), durationMs: z.number().int() })),
|
|
106
|
+
tags: z.array(z.object({
|
|
107
|
+
name: z.string(),
|
|
108
|
+
from: z.number().int(),
|
|
109
|
+
to: z.number().int(),
|
|
110
|
+
direction: z.string(),
|
|
111
|
+
repeats: z.number().int().nullish().describe("Loop count; 0 means forever."),
|
|
112
|
+
})),
|
|
113
|
+
palette: z.array(z.string()).optional(),
|
|
114
|
+
slices: z
|
|
115
|
+
.array(z.object({ name: z.string(), bounds: z.record(z.number()) }))
|
|
116
|
+
.optional(),
|
|
117
|
+
selection: z
|
|
118
|
+
.object({ x: z.number().int(), y: z.number().int(), width: z.number().int(), height: z.number().int() })
|
|
119
|
+
.nullish(),
|
|
120
|
+
activeLayer: z.string().nullish(),
|
|
121
|
+
activeFrame: z.number().int().nullish(),
|
|
122
|
+
},
|
|
123
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
124
|
+
}, async (args) => {
|
|
125
|
+
try {
|
|
126
|
+
const data = await live.call("sprite.info", args);
|
|
127
|
+
return ok(data, describeSprite(data));
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
return fail(err);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
server.registerTool("sprite_manage", {
|
|
134
|
+
title: "Manage sprites",
|
|
135
|
+
description: "Open, create, focus, resize, save and close sprites in the running Aseprite session. Ops: 'list' (open documents), 'new', 'open', 'activate', 'save', 'save_as', 'close', 'resize_canvas', 'set_properties'. Canvas resize keeps existing pixels — pass an anchor to say where they land.",
|
|
136
|
+
inputSchema: {
|
|
137
|
+
op: z.enum([
|
|
138
|
+
"list",
|
|
139
|
+
"new",
|
|
140
|
+
"open",
|
|
141
|
+
"activate",
|
|
142
|
+
"save",
|
|
143
|
+
"save_as",
|
|
144
|
+
"close",
|
|
145
|
+
"resize_canvas",
|
|
146
|
+
"set_properties",
|
|
147
|
+
]),
|
|
148
|
+
sprite: targetShape.sprite,
|
|
149
|
+
path: z.string().optional().describe("File path for 'open' and 'save_as'."),
|
|
150
|
+
width: z.number().int().positive().optional(),
|
|
151
|
+
height: z.number().int().positive().optional(),
|
|
152
|
+
colorMode: z.enum(["rgb", "grayscale", "indexed"]).optional().describe("For 'new'. Indexed keeps a sprite honest about its palette."),
|
|
153
|
+
anchor: z
|
|
154
|
+
.enum(["top_left", "top", "top_right", "left", "center", "right", "bottom_left", "bottom", "bottom_right"])
|
|
155
|
+
.default("center")
|
|
156
|
+
.describe("Where existing pixels sit after 'resize_canvas'."),
|
|
157
|
+
pixelAspect: z.string().optional().describe("e.g. '1:1' or '1:2'."),
|
|
158
|
+
force: z
|
|
159
|
+
.boolean()
|
|
160
|
+
.default(false)
|
|
161
|
+
.describe("Allow 'close' to discard unsaved changes. Ask the user before setting this."),
|
|
162
|
+
},
|
|
163
|
+
outputSchema: {
|
|
164
|
+
op: z.string(),
|
|
165
|
+
sprites: z
|
|
166
|
+
.array(z.object({
|
|
167
|
+
id: z.number().int(),
|
|
168
|
+
name: z.string(),
|
|
169
|
+
filename: z.string().nullish(),
|
|
170
|
+
width: z.number().int(),
|
|
171
|
+
height: z.number().int(),
|
|
172
|
+
colorMode: z.string(),
|
|
173
|
+
frames: z.number().int(),
|
|
174
|
+
layers: z.number().int(),
|
|
175
|
+
active: z.boolean(),
|
|
176
|
+
modified: z.boolean(),
|
|
177
|
+
}))
|
|
178
|
+
.optional(),
|
|
179
|
+
sprite: z.string().optional(),
|
|
180
|
+
id: z.number().int().optional().describe("Stable id of the affected document; pass it back as '#<id>'."),
|
|
181
|
+
path: z.string().optional(),
|
|
182
|
+
width: z.number().int().optional(),
|
|
183
|
+
height: z.number().int().optional(),
|
|
184
|
+
},
|
|
185
|
+
annotations: {
|
|
186
|
+
readOnlyHint: false,
|
|
187
|
+
destructiveHint: true,
|
|
188
|
+
idempotentHint: false,
|
|
189
|
+
openWorldHint: false,
|
|
190
|
+
},
|
|
191
|
+
}, async (args) => {
|
|
192
|
+
try {
|
|
193
|
+
if (args.op === "close" && !args.force) {
|
|
194
|
+
// A close that discards work is not recoverable through undo.
|
|
195
|
+
const info = await live.call("sprite.info", {
|
|
196
|
+
sprite: args.sprite,
|
|
197
|
+
includePalette: false,
|
|
198
|
+
});
|
|
199
|
+
if (info.modified) {
|
|
200
|
+
return fail(new Error(`'${info.name ?? "This sprite"}' has unsaved changes. Save it first, or ask the user to confirm and call again with force: true.`));
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
const data = await live.call("sprite.manage", args);
|
|
204
|
+
const merged = { op: args.op, ...data };
|
|
205
|
+
// Hand back the unambiguous form: the display name of a fresh document
|
|
206
|
+
// is "Sprite" for every unsaved sprite at once, so an agent that feeds
|
|
207
|
+
// the name straight back can address the wrong one.
|
|
208
|
+
const hint = data.id === undefined ? "" : ` Refer to it as '#${String(data.id)}'.`;
|
|
209
|
+
return ok(merged, `${args.op}: ${String(data.sprite ?? "ok")}.${hint}`);
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
return fail(err);
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
function describeSprite(data) {
|
|
217
|
+
const layers = data.layers?.length ?? 0;
|
|
218
|
+
const tags = data.tags ?? [];
|
|
219
|
+
const palette = data.palette?.length;
|
|
220
|
+
const bits = [
|
|
221
|
+
`${String(data.name)} ${String(data.width)}×${String(data.height)} ${String(data.colorMode)}`,
|
|
222
|
+
`${String(data.frameCount)} frame(s)`,
|
|
223
|
+
`${layers} layer(s)`,
|
|
224
|
+
];
|
|
225
|
+
if (palette !== undefined)
|
|
226
|
+
bits.push(`${palette}-colour palette`);
|
|
227
|
+
if (tags.length > 0)
|
|
228
|
+
bits.push(`tags: ${tags.map((t) => t.name).join(", ")}`);
|
|
229
|
+
return bits.join(" · ");
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/tools/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { fail, ok, targetShape } from "./kit.js";
|
|
3
|
+
/**
|
|
4
|
+
* Layers, frames, tags and cels — the skeleton an animator works against.
|
|
5
|
+
*
|
|
6
|
+
* Each is one tool with an `op` enum and a batch array, because these calls
|
|
7
|
+
* arrive in clusters: building a character rig is eight layers, and blocking in
|
|
8
|
+
* a walk cycle is eight frames with three different durations.
|
|
9
|
+
*/
|
|
10
|
+
const blendMode = z.enum([
|
|
11
|
+
"normal", "multiply", "screen", "overlay", "darken", "lighten",
|
|
12
|
+
"color_dodge", "color_burn", "hard_light", "soft_light", "difference",
|
|
13
|
+
"exclusion", "hue", "saturation", "color", "luminosity", "addition",
|
|
14
|
+
"subtract", "divide",
|
|
15
|
+
]);
|
|
16
|
+
const layerOpName = z.enum([
|
|
17
|
+
"list", "create", "rename", "delete", "reorder", "set",
|
|
18
|
+
"group", "ungroup", "merge", "duplicate", "activate",
|
|
19
|
+
]);
|
|
20
|
+
/** One layer operation. Used for both the single-op form and every `batch` entry. */
|
|
21
|
+
const layerOp = z.object({
|
|
22
|
+
op: layerOpName,
|
|
23
|
+
name: z.string().optional(),
|
|
24
|
+
newName: z.string().optional(),
|
|
25
|
+
parent: z.string().optional().describe("Group layer to nest under."),
|
|
26
|
+
index: z.number().int().optional().describe("Target stack position; 0 is bottom."),
|
|
27
|
+
visible: z.boolean().optional(),
|
|
28
|
+
editable: z.boolean().optional(),
|
|
29
|
+
opacity: z.number().int().min(0).max(255).optional(),
|
|
30
|
+
blendMode: blendMode.optional(),
|
|
31
|
+
names: z.array(z.string()).optional().describe("For 'merge' and bulk 'group'."),
|
|
32
|
+
});
|
|
33
|
+
export function registerStructureTools(server, live) {
|
|
34
|
+
server.registerTool("layer", {
|
|
35
|
+
title: "Layers",
|
|
36
|
+
description: "Manage layers. Ops: 'list', 'create', 'rename', 'delete', 'reorder', 'set' (visibility/opacity/blend/lock), 'group', 'ungroup', 'merge', 'duplicate', 'activate'. " +
|
|
37
|
+
"Pass `batch` to run several in one undoable action — building a rig in one call is the normal use. " +
|
|
38
|
+
"A character that will be animated wants its parts on separate layers (head, torso, arm-far, arm-near, leg-far, leg-near) before any frames exist; splitting baked pixels apart later is far more work.",
|
|
39
|
+
inputSchema: {
|
|
40
|
+
op: layerOpName.optional().describe("Single operation. Use `batch` instead for several."),
|
|
41
|
+
sprite: targetShape.sprite,
|
|
42
|
+
name: z.string().optional(),
|
|
43
|
+
newName: z.string().optional(),
|
|
44
|
+
parent: z.string().optional().describe("Group layer to nest under."),
|
|
45
|
+
index: z.number().int().optional().describe("Target stack position for 'reorder'; 0 is bottom."),
|
|
46
|
+
visible: z.boolean().optional(),
|
|
47
|
+
editable: z.boolean().optional(),
|
|
48
|
+
opacity: z.number().int().min(0).max(255).optional(),
|
|
49
|
+
blendMode: blendMode.optional(),
|
|
50
|
+
names: z.array(z.string()).optional().describe("For 'merge' and bulk 'group'."),
|
|
51
|
+
batch: z
|
|
52
|
+
.array(layerOp)
|
|
53
|
+
.max(128)
|
|
54
|
+
.optional()
|
|
55
|
+
.describe("Operations applied in order, in one undoable action. Same shape as the single-op arguments."),
|
|
56
|
+
},
|
|
57
|
+
outputSchema: {
|
|
58
|
+
sprite: z.string(),
|
|
59
|
+
layers: z
|
|
60
|
+
.array(z.object({
|
|
61
|
+
name: z.string(),
|
|
62
|
+
index: z.number().int(),
|
|
63
|
+
visible: z.boolean(),
|
|
64
|
+
editable: z.boolean(),
|
|
65
|
+
opacity: z.number().int(),
|
|
66
|
+
blendMode: z.string(),
|
|
67
|
+
isGroup: z.boolean(),
|
|
68
|
+
isTilemap: z.boolean(),
|
|
69
|
+
parent: z.string().nullish(),
|
|
70
|
+
cels: z.array(z.number().int()).describe("1-based frames that have a cel on this layer."),
|
|
71
|
+
}))
|
|
72
|
+
.optional(),
|
|
73
|
+
applied: z.number().int().optional(),
|
|
74
|
+
activeLayer: z.string().nullish().optional(),
|
|
75
|
+
},
|
|
76
|
+
annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: false },
|
|
77
|
+
}, async (args) => {
|
|
78
|
+
try {
|
|
79
|
+
const data = await live.call("layer.apply", args);
|
|
80
|
+
return ok(data, describeLayers(data));
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
return fail(err);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
server.registerTool("frame", {
|
|
87
|
+
title: "Frames",
|
|
88
|
+
description: "Manage animation frames. Ops: 'list', 'add', 'duplicate', 'delete', 'set_duration', 'activate', 'reorder'. " +
|
|
89
|
+
"Durations are milliseconds per frame and carry most of the life in a cycle — hold a contact pose longer than a pass pose. " +
|
|
90
|
+
"Use `count` to add several at once and `durations` to set a whole cycle's timing in one call.",
|
|
91
|
+
inputSchema: {
|
|
92
|
+
op: z.enum(["list", "add", "duplicate", "delete", "set_duration", "activate", "reorder"]),
|
|
93
|
+
sprite: targetShape.sprite,
|
|
94
|
+
frame: targetShape.frame,
|
|
95
|
+
count: z.number().int().positive().max(256).default(1),
|
|
96
|
+
afterFrame: z.number().int().positive().optional().describe("Insert position. Default: at the end."),
|
|
97
|
+
durationMs: z.number().int().positive().max(65535).optional(),
|
|
98
|
+
durations: z
|
|
99
|
+
.array(z.number().int().positive())
|
|
100
|
+
.optional()
|
|
101
|
+
.describe("Per-frame durations from frame 1, for 'set_duration'."),
|
|
102
|
+
toIndex: z.number().int().positive().optional().describe("For 'reorder'."),
|
|
103
|
+
linkCels: z
|
|
104
|
+
.boolean()
|
|
105
|
+
.default(false)
|
|
106
|
+
.describe("For 'duplicate': share the cel image instead of copying it, so edits apply to both."),
|
|
107
|
+
},
|
|
108
|
+
outputSchema: {
|
|
109
|
+
sprite: z.string(),
|
|
110
|
+
frameCount: z.number().int(),
|
|
111
|
+
frames: z
|
|
112
|
+
.array(z.object({ number: z.number().int(), durationMs: z.number().int() }))
|
|
113
|
+
.optional(),
|
|
114
|
+
activeFrame: z.number().int().optional(),
|
|
115
|
+
totalDurationMs: z.number().int().optional(),
|
|
116
|
+
},
|
|
117
|
+
annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: false },
|
|
118
|
+
}, async (args) => {
|
|
119
|
+
try {
|
|
120
|
+
const data = await live.call("frame.apply", args);
|
|
121
|
+
const total = data.totalDurationMs;
|
|
122
|
+
const summary = typeof total === "number"
|
|
123
|
+
? `${String(data.frameCount)} frame(s), ${total}ms total (${(1000 / Math.max(total / Number(data.frameCount || 1), 1)).toFixed(1)} fps average).`
|
|
124
|
+
: undefined;
|
|
125
|
+
return ok(data, summary);
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
return fail(err);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
server.registerTool("tag", {
|
|
132
|
+
title: "Animation tags",
|
|
133
|
+
description: "Manage animation tags — the named frame ranges a game engine imports as 'idle', 'walk', 'attack'. Ops: 'list', 'create', 'update', 'delete'. Tag every cycle before export; an untagged spritesheet is a pile of frames the engine cannot address.",
|
|
134
|
+
inputSchema: {
|
|
135
|
+
op: z.enum(["list", "create", "update", "delete"]),
|
|
136
|
+
sprite: targetShape.sprite,
|
|
137
|
+
name: z.string().optional(),
|
|
138
|
+
newName: z.string().optional(),
|
|
139
|
+
from: z.number().int().positive().optional().describe("First frame, 1-based, inclusive."),
|
|
140
|
+
to: z.number().int().positive().optional().describe("Last frame, 1-based, inclusive."),
|
|
141
|
+
direction: z.enum(["forward", "reverse", "pingpong", "pingpong_reverse"]).optional(),
|
|
142
|
+
repeats: z.number().int().min(0).optional().describe("Loop count; 0 means forever."),
|
|
143
|
+
color: z.string().optional().describe("Tag colour in the timeline, #rrggbb."),
|
|
144
|
+
},
|
|
145
|
+
outputSchema: {
|
|
146
|
+
sprite: z.string(),
|
|
147
|
+
tags: z.array(z.object({
|
|
148
|
+
name: z.string(),
|
|
149
|
+
from: z.number().int(),
|
|
150
|
+
to: z.number().int(),
|
|
151
|
+
direction: z.string(),
|
|
152
|
+
frames: z.number().int(),
|
|
153
|
+
durationMs: z.number().int(),
|
|
154
|
+
})),
|
|
155
|
+
},
|
|
156
|
+
annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: false },
|
|
157
|
+
}, async (args) => {
|
|
158
|
+
try {
|
|
159
|
+
const data = await live.call("tag.apply", args);
|
|
160
|
+
return ok(data);
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
return fail(err);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
server.registerTool("cel", {
|
|
167
|
+
title: "Cels",
|
|
168
|
+
description: "Manage cels — one layer's image on one frame. Ops: 'list', 'create', 'clear', 'delete', 'move', 'copy', 'link', 'unlink', 'set' (position/opacity). " +
|
|
169
|
+
"'move' is how you shift a whole limb between frames without redrawing it; 'link' shares one image across frames so a static part of a cycle stays in sync.",
|
|
170
|
+
inputSchema: {
|
|
171
|
+
op: z.enum(["list", "create", "clear", "delete", "move", "copy", "link", "unlink", "set"]),
|
|
172
|
+
...targetShape,
|
|
173
|
+
toFrame: z.number().int().positive().optional(),
|
|
174
|
+
toLayer: z.string().optional(),
|
|
175
|
+
frames: z.array(z.number().int().positive()).optional().describe("For 'link' across a range."),
|
|
176
|
+
x: z.number().int().optional().describe("Cel origin, for 'set' and 'move'."),
|
|
177
|
+
y: z.number().int().optional(),
|
|
178
|
+
dx: z.number().int().optional().describe("Relative move."),
|
|
179
|
+
dy: z.number().int().optional(),
|
|
180
|
+
opacity: z.number().int().min(0).max(255).optional(),
|
|
181
|
+
},
|
|
182
|
+
outputSchema: {
|
|
183
|
+
sprite: z.string(),
|
|
184
|
+
cels: z
|
|
185
|
+
.array(z.object({
|
|
186
|
+
layer: z.string(),
|
|
187
|
+
frame: z.number().int(),
|
|
188
|
+
x: z.number().int(),
|
|
189
|
+
y: z.number().int(),
|
|
190
|
+
width: z.number().int(),
|
|
191
|
+
height: z.number().int(),
|
|
192
|
+
opacity: z.number().int(),
|
|
193
|
+
linked: z.boolean(),
|
|
194
|
+
}))
|
|
195
|
+
.optional(),
|
|
196
|
+
applied: z.number().int().optional(),
|
|
197
|
+
},
|
|
198
|
+
annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: false },
|
|
199
|
+
}, async (args) => {
|
|
200
|
+
try {
|
|
201
|
+
const data = await live.call("cel.apply", args);
|
|
202
|
+
return ok(data);
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
return fail(err);
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
function describeLayers(data) {
|
|
210
|
+
const layers = data.layers;
|
|
211
|
+
if (!layers)
|
|
212
|
+
return undefined;
|
|
213
|
+
return `${layers.length} layer(s), top to bottom: ${[...layers]
|
|
214
|
+
.reverse()
|
|
215
|
+
.map((l) => `${l.name}${l.isGroup ? "/" : ""}${l.visible ? "" : " (hidden)"}`)
|
|
216
|
+
.join(", ")}`;
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=structure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structure.js","sourceRoot":"","sources":["../../src/tools/structure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"//": "Claude Code — user scope goes in ~/.claude.json, project scope in .mcp.json. Prefer installing the plugin instead: /plugin marketplace add with-pebbly/aseprite-ai-artist",
|
|
3
|
+
"mcpServers": {
|
|
4
|
+
"aseprite-ai-artist": {
|
|
5
|
+
"command": "npx",
|
|
6
|
+
"args": ["-y", "@pebbly/aseprite-ai-artist@latest", "serve"]
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# OpenAI Codex CLI — ~/.codex/config.toml (or .codex/config.toml in a trusted project).
|
|
2
|
+
# Codex reads TOML; the JSON that Claude Code and Cursor use will not work here.
|
|
3
|
+
#
|
|
4
|
+
# Written for you by: npx @pebbly/aseprite-ai-artist install codex
|
|
5
|
+
|
|
6
|
+
[mcp_servers.aseprite-ai-artist]
|
|
7
|
+
command = "npx"
|
|
8
|
+
args = ["-y", "@pebbly/aseprite-ai-artist@latest", "serve"]
|
|
9
|
+
|
|
10
|
+
# Optional: point at a non-default Aseprite, or move the ports.
|
|
11
|
+
# [mcp_servers.aseprite-ai-artist.env]
|
|
12
|
+
# ASEPRITE_AI_PLUGIN_PORT = "9931"
|
|
13
|
+
# ASEPRITE_AI_CONTROL_PORT = "9932"
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"//": "VS Code — .vscode/mcp.json. Note the key is `servers`, not `mcpServers`, and the transport is explicit.",
|
|
3
|
+
"servers": {
|
|
4
|
+
"aseprite-ai-artist": {
|
|
5
|
+
"type": "stdio",
|
|
6
|
+
"command": "npx",
|
|
7
|
+
"args": ["-y", "@pebbly/aseprite-ai-artist@latest", "serve"]
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}
|