codex-imagegen-mcp 0.1.2

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.
Files changed (105) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/LICENSE +201 -0
  3. package/NOTICE +19 -0
  4. package/README.md +373 -0
  5. package/dist/src/auth/borrowed.js +77 -0
  6. package/dist/src/auth/borrowed.js.map +1 -0
  7. package/dist/src/auth/browser-login.js +179 -0
  8. package/dist/src/auth/browser-login.js.map +1 -0
  9. package/dist/src/auth/device-login.js +39 -0
  10. package/dist/src/auth/device-login.js.map +1 -0
  11. package/dist/src/auth/jwt.js +69 -0
  12. package/dist/src/auth/jwt.js.map +1 -0
  13. package/dist/src/auth/manager.js +289 -0
  14. package/dist/src/auth/manager.js.map +1 -0
  15. package/dist/src/auth/oauth.js +246 -0
  16. package/dist/src/auth/oauth.js.map +1 -0
  17. package/dist/src/auth/pages.js +39 -0
  18. package/dist/src/auth/pages.js.map +1 -0
  19. package/dist/src/auth/pkce.js +14 -0
  20. package/dist/src/auth/pkce.js.map +1 -0
  21. package/dist/src/auth/store.js +75 -0
  22. package/dist/src/auth/store.js.map +1 -0
  23. package/dist/src/backend/images-client.js +223 -0
  24. package/dist/src/backend/images-client.js.map +1 -0
  25. package/dist/src/backend/ratelimits.js +183 -0
  26. package/dist/src/backend/ratelimits.js.map +1 -0
  27. package/dist/src/cli.js +407 -0
  28. package/dist/src/cli.js.map +1 -0
  29. package/dist/src/config.js +87 -0
  30. package/dist/src/config.js.map +1 -0
  31. package/dist/src/constants.js +52 -0
  32. package/dist/src/constants.js.map +1 -0
  33. package/dist/src/doctor.js +122 -0
  34. package/dist/src/doctor.js.map +1 -0
  35. package/dist/src/errors.js +76 -0
  36. package/dist/src/errors.js.map +1 -0
  37. package/dist/src/generation.js +183 -0
  38. package/dist/src/generation.js.map +1 -0
  39. package/dist/src/history.js +47 -0
  40. package/dist/src/history.js.map +1 -0
  41. package/dist/src/images/chroma.js +200 -0
  42. package/dist/src/images/chroma.js.map +1 -0
  43. package/dist/src/images/codec.js +159 -0
  44. package/dist/src/images/codec.js.map +1 -0
  45. package/dist/src/images/inputs.js +83 -0
  46. package/dist/src/images/inputs.js.map +1 -0
  47. package/dist/src/images/output.js +100 -0
  48. package/dist/src/images/output.js.map +1 -0
  49. package/dist/src/images/preview.js +20 -0
  50. package/dist/src/images/preview.js.map +1 -0
  51. package/dist/src/images/resize.js +135 -0
  52. package/dist/src/images/resize.js.map +1 -0
  53. package/dist/src/install/opencode.js +138 -0
  54. package/dist/src/install/opencode.js.map +1 -0
  55. package/dist/src/install/skill.js +128 -0
  56. package/dist/src/install/skill.js.map +1 -0
  57. package/dist/src/install/snippets.js +127 -0
  58. package/dist/src/install/snippets.js.map +1 -0
  59. package/dist/src/log.js +58 -0
  60. package/dist/src/log.js.map +1 -0
  61. package/dist/src/remove-background.js +101 -0
  62. package/dist/src/remove-background.js.map +1 -0
  63. package/dist/src/server/context.js +2 -0
  64. package/dist/src/server/context.js.map +1 -0
  65. package/dist/src/server/index.js +94 -0
  66. package/dist/src/server/index.js.map +1 -0
  67. package/dist/src/server/instructions.js +20 -0
  68. package/dist/src/server/instructions.js.map +1 -0
  69. package/dist/src/server/login-coordinator.js +73 -0
  70. package/dist/src/server/login-coordinator.js.map +1 -0
  71. package/dist/src/server/progress.js +33 -0
  72. package/dist/src/server/progress.js.map +1 -0
  73. package/dist/src/server/prompts.js +45 -0
  74. package/dist/src/server/prompts.js.map +1 -0
  75. package/dist/src/server/resources.js +73 -0
  76. package/dist/src/server/resources.js.map +1 -0
  77. package/dist/src/server/tools.js +338 -0
  78. package/dist/src/server/tools.js.map +1 -0
  79. package/dist/src/server/workspace.js +45 -0
  80. package/dist/src/server/workspace.js.map +1 -0
  81. package/dist/src/status.js +86 -0
  82. package/dist/src/status.js.map +1 -0
  83. package/dist/src/util/format.js +36 -0
  84. package/dist/src/util/format.js.map +1 -0
  85. package/dist/src/util/fs.js +117 -0
  86. package/dist/src/util/fs.js.map +1 -0
  87. package/dist/src/util/http.js +65 -0
  88. package/dist/src/util/http.js.map +1 -0
  89. package/dist/src/util/invocation.js +43 -0
  90. package/dist/src/util/invocation.js.map +1 -0
  91. package/dist/src/util/open.js +41 -0
  92. package/dist/src/util/open.js.map +1 -0
  93. package/docs/ARCHITECTURE.md +123 -0
  94. package/docs/AUTH.md +242 -0
  95. package/docs/BACKEND.md +169 -0
  96. package/docs/CLIENTS.md +154 -0
  97. package/docs/DEVELOPMENT.md +171 -0
  98. package/docs/README.md +84 -0
  99. package/docs/TOOLS.md +221 -0
  100. package/package.json +67 -0
  101. package/skill/imagegen/LICENSE.txt +201 -0
  102. package/skill/imagegen/SKILL.md +189 -0
  103. package/skill/imagegen/references/prompting.md +112 -0
  104. package/skill/imagegen/references/sample-prompts.md +418 -0
  105. package/skill/imagegen/references/tools.md +90 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/images/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { PREVIEW_MAX_EDGE } from "../constants.js";
