Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
87bc111
chore: bootstrap quality gates, CI, and planner handoff
Aug 2, 2026
137390b
docs: align planner-handoff with 28-track product roadmap
Aug 2, 2026
4f73ae3
chore(0002): quality surface stabilization
Ryan-AI-Studios Aug 2, 2026
5ef2f93
feat(security): 0003 SecurityHardening — auth, loopback, exec off, pa…
Ryan-AI-Studios Aug 2, 2026
5303f0f
feat(snapshot): 0004 VisibleCompositeSnapshot — Issue 17 composite + …
Ryan-AI-Studios Aug 2, 2026
bc3fbc4
docs(0004): mark VisibleCompositeSnapshot complete in planner handoff
Aug 2, 2026
0584ace
fix(export): 0005 AlphaExportCorrectness — Issue 16 transparent PNG (#4)
Ryan-AI-Studios Aug 2, 2026
718b2bb
feat(orient): 0006 StateManifestOrientation — orient_workspace v1 (#5)
Ryan-AI-Studios Aug 2, 2026
5407661
docs(0006): mark StateManifestOrientation complete in planner handoff
Aug 2, 2026
33df2b5
feat(handles): 0007 StableHandleRegistry — generation, STALE_HANDLE, …
Ryan-AI-Studios Aug 2, 2026
beb5988
docs(0007): mark StableHandleRegistry complete in planner handoff (#7)
Ryan-AI-Studios Aug 2, 2026
8970ad2
feat(coords): 0008 CoordinateModelAndExif — mapping, normalize, map_*…
Ryan-AI-Studios Aug 2, 2026
dba47db
docs(0008): mark CoordinateModelAndExif complete in planner handoff (#9)
Ryan-AI-Studios Aug 2, 2026
25e93ba
feat(policy): 0009 LayerPolicyAndCheckpoints — Source_Immutable, chec…
Ryan-AI-Studios Aug 2, 2026
8938ecf
docs(0009): mark LayerPolicyAndCheckpoints complete in planner handof…
Ryan-AI-Studios Aug 2, 2026
ee606bc
feat(mcp): 0010 HighLevelMcpSurface — default ~18 HL tools on real Fa…
Ryan-AI-Studios Aug 3, 2026
84e6fdc
docs(0010): mark HighLevelMcpSurface complete in planner handoff (#13)
Ryan-AI-Studios Aug 3, 2026
b9d1d23
feat(mcp): 0011 StructuredErrorsAndAudit — ToolError envelope + reque…
Ryan-AI-Studios Aug 3, 2026
0552abe
docs(0011): mark StructuredErrorsAndAudit complete in planner handoff…
Ryan-AI-Studios Aug 3, 2026
691aaa9
feat(cli): 0012 DeterministicCliSidecar — gimp-agent doctor/probe/exi…
Ryan-AI-Studios Aug 3, 2026
a801ae8
docs(0012): mark DeterministicCliSidecar complete in planner handoff …
Ryan-AI-Studios Aug 3, 2026
5763a69
feat(0013): AtomicSaveExport — temp+replace, collision, CLI save-xcf/…
Ryan-AI-Studios Aug 3, 2026
cee68ca
docs(0013): mark AtomicSaveExport complete in planner handoff (#19)
Ryan-AI-Studios Aug 3, 2026
00cc49a
feat(0014): PixelVerificationProtocol — stdlib metrics, HL 20, host-o…
Ryan-AI-Studios Aug 4, 2026
ea40d7e
docs(0014): mark PixelVerificationProtocol complete in planner handof…
Ryan-AI-Studios Aug 4, 2026
51adaeb
feat(0015): RecipeLibrary — versioned recipes, HL 22, CLI run/batch (…
Ryan-AI-Studios Aug 4, 2026
ca3953c
docs(0015): mark RecipeLibrary complete in planner handoff (#23)
Ryan-AI-Studios Aug 4, 2026
6bb8c9f
feat(0016): NDE DrawableFilter tools — apply/edit/remove, orient filt…
Ryan-AI-Studios Aug 4, 2026
33c9503
docs(0016): record PR #24 merge SHA in planner handoff
Aug 4, 2026
7513a7d
feat(0017): pure gimp_mcp_tx + packaging ship #10
Aug 4, 2026
c713363
feat(0017): plugin agent TX stack begin/end/rollback + TX codes
Aug 4, 2026
62d5755
feat(0017): envelope rollback_available + host forward + HL 28
Aug 4, 2026
a1441a4
fix(0017): stamp rollback on mid-TX errors; reap layer_handle; partia…
Aug 4, 2026
c627066
fix(0017): treat undo False as rollback failure; no host hint on TCP …
Aug 4, 2026
6e7afd7
fix(0017): clear host TX hints on close_image image_index path; docst…
Aug 4, 2026
2e3ddfb
docs(0017): mark UndoGroupTransactions complete in planner handoff
Aug 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# Quality gates: ruff lint/format, basedpyright, pytest
# Node 20 is deprecated on Actions runners; prefer Node 24-native action major lines.
# See: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
name: CI

on:
push:
branches: [main]
pull_request:

permissions:
contents: read

concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

env:
# Prefer Node 24 runtime for JS actions while ecosystem finishes migration
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"

jobs:
quality:
name: Lint · Format · Types · Tests
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v7

- name: Install uv
uses: astral-sh/setup-uv@v9.0.0
with:
enable-cache: true

- name: Python toolchain
run: uv python install 3.13

- name: Sync project (incl. dev group)
run: uv sync --group dev

- name: Ruff lint
run: uv run ruff check .

- name: Ruff format check
run: uv run ruff format --check .

- name: Type check (basedpyright)
run: uv run basedpyright

- name: Pytest (unit / offline)
run: uv run pytest -m "not integration and not slow"
13 changes: 0 additions & 13 deletions .github/workflows/lint.yml

This file was deleted.

30 changes: 28 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,14 +1,40 @@
/.idea/
*.egg-info/
/__pycache__/
**/__pycache__/
.venv/
*.pyc
.pytest_cache/
.ruff_cache/
.mypy_cache/
.coverage
htmlcov/
dist/
build/
output/
*.xcf

# macOS
.DS_Store

# Claude Code working directory
/.claude/

# Generated test artifacts
/tests/continuous_edit_test/output/
# Generated live-script artifacts
/scripts/continuous_edit_test/output/

# --- Local agent / governance (not committed; personal orchestration) ---
.agents/
AGENTS.md
conductor/

# Ledgerful + AI-Brains local state / secrets
.ledgerful/
.env
.env.*
!.env.example

# Local Grok / IDE
.grok/
.vscode/
.cursor/
5 changes: 4 additions & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
# Ruff rev must stay aligned with pyproject.toml / CI (ruff==0.16.1 as of 2026-08-02)
# Local: ruff-check may --fix; CI runs check-only (no --fix) via ci.yml.
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.15.11
rev: v0.16.1
hooks:
- id: ruff-check
args: [--fix]
- id: ruff-format
9 changes: 5 additions & 4 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ This is a GIMP MCP (Model Context Protocol) integration that enables external co
## Architecture

The system uses a client-server architecture:
- GIMP Plugin creates a socket server (localhost:9877) that accepts Python-Fu commands
- GIMP Plugin creates a socket server (`127.0.0.1:9877`, session auth) — arbitrary Python-Fu/`cmds` disabled by default
- MCP Server connects to this socket and exposes a `call_api` tool for MCP clients
- Commands are executed in GIMP's Python-Fu environment with access to the full GIMP 3.2 API

Expand All @@ -32,10 +32,11 @@ path is shown in **Edit > Preferences > Folders > Plug-ins**. Base dirs per plat
BASE="$HOME/snap/gimp/current/.config/GIMP"
GIMP_DIR="$(ls -d "$BASE"/3.* 2>/dev/null | sort -V | tail -1)"
mkdir -p "$GIMP_DIR/plug-ins/gimp-mcp-plugin"
cp gimp-mcp-plugin.py "$GIMP_DIR/plug-ins/gimp-mcp-plugin/"
cp gimp-mcp-plugin.py gimp_mcp_security.py gimp_mcp_snapshot.py gimp_mcp_export.py \
"$GIMP_DIR/plug-ins/gimp-mcp-plugin/"
chmod +x "$GIMP_DIR/plug-ins/gimp-mcp-plugin/gimp-mcp-plugin.py"
```
Then start it from **Tools > MCP > Start MCP Server** in GIMP.
Copy all four files (`gimp-mcp-plugin.py`, `gimp_mcp_security.py`, `gimp_mcp_snapshot.py`, `gimp_mcp_export.py`) into the plug-ins folder; missing any helper fails closed at plugin import. Then start it from **Tools > MCP > Start MCP Server** in GIMP.

### MCP Server Configuration
Add to Claude Desktop config (`~/.config/Claude/claude_desktop_config.json`):
Expand Down Expand Up @@ -86,7 +87,7 @@ images = Gimp.get_images()
image = images[0] # or image1 = images[0]
layers = image.get_layers()
layer = layers[0] # or layer1 = layers[0]
drawable = layer # or drawable1 = layer
drawable = layer # or drawable1 = layer
```

### Common Operations
Expand Down
Loading