capybara-mcp 0.1.3 → 0.1.5

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/README.md CHANGED
@@ -28,6 +28,9 @@ claude mcp add capybara-mcp -e CAPYBARA_API_KEY=<your-api-key> -- npx -y capybar
28
28
  | Variable | Required | Description |
29
29
  |----------|----------|-------------|
30
30
  | `CAPYBARA_API_KEY` | Yes | Your Capybara API key |
31
+ | `CAPYBARA_SKIP_GIT_CHECKPOINT` | No | Set to `1` to disable safety commits before overwriting files |
32
+ | `CAPYBARA_GIT_AUTHOR_NAME` | No | Author name for checkpoint commits (default `capybara-mcp`) |
33
+ | `CAPYBARA_GIT_AUTHOR_EMAIL` | No | Author email for checkpoint commits (default `mcp@capybara.build`) |
31
34
 
32
35
  The API endpoint is built in (`https://caoybaramcp-production.up.railway.app/v1`). No other env vars needed.
33
36
 
@@ -44,6 +47,21 @@ CAPYBARA_API_KEY=<key> npx capybara-mcp
44
47
  3. Assets are generated via the Capybara API and written back to disk.
45
48
  4. Live progress is written to `.capybara/status.active.md` (rewritten in place; cleared on success). Cancelled runs go to `status.cancelled.md` (keep `job_id` for recovery); failures go to `status.failed.md`.
46
49
 
50
+ ### Git safety checkpoint
51
+
52
+ When generation would **overwrite** an existing file, the client tries to preserve the previous version in git (best-effort):
53
+
54
+ - If the file has **uncommitted changes** (or is untracked but present), those contents are committed first as `capybara-mcp: checkpoint before overwriting…`.
55
+ - If the file is already clean at `HEAD`, no commit is made — `git restore -- <path>` still recovers the prior version after the write.
56
+ - Skipped when not a git repo, `git` is unavailable, the path is gitignored, or `CAPYBARA_SKIP_GIT_CHECKPOINT=1`.
57
+ - Checkpoint failures never block writing assets; the tool summary notes skips/errors.
58
+
59
+ To undo a generation write before you commit the new files:
60
+
61
+ ```bash
62
+ git restore -- path/to/file
63
+ ```
64
+
47
65
  If interrupted, use `get_job_status` with the returned `job_id`.
48
66
 
49
67
  ## Requirements
