kritapilot 2026.11.8.36__tar.gz

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.

Potentially problematic release.


This version of kritapilot might be problematic. Click here for more details.

Files changed (140) hide show
  1. kritapilot-2026.11.8.36/.gitattributes +3 -0
  2. kritapilot-2026.11.8.36/.github/ISSUE_TEMPLATE/bug_report.yml +58 -0
  3. kritapilot-2026.11.8.36/.github/ISSUE_TEMPLATE/config.yml +11 -0
  4. kritapilot-2026.11.8.36/.github/ISSUE_TEMPLATE/feature_request.yml +31 -0
  5. kritapilot-2026.11.8.36/.github/PULL_REQUEST_TEMPLATE.md +13 -0
  6. kritapilot-2026.11.8.36/.github/workflows/ci.yml +53 -0
  7. kritapilot-2026.11.8.36/.github/workflows/release.yml +167 -0
  8. kritapilot-2026.11.8.36/.gitignore +19 -0
  9. kritapilot-2026.11.8.36/CHANGELOG.md +65 -0
  10. kritapilot-2026.11.8.36/CODE_OF_CONDUCT.md +25 -0
  11. kritapilot-2026.11.8.36/CONTRIBUTING.md +60 -0
  12. kritapilot-2026.11.8.36/LICENSE +21 -0
  13. kritapilot-2026.11.8.36/PKG-INFO +301 -0
  14. kritapilot-2026.11.8.36/README.md +247 -0
  15. kritapilot-2026.11.8.36/SECURITY.md +31 -0
  16. kritapilot-2026.11.8.36/docs/README.md +32 -0
  17. kritapilot-2026.11.8.36/docs/ai-backends.md +345 -0
  18. kritapilot-2026.11.8.36/docs/ai-chat.md +227 -0
  19. kritapilot-2026.11.8.36/docs/clients.md +75 -0
  20. kritapilot-2026.11.8.36/docs/development.md +102 -0
  21. kritapilot-2026.11.8.36/docs/images/ai-chat.png +0 -0
  22. kritapilot-2026.11.8.36/docs/images/galilee-dawn.jpg +0 -0
  23. kritapilot-2026.11.8.36/docs/images/social-preview.png +0 -0
  24. kritapilot-2026.11.8.36/docs/images/sunset.jpg +0 -0
  25. kritapilot-2026.11.8.36/docs/installation.md +69 -0
  26. kritapilot-2026.11.8.36/docs/krita-panel.md +107 -0
  27. kritapilot-2026.11.8.36/docs/krita-upstream.md +75 -0
  28. kritapilot-2026.11.8.36/docs/releasing.md +53 -0
  29. kritapilot-2026.11.8.36/docs/tools.md +735 -0
  30. kritapilot-2026.11.8.36/docs/undo-and-safety.md +54 -0
  31. kritapilot-2026.11.8.36/docs/workflows.md +92 -0
  32. kritapilot-2026.11.8.36/examples/README.md +13 -0
  33. kritapilot-2026.11.8.36/examples/galilee_dawn.py +348 -0
  34. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge/Manual.html +20 -0
  35. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge/__init__.py +14 -0
  36. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge/analysis.py +142 -0
  37. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge/autoupdate.py +150 -0
  38. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge/chat.py +1293 -0
  39. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge/controls.py +250 -0
  40. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge/dialogs.py +103 -0
  41. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge/dock.py +390 -0
  42. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge/extension.py +238 -0
  43. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge/extras.py +307 -0
  44. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge/genai.py +490 -0
  45. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge/handlers.py +1499 -0
  46. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge/history.py +393 -0
  47. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge/logview.py +165 -0
  48. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge/media.py +554 -0
  49. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge/pixels.py +339 -0
  50. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge/protocol.py +234 -0
  51. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge/tracelog.py +66 -0
  52. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge/updater.py +147 -0
  53. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge/util.py +98 -0
  54. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge/watchdog.py +75 -0
  55. kritapilot-2026.11.8.36/plugin/pykrita/krita_mcp_bridge.desktop +8 -0
  56. kritapilot-2026.11.8.36/pyproject.toml +51 -0
  57. kritapilot-2026.11.8.36/scripts/build_plugin.py +39 -0
  58. kritapilot-2026.11.8.36/scripts/bump_version.py +60 -0
  59. kritapilot-2026.11.8.36/scripts/gen_tool_docs.py +105 -0
  60. kritapilot-2026.11.8.36/scripts/install_plugin.py +46 -0
  61. kritapilot-2026.11.8.36/scripts/krita_upstream.py +114 -0
  62. kritapilot-2026.11.8.36/scripts/paint_sunset.py +184 -0
  63. kritapilot-2026.11.8.36/scripts/smoke_krita.py +1015 -0
  64. kritapilot-2026.11.8.36/src/kritapilot/__init__.py +1 -0
  65. kritapilot-2026.11.8.36/src/kritapilot/__main__.py +3 -0
  66. kritapilot-2026.11.8.36/src/kritapilot/agent.py +1242 -0
  67. kritapilot-2026.11.8.36/src/kritapilot/bridge_client.py +57 -0
  68. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/anime-illustration/SKILL.md +14 -0
  69. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/architecture-viz/SKILL.md +16 -0
  70. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/art-critique/SKILL.md +14 -0
  71. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/avatar-video/SKILL.md +13 -0
  72. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/character-design/SKILL.md +17 -0
  73. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/color-grade/SKILL.md +17 -0
  74. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/color-palette/SKILL.md +15 -0
  75. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/comic-storyboard/SKILL.md +15 -0
  76. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/composition/SKILL.md +15 -0
  77. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/concept-art/SKILL.md +18 -0
  78. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/extend-canvas/SKILL.md +13 -0
  79. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/find-skills/SKILL.md +20 -0
  80. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/fix-ai-artifacts/SKILL.md +16 -0
  81. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/frame-animation/SKILL.md +16 -0
  82. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/game-assets/SKILL.md +15 -0
  83. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/landscape-environment/SKILL.md +15 -0
  84. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/lighting-and-shadows/SKILL.md +14 -0
  85. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/lineart-coloring/SKILL.md +13 -0
  86. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/paint-by-hand/SKILL.md +17 -0
  87. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/photo-composite/SKILL.md +16 -0
  88. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/photo-restoration/SKILL.md +15 -0
  89. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/photoreal-image/SKILL.md +17 -0
  90. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/pixel-art/SKILL.md +18 -0
  91. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/portrait-retouch/SKILL.md +15 -0
  92. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/poster-design/SKILL.md +15 -0
  93. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/print-ready/SKILL.md +15 -0
  94. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/product-shot/SKILL.md +15 -0
  95. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/restyle-image/SKILL.md +16 -0
  96. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/retouch-photo/SKILL.md +17 -0
  97. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/save-credits/SKILL.md +18 -0
  98. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/seamless-pattern/SKILL.md +16 -0
  99. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/sketch-to-render/SKILL.md +15 -0
  100. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/social-media-graphics/SKILL.md +15 -0
  101. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/sticker-design/SKILL.md +14 -0
  102. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/still-to-video/SKILL.md +13 -0
  103. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/textures-materials/SKILL.md +16 -0
  104. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/traditional-media/SKILL.md +16 -0
  105. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/vector-logo/SKILL.md +16 -0
  106. kritapilot-2026.11.8.36/src/kritapilot/bundled_skills/video-editing/SKILL.md +14 -0
  107. kritapilot-2026.11.8.36/src/kritapilot/gen_tools.py +580 -0
  108. kritapilot-2026.11.8.36/src/kritapilot/netfetch.py +46 -0
  109. kritapilot-2026.11.8.36/src/kritapilot/oauth.py +175 -0
  110. kritapilot-2026.11.8.36/src/kritapilot/presets.py +129 -0
  111. kritapilot-2026.11.8.36/src/kritapilot/providers/__init__.py +4 -0
  112. kritapilot-2026.11.8.36/src/kritapilot/providers/assets.py +87 -0
  113. kritapilot-2026.11.8.36/src/kritapilot/providers/catalog.py +97 -0
  114. kritapilot-2026.11.8.36/src/kritapilot/providers/compat.py +184 -0
  115. kritapilot-2026.11.8.36/src/kritapilot/providers/free.py +230 -0
  116. kritapilot-2026.11.8.36/src/kritapilot/providers/gemini.py +80 -0
  117. kritapilot-2026.11.8.36/src/kritapilot/providers/http.py +226 -0
  118. kritapilot-2026.11.8.36/src/kritapilot/providers/images.py +886 -0
  119. kritapilot-2026.11.8.36/src/kritapilot/providers/keys.py +144 -0
  120. kritapilot-2026.11.8.36/src/kritapilot/providers/video.py +277 -0
  121. kritapilot-2026.11.8.36/src/kritapilot/providers/vision.py +113 -0
  122. kritapilot-2026.11.8.36/src/kritapilot/server.py +815 -0
  123. kritapilot-2026.11.8.36/src/kritapilot/skills.py +161 -0
  124. kritapilot-2026.11.8.36/src/kritapilot/tracelog.py +66 -0
  125. kritapilot-2026.11.8.36/src/kritapilot/updater.py +192 -0
  126. kritapilot-2026.11.8.36/tests/conftest.py +68 -0
  127. kritapilot-2026.11.8.36/tests/test_agent.py +765 -0
  128. kritapilot-2026.11.8.36/tests/test_chat_docker.py +654 -0
  129. kritapilot-2026.11.8.36/tests/test_dialogs_qt.py +109 -0
  130. kritapilot-2026.11.8.36/tests/test_e2e.py +219 -0
  131. kritapilot-2026.11.8.36/tests/test_free_and_skills.py +517 -0
  132. kritapilot-2026.11.8.36/tests/test_gen_tools.py +108 -0
  133. kritapilot-2026.11.8.36/tests/test_handlers_qt.py +736 -0
  134. kritapilot-2026.11.8.36/tests/test_meta.py +40 -0
  135. kritapilot-2026.11.8.36/tests/test_pixels.py +81 -0
  136. kritapilot-2026.11.8.36/tests/test_presets.py +77 -0
  137. kritapilot-2026.11.8.36/tests/test_providers.py +489 -0
  138. kritapilot-2026.11.8.36/tests/test_tracelog.py +45 -0
  139. kritapilot-2026.11.8.36/tests/test_updater.py +162 -0
  140. kritapilot-2026.11.8.36/tests/test_watchdog_qt.py +64 -0
