autodev-cli 1.4.153 → 1.4.155

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.
@@ -21,7 +21,7 @@ logger = logging.getLogger("GimpMCPServer")
21
21
 
22
22
 
23
23
  class GimpConnection:
24
- def __init__(self, host='127.0.0.1', port=9876):
24
+ def __init__(self, host='127.0.0.1', port=9877):
25
25
  self.host = host
26
26
  self.port = port
27
27
  self.sock = None
@@ -5,7 +5,7 @@
5
5
  # Derived from libreearth/gimp-mcp (GPL-3.0; see media/gimp/LICENSE) and fixed by
6
6
  # the user / AutoDev for GIMP 3.2 (Store / MSIX). Verified working on real GIMP
7
7
  # 3.2.44: a menu-triggered PLUGIN (Tools -> MCP / Filters -> Development -> Start
8
- # MCP Server) that listens on 127.0.0.1:9876 and drives GIMP. Keep the "GIMP MCP
8
+ # MCP Server) that listens on 127.0.0.1:9877 and drives GIMP. Keep the "GIMP MCP
9
9
  # Server" window open — GLib.MainLoop() holds the out-of-process plug-in alive.
10
10
  #
11
11
  # This is the user's verified file; the body below is kept byte-for-byte. The
@@ -13,7 +13,7 @@
13
13
  # ---------------------------------------------------------------------------
14
14
 
15
15
  # GIMP MCP Server Plugin (GIMP 3.2)
16
- # Listens on localhost:9876 so the libreearth gimp-mcp client can drive GIMP.
16
+ # Listens on localhost:9877 so it does not collide with Blender MCP (9876).
17
17
 
18
18
  import gi
19
19
  gi.require_version('Gimp', '3.0')
@@ -31,7 +31,7 @@ import threading
31
31
  import traceback
32
32
 
33
33
  HOST = '127.0.0.1'
34
- PORT = 9876
34
+ PORT = 9877
35
35
  # Store GIMP redirects GLib config dir into the MSIX LocalCache. Also write
36
36
  # to the real roaming profile so the log is findable.
37
37
  _LOG_PATHS = [
@@ -190,7 +190,7 @@ class MCPPlugin(Gimp.PlugIn):
190
190
  procedure.set_menu_label(_('Start MCP Server'))
191
191
  procedure.set_documentation(
192
192
  _('Starts an MCP server to control GIMP externally'),
193
- _('Listens on 127.0.0.1:9876 for the GIMP MCP client'),
193
+ _('Listens on 127.0.0.1:9877 for the GIMP MCP client'),
194
194
  name,
195
195
  )
196
196
  procedure.set_attribution('GIMP MCP', 'GIMP MCP', '2026')
@@ -298,7 +298,7 @@ function printGimpInstall(res) {
298
298
  logger_1.log.plain(` client: ${p}`);
299
299
  }
300
300
  logger_1.log.plain(" In GIMP: Tools → MCP → Start MCP Server (or Filters → Development), and KEEP the");
301
- logger_1.log.plain(" 'GIMP MCP Server' window open — it holds the plug-in alive on localhost:9876.");
301
+ logger_1.log.plain(" 'GIMP MCP Server' window open — it holds the plug-in alive on localhost:9877.");
302
302
  }
