kritapilot 1.0.0__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.
Files changed (144) hide show
  1. kritapilot-1.0.0/.gitattributes +3 -0
  2. kritapilot-1.0.0/.github/ISSUE_TEMPLATE/bug_report.yml +58 -0
  3. kritapilot-1.0.0/.github/ISSUE_TEMPLATE/config.yml +11 -0
  4. kritapilot-1.0.0/.github/ISSUE_TEMPLATE/feature_request.yml +31 -0
  5. kritapilot-1.0.0/.github/PULL_REQUEST_TEMPLATE.md +13 -0
  6. kritapilot-1.0.0/.github/workflows/ci.yml +53 -0
  7. kritapilot-1.0.0/.github/workflows/release.yml +151 -0
  8. kritapilot-1.0.0/.gitignore +19 -0
  9. kritapilot-1.0.0/CHANGELOG.md +61 -0
  10. kritapilot-1.0.0/CODE_OF_CONDUCT.md +25 -0
  11. kritapilot-1.0.0/CONTRIBUTING.md +60 -0
  12. kritapilot-1.0.0/LICENSE +21 -0
  13. kritapilot-1.0.0/PKG-INFO +306 -0
  14. kritapilot-1.0.0/README.md +252 -0
  15. kritapilot-1.0.0/SECURITY.md +31 -0
  16. kritapilot-1.0.0/docs/README.md +32 -0
  17. kritapilot-1.0.0/docs/ai-backends.md +345 -0
  18. kritapilot-1.0.0/docs/ai-chat.md +227 -0
  19. kritapilot-1.0.0/docs/clients.md +75 -0
  20. kritapilot-1.0.0/docs/development.md +102 -0
  21. kritapilot-1.0.0/docs/images/ai-chat.png +0 -0
  22. kritapilot-1.0.0/docs/images/galilee-dawn.jpg +0 -0
  23. kritapilot-1.0.0/docs/images/social-preview.png +0 -0
  24. kritapilot-1.0.0/docs/images/sunset.jpg +0 -0
  25. kritapilot-1.0.0/docs/installation.md +72 -0
  26. kritapilot-1.0.0/docs/krita-panel.md +107 -0
  27. kritapilot-1.0.0/docs/krita-upstream.md +75 -0
  28. kritapilot-1.0.0/docs/releasing.md +56 -0
  29. kritapilot-1.0.0/docs/tools.md +735 -0
  30. kritapilot-1.0.0/docs/undo-and-safety.md +54 -0
  31. kritapilot-1.0.0/docs/workflows.md +92 -0
  32. kritapilot-1.0.0/examples/README.md +13 -0
  33. kritapilot-1.0.0/examples/galilee_dawn.py +348 -0
  34. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/Manual.html +20 -0
  35. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/__init__.py +14 -0
  36. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/about.py +123 -0
  37. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/analysis.py +142 -0
  38. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/autoupdate.py +152 -0
  39. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/chat.py +1291 -0
  40. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/config.py +54 -0
  41. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/controls.py +250 -0
  42. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/dialogs.py +103 -0
  43. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/dock.py +398 -0
  44. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/extension.py +239 -0
  45. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/extras.py +307 -0
  46. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/genai.py +490 -0
  47. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/handlers.py +1500 -0
  48. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/history.py +393 -0
  49. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/logview.py +165 -0
  50. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/media.py +554 -0
  51. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/pixels.py +339 -0
  52. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/protocol.py +235 -0
  53. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/tracelog.py +67 -0
  54. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/updater.py +168 -0
  55. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/util.py +98 -0
  56. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/watchdog.py +85 -0
  57. kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin.desktop +8 -0
  58. kritapilot-1.0.0/pyproject.toml +50 -0
  59. kritapilot-1.0.0/scripts/build_plugin.py +39 -0
  60. kritapilot-1.0.0/scripts/bump_version.py +93 -0
  61. kritapilot-1.0.0/scripts/gen_tool_docs.py +105 -0
  62. kritapilot-1.0.0/scripts/install_plugin.py +46 -0
  63. kritapilot-1.0.0/scripts/krita_upstream.py +114 -0
  64. kritapilot-1.0.0/scripts/paint_sunset.py +184 -0
  65. kritapilot-1.0.0/scripts/release_version.py +77 -0
  66. kritapilot-1.0.0/scripts/smoke_krita.py +1015 -0
  67. kritapilot-1.0.0/src/kritapilot/__init__.py +7 -0
  68. kritapilot-1.0.0/src/kritapilot/__main__.py +3 -0
  69. kritapilot-1.0.0/src/kritapilot/agent.py +1242 -0
  70. kritapilot-1.0.0/src/kritapilot/bridge_client.py +58 -0
  71. kritapilot-1.0.0/src/kritapilot/bundled_skills/anime-illustration/SKILL.md +14 -0
  72. kritapilot-1.0.0/src/kritapilot/bundled_skills/architecture-viz/SKILL.md +16 -0
  73. kritapilot-1.0.0/src/kritapilot/bundled_skills/art-critique/SKILL.md +14 -0
  74. kritapilot-1.0.0/src/kritapilot/bundled_skills/avatar-video/SKILL.md +13 -0
  75. kritapilot-1.0.0/src/kritapilot/bundled_skills/character-design/SKILL.md +17 -0
  76. kritapilot-1.0.0/src/kritapilot/bundled_skills/color-grade/SKILL.md +17 -0
  77. kritapilot-1.0.0/src/kritapilot/bundled_skills/color-palette/SKILL.md +15 -0
  78. kritapilot-1.0.0/src/kritapilot/bundled_skills/comic-storyboard/SKILL.md +15 -0
  79. kritapilot-1.0.0/src/kritapilot/bundled_skills/composition/SKILL.md +15 -0
  80. kritapilot-1.0.0/src/kritapilot/bundled_skills/concept-art/SKILL.md +18 -0
  81. kritapilot-1.0.0/src/kritapilot/bundled_skills/extend-canvas/SKILL.md +13 -0
  82. kritapilot-1.0.0/src/kritapilot/bundled_skills/find-skills/SKILL.md +20 -0
  83. kritapilot-1.0.0/src/kritapilot/bundled_skills/fix-ai-artifacts/SKILL.md +16 -0
  84. kritapilot-1.0.0/src/kritapilot/bundled_skills/frame-animation/SKILL.md +16 -0
  85. kritapilot-1.0.0/src/kritapilot/bundled_skills/game-assets/SKILL.md +15 -0
  86. kritapilot-1.0.0/src/kritapilot/bundled_skills/landscape-environment/SKILL.md +15 -0
  87. kritapilot-1.0.0/src/kritapilot/bundled_skills/lighting-and-shadows/SKILL.md +14 -0
  88. kritapilot-1.0.0/src/kritapilot/bundled_skills/lineart-coloring/SKILL.md +13 -0
  89. kritapilot-1.0.0/src/kritapilot/bundled_skills/paint-by-hand/SKILL.md +17 -0
  90. kritapilot-1.0.0/src/kritapilot/bundled_skills/photo-composite/SKILL.md +16 -0
  91. kritapilot-1.0.0/src/kritapilot/bundled_skills/photo-restoration/SKILL.md +15 -0
  92. kritapilot-1.0.0/src/kritapilot/bundled_skills/photoreal-image/SKILL.md +17 -0
  93. kritapilot-1.0.0/src/kritapilot/bundled_skills/pixel-art/SKILL.md +18 -0
  94. kritapilot-1.0.0/src/kritapilot/bundled_skills/portrait-retouch/SKILL.md +15 -0
  95. kritapilot-1.0.0/src/kritapilot/bundled_skills/poster-design/SKILL.md +15 -0
  96. kritapilot-1.0.0/src/kritapilot/bundled_skills/print-ready/SKILL.md +15 -0
  97. kritapilot-1.0.0/src/kritapilot/bundled_skills/product-shot/SKILL.md +15 -0
  98. kritapilot-1.0.0/src/kritapilot/bundled_skills/restyle-image/SKILL.md +16 -0
  99. kritapilot-1.0.0/src/kritapilot/bundled_skills/retouch-photo/SKILL.md +17 -0
  100. kritapilot-1.0.0/src/kritapilot/bundled_skills/save-credits/SKILL.md +18 -0
  101. kritapilot-1.0.0/src/kritapilot/bundled_skills/seamless-pattern/SKILL.md +16 -0
  102. kritapilot-1.0.0/src/kritapilot/bundled_skills/sketch-to-render/SKILL.md +15 -0
  103. kritapilot-1.0.0/src/kritapilot/bundled_skills/social-media-graphics/SKILL.md +15 -0
  104. kritapilot-1.0.0/src/kritapilot/bundled_skills/sticker-design/SKILL.md +14 -0
  105. kritapilot-1.0.0/src/kritapilot/bundled_skills/still-to-video/SKILL.md +13 -0
  106. kritapilot-1.0.0/src/kritapilot/bundled_skills/textures-materials/SKILL.md +16 -0
  107. kritapilot-1.0.0/src/kritapilot/bundled_skills/traditional-media/SKILL.md +16 -0
  108. kritapilot-1.0.0/src/kritapilot/bundled_skills/vector-logo/SKILL.md +16 -0
  109. kritapilot-1.0.0/src/kritapilot/bundled_skills/video-editing/SKILL.md +14 -0
  110. kritapilot-1.0.0/src/kritapilot/config.py +48 -0
  111. kritapilot-1.0.0/src/kritapilot/gen_tools.py +580 -0
  112. kritapilot-1.0.0/src/kritapilot/netfetch.py +46 -0
  113. kritapilot-1.0.0/src/kritapilot/oauth.py +175 -0
  114. kritapilot-1.0.0/src/kritapilot/presets.py +129 -0
  115. kritapilot-1.0.0/src/kritapilot/providers/__init__.py +4 -0
  116. kritapilot-1.0.0/src/kritapilot/providers/assets.py +87 -0
  117. kritapilot-1.0.0/src/kritapilot/providers/catalog.py +97 -0
  118. kritapilot-1.0.0/src/kritapilot/providers/compat.py +184 -0
  119. kritapilot-1.0.0/src/kritapilot/providers/free.py +230 -0
  120. kritapilot-1.0.0/src/kritapilot/providers/gemini.py +80 -0
  121. kritapilot-1.0.0/src/kritapilot/providers/http.py +226 -0
  122. kritapilot-1.0.0/src/kritapilot/providers/images.py +886 -0
  123. kritapilot-1.0.0/src/kritapilot/providers/keys.py +144 -0
  124. kritapilot-1.0.0/src/kritapilot/providers/video.py +277 -0
  125. kritapilot-1.0.0/src/kritapilot/providers/vision.py +113 -0
  126. kritapilot-1.0.0/src/kritapilot/server.py +815 -0
  127. kritapilot-1.0.0/src/kritapilot/skills.py +161 -0
  128. kritapilot-1.0.0/src/kritapilot/tracelog.py +67 -0
  129. kritapilot-1.0.0/src/kritapilot/updater.py +185 -0
  130. kritapilot-1.0.0/tests/conftest.py +68 -0
  131. kritapilot-1.0.0/tests/test_agent.py +765 -0
  132. kritapilot-1.0.0/tests/test_chat_docker.py +649 -0
  133. kritapilot-1.0.0/tests/test_dialogs_qt.py +109 -0
  134. kritapilot-1.0.0/tests/test_e2e.py +219 -0
  135. kritapilot-1.0.0/tests/test_free_and_skills.py +517 -0
  136. kritapilot-1.0.0/tests/test_gen_tools.py +108 -0
  137. kritapilot-1.0.0/tests/test_handlers_qt.py +736 -0
  138. kritapilot-1.0.0/tests/test_meta.py +58 -0
  139. kritapilot-1.0.0/tests/test_pixels.py +81 -0
  140. kritapilot-1.0.0/tests/test_presets.py +77 -0
  141. kritapilot-1.0.0/tests/test_providers.py +489 -0
  142. kritapilot-1.0.0/tests/test_tracelog.py +45 -0
  143. kritapilot-1.0.0/tests/test_updater.py +150 -0
  144. kritapilot-1.0.0/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 `~/.kritapilot/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,151 @@
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 next 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
+ # Versions are SemVer and count up by one: MAJOR.MINOR from pyproject.toml, PATCH one more than the highest already
11
+ # published (GitHub or PyPI). The tag is vX.Y.Z and official names use only the version. Each build also has a
12
+ # build id, the build date and commit (YYYYMMDD-COMMIT), shown in the release notes and the app. Nothing is committed.
13
+ #
14
+
15
+ name: Release
16
+
17
+ on:
18
+ push:
19
+ branches: [main]
20
+ workflow_dispatch:
21
+
22
+ concurrency:
23
+ group: release
24
+ cancel-in-progress: true # a newer push supersedes a release still being built
25
+
26
+ jobs:
27
+ build:
28
+ runs-on: ubuntu-latest
29
+ timeout-minutes: 30
30
+ permissions:
31
+ contents: read
32
+ outputs:
33
+ version: ${{ steps.version.outputs.version }}
34
+ build: ${{ steps.version.outputs.build }}
35
+ commit: ${{ steps.version.outputs.commit }}
36
+ steps:
37
+ - uses: actions/checkout@v4
38
+
39
+ - uses: actions/setup-python@v5
40
+ with:
41
+ python-version: "3.12"
42
+
43
+ - name: Install
44
+ run: |
45
+ sudo apt-get update && sudo apt-get install -y libegl1 libgl1 libxkbcommon0 libfontconfig1 libdbus-1-3
46
+ python -m pip install -e ".[test]" PyQt6 build twine
47
+
48
+ - name: Next version, build id and commit (stamped in this build only)
49
+ id: version
50
+ env:
51
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
52
+ run: python scripts/release_version.py --repo "${{ github.repository }}" --sha "$GITHUB_SHA" >> "$GITHUB_OUTPUT"
53
+
54
+ - name: Test
55
+ env:
56
+ QT_QPA_PLATFORM: offscreen
57
+ run: python -m pytest -q
58
+
59
+ - name: Build plugin zip, wheel and sdist
60
+ run: |
61
+ python scripts/build_plugin.py --out dist
62
+ python -m build --outdir dist
63
+ python -m twine check --strict dist/*.whl dist/*.tar.gz
64
+ {
65
+ echo "## 📦 KritaPilot ${{ steps.version.outputs.version }} (build ${{ steps.version.outputs.build }})"
66
+ echo
67
+ ls -lh dist | awk 'NR>1 {print "- **" $9 "**: " $5}'
68
+ } >> "$GITHUB_STEP_SUMMARY"
69
+
70
+ - uses: actions/upload-artifact@v4
71
+ with:
72
+ name: dist
73
+ path: dist/*
74
+
75
+ github-release:
76
+ needs: build
77
+ runs-on: ubuntu-latest
78
+ timeout-minutes: 15
79
+ permissions:
80
+ contents: write
81
+ actions: write
82
+ env:
83
+ VERSION: ${{ needs.build.outputs.version }}
84
+ BUILD_ID: ${{ needs.build.outputs.build }}
85
+ COMMIT: ${{ needs.build.outputs.commit }}
86
+ steps:
87
+ - uses: actions/download-artifact@v4
88
+ with:
89
+ name: dist
90
+ path: dist
91
+
92
+ - name: Create the GitHub release
93
+ uses: softprops/action-gh-release@v2
94
+ with:
95
+ tag_name: v${{ env.VERSION }}
96
+ target_commitish: ${{ github.sha }}
97
+ name: KritaPilot ${{ env.VERSION }}
98
+ make_latest: true
99
+ generate_release_notes: true
100
+ body: |
101
+ Version **${{ env.VERSION }}** · build `${{ env.BUILD_ID }}` ([commit](https://github.com/${{ github.repository }}/commit/${{ github.sha }}))
102
+
103
+ ## Install
104
+
105
+ **Server** (the Krita MCP server and the AI Chat assistant), from PyPI or from GitHub:
106
+
107
+ ```bash
108
+ pip install kritapilot==${{ env.VERSION }}
109
+ pip install "git+https://github.com/${{ github.repository }}@v${{ env.VERSION }}"
110
+ ```
111
+
112
+ **Krita plugin**: download `kritapilot-plugin-${{ env.VERSION }}.zip` below, then in Krita choose *Tools >
113
+ Scripts > Import Python Plugin from File...*, pick the zip, enable it and restart Krita. Open *Settings >
114
+ Dockers > AI Chat* or *AI Bridge (MCP)*.
115
+
116
+ Already installed? The plugin and the server update themselves.
117
+
118
+ Docs: https://github.com/${{ github.repository }}/tree/main/docs · Changes: [CHANGELOG.md](https://github.com/${{ github.repository }}/blob/main/CHANGELOG.md)
119
+ files: dist/*
120
+ fail_on_unmatched_files: true
121
+ env:
122
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
123
+
124
+ - name: Delete old workflow runs
125
+ uses: Mattraks/delete-workflow-runs@v2
126
+ with:
127
+ retain_days: 7
128
+ keep_minimum_runs: 2
129
+ env:
130
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
131
+
132
+ pypi:
133
+ name: Publish to PyPI
134
+ needs: build
135
+ runs-on: ubuntu-latest
136
+ timeout-minutes: 15
137
+ environment:
138
+ name: pypi
139
+ url: https://pypi.org/p/kritapilot
140
+ permissions:
141
+ id-token: write # trusted publishing: PyPI checks this workflow's identity instead of a stored token
142
+ steps:
143
+ - uses: actions/download-artifact@v4
144
+ with:
145
+ name: dist
146
+ path: dist
147
+
148
+ - name: Keep only the Python packages
149
+ run: rm -f dist/*.zip
150
+
151
+ - 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,61 @@
1
+ # Changelog
2
+
3
+ Releases are published automatically from `main` with [SemVer](https://semver.org) versions that count up by one
4
+ (see [releases](https://github.com/jowinjohnchemban/kritapilot/releases) and [PyPI](https://pypi.org/p/kritapilot)).
5
+ The plugin and the server update themselves. 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 of its own: the repository is `jowinjohnchemban/kritapilot`, the package is [`kritapilot` on PyPI](https://pypi.org/p/kritapilot) and the command is `kritapilot`. Versions are SemVer from 1.0.0 and count up by one with each release.
10
+
11
+ **AI Chat**
12
+ - **Auto - all my providers** is the default: it uses the providers you signed in to or set up, then the
13
+ free ones, and when one runs out of credit, hits a quota, rejects its key or stops answering, the next
14
+ one carries on with the same task (with a recap of what was done).
15
+ - The provider menu always lists what you can use now; every other provider is one pick away and opens
16
+ its setup.
17
+ - Services are set up the way each one works: an API key, a browser sign-in, a server address with
18
+ **Test connection**, or nothing at all for the free ones. Sign out, Change key, Turn on and Turn off work
19
+ at once.
20
+ - A chat like a coding assistant's: Enter sends, Shift+Enter adds a line, Up recalls; messages typed while
21
+ the AI works are queued; your message shows at once; a status line says what the AI is doing.
22
+ - A model answer may take at most three minutes; models that cannot see pictures get text instead; an
23
+ image service the AI invents is replaced by one you have; AI Horde makes at most two variations, each
24
+ with its own seed.
25
+
26
+ **Reliability**
27
+ - A freeze watchdog: if Krita is ever frozen for a minute, every thread's stack goes to
28
+ `~/.kritapilot/hang.log`.
29
+ - Fixed: the Send button, a panel that could stop updating while a dialog was open, and skills meant for
30
+ coding assistants being offered to the painting assistant.
31
+
32
+ ## 2026-11-07
33
+
34
+ **AI Chat**
35
+ - Free providers with no sign-in (Pollinations, Kilo Gateway, OVHcloud, LLM7, OmniRoute) and free image
36
+ services (Pollinations, AI Horde).
37
+ - 39 built-in skills, found and loaded only when a request needs them.
38
+ - Fewer tokens per step (older pictures dropped, prompt caching, repeated errors stop), and the cost of
39
+ each answer shown.
40
+ - Stop works at once; retries when a model service is briefly down; readable errors.
41
+ - **Logs…**: every command, chat step, setting change and error, live, with keys masked.
42
+
43
+ **Krita**
44
+ - Fixed the "Waiting for image operation to complete… Scripted Brush Stroke" freeze.
45
+ - Popups Krita opens while the AI works (such as "Missing Colour Profile") are cancelled and reported to
46
+ the AI instead of blocking it.
47
+ - Copy or cut to a new layer no longer goes through your clipboard.
48
+ - Over-the-air updates for the plugin and the server, checked against GitHub's checksums.
49
+
50
+ ## 2026-11-06
51
+
52
+ First public version:
53
+ - 86 MCP tools: real brushes, shapes, vectors and text; layers, masks and selections; photo adjustments
54
+ and filters; animation and video; seeing and measuring the canvas; undo for AI edits.
55
+ - Generative AI on the canvas: ComfyUI, AUTOMATIC1111/Forge, OpenAI, Gemini, Stability, Replicate and
56
+ fal.ai for images; Sora, Veo, HeyGen, Replicate and fal for video; vision models for a second opinion.
57
+ - `create_artwork`: one prompt, generated or painted by hand.
58
+ - The AI Chat docker inside Krita with browser sign-in for OpenRouter and live model lists from each
59
+ provider.
60
+ - The AI Bridge panel: status, access modes (full, read-only, paused), workspace, token and client
61
+ 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: `~/.kritapilot/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.