@@ -0,0 +1,3 @@
1
+ * text=auto
2
+ *.png binary
3
+ *.zip binary
@@ -0,0 +1,58 @@
1
+ name: Bug report
2
+ description: Something doesn't work as it should
3
+ labels: [bug]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Thanks for reporting! The more of this you fill in, the faster it can be fixed.
9
+ Security problems: please don't post them here - see SECURITY.md.
10
+ - type: textarea
11
+ id: what
12
+ attributes:
13
+ label: What happened
14
+ description: What you did (or asked the AI), what you expected, and what happened instead.
15
+ placeholder: |
16
+ I asked the AI Chat (provider: Auto) to "paint a sunset over mountains".
17
+ Expected: a painting. Instead: ...
18
+ validations:
19
+ required: true
20
+ - type: input
21
+ id: versions
22
+ attributes:
23
+ label: Versions
24
+ description: Krita, the plugin and the server. The AI Bridge (MCP) panel shows them; or run `kritapilot --version`.
25
+ placeholder: Krita 5.3.4, plugin 2026.11.8.35, server 2026.11.8.35
26
+ validations:
27
+ required: true
28
+ - type: dropdown
29
+ id: where
30
+ attributes:
31
+ label: Where
32
+ multiple: true
33
+ options:
34
+ - AI Chat inside Krita
35
+ - An MCP client (Claude, ChatGPT, Cursor, ...)
36
+ - The AI Bridge (MCP) panel
37
+ - Installing or updating
38
+ - Image or video generation
39
+ - Something else
40
+ - type: input
41
+ id: os
42
+ attributes:
43
+ label: Operating system
44
+ placeholder: Windows 11 / macOS 15 / Ubuntu 24.04
45
+ - type: textarea
46
+ id: logs
47
+ attributes:
48
+ label: Log lines
49
+ description: |
50
+ Open **Logs…** (in the AI Chat or AI Bridge panel), type ✗ in the filter to see only failures, and paste
51
+ the lines around the problem. Keys are masked in the logs, so they are safe to share.
52
+ If Krita froze, attach `~/.krita-mcp/hang.log` too.
53
+ render: text
54
+ - type: textarea
55
+ id: extra
56
+ attributes:
57
+ label: Anything else
58
+ description: Screenshots, the prompt you used, the provider and model, ...
@@ -0,0 +1,11 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: Installation and first steps
4
+ url: https://github.com/jowinjohnchemban/kritapilot/blob/main/docs/installation.md
5
+ about: Installing the plugin and the server, and connecting an AI client.
6
+ - name: AI Chat inside Krita
7
+ url: https://github.com/jowinjohnchemban/kritapilot/blob/main/docs/ai-chat.md
8
+ about: Providers, Auto, free services, skills and settings.
9
+ - name: Report a security problem privately
10
+ url: https://github.com/jowinjohnchemban/kritapilot/security/advisories/new
11
+ about: Please don't post security problems in public issues.
@@ -0,0 +1,31 @@
1
+ name: Idea or feature request
2
+ description: Something the AI should be able to do in Krita, a service to support, or a better way of working
3
+ labels: [enhancement]
4
+ body:
5
+ - type: textarea
6
+ id: idea
7
+ attributes:
8
+ label: What would you like to do?
9
+ description: Describe it as an artist or user would - what you want to make or change, not how to build it.
10
+ placeholder: I'd like to ask the AI to turn my sketch layer into a coloured comic panel ...
11
+ validations:
12
+ required: true
13
+ - type: textarea
14
+ id: today
15
+ attributes:
16
+ label: What happens today?
17
+ description: How you do it now, or what goes wrong when you try.
18
+ - type: dropdown
19
+ id: area
20
+ attributes:
21
+ label: Area
22
+ multiple: true
23
+ options:
24
+ - Painting and drawing
25
+ - Photo editing
26
+ - Animation and video
27
+ - Image or video generation
28
+ - AI Chat inside Krita
29
+ - A new AI service or model provider
30
+ - A new skill
31
+ - Something else
@@ -0,0 +1,13 @@
1
+ ## What this changes
2
+
3
+ <!-- What and why, in a few sentences. Link the issue it fixes, if any (Fixes #123). -->
4
+
5
+ ## How it was tested
6
+
7
+ - [ ] `pytest` (PyQt6) and `KRITA_TEST_QT=5 pytest` (PyQt5) pass
8
+ - [ ] Plugin changes: `python scripts/smoke_krita.py` passes against a real Krita
9
+ - [ ] New or changed tools: `python scripts/gen_tool_docs.py` run, `docs/tools.md` updated
10
+
11
+ ## Notes for the reviewer
12
+
13
+ <!-- Anything that needs a closer look, screenshots of UI changes, follow-ups. -->
@@ -0,0 +1,53 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ test:
14
+ name: test (${{ matrix.os }}, py${{ matrix.python }}, ${{ matrix.qt }})
15
+ runs-on: ${{ matrix.os }}
16
+ strategy:
17
+ fail-fast: false
18
+ matrix:
19
+ os: [ubuntu-latest, windows-latest]
20
+ python: ["3.10", "3.13"]
21
+ qt: [PyQt6, PyQt5]
22
+ env:
23
+ QT_QPA_PLATFORM: offscreen
24
+ KRITA_TEST_QT: ${{ matrix.qt == 'PyQt5' && '5' || '6' }}
25
+ steps:
26
+ - uses: actions/checkout@v4
27
+ - uses: actions/setup-python@v5
28
+ with:
29
+ python-version: ${{ matrix.python }}
30
+ cache: pip
31
+ - name: System libraries for headless Qt
32
+ if: runner.os == 'Linux'
33
+ run: sudo apt-get update && sudo apt-get install -y libegl1 libgl1 libxkbcommon0 libfontconfig1 libdbus-1-3
34
+ - name: Install
35
+ run: python -m pip install -e ".[test]" ${{ matrix.qt }} pyflakes
36
+ - name: Lint
37
+ run: python -m pyflakes src scripts tests plugin
38
+ - name: Tests
39
+ run: python -m pytest -q
40
+
41
+ plugin:
42
+ runs-on: ubuntu-latest
43
+ steps:
44
+ - uses: actions/checkout@v4
45
+ - uses: actions/setup-python@v5
46
+ with:
47
+ python-version: "3.12"
48
+ - name: Build plugin zip
49
+ run: python scripts/build_plugin.py --out dist
50
+ - uses: actions/upload-artifact@v4
51
+ with:
52
+ name: krita-plugin
53
+ path: dist/*.zip
@@ -0,0 +1,167 @@
1
+ #
2
+ # Publish KritaPilot on every push to main: the Krita plugin zip and the server's wheel and sdist go to a GitHub
3
+ # release, and the wheel and sdist to PyPI (https://pypi.org/p/kritapilot).
4
+ #
5
+ # Jobs, as in PyPA's guide (https://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/):
6
+ # build version, test, build everything once and keep it as the "dist" artifact
7
+ # github-release publish the artifact as a GitHub release (the plugin and the server update from there)
8
+ # pypi upload the wheel and sdist with PyPI trusted publishing - no password or token is stored
9
+ #
10
+ # The version is the date plus the build number (YYYY.M.D.<run number>), so several releases a day each get their
11
+ # own version, and nothing is ever committed to the repository.
12
+ #
13
+
14
+ name: Release
15
+
16
+ on:
17
+ push:
18
+ branches: [main]
19
+ workflow_dispatch:
20
+
21
+ concurrency:
22
+ group: release
23
+ cancel-in-progress: true # a newer push supersedes a release still being built
24
+
25
+ jobs:
26
+ build:
27
+ runs-on: ubuntu-latest
28
+ timeout-minutes: 30
29
+ permissions:
30
+ contents: read
31
+ outputs:
32
+ version: ${{ steps.version.outputs.version }}
33
+ tag: ${{ steps.version.outputs.tag }}
34
+ commit: ${{ steps.version.outputs.commit }}
35
+ steps:
36
+ - uses: actions/checkout@v4
37
+
38
+ - uses: actions/setup-python@v5
39
+ with:
40
+ python-version: "3.12"
41
+
42
+ - name: Version from the date and the build number
43
+ id: version
44
+ env:
45
+ BUILD: ${{ github.run_number }} # grows with every build, so later builds always compare as newer
46
+ run: |
47
+ echo "tag=$(date -u +'%Y.%m.%d').${BUILD}" >> "$GITHUB_OUTPUT" # tag / release name
48
+ echo "version=$(date -u +'%Y.%-m.%-d').${BUILD}" >> "$GITHUB_OUTPUT" # the same as a Python version
49
+ echo "commit=${GITHUB_SHA::7}" >> "$GITHUB_OUTPUT"
50
+
51
+ - name: Install
52
+ run: |
53
+ sudo apt-get update && sudo apt-get install -y libegl1 libgl1 libxkbcommon0 libfontconfig1 libdbus-1-3
54
+ python -m pip install -e ".[test]" PyQt6 build twine
55
+
56
+ - name: Stamp the version (this build only, never committed)
57
+ run: python scripts/bump_version.py "${{ steps.version.outputs.version }}"
58
+
59
+ - name: Test
60
+ env:
61
+ QT_QPA_PLATFORM: offscreen
62
+ run: python -m pytest -q
63
+
64
+ - name: Build plugin zip, wheel and sdist
65
+ run: |
66
+ python scripts/build_plugin.py --out dist
67
+ python -m build --outdir dist
68
+ python -m twine check --strict dist/*.whl dist/*.tar.gz
69
+ {
70
+ echo "## 📦 KritaPilot ${{ steps.version.outputs.version }} (build ${{ github.run_number }}, commit ${{ steps.version.outputs.commit }})"
71
+ echo
72
+ ls -lh dist | awk 'NR>1 {print "- **" $9 "**: " $5}'
73
+ } >> "$GITHUB_STEP_SUMMARY"
74
+
75
+ - uses: actions/upload-artifact@v4
76
+ with:
77
+ name: dist
78
+ path: dist/*
79
+
80
+ github-release:
81
+ needs: build
82
+ runs-on: ubuntu-latest
83
+ timeout-minutes: 15
84
+ permissions:
85
+ contents: write
86
+ actions: write
87
+ env:
88
+ VERSION: ${{ needs.build.outputs.version }}
89
+ TAG_NAME: ${{ needs.build.outputs.tag }}
90
+ COMMIT: ${{ needs.build.outputs.commit }}
91
+ steps:
92
+ - uses: actions/download-artifact@v4
93
+ with:
94
+ name: dist
95
+ path: dist
96
+
97
+ - name: Delete an existing release of this build # only when this same build is re-run
98
+ env:
99
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
100
+ run: |
101
+ gh release delete "${TAG_NAME}" --yes --cleanup-tag --repo "${{ github.repository }}" || true
102
+
103
+ - name: Create the GitHub release
104
+ uses: softprops/action-gh-release@v2
105
+ with:
106
+ tag_name: ${{ env.TAG_NAME }}
107
+ target_commitish: ${{ github.sha }}
108
+ name: KritaPilot ${{ env.VERSION }} (build ${{ github.run_number }}, ${{ env.COMMIT }})
109
+ make_latest: true
110
+ generate_release_notes: true
111
+ body: |
112
+ Build ${{ github.run_number }} from commit [`${{ env.COMMIT }}`](https://github.com/${{ github.repository }}/commit/${{ github.sha }}).
113
+
114
+ ## Install
115
+
116
+ **Krita plugin**: download `krita-mcp-bridge-${{ env.VERSION }}.zip`, then in Krita choose *Tools > Scripts >
117
+ Import Python Plugin from File...*, pick the zip, enable it and restart Krita. Open *Settings > Dockers >
118
+ AI Chat* or *AI Bridge (MCP)*.
119
+
120
+ **Server** (the Krita MCP server and the AI Chat assistant): `pip install kritapilot==${{ env.VERSION }}`,
121
+ or `pip install` the `.whl` from this release. Then chat inside Krita with *AI Chat*, or connect your AI
122
+ app with the snippet shown in the Krita panel.
123
+
124
+ Already installed? The plugin and the server update themselves.
125
+
126
+ Docs: https://github.com/${{ github.repository }}/tree/main/docs · Changes: [CHANGELOG.md](https://github.com/${{ github.repository }}/blob/main/CHANGELOG.md)
127
+ files: dist/*
128
+ fail_on_unmatched_files: true
129
+ env:
130
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
131
+
132
+ - name: Remove old releases
133
+ uses: dev-drprasad/delete-older-releases@v0.2.1
134
+ with:
135
+ keep_latest: 5
136
+ delete_tags: true
137
+ env:
138
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
139
+
140
+ - name: Delete old workflow runs
141
+ uses: Mattraks/delete-workflow-runs@v2
142
+ with:
143
+ retain_days: 7
144
+ keep_minimum_runs: 2
145
+ env:
146
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
147
+
148
+ pypi:
149
+ name: Publish to PyPI
150
+ needs: build
151
+ runs-on: ubuntu-latest
152
+ timeout-minutes: 15
153
+ environment:
154
+ name: pypi
155
+ url: https://pypi.org/p/kritapilot
156
+ permissions:
157
+ id-token: write # trusted publishing: PyPI checks this workflow's identity instead of a stored token
158
+ steps:
159
+ - uses: actions/download-artifact@v4
160
+ with:
161
+ name: dist
162
+ path: dist
163
+
164
+ - name: Keep only the Python packages
165
+ run: rm -f dist/*.zip
166
+
167
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,19 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ .venv/
6
+ venv/
7
+ build/
8
+ dist/
9
+ .pytest_cache/
10
+
11
+ # Local smoke-test output
12
+ smoke_out/
13
+
14
+ # Editors / OS
15
+ .vscode/
16
+ .idea/
17
+ Thumbs.db
18
+ .DS_Store
19
+ dist/
@@ -0,0 +1,65 @@
1
+ # Changelog
2
+
3
+ Releases are published automatically from `main` and numbered `YEAR.MONTH.DAY.BUILD`
4
+ (see [releases](https://github.com/jowinjohnchemban/kritapilot/releases)). The plugin and the server update
5
+ themselves from there. This file lists what changed, newest first.
6
+
7
+ ## 2026-11-08
8
+
9
+ **New name: KritaPilot** (formerly *krita-mcp*). The project is more than an MCP server now, so it has a name
10
+ of its own: the repository is `jowinjohnchemban/kritapilot` (old links redirect), the package is
11
+ [`kritapilot` on PyPI](https://pypi.org/p/kritapilot) and the command is `kritapilot`. Nothing breaks: the
12
+ `krita-mcp` command still works, settings, keys and logs stay in `~/.krita-mcp`, `KRITA_MCP_*` variables
13
+ are unchanged, and the updater replaces the old package by itself.
14
+
15
+ **AI Chat**
16
+ - **Auto - all my providers** is the default: it uses the providers you signed in to or set up, then the
17
+ free ones, and when one runs out of credit, hits a quota, rejects its key or stops answering, the next
18
+ one carries on with the same task (with a recap of what was done).
19
+ - The provider menu always lists what you can use now; every other provider is one pick away and opens
20
+ its setup.
21
+ - Services are set up the way each one works: an API key, a browser sign-in, a server address with
22
+ **Test connection**, or nothing at all for the free ones. Sign out, Change key, Turn on and Turn off work
23
+ at once.
24
+ - A chat like a coding assistant's: Enter sends, Shift+Enter adds a line, Up recalls; messages typed while
25
+ the AI works are queued; your message shows at once; a status line says what the AI is doing.
26
+ - A model answer may take at most three minutes; models that cannot see pictures get text instead; an
27
+ image service the AI invents is replaced by one you have; AI Horde makes at most two variations, each
28
+ with its own seed.
29
+
30
+ **Reliability**
31
+ - A freeze watchdog: if Krita is ever frozen for a minute, every thread's stack goes to
32
+ `~/.krita-mcp/hang.log`.
33
+ - Fixed: the Send button, a panel that could stop updating while a dialog was open, and skills meant for
34
+ coding assistants being offered to the painting assistant.
35
+
36
+ ## 2026-11-07
37
+
38
+ **AI Chat**
39
+ - Free providers with no sign-in (Pollinations, Kilo Gateway, OVHcloud, LLM7, OmniRoute) and free image
40
+ services (Pollinations, AI Horde).
41
+ - 39 built-in skills, found and loaded only when a request needs them.
42
+ - Fewer tokens per step (older pictures dropped, prompt caching, repeated errors stop), and the cost of
43
+ each answer shown.
44
+ - Stop works at once; retries when a model service is briefly down; readable errors.
45
+ - **Logs…**: every command, chat step, setting change and error, live, with keys masked.
46
+
47
+ **Krita**
48
+ - Fixed the "Waiting for image operation to complete… Scripted Brush Stroke" freeze.
49
+ - Popups Krita opens while the AI works (such as "Missing Colour Profile") are cancelled and reported to
50
+ the AI instead of blocking it.
51
+ - Copy or cut to a new layer no longer goes through your clipboard.
52
+ - Over-the-air updates for the plugin and the server, checked against GitHub's checksums.
53
+
54
+ ## 2026-11-06
55
+
56
+ First public version:
57
+ - 86 MCP tools: real brushes, shapes, vectors and text; layers, masks and selections; photo adjustments
58
+ and filters; animation and video; seeing and measuring the canvas; undo for AI edits.
59
+ - Generative AI on the canvas: ComfyUI, AUTOMATIC1111/Forge, OpenAI, Gemini, Stability, Replicate and
60
+ fal.ai for images; Sora, Veo, HeyGen, Replicate and fal for video; vision models for a second opinion.
61
+ - `create_artwork`: one prompt, generated or painted by hand.
62
+ - The AI Chat docker inside Krita with browser sign-in for OpenRouter and live model lists from each
63
+ provider.
64
+ - The AI Bridge panel: status, access modes (full, read-only, paused), workspace, token and client
65
+ snippets.
@@ -0,0 +1,25 @@
1
+ # Code of conduct
2
+
3
+ This project welcomes everyone: artists, developers, beginners and experts, whatever their background.
4
+
5
+ ## Expected
6
+
7
+ - Be kind and patient, especially with people who are new to Krita, AI or open source.
8
+ - Assume good intent, and give and take feedback about the work, not the person.
9
+ - Keep discussions on topic and useful to others who read them later.
10
+
11
+ ## Not accepted
12
+
13
+ - Harassment, insults, or discriminatory jokes and language.
14
+ - Personal attacks, trolling, or deliberately derailing discussions.
15
+ - Publishing someone's private information, or sexual or violent content aimed at anyone.
16
+ - Using the project to create or share content that violates other people's rights or the law.
17
+
18
+ ## Enforcement
19
+
20
+ Maintainers may edit or remove comments, issues and contributions that break these rules, and may block
21
+ people who repeatedly do. To report a problem, contact a maintainer privately through GitHub (for example
22
+ by [reporting the content](https://docs.github.com/en/communities/maintaining-your-safety-on-github/reporting-abuse-or-spam)
23
+ or the user). Reports are handled confidentially.
24
+
25
+ This code is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/), version 2.1.
@@ -0,0 +1,60 @@
1
+ # Contributing
2
+
3
+ Thanks for helping. Bug reports, ideas, new skills, docs fixes and code are all welcome.
4
+
5
+ ## Reporting a bug
6
+
7
+ Open an [issue](https://github.com/jowinjohnchemban/kritapilot/issues/new/choose) and include:
8
+
9
+ - the versions: Krita, the plugin and the server (the **AI Bridge (MCP)** panel shows them, or run
10
+ `kritapilot --version`);
11
+ - what you asked the AI and what happened instead;
12
+ - the relevant lines from **Logs…** (in the AI Chat or AI Bridge panel). Keys are masked, so the text is
13
+ safe to paste. **Copy** copies what the window shows; type `✗` in its filter to see only failures;
14
+ - if Krita froze: `~/.krita-mcp/hang.log`.
15
+
16
+ Security problems: please don't open a public issue; see [SECURITY.md](SECURITY.md).
17
+
18
+ ## Setting up
19
+
20
+ ```bash
21
+ git clone https://github.com/jowinjohnchemban/kritapilot
22
+ cd KritaPilot
23
+ python -m venv .venv && . .venv/bin/activate # Windows: .venv\Scripts\activate
24
+ pip install -e ".[test]" PyQt6 PyQt5
25
+ python scripts/install_plugin.py # copy the plugin into Krita, then restart Krita
26
+ ```
27
+
28
+ ## Tests
29
+
30
+ ```bash
31
+ QT_QPA_PLATFORM=offscreen pytest # PyQt6 (Krita 6 code path)
32
+ KRITA_TEST_QT=5 QT_QPA_PLATFORM=offscreen pytest # PyQt5 (Krita 5 code path)
33
+ python scripts/smoke_krita.py # against a running Krita: 56 end-to-end checks
34
+ ```
35
+
36
+ CI runs the unit tests on Linux and Windows with both PyQt versions. CI cannot run Krita, so for changes
37
+ to the plugin, please run the smoke test against a real Krita too.
38
+
39
+ ## Making a change
40
+
41
+ - Keep a change focused, with tests for what it fixes or adds.
42
+ - New tool: see [Adding a tool](docs/development.md#adding-a-tool). Run `python scripts/gen_tool_docs.py`
43
+ so `docs/tools.md` stays current (a test checks it).
44
+ - New skill: add a folder with a `SKILL.md` under `src/kritapilot/bundled_skills/` (a name, a one-line
45
+ description, then the steps). Name only tools that exist; a test checks that too.
46
+ - New AI service: most are OpenAI-compatible and need one line in
47
+ `src/kritapilot/providers/compat.py`. See [Connecting AI services](docs/ai-backends.md).
48
+ - Write docs and messages in plain words for artists, not developers.
49
+ - The plugin runs inside Krita on its main thread: never block it (network calls go to a worker thread).
50
+ Never add a way for the AI to run code, and never log or show API keys.
51
+
52
+ The project layout and Krita API notes are in [docs/development.md](docs/development.md).
53
+
54
+ ## Pull requests
55
+
56
+ Describe what changed and how you tested it. A maintainer reviews it, and once it is merged into `main`,
57
+ it ships in the next release automatically.
58
+
59
+ By contributing you agree that your work is released under the [MIT licence](LICENSE), and to follow the
60
+ [code of conduct](CODE_OF_CONDUCT.md).
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 krita-mcp contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.