303
303
  else {
304
304
  logger_1.log.warn('⚠ The GIMP MCP plugin was NOT installed.');
@@ -445,7 +445,7 @@ function mcpCommand(program) {
445
445
  // autodev mcp gimp-install-plugin [dir]
446
446
  cmd
447
447
  .command('gimp-install-plugin [dir]')
448
- .description('Install the AUTO-START GIMP 3.x MCP plugin (localhost:9876 opens on GIMP launch — no menu click)')
448
+ .description('Install the AUTO-START GIMP 3.x MCP plugin (localhost:9877 opens on GIMP launch — no menu click)')
449
449
  .action((dir) => {
450
450
  const res = (0, gimpPluginInstall_1.installGimpPlugin)(dir ? { targetDir: path.resolve(dir) } : undefined);
451
451
  printGimpInstall(res);
@@ -1,4 +1,4 @@
1
1
  /** sha256 (first 12 hex) of the canonical media/gimp/gimp_mcp_client.py. */
2
- export declare const GIMP_CLIENT_SOURCE_HASH = "03f3cfe6c80a";
2
+ export declare const GIMP_CLIENT_SOURCE_HASH = "a11b5a3693a8";
3
3
  /** Full body of the user-verified GIMP MCP client (FastMCP stdio) (media/gimp/gimp_mcp_client.py). */
4
- export declare const GIMP_CLIENT_SOURCE = "#!/usr/bin/env python3\n# ---------------------------------------------------------------------------\n# gimp_mcp_client.py \u2014 vendored, USER-VERIFIED GIMP MCP client (FastMCP stdio).\n#\n# Derived from libreearth/gimp-mcp (GPL-3.0; see media/gimp/LICENSE) and fixed by\n# the user / AutoDev: reconnect via getpeername, reads > 1024 bytes, get_images.\n# Launched by: uv run --with mcp==1.2.0 <this file>. The body below is kept\n# byte-for-byte; the lines in THIS block are a provenance comment only.\n# ---------------------------------------------------------------------------\n\n# GIMP MCP Server Script\n# Provides an MCP interface to control GIMP via a socket connection.\n\nfrom mcp.server.fastmcp import FastMCP, Context\nimport socket\nimport json\nimport logging\n\nlogging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')\nlogger = logging.getLogger(\"GimpMCPServer\")\n\n\nclass GimpConnection:\n def __init__(self, host='127.0.0.1', port=9876):\n self.host = host\n self.port = port\n self.sock = None\n\n def close(self):\n if self.sock:\n try:\n self.sock.close()\n except Exception:\n pass\n self.sock = None\n\n def connect(self):\n if self.sock:\n try:\n self.sock.getpeername()\n return\n except Exception:\n self.close()\n try:\n sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n sock.settimeout(30)\n sock.connect((self.host, self.port))\n self.sock = sock\n logger.info(f\"Connected to GIMP at {self.host}:{self.port}\")\n except Exception as e:\n self.close()\n logger.error(f\"Failed to connect: {e}\")\n raise ConnectionError(\n \"Could not connect to GIMP. Open GIMP and run \"\n \"Filters > Development > Start MCP Server.\"\n )\n\n def send_command(self, command_type, params=None):\n self.connect()\n command = {\"type\": command_type, \"params\": params or {}}\n try:\n self.sock.sendall(json.dumps(command).encode('utf-8'))\n chunks = []\n while True:\n data = self.sock.recv(65536)\n if not data:\n break\n chunks.append(data)\n try:\n return json.loads(b''.join(chunks).decode('utf-8'))\n except json.JSONDecodeError:\n continue\n raise Exception(\"GIMP closed the connection before sending a complete response\")\n except Exception as e:\n logger.error(f\"Communication error: {e}\")\n self.close()\n raise Exception(f\"Error communicating with GIMP: {e}\")\n\n\n_gimp_connection = None\n\n\ndef get_gimp_connection():\n global _gimp_connection\n if _gimp_connection is None:\n _gimp_connection = GimpConnection()\n _gimp_connection.connect()\n return _gimp_connection\n\n\nmcp = FastMCP(\"GimpMCP\", description=\"GIMP integration through MCP\")\n\n\n@mcp.tool()\ndef call_api(ctx: Context, api_path: str, args: list = [], kwargs: dict = {}) -> str:\n \"\"\"Call any GIMP API method dynamically.\n\n Parameters:\n - api_path: The path to the API method (e.g., \"Gimp.Image.get_by_id\")\n Use \"exec\" to run Python inside GIMP. Pass the code in args[0].\n - args: List of positional arguments\n - kwargs: Dictionary of keyword arguments\n\n Returns:\n - JSON string of the result or error message\n \"\"\"\n try:\n conn = get_gimp_connection()\n result = conn.send_command(\"call_api\", {\"api_path\": api_path, \"args\": args, \"kwargs\": kwargs})\n if result[\"status\"] == \"success\":\n return json.dumps(result[\"result\"])\n return f\"Error: {result['message']}\"\n except Exception as e:\n return f\"Error: {e}\"\n\n\n@mcp.tool()\ndef list_images(ctx: Context) -> str:\n \"\"\"List all open images in GIMP.\n\n Returns:\n - JSON string of image IDs and names\n \"\"\"\n return call_api(ctx, \"Gimp.get_images\")\n\n\n@mcp.tool()\ndef get_image_info(ctx: Context, image_id: int) -> str:\n \"\"\"Get information about a specific image.\n\n Parameters:\n - image_id: The ID of the image\n\n Returns:\n - JSON string of image details\n \"\"\"\n return call_api(\n ctx,\n \"exec\",\n args=[\n f\"\"\"\nimage = Gimp.Image.get_by_id({int(image_id)})\nif image is None:\n _result = {{\"error\": \"image not found\"}}\nelse:\n _result = {{\n \"id\": image.get_id(),\n \"name\": image.get_name(),\n \"width\": image.get_width(),\n \"height\": image.get_height(),\n \"layers\": [{{\"id\": layer.get_id(), \"name\": layer.get_name()}} for layer in image.get_layers()],\n }}\n\"\"\"\n ],\n )\n\n\n@mcp.tool()\ndef apply_gaussian_blur(ctx: Context, image_id: int, radius: float = 5.0) -> str:\n \"\"\"Apply Gaussian blur to an image.\n\n Parameters:\n - image_id: The ID of the image\n - radius: Blur radius\n\n Returns:\n - Success message or error\n \"\"\"\n return call_api(\n ctx,\n \"exec\",\n args=[\n f\"\"\"\nimage = Gimp.Image.get_by_id({int(image_id)})\nif image is None:\n _result = \"image not found\"\nelse:\n layers = image.get_layers()\n if not layers:\n _result = \"no layers\"\n else:\n drawable = layers[0]\n blur = Gimp.DrawableFilter.new(drawable, \"gegl:gaussian-blur\", \"\")\n cfg = blur.get_config()\n try:\n cfg.set_property(\"std-dev-x\", {float(radius)})\n cfg.set_property(\"std-dev-y\", {float(radius)})\n except Exception:\n pass\n drawable.append_filter(blur)\n drawable.merge_filter(blur)\n Gimp.displays_flush()\n _result = \"Applied Gaussian blur successfully\"\n\"\"\"\n ],\n )\n\n\ndef main():\n mcp.run()\n\n\nif __name__ == \"__main__\":\n main()\n";
4
+ export declare const GIMP_CLIENT_SOURCE = "#!/usr/bin/env python3\n# ---------------------------------------------------------------------------\n# gimp_mcp_client.py \u2014 vendored, USER-VERIFIED GIMP MCP client (FastMCP stdio).\n#\n# Derived from libreearth/gimp-mcp (GPL-3.0; see media/gimp/LICENSE) and fixed by\n# the user / AutoDev: reconnect via getpeername, reads > 1024 bytes, get_images.\n# Launched by: uv run --with mcp==1.2.0 <this file>. The body below is kept\n# byte-for-byte; the lines in THIS block are a provenance comment only.\n# ---------------------------------------------------------------------------\n\n# GIMP MCP Server Script\n# Provides an MCP interface to control GIMP via a socket connection.\n\nfrom mcp.server.fastmcp import FastMCP, Context\nimport socket\nimport json\nimport logging\n\nlogging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')\nlogger = logging.getLogger(\"GimpMCPServer\")\n\n\nclass GimpConnection:\n def __init__(self, host='127.0.0.1', port=9877):\n self.host = host\n self.port = port\n self.sock = None\n\n def close(self):\n if self.sock:\n try:\n self.sock.close()\n except Exception:\n pass\n self.sock = None\n\n def connect(self):\n if self.sock:\n try:\n self.sock.getpeername()\n return\n except Exception:\n self.close()\n try:\n sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n sock.settimeout(30)\n sock.connect((self.host, self.port))\n self.sock = sock\n logger.info(f\"Connected to GIMP at {self.host}:{self.port}\")\n except Exception as e:\n self.close()\n logger.error(f\"Failed to connect: {e}\")\n raise ConnectionError(\n \"Could not connect to GIMP. Open GIMP and run \"\n \"Filters > Development > Start MCP Server.\"\n )\n\n def send_command(self, command_type, params=None):\n self.connect()\n command = {\"type\": command_type, \"params\": params or {}}\n try:\n self.sock.sendall(json.dumps(command).encode('utf-8'))\n chunks = []\n while True:\n data = self.sock.recv(65536)\n if not data:\n break\n chunks.append(data)\n try:\n return json.loads(b''.join(chunks).decode('utf-8'))\n except json.JSONDecodeError:\n continue\n raise Exception(\"GIMP closed the connection before sending a complete response\")\n except Exception as e:\n logger.error(f\"Communication error: {e}\")\n self.close()\n raise Exception(f\"Error communicating with GIMP: {e}\")\n\n\n_gimp_connection = None\n\n\ndef get_gimp_connection():\n global _gimp_connection\n if _gimp_connection is None:\n _gimp_connection = GimpConnection()\n _gimp_connection.connect()\n return _gimp_connection\n\n\nmcp = FastMCP(\"GimpMCP\", description=\"GIMP integration through MCP\")\n\n\n@mcp.tool()\ndef call_api(ctx: Context, api_path: str, args: list = [], kwargs: dict = {}) -> str:\n \"\"\"Call any GIMP API method dynamically.\n\n Parameters:\n - api_path: The path to the API method (e.g., \"Gimp.Image.get_by_id\")\n Use \"exec\" to run Python inside GIMP. Pass the code in args[0].\n - args: List of positional arguments\n - kwargs: Dictionary of keyword arguments\n\n Returns:\n - JSON string of the result or error message\n \"\"\"\n try:\n conn = get_gimp_connection()\n result = conn.send_command(\"call_api\", {\"api_path\": api_path, \"args\": args, \"kwargs\": kwargs})\n if result[\"status\"] == \"success\":\n return json.dumps(result[\"result\"])\n return f\"Error: {result['message']}\"\n except Exception as e:\n return f\"Error: {e}\"\n\n\n@mcp.tool()\ndef list_images(ctx: Context) -> str:\n \"\"\"List all open images in GIMP.\n\n Returns:\n - JSON string of image IDs and names\n \"\"\"\n return call_api(ctx, \"Gimp.get_images\")\n\n\n@mcp.tool()\ndef get_image_info(ctx: Context, image_id: int) -> str:\n \"\"\"Get information about a specific image.\n\n Parameters:\n - image_id: The ID of the image\n\n Returns:\n - JSON string of image details\n \"\"\"\n return call_api(\n ctx,\n \"exec\",\n args=[\n f\"\"\"\nimage = Gimp.Image.get_by_id({int(image_id)})\nif image is None:\n _result = {{\"error\": \"image not found\"}}\nelse:\n _result = {{\n \"id\": image.get_id(),\n \"name\": image.get_name(),\n \"width\": image.get_width(),\n \"height\": image.get_height(),\n \"layers\": [{{\"id\": layer.get_id(), \"name\": layer.get_name()}} for layer in image.get_layers()],\n }}\n\"\"\"\n ],\n )\n\n\n@mcp.tool()\ndef apply_gaussian_blur(ctx: Context, image_id: int, radius: float = 5.0) -> str:\n \"\"\"Apply Gaussian blur to an image.\n\n Parameters:\n - image_id: The ID of the image\n - radius: Blur radius\n\n Returns:\n - Success message or error\n \"\"\"\n return call_api(\n ctx,\n \"exec\",\n args=[\n f\"\"\"\nimage = Gimp.Image.get_by_id({int(image_id)})\nif image is None:\n _result = \"image not found\"\nelse:\n layers = image.get_layers()\n if not layers:\n _result = \"no layers\"\n else:\n drawable = layers[0]\n blur = Gimp.DrawableFilter.new(drawable, \"gegl:gaussian-blur\", \"\")\n cfg = blur.get_config()\n try:\n cfg.set_property(\"std-dev-x\", {float(radius)})\n cfg.set_property(\"std-dev-y\", {float(radius)})\n except Exception:\n pass\n drawable.append_filter(blur)\n drawable.merge_filter(blur)\n Gimp.displays_flush()\n _result = \"Applied Gaussian blur successfully\"\n\"\"\"\n ],\n )\n\n\ndef main():\n mcp.run()\n\n\nif __name__ == \"__main__\":\n main()\n";
@@ -11,7 +11,7 @@
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.GIMP_CLIENT_SOURCE = exports.GIMP_CLIENT_SOURCE_HASH = void 0;
13
13
  /** sha256 (first 12 hex) of the canonical media/gimp/gimp_mcp_client.py. */
14
- exports.GIMP_CLIENT_SOURCE_HASH = "03f3cfe6c80a";
14
+ exports.GIMP_CLIENT_SOURCE_HASH = "a11b5a3693a8";
15
15
  /** Full body of the user-verified GIMP MCP client (FastMCP stdio) (media/gimp/gimp_mcp_client.py). */
16
16
  exports.GIMP_CLIENT_SOURCE = `#!/usr/bin/env python3
17
17
  # ---------------------------------------------------------------------------
@@ -36,7 +36,7 @@ logger = logging.getLogger("GimpMCPServer")
36
36
 
37
37
 
38
38
  class GimpConnection:
39
- def __init__(self, host='127.0.0.1', port=9876):
39
+ def __init__(self, host='127.0.0.1', port=9877):
40
40
  self.host = host
41
41
  self.port = port
42
42
  self.sock = None
@@ -8,7 +8,7 @@
8
8
  // The plug-in is MENU-TRIGGERED (the user's verified flow): in GIMP the user runs
9
9
  // Tools → MCP → Start MCP Server (or Filters → Development → Start MCP Server) and
10
10
  // keeps the "GIMP MCP Server" window open — that holds the out-of-process plug-in
11
- // alive and the :9876 socket. We do NOT auto-start it (the PERSISTENT approach we
11
+ // alive and the :9877 socket. We do NOT auto-start it (the PERSISTENT approach we
12
12
  // tried did not work on GIMP 3.2); we only install the files.
13
13
  //
14
14
  // GROUNDED RULES (see AutoDev research):
@@ -1,4 +1,4 @@
1
1
  /** sha256 (first 12 hex) of the canonical media/gimp/gimp_mcp_server.py. */
2
- export declare const GIMP_PLUGIN_SOURCE_HASH = "e9f5d21b82f7";
2
+ export declare const GIMP_PLUGIN_SOURCE_HASH = "882fdb94b5c9";
3
3
  /** Full body of the user-verified GIMP 3.x MCP server plug-in (media/gimp/gimp_mcp_server.py). */
4
- export declare const GIMP_PLUGIN_SOURCE = "#!/usr/bin/env python3\n# ---------------------------------------------------------------------------\n# gimp_mcp_server.py \u2014 vendored, USER-VERIFIED GIMP 3.2 MCP bridge (plug-in).\n#\n# Derived from libreearth/gimp-mcp (GPL-3.0; see media/gimp/LICENSE) and fixed by\n# the user / AutoDev for GIMP 3.2 (Store / MSIX). Verified working on real GIMP\n# 3.2.44: a menu-triggered PLUGIN (Tools -> MCP / Filters -> Development -> Start\n# MCP Server) that listens on 127.0.0.1:9876 and drives GIMP. Keep the \"GIMP MCP\n# Server\" window open \u2014 GLib.MainLoop() holds the out-of-process plug-in alive.\n#\n# This is the user's verified file; the body below is kept byte-for-byte. The\n# lines in THIS block are a provenance comment only \u2014 do not edit the code below.\n# ---------------------------------------------------------------------------\n\n# GIMP MCP Server Plugin (GIMP 3.2)\n# Listens on localhost:9876 so the libreearth gimp-mcp client can drive GIMP.\n\nimport gi\ngi.require_version('Gimp', '3.0')\nfrom gi.repository import Gimp\nfrom gi.repository import GLib\nfrom gi.repository import Gio\nfrom gi.repository import GObject\n\nimport io\nimport json\nimport os\nimport socket\nimport sys\nimport threading\nimport traceback\n\nHOST = '127.0.0.1'\nPORT = 9876\n# Store GIMP redirects GLib config dir into the MSIX LocalCache. Also write\n# to the real roaming profile so the log is findable.\n_LOG_PATHS = [\n os.path.join(GLib.get_user_config_dir(), 'GIMP', '3.2', 'gimp_mcp_server.log'),\n os.path.join(os.environ.get('APPDATA', ''), 'GIMP', '3.2', 'gimp_mcp_server.log'),\n]\n\n_server_lock = threading.Lock()\n_server_started = False\n_exec_globals = None\n_main_loop = None\n\n\ndef _log(msg):\n line = msg.rstrip() + '\\n'\n for path in _LOG_PATHS:\n if not path:\n continue\n try:\n os.makedirs(os.path.dirname(path), exist_ok=True)\n with open(path, 'a', encoding='utf-8') as fh:\n fh.write(line)\n except Exception:\n pass\n print(msg, flush=True)\n\n\ndef N_(message):\n return message\n\n\ndef _(message):\n return GLib.dgettext(None, message)\n\n\ndef _serialize(obj):\n if obj is None or isinstance(obj, (str, int, float, bool)):\n return obj\n if isinstance(obj, (list, tuple)):\n return [_serialize(item) for item in obj]\n if isinstance(obj, dict):\n return {str(k): _serialize(v) for k, v in obj.items()}\n data = {'type': obj.__class__.__name__}\n if hasattr(obj, 'get_id'):\n try:\n data['id'] = int(obj.get_id())\n except Exception:\n pass\n elif hasattr(obj, 'ID'):\n data['id'] = obj.ID\n if hasattr(obj, 'get_name'):\n try:\n data['name'] = obj.get_name()\n except Exception:\n pass\n if 'id' not in data and len(data) == 1:\n return str(obj)\n return data\n\n\ndef _resolve_api(api_path):\n parts = [p for p in str(api_path).split('.') if p]\n if parts and parts[0] == 'Gimp':\n parts = parts[1:]\n elif len(parts) >= 3 and parts[0] == 'gi' and parts[1] == 'repository' and parts[2] == 'Gimp':\n parts = parts[3:]\n\n aliases = {\n 'list_images': 'get_images',\n 'list_fonts': 'get_fonts',\n 'fonts_get_list': 'get_fonts',\n }\n\n if not parts:\n return Gimp\n\n obj = Gimp\n for part in parts:\n part = aliases.get(part, part)\n obj = getattr(obj, part)\n return obj\n\n\ndef _exec_namespace():\n global _exec_globals\n if _exec_globals is None:\n ns = {\n '__builtins__': __builtins__,\n '__name__': '__main__',\n 'Gimp': Gimp,\n 'GLib': GLib,\n 'Gio': Gio,\n 'GObject': GObject,\n 'sys': sys,\n 'os': os,\n 'json': json,\n }\n try:\n gi.require_version('Gegl', '0.4')\n from gi.repository import Gegl\n ns['Gegl'] = Gegl\n except Exception as exc:\n _log(f'Gegl import failed: {exc}')\n try:\n gi.require_version('Babl', '0.1')\n from gi.repository import Babl\n ns['Babl'] = Babl\n except Exception:\n pass\n _exec_globals = ns\n return _exec_globals\n\n\ndef _extract_code(args, kwargs):\n if kwargs.get('code'):\n return str(kwargs['code'])\n if not args:\n return ''\n if len(args) >= 2 and args[0] in ('exec', 'eval', 'pyGObject-console'):\n payload = args[1]\n if isinstance(payload, (list, tuple)):\n return '\\n'.join(str(item) for item in payload)\n return str(payload)\n if isinstance(args[0], (list, tuple)):\n return '\\n'.join(str(item) for item in args[0])\n return str(args[0])\n\n\ndef _run_python(code):\n ns = _exec_namespace()\n stdout = io.StringIO()\n old_stdout = sys.stdout\n sys.stdout = stdout\n try:\n exec(code, ns)\n finally:\n sys.stdout = old_stdout\n printed = stdout.getvalue()\n result = ns.get('_result')\n if result is not None:\n return {'printed': printed, 'result': _serialize(result)}\n return {'printed': printed, 'result': None}\n\n\nclass MCPPlugin(Gimp.PlugIn):\n def do_set_i18n(self, name):\n return False\n\n def do_query_procedures(self):\n return ['plug-in-mcp-server']\n\n def do_create_procedure(self, name):\n procedure = Gimp.Procedure.new(\n self, name, Gimp.PDBProcType.PLUGIN, self.run, None\n )\n procedure.set_menu_label(_('Start MCP Server'))\n procedure.set_documentation(\n _('Starts an MCP server to control GIMP externally'),\n _('Listens on 127.0.0.1:9876 for the GIMP MCP client'),\n name,\n )\n procedure.set_attribution('GIMP MCP', 'GIMP MCP', '2026')\n procedure.set_sensitivity_mask(Gimp.ProcedureSensitivityMask.ALWAYS)\n procedure.add_enum_argument(\n 'run-mode',\n _('Run mode'),\n _('The run mode'),\n Gimp.RunMode,\n Gimp.RunMode.INTERACTIVE,\n GObject.ParamFlags.READWRITE,\n )\n procedure.add_menu_path('<Image>/Tools/MCP')\n procedure.add_menu_path('<Image>/Filters/Development/')\n return procedure\n\n def run(self, procedure, config, data):\n global _main_loop\n started, message = self.ensure_server()\n _log(message)\n if not started:\n return procedure.new_return_values(Gimp.PDBStatusType.EXECUTION_ERROR, GLib.Error(message))\n\n # GIMP 3 launches Python plug-ins out of process. Returning from run()\n # would exit that process and kill the socket thread. Stay alive and\n # dispatch GLib.idle_add work (API calls) on this main loop.\n # A visible window is required: otherwise \"Start MCP Server\" looks like\n # it did not open anything.\n try:\n self._show_status_window(message)\n except Exception as exc:\n _log(f'Status window failed: {exc}\\n{traceback.format_exc()}')\n\n _main_loop = GLib.MainLoop()\n _log('Entering GLib.MainLoop to keep MCP server process alive')\n try:\n _main_loop.run()\n except Exception as exc:\n _log(f'MainLoop exited: {exc}')\n return procedure.new_return_values(Gimp.PDBStatusType.SUCCESS, GLib.Error())\n\n def _show_status_window(self, message):\n gi.require_version('Gtk', '3.0')\n gi.require_version('GimpUi', '3.0')\n from gi.repository import Gtk\n from gi.repository import GimpUi\n\n GimpUi.init('gimp_mcp_server.py')\n window = Gtk.Window(title='GIMP MCP Server')\n window.set_default_size(360, 120)\n window.set_keep_above(False)\n window.set_skip_taskbar_hint(False)\n box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=8)\n box.set_border_width(16)\n label = Gtk.Label(label=message + '\\nLeave this window open.')\n label.set_line_wrap(True)\n box.pack_start(label, True, True, 0)\n button = Gtk.Button(label='Stop server')\n button.connect('clicked', lambda *_: window.destroy())\n box.pack_start(button, False, False, 0)\n window.add(box)\n window.connect('destroy', self._on_status_closed)\n window.show_all()\n _log('Status window opened')\n\n def _on_status_closed(self, *_args):\n global _main_loop\n _log('Status window closed; stopping MCP server')\n if _main_loop is not None:\n _main_loop.quit()\n\n def ensure_server(self):\n global _server_started\n with _server_lock:\n if _server_started:\n return True, f'MCP Server already listening on {HOST}:{PORT}'\n try:\n thread = threading.Thread(target=self.start_server, daemon=True)\n thread.start()\n _server_started = True\n return True, f'MCP Server started on {HOST}:{PORT}'\n except Exception as exc:\n return False, f'Failed to start MCP Server: {exc}'\n\n def start_server(self):\n sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)\n try:\n sock.bind((HOST, PORT))\n sock.listen(8)\n _log(f'Server listening on {HOST}:{PORT}')\n except Exception as exc:\n _log(f'Bind/listen failed: {exc}')\n return\n\n while True:\n try:\n client, addr = sock.accept()\n _log(f'Connected to {addr}')\n threading.Thread(target=self.handle_client, args=(client,), daemon=True).start()\n except Exception as exc:\n _log(f'Server accept error: {exc}')\n break\n sock.close()\n\n def handle_client(self, client):\n buffer = b''\n try:\n client.settimeout(120)\n while True:\n chunk = client.recv(65536)\n if not chunk:\n break\n buffer += chunk\n while buffer:\n try:\n command = json.loads(buffer.decode('utf-8'))\n buffer = b''\n except json.JSONDecodeError:\n break\n GLib.idle_add(self.execute_command, command, client)\n except Exception as exc:\n _log(f'Client error: {exc}')\n finally:\n try:\n client.close()\n except Exception:\n pass\n\n def execute_command(self, command, client):\n cmd_type = command.get('type')\n params = command.get('params', {}) or {}\n try:\n if cmd_type == 'ping':\n response = {'status': 'success', 'result': 'pong'}\n elif cmd_type == 'exec':\n code = _extract_code(params.get('args', []), params.get('kwargs', {}))\n if not code:\n code = str(params.get('code', ''))\n response = {'status': 'success', 'result': _run_python(code)}\n elif cmd_type == 'call_api':\n api_path = params.get('api_path', '')\n args = params.get('args', []) or []\n kwargs = params.get('kwargs', {}) or {}\n if api_path in ('exec', 'eval', '__exec__'):\n response = {'status': 'success', 'result': _run_python(_extract_code(args, kwargs))}\n else:\n method = _resolve_api(api_path)\n result = method(*args, **kwargs)\n response = {'status': 'success', 'result': _serialize(result)}\n else:\n response = {'status': 'error', 'message': f'Unknown command: {cmd_type}'}\n except Exception as exc:\n response = {\n 'status': 'error',\n 'message': str(exc),\n 'traceback': traceback.format_exc(),\n }\n _log(f'Command error: {response[\"message\"]}\\n{response[\"traceback\"]}')\n\n try:\n payload = json.dumps(response).encode('utf-8')\n client.sendall(payload)\n except Exception as exc:\n _log(f'Response send failed: {exc}')\n return False\n\n\nGimp.main(MCPPlugin.__gtype__, sys.argv)\n";
4
+ export declare const GIMP_PLUGIN_SOURCE = "#!/usr/bin/env python3\n# ---------------------------------------------------------------------------\n# gimp_mcp_server.py \u2014 vendored, USER-VERIFIED GIMP 3.2 MCP bridge (plug-in).\n#\n# Derived from libreearth/gimp-mcp (GPL-3.0; see media/gimp/LICENSE) and fixed by\n# the user / AutoDev for GIMP 3.2 (Store / MSIX). Verified working on real GIMP\n# 3.2.44: a menu-triggered PLUGIN (Tools -> MCP / Filters -> Development -> Start\n# MCP Server) that listens on 127.0.0.1:9877 and drives GIMP. Keep the \"GIMP MCP\n# Server\" window open \u2014 GLib.MainLoop() holds the out-of-process plug-in alive.\n#\n# This is the user's verified file; the body below is kept byte-for-byte. The\n# lines in THIS block are a provenance comment only \u2014 do not edit the code below.\n# ---------------------------------------------------------------------------\n\n# GIMP MCP Server Plugin (GIMP 3.2)\n# Listens on localhost:9877 so it does not collide with Blender MCP (9876).\n\nimport gi\ngi.require_version('Gimp', '3.0')\nfrom gi.repository import Gimp\nfrom gi.repository import GLib\nfrom gi.repository import Gio\nfrom gi.repository import GObject\n\nimport io\nimport json\nimport os\nimport socket\nimport sys\nimport threading\nimport traceback\n\nHOST = '127.0.0.1'\nPORT = 9877\n# Store GIMP redirects GLib config dir into the MSIX LocalCache. Also write\n# to the real roaming profile so the log is findable.\n_LOG_PATHS = [\n os.path.join(GLib.get_user_config_dir(), 'GIMP', '3.2', 'gimp_mcp_server.log'),\n os.path.join(os.environ.get('APPDATA', ''), 'GIMP', '3.2', 'gimp_mcp_server.log'),\n]\n\n_server_lock = threading.Lock()\n_server_started = False\n_exec_globals = None\n_main_loop = None\n\n\ndef _log(msg):\n line = msg.rstrip() + '\\n'\n for path in _LOG_PATHS:\n if not path:\n continue\n try:\n os.makedirs(os.path.dirname(path), exist_ok=True)\n with open(path, 'a', encoding='utf-8') as fh:\n fh.write(line)\n except Exception:\n pass\n print(msg, flush=True)\n\n\ndef N_(message):\n return message\n\n\ndef _(message):\n return GLib.dgettext(None, message)\n\n\ndef _serialize(obj):\n if obj is None or isinstance(obj, (str, int, float, bool)):\n return obj\n if isinstance(obj, (list, tuple)):\n return [_serialize(item) for item in obj]\n if isinstance(obj, dict):\n return {str(k): _serialize(v) for k, v in obj.items()}\n data = {'type': obj.__class__.__name__}\n if hasattr(obj, 'get_id'):\n try:\n data['id'] = int(obj.get_id())\n except Exception:\n pass\n elif hasattr(obj, 'ID'):\n data['id'] = obj.ID\n if hasattr(obj, 'get_name'):\n try:\n data['name'] = obj.get_name()\n except Exception:\n pass\n if 'id' not in data and len(data) == 1:\n return str(obj)\n return data\n\n\ndef _resolve_api(api_path):\n parts = [p for p in str(api_path).split('.') if p]\n if parts and parts[0] == 'Gimp':\n parts = parts[1:]\n elif len(parts) >= 3 and parts[0] == 'gi' and parts[1] == 'repository' and parts[2] == 'Gimp':\n parts = parts[3:]\n\n aliases = {\n 'list_images': 'get_images',\n 'list_fonts': 'get_fonts',\n 'fonts_get_list': 'get_fonts',\n }\n\n if not parts:\n return Gimp\n\n obj = Gimp\n for part in parts:\n part = aliases.get(part, part)\n obj = getattr(obj, part)\n return obj\n\n\ndef _exec_namespace():\n global _exec_globals\n if _exec_globals is None:\n ns = {\n '__builtins__': __builtins__,\n '__name__': '__main__',\n 'Gimp': Gimp,\n 'GLib': GLib,\n 'Gio': Gio,\n 'GObject': GObject,\n 'sys': sys,\n 'os': os,\n 'json': json,\n }\n try:\n gi.require_version('Gegl', '0.4')\n from gi.repository import Gegl\n ns['Gegl'] = Gegl\n except Exception as exc:\n _log(f'Gegl import failed: {exc}')\n try:\n gi.require_version('Babl', '0.1')\n from gi.repository import Babl\n ns['Babl'] = Babl\n except Exception:\n pass\n _exec_globals = ns\n return _exec_globals\n\n\ndef _extract_code(args, kwargs):\n if kwargs.get('code'):\n return str(kwargs['code'])\n if not args:\n return ''\n if len(args) >= 2 and args[0] in ('exec', 'eval', 'pyGObject-console'):\n payload = args[1]\n if isinstance(payload, (list, tuple)):\n return '\\n'.join(str(item) for item in payload)\n return str(payload)\n if isinstance(args[0], (list, tuple)):\n return '\\n'.join(str(item) for item in args[0])\n return str(args[0])\n\n\ndef _run_python(code):\n ns = _exec_namespace()\n stdout = io.StringIO()\n old_stdout = sys.stdout\n sys.stdout = stdout\n try:\n exec(code, ns)\n finally:\n sys.stdout = old_stdout\n printed = stdout.getvalue()\n result = ns.get('_result')\n if result is not None:\n return {'printed': printed, 'result': _serialize(result)}\n return {'printed': printed, 'result': None}\n\n\nclass MCPPlugin(Gimp.PlugIn):\n def do_set_i18n(self, name):\n return False\n\n def do_query_procedures(self):\n return ['plug-in-mcp-server']\n\n def do_create_procedure(self, name):\n procedure = Gimp.Procedure.new(\n self, name, Gimp.PDBProcType.PLUGIN, self.run, None\n )\n procedure.set_menu_label(_('Start MCP Server'))\n procedure.set_documentation(\n _('Starts an MCP server to control GIMP externally'),\n _('Listens on 127.0.0.1:9877 for the GIMP MCP client'),\n name,\n )\n procedure.set_attribution('GIMP MCP', 'GIMP MCP', '2026')\n procedure.set_sensitivity_mask(Gimp.ProcedureSensitivityMask.ALWAYS)\n procedure.add_enum_argument(\n 'run-mode',\n _('Run mode'),\n _('The run mode'),\n Gimp.RunMode,\n Gimp.RunMode.INTERACTIVE,\n GObject.ParamFlags.READWRITE,\n )\n procedure.add_menu_path('<Image>/Tools/MCP')\n procedure.add_menu_path('<Image>/Filters/Development/')\n return procedure\n\n def run(self, procedure, config, data):\n global _main_loop\n started, message = self.ensure_server()\n _log(message)\n if not started:\n return procedure.new_return_values(Gimp.PDBStatusType.EXECUTION_ERROR, GLib.Error(message))\n\n # GIMP 3 launches Python plug-ins out of process. Returning from run()\n # would exit that process and kill the socket thread. Stay alive and\n # dispatch GLib.idle_add work (API calls) on this main loop.\n # A visible window is required: otherwise \"Start MCP Server\" looks like\n # it did not open anything.\n try:\n self._show_status_window(message)\n except Exception as exc:\n _log(f'Status window failed: {exc}\\n{traceback.format_exc()}')\n\n _main_loop = GLib.MainLoop()\n _log('Entering GLib.MainLoop to keep MCP server process alive')\n try:\n _main_loop.run()\n except Exception as exc:\n _log(f'MainLoop exited: {exc}')\n return procedure.new_return_values(Gimp.PDBStatusType.SUCCESS, GLib.Error())\n\n def _show_status_window(self, message):\n gi.require_version('Gtk', '3.0')\n gi.require_version('GimpUi', '3.0')\n from gi.repository import Gtk\n from gi.repository import GimpUi\n\n GimpUi.init('gimp_mcp_server.py')\n window = Gtk.Window(title='GIMP MCP Server')\n window.set_default_size(360, 120)\n window.set_keep_above(False)\n window.set_skip_taskbar_hint(False)\n box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=8)\n box.set_border_width(16)\n label = Gtk.Label(label=message + '\\nLeave this window open.')\n label.set_line_wrap(True)\n box.pack_start(label, True, True, 0)\n button = Gtk.Button(label='Stop server')\n button.connect('clicked', lambda *_: window.destroy())\n box.pack_start(button, False, False, 0)\n window.add(box)\n window.connect('destroy', self._on_status_closed)\n window.show_all()\n _log('Status window opened')\n\n def _on_status_closed(self, *_args):\n global _main_loop\n _log('Status window closed; stopping MCP server')\n if _main_loop is not None:\n _main_loop.quit()\n\n def ensure_server(self):\n global _server_started\n with _server_lock:\n if _server_started:\n return True, f'MCP Server already listening on {HOST}:{PORT}'\n try:\n thread = threading.Thread(target=self.start_server, daemon=True)\n thread.start()\n _server_started = True\n return True, f'MCP Server started on {HOST}:{PORT}'\n except Exception as exc:\n return False, f'Failed to start MCP Server: {exc}'\n\n def start_server(self):\n sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)\n try:\n sock.bind((HOST, PORT))\n sock.listen(8)\n _log(f'Server listening on {HOST}:{PORT}')\n except Exception as exc:\n _log(f'Bind/listen failed: {exc}')\n return\n\n while True:\n try:\n client, addr = sock.accept()\n _log(f'Connected to {addr}')\n threading.Thread(target=self.handle_client, args=(client,), daemon=True).start()\n except Exception as exc:\n _log(f'Server accept error: {exc}')\n break\n sock.close()\n\n def handle_client(self, client):\n buffer = b''\n try:\n client.settimeout(120)\n while True:\n chunk = client.recv(65536)\n if not chunk:\n break\n buffer += chunk\n while buffer:\n try:\n command = json.loads(buffer.decode('utf-8'))\n buffer = b''\n except json.JSONDecodeError:\n break\n GLib.idle_add(self.execute_command, command, client)\n except Exception as exc:\n _log(f'Client error: {exc}')\n finally:\n try:\n client.close()\n except Exception:\n pass\n\n def execute_command(self, command, client):\n cmd_type = command.get('type')\n params = command.get('params', {}) or {}\n try:\n if cmd_type == 'ping':\n response = {'status': 'success', 'result': 'pong'}\n elif cmd_type == 'exec':\n code = _extract_code(params.get('args', []), params.get('kwargs', {}))\n if not code:\n code = str(params.get('code', ''))\n response = {'status': 'success', 'result': _run_python(code)}\n elif cmd_type == 'call_api':\n api_path = params.get('api_path', '')\n args = params.get('args', []) or []\n kwargs = params.get('kwargs', {}) or {}\n if api_path in ('exec', 'eval', '__exec__'):\n response = {'status': 'success', 'result': _run_python(_extract_code(args, kwargs))}\n else:\n method = _resolve_api(api_path)\n result = method(*args, **kwargs)\n response = {'status': 'success', 'result': _serialize(result)}\n else:\n response = {'status': 'error', 'message': f'Unknown command: {cmd_type}'}\n except Exception as exc:\n response = {\n 'status': 'error',\n 'message': str(exc),\n 'traceback': traceback.format_exc(),\n }\n _log(f'Command error: {response[\"message\"]}\\n{response[\"traceback\"]}')\n\n try:\n payload = json.dumps(response).encode('utf-8')\n client.sendall(payload)\n except Exception as exc:\n _log(f'Response send failed: {exc}')\n return False\n\n\nGimp.main(MCPPlugin.__gtype__, sys.argv)\n";
@@ -11,7 +11,7 @@
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.GIMP_PLUGIN_SOURCE = exports.GIMP_PLUGIN_SOURCE_HASH = void 0;
13
13
  /** sha256 (first 12 hex) of the canonical media/gimp/gimp_mcp_server.py. */
14
- exports.GIMP_PLUGIN_SOURCE_HASH = "e9f5d21b82f7";
14
+ exports.GIMP_PLUGIN_SOURCE_HASH = "882fdb94b5c9";
15
15
  /** Full body of the user-verified GIMP 3.x MCP server plug-in (media/gimp/gimp_mcp_server.py). */
16
16
  exports.GIMP_PLUGIN_SOURCE = `#!/usr/bin/env python3
17
17
  # ---------------------------------------------------------------------------
@@ -20,7 +20,7 @@ exports.GIMP_PLUGIN_SOURCE = `#!/usr/bin/env python3
20
20
  # Derived from libreearth/gimp-mcp (GPL-3.0; see media/gimp/LICENSE) and fixed by
21
21
  # the user / AutoDev for GIMP 3.2 (Store / MSIX). Verified working on real GIMP
22
22
  # 3.2.44: a menu-triggered PLUGIN (Tools -> MCP / Filters -> Development -> Start
23
- # MCP Server) that listens on 127.0.0.1:9876 and drives GIMP. Keep the "GIMP MCP
23
+ # MCP Server) that listens on 127.0.0.1:9877 and drives GIMP. Keep the "GIMP MCP
24
24
  # Server" window open — GLib.MainLoop() holds the out-of-process plug-in alive.
25
25
  #
26
26
  # This is the user's verified file; the body below is kept byte-for-byte. The
@@ -28,7 +28,7 @@ exports.GIMP_PLUGIN_SOURCE = `#!/usr/bin/env python3
28
28
  # ---------------------------------------------------------------------------
29
29
 
30
30
  # GIMP MCP Server Plugin (GIMP 3.2)
31
- # Listens on localhost:9876 so the libreearth gimp-mcp client can drive GIMP.
31
+ # Listens on localhost:9877 so it does not collide with Blender MCP (9876).
32
32
 
33
33
  import gi
34
34
  gi.require_version('Gimp', '3.0')
@@ -46,7 +46,7 @@ import threading
46
46
  import traceback
47
47
 
48
48
  HOST = '127.0.0.1'
49
- PORT = 9876
49
+ PORT = 9877
50
50
  # Store GIMP redirects GLib config dir into the MSIX LocalCache. Also write
51
51
  # to the real roaming profile so the log is findable.
52
52
  _LOG_PATHS = [
@@ -205,7 +205,7 @@ class MCPPlugin(Gimp.PlugIn):
205
205
  procedure.set_menu_label(_('Start MCP Server'))
206
206
  procedure.set_documentation(
207
207
  _('Starts an MCP server to control GIMP externally'),
208
- _('Listens on 127.0.0.1:9876 for the GIMP MCP client'),
208
+ _('Listens on 127.0.0.1:9877 for the GIMP MCP client'),
209
209
  name,
210
210
  )
211
211
  procedure.set_attribution('GIMP MCP', 'GIMP MCP', '2026')
@@ -160,9 +160,9 @@ function getCatalog(platform) {
160
160
  prerequisites: [{ id: 'uv', installHint: uvInstallHint(platform) }],
161
161
  postSetup: [
162
162
  `Plugin + client are installed automatically into your GIMP 3.x config (${gimpPluginDir(platform)}) — you copy nothing. Re-run any time with: autodev mcp gimp-install-plugin`,
163
- "In GIMP: Tools → MCP → Start MCP Server (or Filters → Development → Start MCP Server), and KEEP the 'GIMP MCP Server' window open — it holds the plug-in process alive and the :9876 socket. One click per GIMP session (the window may hide behind other apps; use the taskbar).",
163
+ "In GIMP: Tools → MCP → Start MCP Server (or Filters → Development → Start MCP Server), and KEEP the 'GIMP MCP Server' window open — it holds the plug-in process alive and the :9877 socket. One click per GIMP session (the window may hide behind other apps; use the taskbar).",
164
164
  'Requires GIMP 3.x (the plugin uses the GIMP 3.0 Python API).',
165
- "Port 9876 collides with Blender — don't run both MCP servers at once.",
165
+ 'GIMP MCP uses port 9877; Blender uses 9876, so they no longer collide and can run together.',
166
166
  ],
167
167
  notes: [
168
168
  `Log: ${gimpLogPath(platform)} (Store/MSIX GIMP also mirrors a copy inside its sandbox LocalCache).`,
@@ -1 +1 @@
1
- {"version":3,"file":"mcpCatalog.js","sourceRoot":"","sources":["../../src/core/mcpCatalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcpCatalog.js","sourceRoot":"","sources":["../../src/core/mcpCatalog.ts"],"names":[],"mappings":"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"}
package/out/dispatcher.js CHANGED
@@ -122,6 +122,13 @@ showOutput) {
122
122
  ]) {
123
123
  ensureProjectGitignore(root, entry);
124
124
  }
125
+ // Test/tool artifact output dirs — junk written by QA swarms, Playwright MCP,
126
+ // and test runners; never source. Keep conservative: only artifact dirs.
127
+ for (const entry of [
128
+ '.playwright-mcp/', 'qa/', 'test-results/', 'playwright-report/',
129
+ ]) {
130
+ ensureProjectGitignore(root, entry);
131
+ }
125
132
  const settings = (0, settingsLoader_1.loadSettingsForRoot)(root);
126
133
  // Ensure the OpenCode hooks plugin is installed for opencode providers when
127
134
  // hooks are enabled. Without it, opencode emits only the synthetic
@@ -1 +1 @@
1
- {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../src/dispatcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../src/dispatcher.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autodev-cli",
3
- "version": "1.4.153",
3
+ "version": "1.4.155",
4
4
  "description": "AutoAIDev CLI — autonomous AI task loop with VS Code / Cursor launcher",
5
5
  "author": "Peter Ivanov <peter@microweber.com>",
6
6
  "license": "MIT",