2
+ import { decodeImage, encodeJpeg, hasTransparency, onCheckerboard, sniffImageMime } from "./codec.js";
3
+ import { resizeToFit } from "./resize.js";
4
+ /**
5
+ * Small JPEG preview for the model to look at. Keeps tool results far below MCP stdio message
6
+ * limits (10 MB in the TypeScript SDK) and client attachment limits, while the full-resolution
7
+ * file stays on disk. Transparent images are shown over a checkerboard so the cutout is visible.
8
+ */
9
+ export function buildPreview(bytes, maxEdge = PREVIEW_MAX_EDGE) {
10
+ const mime = sniffImageMime(bytes);
11
+ if (mime !== "image/png" && mime !== "image/jpeg")
12
+ return undefined;
13
+ let img = decodeImage(bytes);
14
+ const transparent = hasTransparency(img);
15
+ if (transparent)
16
+ img = onCheckerboard(img, Math.max(8, Math.round(Math.max(img.width, img.height) / 64)));
17
+ img = resizeToFit(img, maxEdge);
18
+ return { data: encodeJpeg(img, 82).toString("base64"), mimeType: "image/jpeg", width: img.width, height: img.height, transparent };
19
+ }
20
+ //# sourceMappingURL=preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/images/preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACtG,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAY1C;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,KAAiB,EAAE,OAAO,GAAG,gBAAgB;IACxE,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO,SAAS,CAAC;IACpE,IAAI,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,WAAW;QAAE,GAAG,GAAG,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1G,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;AACrI,CAAC"}
@@ -0,0 +1,135 @@
1
+ /** Downscale so the longest edge is at most `maxEdge` (never upscales). */
2
+ export function resizeToFit(img, maxEdge) {
3
+ const longest = Math.max(img.width, img.height);
4
+ if (longest <= maxEdge)
5
+ return img;
6
+ const scale = maxEdge / longest;
7
+ return resampleArea(img, Math.max(1, Math.round(img.width * scale)), Math.max(1, Math.round(img.height * scale)));
8
+ }
9
+ /**
10
+ * Area-averaging (box) downsampler with fractional pixel coverage and premultiplied alpha, so
11
+ * transparent pixels don't bleed dark fringes into their neighbours.
12
+ */
13
+ export function resampleArea(img, dw, dh) {
14
+ const { width: sw, height: sh, data: src } = img;
15
+ const out = new Uint8Array(dw * dh * 4);
16
+ const xScale = sw / dw;
17
+ const yScale = sh / dh;
18
+ for (let dy = 0; dy < dh; dy++) {
19
+ const sy0 = dy * yScale;
20
+ const sy1 = sy0 + yScale;
21
+ const iy0 = Math.floor(sy0);
22
+ const iy1 = Math.min(sh, Math.ceil(sy1));
23
+ for (let dx = 0; dx < dw; dx++) {
24
+ const sx0 = dx * xScale;
25
+ const sx1 = sx0 + xScale;
26
+ const ix0 = Math.floor(sx0);
27
+ const ix1 = Math.min(sw, Math.ceil(sx1));
28
+ let r = 0;
29
+ let g = 0;
30
+ let b = 0;
31
+ let a = 0;
32
+ let wsum = 0;
33
+ for (let y = iy0; y < iy1; y++) {
34
+ const wy = Math.min(y + 1, sy1) - Math.max(y, sy0);
35
+ if (wy <= 0)
36
+ continue;
37
+ const row = y * sw * 4;
38
+ for (let x = ix0; x < ix1; x++) {
39
+ const wx = Math.min(x + 1, sx1) - Math.max(x, sx0);
40
+ if (wx <= 0)
41
+ continue;
42
+ const w = wx * wy;
43
+ const i = row + x * 4;
44
+ const wa = w * src[i + 3];
45
+ r += src[i] * wa;
46
+ g += src[i + 1] * wa;
47
+ b += src[i + 2] * wa;
48
+ a += wa;
49
+ wsum += w;
50
+ }
51
+ }
52
+ const o = (dy * dw + dx) * 4;
53
+ if (a > 0) {
54
+ out[o] = Math.round(r / a);
55
+ out[o + 1] = Math.round(g / a);
56
+ out[o + 2] = Math.round(b / a);
57
+ }
58
+ out[o + 3] = wsum > 0 ? Math.round(a / wsum) : 0;
59
+ }
60
+ }
61
+ return { width: dw, height: dh, data: out };
62
+ }
63
+ /** One sliding-window box blur pass (clamped edges) along rows or columns. */
64
+ function boxBlurPass(src, dst, w, h, r, horizontal) {
65
+ const len = horizontal ? w : h;
66
+ const lines = horizontal ? h : w;
67
+ const stride = horizontal ? 1 : w;
68
+ const lineStep = horizontal ? w : 1;
69
+ const norm = 1 / (2 * r + 1);
70
+ for (let l = 0; l < lines; l++) {
71
+ const base = l * lineStep;
72
+ const at = (i) => src[base + Math.min(len - 1, Math.max(0, i)) * stride];
73
+ let acc = 0;
74
+ for (let i = -r; i <= r; i++)
75
+ acc += at(i);
76
+ for (let i = 0; i < len; i++) {
77
+ dst[base + i * stride] = acc * norm;
78
+ acc += at(i + r + 1) - at(i - r);
79
+ }
80
+ }
81
+ }
82
+ /** Box sizes whose 3-pass composition approximates a Gaussian of std-dev `sigma`. */
83
+ function boxesForGauss(sigma, n = 3) {
84
+ const wIdeal = Math.sqrt((12 * sigma * sigma) / n + 1);
85
+ let wl = Math.floor(wIdeal);
86
+ if (wl % 2 === 0)
87
+ wl--;
88
+ const wu = wl + 2;
89
+ const mIdeal = (12 * sigma * sigma - n * wl * wl - 4 * n * wl - 3 * n) / (-4 * wl - 4);
90
+ const m = Math.round(mIdeal);
91
+ return Array.from({ length: n }, (_, i) => (i < m ? wl : wu));
92
+ }
93
+ /** Gaussian blur (radius = std-dev, like Pillow's GaussianBlur) of a single 8-bit channel. */
94
+ export function gaussianBlurChannel(channel, w, h, sigma) {
95
+ if (sigma <= 0)
96
+ return channel;
97
+ let a = Float32Array.from(channel);
98
+ let b = new Float32Array(a.length);
99
+ for (const size of boxesForGauss(sigma)) {
100
+ const r = Math.max(0, (size - 1) / 2);
101
+ boxBlurPass(a, b, w, h, r, true);
102
+ boxBlurPass(b, a, w, h, r, false);
103
+ }
104
+ const out = new Uint8Array(channel.length);
105
+ for (let i = 0; i < a.length; i++)
106
+ out[i] = Math.max(0, Math.min(255, Math.round(a[i])));
107
+ return out;
108
+ }
109
+ /** 3x3 minimum filter applied `iterations` times (erodes an alpha matte by one pixel per pass). */
110
+ export function erodeChannel(channel, w, h, iterations) {
111
+ let cur = channel;
112
+ const tmp = new Uint8Array(channel.length);
113
+ for (let it = 0; it < iterations; it++) {
114
+ for (let y = 0; y < h; y++) {
115
+ const row = y * w;
116
+ for (let x = 0; x < w; x++) {
117
+ const l = cur[row + Math.max(0, x - 1)];
118
+ const c = cur[row + x];
119
+ const r = cur[row + Math.min(w - 1, x + 1)];
120
+ tmp[row + x] = Math.min(l, c, r);
121
+ }
122
+ }
123
+ const next = new Uint8Array(channel.length);
124
+ for (let y = 0; y < h; y++) {
125
+ const up = Math.max(0, y - 1) * w;
126
+ const row = y * w;
127
+ const down = Math.min(h - 1, y + 1) * w;
128
+ for (let x = 0; x < w; x++)
129
+ next[row + x] = Math.min(tmp[up + x], tmp[row + x], tmp[down + x]);
130
+ }
131
+ cur = next;
132
+ }
133
+ return cur;
134
+ }
135
+ //# sourceMappingURL=resize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resize.js","sourceRoot":"","sources":["../../../src/images/resize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,138 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { applyEdits, modify, parse as parseJsonc, printParseErrorCode } from "jsonc-parser";
5
+ import { expandHome } from "../config.js";
6
+ import { SKILL_NAME } from "../constants.js";
7
+ import { ImagegenError } from "../errors.js";
8
+ import { pathExists, writeFileAtomic } from "../util/fs.js";
9
+ import { isRecord } from "../util/http.js";
10
+ import { findSkillsNamed, installSkillDir, opencodeSkillRoots, removeSkillDir } from "./skill.js";
11
+ export function opencodeConfigDir(env = process.env) {
12
+ const xdg = env.XDG_CONFIG_HOME?.trim();
13
+ return path.join(xdg ? expandHome(xdg) : path.join(os.homedir(), ".config"), "opencode");
14
+ }
15
+ /** opencode reads opencode.jsonc or opencode.json; prefer whichever exists. */
16
+ export async function resolveOpencodeConfigFile(dir) {
17
+ for (const name of ["opencode.jsonc", "opencode.json"]) {
18
+ const file = path.join(dir, name);
19
+ if (await pathExists(file))
20
+ return { file, exists: true };
21
+ }
22
+ return { file: path.join(dir, "opencode.json"), exists: false };
23
+ }
24
+ function detectFormatting(text) {
25
+ const eol = text.includes("\r\n") ? "\r\n" : "\n";
26
+ const indented = /^([ \t]+)\S/m.exec(text)?.[1];
27
+ if (indented?.startsWith("\t"))
28
+ return { insertSpaces: false, tabSize: 1, eol };
29
+ return { insertSpaces: true, tabSize: indented ? Math.min(8, indented.length) : 2, eol };
30
+ }
31
+ function parseConfig(text, file) {
32
+ const errors = [];
33
+ const value = parseJsonc(text, errors, { allowTrailingComma: true, disallowComments: false });
34
+ if (errors.length > 0) {
35
+ const first = errors[0];
36
+ throw new ImagegenError("invalid_input", `Cannot parse ${file}: ${printParseErrorCode(first.error)} at offset ${first.offset}. Fix the file and retry.`);
37
+ }
38
+ if (value !== undefined && !isRecord(value))
39
+ throw new ImagegenError("invalid_input", `${file} does not contain a JSON object.`);
40
+ return value ?? {};
41
+ }
42
+ function sameJson(a, b) {
43
+ return JSON.stringify(a) === JSON.stringify(b);
44
+ }
45
+ async function writeConfig(file, text, existed) {
46
+ const mode = existed ? ((await fs.stat(file)).mode & 0o777) : 0o644;
47
+ await writeFileAtomic(file, text, mode);
48
+ }
49
+ /**
50
+ * Add (or update) the MCP server entry in opencode.json[c] — preserving comments and formatting —
51
+ * and install the bundled skill where opencode discovers it.
52
+ */
53
+ export async function installOpencode(o) {
54
+ const configDir = o.scope === "global" ? (o.configDir ?? opencodeConfigDir()) : o.projectDir;
55
+ const { file, exists } = await resolveOpencodeConfigFile(configDir);
56
+ const original = exists ? await fs.readFile(file, "utf8") : `{\n "$schema": "https://opencode.ai/config.json"\n}\n`;
57
+ const config = parseConfig(original, file);
58
+ const entry = { type: "local", command: o.command, enabled: true, timeout: o.timeoutMs };
59
+ if (o.environment && Object.keys(o.environment).length > 0)
60
+ entry.environment = o.environment;
61
+ const report = { configFile: file, entry, steps: [], warnings: [] };
62
+ const mcp = isRecord(config.mcp) ? config.mcp : {};
63
+ const current = mcp[o.serverName];
64
+ if (current !== undefined && sameJson(current, entry)) {
65
+ report.steps.push({ action: "MCP entry already up to date", path: file });
66
+ }
67
+ else {
68
+ if (current !== undefined && !o.force) {
69
+ const cmd = isRecord(current) && Array.isArray(current.command) ? current.command.join(" ") : "";
70
+ if (!cmd.includes("codex-imagegen-mcp") && !cmd.includes("cli.js")) {
71
+ throw new ImagegenError("invalid_input", `${file} already has an MCP server named "${o.serverName}" that doesn't look like this one (${cmd || "unknown command"}). Use --name to pick another name, or --force to replace it.`);
72
+ }
73
+ }
74
+ const edits = modify(original, ["mcp", o.serverName], entry, { formattingOptions: detectFormatting(original) });
75
+ const updated = applyEdits(original, edits);
76
+ parseConfig(updated, file); // sanity check before writing
77
+ if (!o.dryRun) {
78
+ if (exists) {
79
+ const backup = `${file}.codex-imagegen-mcp.bak`;
80
+ await fs.copyFile(file, backup);
81
+ report.steps.push({ action: "Backed up config", path: backup });
82
+ }
83
+ await writeConfig(file, updated, exists);
84
+ }
85
+ report.steps.push({ action: `${current === undefined ? "Added" : "Updated"} MCP server "${o.serverName}"`, path: file });
86
+ }
87
+ for (const [name, value] of Object.entries(mcp)) {
88
+ if (name === o.serverName || !isRecord(value) || !Array.isArray(value.command))
89
+ continue;
90
+ if (value.command.join(" ").includes("codex-imagegen-mcp")) {
91
+ report.warnings.push(`Another MCP entry "${name}" also runs codex-imagegen-mcp; remove it to avoid duplicate tools.`);
92
+ }
93
+ }
94
+ if (o.installSkill) {
95
+ const skillDir = o.scope === "global" ? path.join(configDir, "skills", SKILL_NAME) : path.join(o.projectDir, ".opencode", "skills", SKILL_NAME);
96
+ const result = await installSkillDir(skillDir, { force: o.force, dryRun: o.dryRun });
97
+ report.skillDir = skillDir;
98
+ report.steps.push({ action: `Skill ${result.action}`, path: skillDir });
99
+ if (result.warning)
100
+ report.warnings.push(result.warning);
101
+ const roots = opencodeSkillRoots(o.scope === "global" ? configDir : opencodeConfigDir(), o.scope === "project" ? o.projectDir : undefined);
102
+ const others = (await findSkillsNamed(SKILL_NAME, roots)).filter((d) => path.resolve(d) !== path.resolve(skillDir));
103
+ for (const other of others) {
104
+ report.warnings.push(`Another skill named "${SKILL_NAME}" exists at ${other}. opencode picks one of duplicate skills unpredictably — remove or rename it.`);
105
+ }
106
+ }
107
+ return report;
108
+ }
109
+ export async function uninstallOpencode(o) {
110
+ const configDir = o.scope === "global" ? (o.configDir ?? opencodeConfigDir()) : o.projectDir;
111
+ const { file, exists } = await resolveOpencodeConfigFile(configDir);
112
+ const report = { configFile: file, entry: {}, steps: [], warnings: [] };
113
+ if (exists) {
114
+ const original = await fs.readFile(file, "utf8");
115
+ const config = parseConfig(original, file);
116
+ if (isRecord(config.mcp) && config.mcp[o.serverName] !== undefined) {
117
+ const updated = applyEdits(original, modify(original, ["mcp", o.serverName], undefined, { formattingOptions: detectFormatting(original) }));
118
+ if (!o.dryRun) {
119
+ await fs.copyFile(file, `${file}.codex-imagegen-mcp.bak`);
120
+ await writeConfig(file, updated, true);
121
+ }
122
+ report.steps.push({ action: `Removed MCP server "${o.serverName}"`, path: file });
123
+ }
124
+ else {
125
+ report.steps.push({ action: `No MCP server named "${o.serverName}"`, path: file });
126
+ }
127
+ }
128
+ else {
129
+ report.steps.push({ action: "No opencode config found", path: file });
130
+ }
131
+ if (!o.keepSkill) {
132
+ const skillDir = o.scope === "global" ? path.join(configDir, "skills", SKILL_NAME) : path.join(o.projectDir, ".opencode", "skills", SKILL_NAME);
133
+ const r = await removeSkillDir(skillDir, { dryRun: o.dryRun });
134
+ report.steps.push({ action: r === "removed" ? "Removed skill" : r === "not-ours" ? "Skill not installed by us; left untouched" : "No skill installed", path: skillDir });
135
+ }
136
+ return report;
137
+ }
138
+ //# sourceMappingURL=opencode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/install/opencode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { SKILL_NAME, SKILL_SOURCE_DIR, VERSION } from "../constants.js";
5
+ import { pathExists } from "../util/fs.js";
6
+ /** Marker written into skill directories we install, so we never delete a user's own skill. */
7
+ export const SKILL_MARKER = ".codex-imagegen-mcp.json";
8
+ async function listFiles(dir, prefix = "") {
9
+ const out = [];
10
+ for (const entry of await fs.readdir(dir, { withFileTypes: true })) {
11
+ const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
12
+ if (entry.isDirectory())
13
+ out.push(...(await listFiles(path.join(dir, entry.name), rel)));
14
+ else if (entry.isFile())
15
+ out.push(rel);
16
+ }
17
+ return out.sort();
18
+ }
19
+ async function sameContents(a, b) {
20
+ try {
21
+ const [fa, fb] = await Promise.all([listFiles(a), listFiles(b)]);
22
+ const filtered = fb.filter((f) => f !== SKILL_MARKER);
23
+ if (fa.length !== filtered.length || fa.some((f, i) => f !== filtered[i]))
24
+ return false;
25
+ for (const f of fa) {
26
+ const [x, y] = await Promise.all([fs.readFile(path.join(a, f)), fs.readFile(path.join(b, f))]);
27
+ if (!x.equals(y))
28
+ return false;
29
+ }
30
+ return true;
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ export async function isOurSkill(dir) {
37
+ return pathExists(path.join(dir, SKILL_MARKER));
38
+ }
39
+ /** Copy the bundled skill into `targetDir` (replacing an older copy we installed). */
40
+ export async function installSkillDir(targetDir, options) {
41
+ const source = options.source ?? SKILL_SOURCE_DIR;
42
+ const exists = await pathExists(targetDir);
43
+ if (exists && !(await isOurSkill(targetDir)) && !options.force) {
44
+ return {
45
+ action: "skipped",
46
+ warning: `${targetDir} already exists and was not installed by codex-imagegen-mcp; left untouched (use --force to replace it).`,
47
+ };
48
+ }
49
+ if (exists && (await sameContents(source, targetDir)))
50
+ return { action: "unchanged" };
51
+ if (!options.dryRun) {
52
+ if (exists)
53
+ await fs.rm(targetDir, { recursive: true, force: true });
54
+ await fs.mkdir(path.dirname(targetDir), { recursive: true });
55
+ await fs.cp(source, targetDir, { recursive: true });
56
+ await fs.writeFile(path.join(targetDir, SKILL_MARKER), `${JSON.stringify({ installedBy: "codex-imagegen-mcp", version: VERSION, source, installedAt: new Date().toISOString() }, null, 2)}\n`);
57
+ }
58
+ return { action: exists ? "updated" : "installed" };
59
+ }
60
+ export async function removeSkillDir(targetDir, options) {
61
+ if (!(await pathExists(targetDir)))
62
+ return "missing";
63
+ if (!(await isOurSkill(targetDir)))
64
+ return "not-ours";
65
+ if (!options.dryRun)
66
+ await fs.rm(targetDir, { recursive: true, force: true });
67
+ return "removed";
68
+ }
69
+ /** Read `name:` from a SKILL.md frontmatter block. */
70
+ export async function skillNameOf(skillFile) {
71
+ try {
72
+ const head = (await fs.readFile(skillFile, "utf8")).slice(0, 4096);
73
+ const fm = /^---\s*\r?\n([\s\S]*?)\r?\n---/.exec(head)?.[1];
74
+ const name = fm ? /^name:\s*["']?([^"'\r\n]+?)["']?\s*$/m.exec(fm)?.[1] : undefined;
75
+ return name?.trim();
76
+ }
77
+ catch {
78
+ return undefined;
79
+ }
80
+ }
81
+ /** Find every SKILL.md under `roots` (max depth 4) whose frontmatter name is `name`. */
82
+ export async function findSkillsNamed(name, roots) {
83
+ const found = [];
84
+ const walk = async (dir, depth) => {
85
+ if (depth > 4)
86
+ return;
87
+ let entries;
88
+ try {
89
+ entries = await fs.readdir(dir, { withFileTypes: true });
90
+ }
91
+ catch {
92
+ return;
93
+ }
94
+ for (const e of entries) {
95
+ if (e.name === "node_modules" || e.name === ".git")
96
+ continue;
97
+ const full = path.join(dir, e.name);
98
+ if (e.isFile() && e.name === "SKILL.md") {
99
+ if ((await skillNameOf(full)) === name)
100
+ found.push(path.dirname(full));
101
+ }
102
+ else if (e.isDirectory() || e.isSymbolicLink()) {
103
+ await walk(full, depth + 1);
104
+ }
105
+ }
106
+ };
107
+ for (const root of new Set(roots))
108
+ await walk(root, 0);
109
+ return [...new Set(found)];
110
+ }
111
+ /** Directories opencode scans for skills (global + project, per opencode's skill loader). */
112
+ export function opencodeSkillRoots(configDir, projectDir) {
113
+ const home = os.homedir();
114
+ const roots = [
115
+ path.join(home, ".claude", "skills"),
116
+ path.join(home, ".agents", "skills"),
117
+ path.join(configDir, "skill"),
118
+ path.join(configDir, "skills"),
119
+ path.join(home, ".opencode", "skill"),
120
+ path.join(home, ".opencode", "skills"),
121
+ ];
122
+ if (projectDir) {
123
+ roots.push(path.join(projectDir, ".claude", "skills"), path.join(projectDir, ".agents", "skills"), path.join(projectDir, ".opencode", "skill"), path.join(projectDir, ".opencode", "skills"));
124
+ }
125
+ return roots;
126
+ }
127
+ export { SKILL_NAME };
128
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../../src/install/skill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { SKILL_SOURCE_DIR } from "../constants.js";
5
+ export const CLIENTS = ["opencode", "claude-code", "claude-desktop", "cursor", "vscode", "windsurf", "codex", "gemini"];
6
+ /**
7
+ * GUI apps often start without the shell PATH, so they need an absolute `node`. Prefer a stable
8
+ * symlink (e.g. /opt/homebrew/bin/node) over a versioned Cellar path that breaks on upgrade.
9
+ */
10
+ export function stableNodePath() {
11
+ const exec = process.execPath;
12
+ let real = exec;
13
+ try {
14
+ real = fs.realpathSync(exec);
15
+ }
16
+ catch {
17
+ /* keep */
18
+ }
19
+ for (const candidate of ["/opt/homebrew/bin/node", "/usr/local/bin/node", "/usr/bin/node"]) {
20
+ try {
21
+ if (fs.realpathSync(candidate) === real)
22
+ return candidate;
23
+ }
24
+ catch {
25
+ /* not present */
26
+ }
27
+ }
28
+ return exec;
29
+ }
30
+ function withAbsoluteNode(command) {
31
+ return command[0] === "node" ? [stableNodePath(), ...command.slice(1)] : [...command];
32
+ }
33
+ /**
34
+ * The launch command for GUI apps, which may start without the shell PATH: an absolute node plus
35
+ * the absolute CLI script. (A global install's `codex-imagegen-mcp` launcher is `#!/usr/bin/env
36
+ * node`, which fails when node isn't on the GUI app's PATH.)
37
+ */
38
+ export function absoluteServerCommand(script) {
39
+ return [stableNodePath(), script, "serve"];
40
+ }
41
+ function shellQuote(arg) {
42
+ return /^[\w@%+=:,./-]+$/.test(arg) ? arg : `'${arg.replace(/'/g, "'\\''")}'`;
43
+ }
44
+ function claudeDesktopConfigPath() {
45
+ if (process.platform === "darwin")
46
+ return path.join(os.homedir(), "Library", "Application Support", "Claude", "claude_desktop_config.json");
47
+ if (process.platform === "win32")
48
+ return path.join(process.env.APPDATA ?? path.join(os.homedir(), "AppData", "Roaming"), "Claude", "claude_desktop_config.json");
49
+ return path.join(os.homedir(), ".config", "Claude", "claude_desktop_config.json");
50
+ }
51
+ const SKILL_NOTE = (dir) => `Skill (optional but recommended): copy ${SKILL_SOURCE_DIR} to ${dir}`;
52
+ export function clientSnippet(client, serverName, command, absoluteCommand) {
53
+ const [cmd = "node", ...args] = command;
54
+ const abs = absoluteCommand ? [...absoluteCommand] : withAbsoluteNode(command);
55
+ const [absCmd = "node", ...absArgs] = abs;
56
+ const json = (v) => JSON.stringify(v, null, 2);
57
+ switch (client) {
58
+ case "opencode":
59
+ return {
60
+ client,
61
+ title: "opencode",
62
+ location: "~/.config/opencode/opencode.json (or ./opencode.json for one project) — or just run: codex-imagegen-mcp install opencode",
63
+ body: json({ mcp: { [serverName]: { type: "local", command: [...command], enabled: true, timeout: 300000 } } }),
64
+ notes: [
65
+ "timeout applies to every MCP request; progress notifications reset it, 300000 ms is a safe ceiling.",
66
+ SKILL_NOTE("~/.config/opencode/skills/imagegen"),
67
+ ],
68
+ };
69
+ case "claude-code":
70
+ return {
71
+ client,
72
+ title: "Claude Code",
73
+ location: "run in a terminal",
74
+ body: `claude mcp add --scope user ${shellQuote(serverName)} -- ${command.map(shellQuote).join(" ")}`,
75
+ notes: ["For long generations, start Claude Code with MCP_TOOL_TIMEOUT=300000.", SKILL_NOTE("~/.claude/skills/imagegen")],
76
+ };
77
+ case "claude-desktop":
78
+ return {
79
+ client,
80
+ title: "Claude Desktop",
81
+ location: claudeDesktopConfigPath(),
82
+ body: json({ mcpServers: { [serverName]: { command: absCmd, args: absArgs } } }),
83
+ notes: ["Restart Claude Desktop after editing. Absolute paths are used because GUI apps may not inherit your shell PATH."],
84
+ };
85
+ case "cursor":
86
+ return {
87
+ client,
88
+ title: "Cursor",
89
+ location: "~/.cursor/mcp.json (global) or .cursor/mcp.json (project)",
90
+ body: json({ mcpServers: { [serverName]: { command: cmd, args } } }),
91
+ notes: ["If Cursor cannot find node, replace \"node\" with the absolute path: " + stableNodePath()],
92
+ };
93
+ case "vscode":
94
+ return {
95
+ client,
96
+ title: "VS Code (GitHub Copilot agent mode)",
97
+ location: ".vscode/mcp.json in your workspace (or the user-level mcp.json via “MCP: Open User Configuration”)",
98
+ body: json({ servers: { [serverName]: { type: "stdio", command: cmd, args } } }),
99
+ notes: [],
100
+ };
101
+ case "windsurf":
102
+ return {
103
+ client,
104
+ title: "Windsurf",
105
+ location: "~/.codeium/windsurf/mcp_config.json",
106
+ body: json({ mcpServers: { [serverName]: { command: absCmd, args: absArgs } } }),
107
+ notes: [],
108
+ };
109
+ case "codex":
110
+ return {
111
+ client,
112
+ title: "OpenAI Codex CLI / IDE",
113
+ location: "~/.codex/config.toml",
114
+ body: `[mcp_servers.${serverName}]\ncommand = ${JSON.stringify(cmd)}\nargs = [${args.map((a) => JSON.stringify(a)).join(", ")}]\ntool_timeout_sec = 300`,
115
+ notes: ["Codex already has a built-in image_gen tool when signed in with ChatGPT; this is mainly useful for API-key Codex setups."],
116
+ };
117
+ case "gemini":
118
+ return {
119
+ client,
120
+ title: "Gemini CLI",
121
+ location: "~/.gemini/settings.json",
122
+ body: json({ mcpServers: { [serverName]: { command: cmd, args, timeout: 300000 } } }),
123
+ notes: [],
124
+ };
125
+ }
126
+ }
127
+ //# sourceMappingURL=snippets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snippets.js","sourceRoot":"","sources":["../../../src/install/snippets.ts"],"names":[],"mappings":"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"}