@@ -1 +1 @@
1
- {"version":3,"file":"capybara-api.d.ts","sourceRoot":"","sources":["../../src/api/capybara-api.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAM7B,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAwBF,wBAAsB,cAAc,CAClC,KAAK,EAAE,qBAAqB,EAC5B,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC,gBAAgB,CAAC,CAmD3B;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAcjE;AA8BD,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,aAAa,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GACpE,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAAC,CA8BzD"}
1
+ {"version":3,"file":"capybara-api.d.ts","sourceRoot":"","sources":["../../src/api/capybara-api.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAO7B,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AA2CF,wBAAsB,cAAc,CAClC,KAAK,EAAE,qBAAqB,EAC5B,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC,gBAAgB,CAAC,CAoD3B;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAcjE;AA+BD,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,aAAa,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GACpE,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAAC,CA8BzD"}
@@ -2,7 +2,7 @@ import path from "node:path";
2
2
  import { getJobStatus, flattenAssetToolInput, postApiRequest, TOOL_GET_JOB_STATUS, } from "capybara-mcp-shared";
3
3
  import { writeFiles } from "../lib/write-files.js";
4
4
  import { readGameIdFromWorkspace, writeGameIdToWorkspace } from "../lib/game-id.js";
5
- import { resolveBaseMapArtReferences } from "../lib/resolve-art-reference.js";
5
+ import { resolveBatchArtReference } from "../lib/resolve-art-reference.js";
6
6
  import { readWorkspaceContext } from "../lib/read-workspace-context.js";
7
7
  function withJobId(summary, jobId) {
8
8
  if (!jobId) {
@@ -10,6 +10,16 @@ function withJobId(summary, jobId) {
10
10
  }
11
11
  return [summary, "", `job_id: ${jobId}`, `If interrupted, call ${TOOL_GET_JOB_STATUS} with this job_id.`].join("\n");
12
12
  }
13
+ function formatWriteSummary(written, rootDir, checkpoint) {
14
+ const parts = [];
15
+ if (checkpoint.summary) {
16
+ parts.push(checkpoint.summary);
17
+ }
18
+ if (written.length > 0) {
19
+ parts.push([`Wrote ${written.length} file(s) to ${rootDir}:`, ...written.map((p) => ` - ${p}`)].join("\n"));
20
+ }
21
+ return parts.length > 0 ? parts.join("\n") : null;
22
+ }
13
23
  async function persistNewGameId(workspaceRoot, existingGameId, result) {
14
24
  if (existingGameId || !result.gameId) {
15
25
  return null;
@@ -20,7 +30,7 @@ async function persistNewGameId(workspaceRoot, existingGameId, result) {
20
30
  export async function generateAssets(input, ctx) {
21
31
  const { output_dir, workspace_root, ...schemaInput } = input;
22
32
  const workspaceRoot = path.resolve(workspace_root || ".");
23
- const payload = await resolveBaseMapArtReferences(flattenAssetToolInput(schemaInput), workspaceRoot);
33
+ const payload = await resolveBatchArtReference(flattenAssetToolInput(schemaInput), workspaceRoot);
24
34
  const workspace_files = await readWorkspaceContext(workspaceRoot);
25
35
  const existingGameId = await readGameIdFromWorkspace(workspaceRoot);
26
36
  await ctx.report?.({
@@ -44,7 +54,7 @@ export async function generateAssets(input, ctx) {
44
54
  });
45
55
  const result = data;
46
56
  const rootDir = path.resolve(output_dir || workspaceRoot);
47
- const written = await writeFiles(result.assets ?? result.files ?? [], rootDir);
57
+ const { written, checkpoint } = await writeFiles(result.assets ?? result.files ?? [], rootDir);
48
58
  const gameIdNote = await persistNewGameId(workspaceRoot, existingGameId, result);
49
59
  const summaryParts = [
50
60
  result.message || `Generated ${payload.assets.length} asset(s).`,
@@ -55,9 +65,7 @@ export async function generateAssets(input, ctx) {
55
65
  result.failedAssets?.length
56
66
  ? `Failures:\n${result.failedAssets.map((f) => ` - ${f.id}: ${f.error}`).join("\n")}`
57
67
  : null,
58
- written.length > 0
59
- ? [`Wrote ${written.length} file(s) to ${rootDir}:`, ...written.map((p) => ` - ${p}`)].join("\n")
60
- : null,
68
+ formatWriteSummary(written, rootDir, checkpoint),
61
69
  ].filter(Boolean);
62
70
  return { summary: withJobId(summaryParts.join("\n"), jobId), jobId };
63
71
  }
@@ -81,16 +89,14 @@ async function applyCompletedJob(status, outputDir, workspaceRoot, existingGameI
81
89
  }
82
90
  const result = status.result;
83
91
  const rootDir = path.resolve(outputDir || workspaceRoot || ".");
84
- const written = await writeFiles(result.assets ?? result.files ?? [], rootDir);
92
+ const { written, checkpoint } = await writeFiles(result.assets ?? result.files ?? [], rootDir);
85
93
  const gameIdNote = workspaceRoot != null
86
94
  ? await persistNewGameId(workspaceRoot, existingGameId, result)
87
95
  : null;
88
96
  return [
89
97
  result.message || "Recovered generated assets.",
90
98
  gameIdNote,
91
- written.length > 0
92
- ? [`Wrote ${written.length} file(s) to ${rootDir}:`, ...written.map((p) => ` - ${p}`)].join("\n")
93
- : null,
99
+ formatWriteSummary(written, rootDir, checkpoint),
94
100
  ]
95
101
  .filter(Boolean)
96
102
  .join("\n");
@@ -1 +1 @@
1
- {"version":3,"file":"capybara-api.js","sourceRoot":"","sources":["../../src/api/capybara-api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capybara-api.js","sourceRoot":"","sources":["../../src/api/capybara-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export type GitCheckpointResult = {
2
+ /** True when `workDir` resolved to a git work tree. */
3
+ inRepo: boolean;
4
+ /** True when we attempted a checkpoint (repo present + candidates). */
5
+ attempted: boolean;
6
+ /** True when a new commit was created. */
7
+ committed: boolean;
8
+ sha?: string;
9
+ /** Absolute paths whose prior contents were committed. */
10
+ files: string[];
11
+ /** Human-readable note for tool summaries. */
12
+ summary?: string;
13
+ };
14
+ /**
15
+ * Before overwriting generated assets, commit the current working-tree
16
+ * versions of any existing files that would be lost (dirty or untracked).
17
+ *
18
+ * Best-effort: never throws. Skips when not a git repo, git is missing,
19
+ * files are ignored, clean at HEAD, or CAPYBARA_SKIP_GIT_CHECKPOINT is set.
20
+ */
21
+ export declare function checkpointBeforeOverwrite(absolutePaths: string[], workDir: string): Promise<GitCheckpointResult>;
22
+ //# sourceMappingURL=git-checkpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-checkpoint.d.ts","sourceRoot":"","sources":["../../src/lib/git-checkpoint.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,mBAAmB,GAAG;IAChC,uDAAuD;IACvD,MAAM,EAAE,OAAO,CAAC;IAChB,uEAAuE;IACvE,SAAS,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AA2IF;;;;;;GAMG;AACH,wBAAsB,yBAAyB,CAC7C,aAAa,EAAE,MAAM,EAAE,EACvB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,mBAAmB,CAAC,CA2I9B"}
@@ -0,0 +1,240 @@
1
+ import { execFile } from "node:child_process";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { promisify } from "node:util";
5
+ const execFileAsync = promisify(execFile);
6
+ const SKIP_ENV = "CAPYBARA_SKIP_GIT_CHECKPOINT";
7
+ /** Author identity used only for automated checkpoint commits. */
8
+ const CHECKPOINT_AUTHOR_NAME = "capybara-mcp";
9
+ const CHECKPOINT_AUTHOR_EMAIL = "mcp@capybara.build";
10
+ async function pathExists(filePath) {
11
+ try {
12
+ await fs.access(filePath);
13
+ return true;
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ }
19
+ async function runGit(cwd, args, env) {
20
+ try {
21
+ const { stdout, stderr } = await execFileAsync("git", args, {
22
+ cwd,
23
+ env: env ?? process.env,
24
+ maxBuffer: 10 * 1024 * 1024,
25
+ // Checkpoints should never hang on a credential / gpg prompt.
26
+ timeout: 30_000,
27
+ });
28
+ return {
29
+ code: 0,
30
+ stdout: typeof stdout === "string" ? stdout : String(stdout),
31
+ stderr: typeof stderr === "string" ? stderr : String(stderr),
32
+ };
33
+ }
34
+ catch (err) {
35
+ const error = err;
36
+ const code = typeof error.code === "number"
37
+ ? error.code
38
+ : error.code === "ENOENT"
39
+ ? 127
40
+ : 1;
41
+ return {
42
+ code,
43
+ stdout: error.stdout
44
+ ? typeof error.stdout === "string"
45
+ ? error.stdout
46
+ : String(error.stdout)
47
+ : "",
48
+ stderr: error.stderr
49
+ ? typeof error.stderr === "string"
50
+ ? error.stderr
51
+ : String(error.stderr)
52
+ : error.message || "",
53
+ };
54
+ }
55
+ }
56
+ function toRepoRelative(gitRoot, absolutePath) {
57
+ return path.relative(gitRoot, absolutePath).split(path.sep).join("/");
58
+ }
59
+ async function resolveGitRoot(startDir) {
60
+ const result = await runGit(startDir, [
61
+ "rev-parse",
62
+ "--show-toplevel",
63
+ ]);
64
+ if (result.code !== 0) {
65
+ return null;
66
+ }
67
+ const root = result.stdout.trim();
68
+ return root || null;
69
+ }
70
+ async function isIgnored(gitRoot, repoRelativePath) {
71
+ const result = await runGit(gitRoot, [
72
+ "check-ignore",
73
+ "-q",
74
+ "--",
75
+ repoRelativePath,
76
+ ]);
77
+ // exit 0 = ignored, 1 = not ignored, 128 = error
78
+ return result.code === 0;
79
+ }
80
+ /**
81
+ * True when the working-tree file differs from HEAD (or is untracked).
82
+ * Clean tracked files already live at HEAD — no checkpoint commit needed;
83
+ * `git restore` after overwrite recovers them.
84
+ */
85
+ async function needsCheckpoint(gitRoot, repoRelativePath) {
86
+ const status = await runGit(gitRoot, [
87
+ "status",
88
+ "--porcelain",
89
+ "--untracked-files=all",
90
+ "--",
91
+ repoRelativePath,
92
+ ]);
93
+ if (status.code !== 0) {
94
+ // Be conservative: try to checkpoint if status is unclear.
95
+ return true;
96
+ }
97
+ return status.stdout.trim().length > 0;
98
+ }
99
+ function checkpointEnv() {
100
+ const name = process.env.CAPYBARA_GIT_AUTHOR_NAME?.trim() || CHECKPOINT_AUTHOR_NAME;
101
+ const email = process.env.CAPYBARA_GIT_AUTHOR_EMAIL?.trim() || CHECKPOINT_AUTHOR_EMAIL;
102
+ return {
103
+ ...process.env,
104
+ GIT_AUTHOR_NAME: name,
105
+ GIT_AUTHOR_EMAIL: email,
106
+ GIT_COMMITTER_NAME: name,
107
+ GIT_COMMITTER_EMAIL: email,
108
+ // Never open an editor for the message.
109
+ GIT_EDITOR: "true",
110
+ };
111
+ }
112
+ function formatFileList(paths, gitRoot) {
113
+ return paths
114
+ .map((p) => ` - ${toRepoRelative(gitRoot, p)}`)
115
+ .join("\n");
116
+ }
117
+ /**
118
+ * Before overwriting generated assets, commit the current working-tree
119
+ * versions of any existing files that would be lost (dirty or untracked).
120
+ *
121
+ * Best-effort: never throws. Skips when not a git repo, git is missing,
122
+ * files are ignored, clean at HEAD, or CAPYBARA_SKIP_GIT_CHECKPOINT is set.
123
+ */
124
+ export async function checkpointBeforeOverwrite(absolutePaths, workDir) {
125
+ const empty = (inRepo = false) => ({
126
+ inRepo,
127
+ attempted: false,
128
+ committed: false,
129
+ files: [],
130
+ });
131
+ if (process.env[SKIP_ENV]?.trim() === "1") {
132
+ return {
133
+ ...empty(false),
134
+ summary: `Skipped git checkpoint (${SKIP_ENV}=1).`,
135
+ };
136
+ }
137
+ if (absolutePaths.length === 0) {
138
+ return empty(false);
139
+ }
140
+ const resolvedWorkDir = path.resolve(workDir);
141
+ const gitRoot = await resolveGitRoot(resolvedWorkDir);
142
+ if (!gitRoot) {
143
+ return empty(false);
144
+ }
145
+ // Only consider paths inside the repo work tree.
146
+ const insideRepo = absolutePaths.filter((p) => {
147
+ const rel = path.relative(gitRoot, p);
148
+ return rel !== "" && !rel.startsWith("..") && !path.isAbsolute(rel);
149
+ });
150
+ if (insideRepo.length === 0) {
151
+ return empty(true);
152
+ }
153
+ const candidates = [];
154
+ for (const abs of insideRepo) {
155
+ if (!(await pathExists(abs))) {
156
+ continue;
157
+ }
158
+ const rel = toRepoRelative(gitRoot, abs);
159
+ if (await isIgnored(gitRoot, rel)) {
160
+ continue;
161
+ }
162
+ if (!(await needsCheckpoint(gitRoot, rel))) {
163
+ continue;
164
+ }
165
+ candidates.push(abs);
166
+ }
167
+ if (candidates.length === 0) {
168
+ // In a repo, but every overwrite target is clean at HEAD or ignored.
169
+ return empty(true);
170
+ }
171
+ const relPaths = candidates.map((p) => toRepoRelative(gitRoot, p));
172
+ // Stage only the files we are about to clobber.
173
+ const add = await runGit(gitRoot, ["add", "--", ...relPaths]);
174
+ if (add.code !== 0) {
175
+ return {
176
+ inRepo: true,
177
+ attempted: true,
178
+ committed: false,
179
+ files: candidates,
180
+ summary: `Git checkpoint skipped (git add failed): ${add.stderr.trim() || add.stdout.trim() || `exit ${add.code}`}`,
181
+ };
182
+ }
183
+ const subject = candidates.length === 1
184
+ ? `capybara-mcp: checkpoint before overwriting ${relPaths[0]}`
185
+ : `capybara-mcp: checkpoint before overwriting ${candidates.length} files`;
186
+ const body = [
187
+ "Automatic safety commit so prior asset contents can be restored with:",
188
+ " git restore --source=HEAD -- <paths>",
189
+ "or:",
190
+ " git checkout HEAD -- <paths>",
191
+ "",
192
+ "Files:",
193
+ ...relPaths.map((p) => ` - ${p}`),
194
+ ].join("\n");
195
+ const commit = await runGit(gitRoot, [
196
+ "commit",
197
+ "--no-verify",
198
+ "--no-gpg-sign",
199
+ "-m",
200
+ subject,
201
+ "-m",
202
+ body,
203
+ "--",
204
+ ...relPaths,
205
+ ], checkpointEnv());
206
+ if (commit.code !== 0) {
207
+ // Leave staged state as-is; user can unstage. Common when nothing
208
+ // actually differed after add (race) or hooks/config blocked commit.
209
+ const detail = commit.stderr.trim() || commit.stdout.trim() || `exit ${commit.code}`;
210
+ // "nothing to commit" is benign.
211
+ if (/nothing to commit/i.test(detail)) {
212
+ return empty(true);
213
+ }
214
+ return {
215
+ inRepo: true,
216
+ attempted: true,
217
+ committed: false,
218
+ files: candidates,
219
+ summary: `Git checkpoint skipped (commit failed): ${detail}`,
220
+ };
221
+ }
222
+ const shaResult = await runGit(gitRoot, ["rev-parse", "--short", "HEAD"]);
223
+ const sha = shaResult.code === 0 ? shaResult.stdout.trim() || undefined : undefined;
224
+ return {
225
+ inRepo: true,
226
+ attempted: true,
227
+ committed: true,
228
+ sha,
229
+ files: candidates,
230
+ summary: [
231
+ sha
232
+ ? `Git checkpoint ${sha} saved prior version(s) of ${candidates.length} file(s):`
233
+ : `Git checkpoint saved prior version(s) of ${candidates.length} file(s):`,
234
+ formatFileList(candidates, gitRoot),
235
+ // New writes stay unstaged; restore from HEAD undoes them.
236
+ "To undo these writes (before you commit them): git restore -- <path>",
237
+ ].join("\n"),
238
+ };
239
+ }
240
+ //# sourceMappingURL=git-checkpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-checkpoint.js","sourceRoot":"","sources":["../../src/lib/git-checkpoint.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/lib/progress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,KAAK,EACV,kBAAkB,EAClB,aAAa,EACd,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,KAAK,SAAS,GAAG,mBAAmB,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;AAiCxE,wBAAgB,sBAAsB,CAAC,EACrC,KAAK,EACL,MAAM,EACN,KAAK,EACL,SAAS,GACV,EAAE;IACD,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,YAAY,CAAC;CAC1B;qBAI+B,cAAc;EAiC7C"}
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/lib/progress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,KAAK,EACV,kBAAkB,EAClB,aAAa,EACd,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,KAAK,SAAS,GAAG,mBAAmB,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;AAiCxE,wBAAgB,sBAAsB,CAAC,EACrC,KAAK,EACL,MAAM,EACN,KAAK,EACL,SAAS,GACV,EAAE;IACD,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,YAAY,CAAC;CAC1B;qBAM+B,cAAc;EAoD7C"}
@@ -30,6 +30,8 @@ function progressKey({ message, progress, total }) {
30
30
  export function createProgressReporter({ extra, server, label, statusLog, }) {
31
31
  const progressToken = extra._meta?.progressToken;
32
32
  let lastProgress = 0;
33
+ let lastMessage;
34
+ let lastTotal;
33
35
  const report = async (update) => {
34
36
  if (extra.signal.aborted) {
35
37
  throw new DOMException("Cancelled", "AbortError");
@@ -37,21 +39,36 @@ export function createProgressReporter({ extra, server, label, statusLog, }) {
37
39
  if (update.progress != null) {
38
40
  lastProgress = update.progress;
39
41
  }
40
- await statusLog?.upsert(progressKey(update), formatProgressLine(update));
42
+ if (update.total != null) {
43
+ lastTotal = update.total;
44
+ }
45
+ if (update.message) {
46
+ lastMessage = update.message;
47
+ }
48
+ const displayUpdate = {
49
+ message: update.message ?? lastMessage,
50
+ progress: update.progress ?? lastProgress,
51
+ total: update.total ?? lastTotal,
52
+ };
53
+ await statusLog?.upsert(progressKey(displayUpdate), formatProgressLine(displayUpdate));
41
54
  if (progressToken !== undefined) {
42
55
  await extra.sendNotification({
43
56
  method: "notifications/progress",
44
57
  params: {
45
58
  progressToken,
46
- progress: update.progress ?? lastProgress,
47
- ...(update.total != null ? { total: update.total } : {}),
48
- ...(update.message ? { message: update.message } : {}),
59
+ progress: displayUpdate.progress ?? lastProgress,
60
+ ...(displayUpdate.total != null
61
+ ? { total: displayUpdate.total }
62
+ : {}),
63
+ ...(displayUpdate.message
64
+ ? { message: displayUpdate.message }
65
+ : {}),
49
66
  },
50
67
  });
51
68
  return;
52
69
  }
53
- if (extra.sessionId && update.message) {
54
- await server.sendLoggingMessage({ level: "info", data: `[${label}] ${update.message}` }, extra.sessionId);
70
+ if (extra.sessionId && displayUpdate.message) {
71
+ await server.sendLoggingMessage({ level: "info", data: `[${label}] ${displayUpdate.message}` }, extra.sessionId);
55
72
  }
56
73
  };
57
74
  return { report };
@@ -1 +1 @@
1
- {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/lib/progress.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/lib/progress.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,9 @@
1
1
  import type { AssetToolInput } from "capybara-mcp-shared";
2
2
  /** Load an art reference (http(s) URL or local path) as a data:image base64 URI. */
3
3
  export declare function resolveArtReferenceToBase64(source: string, workspaceRoot: string): Promise<string>;
4
- /** Replace base_map art_reference_url path/URL values with base64 data URIs. */
5
- export declare function resolveBaseMapArtReferences(payload: AssetToolInput, workspaceRoot: string): Promise<AssetToolInput>;
4
+ /**
5
+ * Resolve top-level batch `art_reference_url` (path or http URL) to a
6
+ * data:image base64 URI before sending the payload to the API.
7
+ */
8
+ export declare function resolveBatchArtReference(payload: AssetToolInput, workspaceRoot: string): Promise<AssetToolInput>;
6
9
  //# sourceMappingURL=resolve-art-reference.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-art-reference.d.ts","sourceRoot":"","sources":["../../src/lib/resolve-art-reference.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAe,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAgCvE,oFAAoF;AACpF,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAmCjB;AAED,gFAAgF;AAChF,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,cAAc,EACvB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,cAAc,CAAC,CAqBzB"}
1
+ {"version":3,"file":"resolve-art-reference.d.ts","sourceRoot":"","sources":["../../src/lib/resolve-art-reference.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAgC1D,oFAAoF;AACpF,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAmCjB;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,cAAc,EACvB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,cAAc,CAAC,CAYzB"}
@@ -55,19 +55,17 @@ export async function resolveArtReferenceToBase64(source, workspaceRoot) {
55
55
  throw new Error(`Failed to read art_reference_url file "${trimmed}" (resolved: ${absolutePath}): ${message}`);
56
56
  }
57
57
  }
58
- /** Replace base_map art_reference_url path/URL values with base64 data URIs. */
59
- export async function resolveBaseMapArtReferences(payload, workspaceRoot) {
60
- const assets = await Promise.all(payload.assets.map(async (asset) => {
61
- if (asset.type !== "base_map") {
62
- return asset;
63
- }
64
- const source = asset.art_reference_url;
65
- if (typeof source !== "string" || !source.trim()) {
66
- return asset;
67
- }
68
- const art_reference_url = await resolveArtReferenceToBase64(source, workspaceRoot);
69
- return { ...asset, art_reference_url };
70
- }));
71
- return { ...payload, assets };
58
+ /**
59
+ * Resolve top-level batch `art_reference_url` (path or http URL) to a
60
+ * data:image base64 URI before sending the payload to the API.
61
+ */
62
+ export async function resolveBatchArtReference(payload, workspaceRoot) {
63
+ const source = payload.art_reference_url;
64
+ if (typeof source !== "string" || !source.trim()) {
65
+ const { art_reference_url: _omit, ...rest } = payload;
66
+ return rest;
67
+ }
68
+ const art_reference_url = await resolveArtReferenceToBase64(source, workspaceRoot);
69
+ return { ...payload, art_reference_url };
72
70
  }
73
71
  //# sourceMappingURL=resolve-art-reference.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-art-reference.js","sourceRoot":"","sources":["../../src/lib/resolve-art-reference.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolve-art-reference.js","sourceRoot":"","sources":["../../src/lib/resolve-art-reference.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,8 @@
1
1
  import type { FileWriteEntry } from "capybara-mcp-shared";
2
- export declare function writeFiles(files: FileWriteEntry[], rootDir: string): Promise<string[]>;
2
+ import { type GitCheckpointResult } from "./git-checkpoint.js";
3
+ export type WriteFilesResult = {
4
+ written: string[];
5
+ checkpoint: GitCheckpointResult;
6
+ };
7
+ export declare function writeFiles(files: FileWriteEntry[], rootDir: string): Promise<WriteFilesResult>;
3
8
  //# sourceMappingURL=write-files.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"write-files.d.ts","sourceRoot":"","sources":["../../src/lib/write-files.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,wBAAsB,UAAU,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsB5F"}
1
+ {"version":3,"file":"write-files.d.ts","sourceRoot":"","sources":["../../src/lib/write-files.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,mBAAmB,CAAC;CACjC,CAAC;AAwCF,wBAAsB,UAAU,CAC9B,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,CAAC,CAqD3B"}
@@ -1,11 +1,57 @@
1
1
  import fs from "node:fs/promises";
2
2
  import path from "node:path";
3
+ import { checkpointBeforeOverwrite, } from "./git-checkpoint.js";
4
+ function entryBuffer(file) {
5
+ if (file.content_base64) {
6
+ return Buffer.from(file.content_base64, "base64");
7
+ }
8
+ return Buffer.from(file.content ?? "", "utf-8");
9
+ }
10
+ async function resolveOverwriteTargets(files, resolvedRoot) {
11
+ const targets = [];
12
+ for (const file of files) {
13
+ const targetPath = path.resolve(resolvedRoot, file.path);
14
+ if (targetPath !== resolvedRoot &&
15
+ !targetPath.startsWith(resolvedRoot + path.sep)) {
16
+ continue;
17
+ }
18
+ let existing;
19
+ try {
20
+ existing = await fs.readFile(targetPath);
21
+ }
22
+ catch {
23
+ // New file — nothing to preserve.
24
+ continue;
25
+ }
26
+ if (!existing.equals(entryBuffer(file))) {
27
+ targets.push(targetPath);
28
+ }
29
+ }
30
+ return targets;
31
+ }
3
32
  export async function writeFiles(files, rootDir) {
4
33
  const resolvedRoot = path.resolve(rootDir);
34
+ const overwriteTargets = await resolveOverwriteTargets(files, resolvedRoot);
35
+ let checkpoint = await checkpointBeforeOverwrite(overwriteTargets, resolvedRoot);
36
+ // Clean tracked files need no commit (HEAD already has the prior bytes),
37
+ // but still tell the agent/user how to restore after the overwrite.
38
+ if (checkpoint.inRepo &&
39
+ overwriteTargets.length > 0 &&
40
+ !checkpoint.committed &&
41
+ !checkpoint.summary) {
42
+ checkpoint = {
43
+ ...checkpoint,
44
+ summary: [
45
+ `Overwriting ${overwriteTargets.length} existing file(s); prior versions recoverable with:`,
46
+ " git restore -- <path>",
47
+ ].join("\n"),
48
+ };
49
+ }
5
50
  const written = [];
6
51
  for (const file of files) {
7
52
  const targetPath = path.resolve(resolvedRoot, file.path);
8
- if (targetPath !== resolvedRoot && !targetPath.startsWith(resolvedRoot + path.sep)) {
53
+ if (targetPath !== resolvedRoot &&
54
+ !targetPath.startsWith(resolvedRoot + path.sep)) {
9
55
  throw new Error(`Refusing to write outside of ${resolvedRoot}: ${file.path}`);
10
56
  }
11
57
  await fs.mkdir(path.dirname(targetPath), { recursive: true });
@@ -17,6 +63,6 @@ export async function writeFiles(files, rootDir) {
17
63
  }
18
64
  written.push(targetPath);
19
65
  }
20
- return written;
66
+ return { written, checkpoint };
21
67
  }
22
68
  //# sourceMappingURL=write-files.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"write-files.js","sourceRoot":"","sources":["../../src/lib/write-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAuB,EAAE,OAAe;IACvE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,UAAU,KAAK,YAAY,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACnF,MAAM,IAAI,KAAK,CAAC,gCAAgC,YAAY,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9D,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"write-files.js","sourceRoot":"","sources":["../../src/lib/write-files.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "capybara-mcp",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Capybara MCP tools — generate game assets from Claude Code, Cursor, Codex, and other MCP agents",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -19,7 +19,7 @@
19
19
  "prepublishOnly": "npm run build"
20
20
  },
21
21
  "dependencies": {
22
- "capybara-mcp-shared": "0.1.2",
22
+ "capybara-mcp-shared": "0.1.3",
23
23
  "@modelcontextprotocol/sdk": "^1.11.0",
24
24
  "zod": "^3.23.8"
25
25
  },