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 +18 -0
- package/dist/api/capybara-api.d.ts.map +1 -1
- package/dist/api/capybara-api.js +16 -10
- package/dist/api/capybara-api.js.map +1 -1
- package/dist/lib/git-checkpoint.d.ts +22 -0
- package/dist/lib/git-checkpoint.d.ts.map +1 -0
- package/dist/lib/git-checkpoint.js +240 -0
- package/dist/lib/git-checkpoint.js.map +1 -0
- package/dist/lib/progress.d.ts.map +1 -1
- package/dist/lib/progress.js +23 -6
- package/dist/lib/progress.js.map +1 -1
- package/dist/lib/resolve-art-reference.d.ts +5 -2
- package/dist/lib/resolve-art-reference.d.ts.map +1 -1
- package/dist/lib/resolve-art-reference.js +12 -14
- package/dist/lib/resolve-art-reference.js.map +1 -1
- package/dist/lib/write-files.d.ts +6 -1
- package/dist/lib/write-files.d.ts.map +1 -1
- package/dist/lib/write-files.js +48 -2
- package/dist/lib/write-files.js.map +1 -1
- package/package.json +2 -2
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;
|
|
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"}
|
package/dist/api/capybara-api.js
CHANGED
|
@@ -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 {
|
|
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
|
|
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
|
|
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
|
|
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":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,cAAc,EACd,mBAAmB,GAKpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;
|
|
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;
|
|
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"}
|
package/dist/lib/progress.js
CHANGED
|
@@ -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
|
-
|
|
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:
|
|
47
|
-
...(
|
|
48
|
-
|
|
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 &&
|
|
54
|
-
await server.sendLoggingMessage({ level: "info", data: `[${label}] ${
|
|
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 };
|
package/dist/lib/progress.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/lib/progress.ts"],"names":[],"mappings":"AAWA,SAAS,kBAAkB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAkB;IACtE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC;AAC3C,CAAC;AAED,sEAAsE;AACtE,SAAS,WAAW,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAkB;IAC/D,IAAI,QAAQ,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QACtC,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAClC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,oFAAoF;IACpF,4DAA4D;IAC5D,MAAM,KAAK,GAAG,GAAG;SACd,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC;SAClC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE;SACN,WAAW,EAAE,CAAC;IACjB,OAAO,KAAK,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,EACrC,KAAK,EACL,MAAM,EACN,KAAK,EACL,SAAS,GAMV;IACC,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC;IACjD,IAAI,YAAY,GAAG,CAAC,CAAC;
|
|
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
|
-
/**
|
|
5
|
-
|
|
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,
|
|
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
|
-
/**
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
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;
|
|
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"}
|
package/dist/lib/write-files.js
CHANGED
|
@@ -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 &&
|
|
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;
|
|
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;AAE7B,OAAO,EACL,yBAAyB,GAE1B,MAAM,qBAAqB,CAAC;AAO7B,SAAS,WAAW,CAAC,IAAoB;IACvC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,KAAuB,EACvB,YAAoB;IAEpB,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,IACE,UAAU,KAAK,YAAY;YAC3B,CAAC,UAAU,CAAC,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,EAC/C,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;YAClC,SAAS;QACX,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAAuB,EACvB,OAAe;IAEf,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,gBAAgB,GAAG,MAAM,uBAAuB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC5E,IAAI,UAAU,GAAG,MAAM,yBAAyB,CAC9C,gBAAgB,EAChB,YAAY,CACb,CAAC;IAEF,yEAAyE;IACzE,oEAAoE;IACpE,IACE,UAAU,CAAC,MAAM;QACjB,gBAAgB,CAAC,MAAM,GAAG,CAAC;QAC3B,CAAC,UAAU,CAAC,SAAS;QACrB,CAAC,UAAU,CAAC,OAAO,EACnB,CAAC;QACD,UAAU,GAAG;YACX,GAAG,UAAU;YACb,OAAO,EAAE;gBACP,eAAe,gBAAgB,CAAC,MAAM,qDAAqD;gBAC3F,yBAAyB;aAC1B,CAAC,IAAI,CAAC,IAAI,CAAC;SACb,CAAC;IACJ,CAAC;IAED,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,IACE,UAAU,KAAK,YAAY;YAC3B,CAAC,UAAU,CAAC,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,EAC/C,CAAC;YACD,MAAM,IAAI,KAAK,CACb,gCAAgC,YAAY,KAAK,IAAI,CAAC,IAAI,EAAE,CAC7D,CAAC;QACJ,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,CAChB,UAAU,EACV,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAC3C,CAAC;QACJ,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,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACjC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "capybara-mcp",
|
|
3
|
-
"version": "0.1.
|
|
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.
|
|
22
|
+
"capybara-mcp-shared": "0.1.3",
|
|
23
23
|
"@modelcontextprotocol/sdk": "^1.11.0",
|
|
24
24
|
"zod": "^3.23.8"
|
|
25
25
|
},
|