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.
- kritapilot-1.0.0/.gitattributes +3 -0
- kritapilot-1.0.0/.github/ISSUE_TEMPLATE/bug_report.yml +58 -0
- kritapilot-1.0.0/.github/ISSUE_TEMPLATE/config.yml +11 -0
- kritapilot-1.0.0/.github/ISSUE_TEMPLATE/feature_request.yml +31 -0
- kritapilot-1.0.0/.github/PULL_REQUEST_TEMPLATE.md +13 -0
- kritapilot-1.0.0/.github/workflows/ci.yml +53 -0
- kritapilot-1.0.0/.github/workflows/release.yml +151 -0
- kritapilot-1.0.0/.gitignore +19 -0
- kritapilot-1.0.0/CHANGELOG.md +61 -0
- kritapilot-1.0.0/CODE_OF_CONDUCT.md +25 -0
- kritapilot-1.0.0/CONTRIBUTING.md +60 -0
- kritapilot-1.0.0/LICENSE +21 -0
- kritapilot-1.0.0/PKG-INFO +306 -0
- kritapilot-1.0.0/README.md +252 -0
- kritapilot-1.0.0/SECURITY.md +31 -0
- kritapilot-1.0.0/docs/README.md +32 -0
- kritapilot-1.0.0/docs/ai-backends.md +345 -0
- kritapilot-1.0.0/docs/ai-chat.md +227 -0
- kritapilot-1.0.0/docs/clients.md +75 -0
- kritapilot-1.0.0/docs/development.md +102 -0
- kritapilot-1.0.0/docs/images/ai-chat.png +0 -0
- kritapilot-1.0.0/docs/images/galilee-dawn.jpg +0 -0
- kritapilot-1.0.0/docs/images/social-preview.png +0 -0
- kritapilot-1.0.0/docs/images/sunset.jpg +0 -0
- kritapilot-1.0.0/docs/installation.md +72 -0
- kritapilot-1.0.0/docs/krita-panel.md +107 -0
- kritapilot-1.0.0/docs/krita-upstream.md +75 -0
- kritapilot-1.0.0/docs/releasing.md +56 -0
- kritapilot-1.0.0/docs/tools.md +735 -0
- kritapilot-1.0.0/docs/undo-and-safety.md +54 -0
- kritapilot-1.0.0/docs/workflows.md +92 -0
- kritapilot-1.0.0/examples/README.md +13 -0
- kritapilot-1.0.0/examples/galilee_dawn.py +348 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/Manual.html +20 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/__init__.py +14 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/about.py +123 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/analysis.py +142 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/autoupdate.py +152 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/chat.py +1291 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/config.py +54 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/controls.py +250 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/dialogs.py +103 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/dock.py +398 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/extension.py +239 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/extras.py +307 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/genai.py +490 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/handlers.py +1500 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/history.py +393 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/logview.py +165 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/media.py +554 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/pixels.py +339 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/protocol.py +235 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/tracelog.py +67 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/updater.py +168 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/util.py +98 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin/watchdog.py +85 -0
- kritapilot-1.0.0/plugin/pykrita/kritapilot_plugin.desktop +8 -0
- kritapilot-1.0.0/pyproject.toml +50 -0
- kritapilot-1.0.0/scripts/build_plugin.py +39 -0
- kritapilot-1.0.0/scripts/bump_version.py +93 -0
- kritapilot-1.0.0/scripts/gen_tool_docs.py +105 -0
- kritapilot-1.0.0/scripts/install_plugin.py +46 -0
- kritapilot-1.0.0/scripts/krita_upstream.py +114 -0
- kritapilot-1.0.0/scripts/paint_sunset.py +184 -0
- kritapilot-1.0.0/scripts/release_version.py +77 -0
- kritapilot-1.0.0/scripts/smoke_krita.py +1015 -0
- kritapilot-1.0.0/src/kritapilot/__init__.py +7 -0
- kritapilot-1.0.0/src/kritapilot/__main__.py +3 -0
- kritapilot-1.0.0/src/kritapilot/agent.py +1242 -0
- kritapilot-1.0.0/src/kritapilot/bridge_client.py +58 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/anime-illustration/SKILL.md +14 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/architecture-viz/SKILL.md +16 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/art-critique/SKILL.md +14 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/avatar-video/SKILL.md +13 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/character-design/SKILL.md +17 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/color-grade/SKILL.md +17 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/color-palette/SKILL.md +15 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/comic-storyboard/SKILL.md +15 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/composition/SKILL.md +15 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/concept-art/SKILL.md +18 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/extend-canvas/SKILL.md +13 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/find-skills/SKILL.md +20 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/fix-ai-artifacts/SKILL.md +16 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/frame-animation/SKILL.md +16 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/game-assets/SKILL.md +15 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/landscape-environment/SKILL.md +15 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/lighting-and-shadows/SKILL.md +14 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/lineart-coloring/SKILL.md +13 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/paint-by-hand/SKILL.md +17 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/photo-composite/SKILL.md +16 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/photo-restoration/SKILL.md +15 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/photoreal-image/SKILL.md +17 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/pixel-art/SKILL.md +18 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/portrait-retouch/SKILL.md +15 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/poster-design/SKILL.md +15 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/print-ready/SKILL.md +15 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/product-shot/SKILL.md +15 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/restyle-image/SKILL.md +16 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/retouch-photo/SKILL.md +17 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/save-credits/SKILL.md +18 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/seamless-pattern/SKILL.md +16 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/sketch-to-render/SKILL.md +15 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/social-media-graphics/SKILL.md +15 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/sticker-design/SKILL.md +14 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/still-to-video/SKILL.md +13 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/textures-materials/SKILL.md +16 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/traditional-media/SKILL.md +16 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/vector-logo/SKILL.md +16 -0
- kritapilot-1.0.0/src/kritapilot/bundled_skills/video-editing/SKILL.md +14 -0
- kritapilot-1.0.0/src/kritapilot/config.py +48 -0
- kritapilot-1.0.0/src/kritapilot/gen_tools.py +580 -0
- kritapilot-1.0.0/src/kritapilot/netfetch.py +46 -0
- kritapilot-1.0.0/src/kritapilot/oauth.py +175 -0
- kritapilot-1.0.0/src/kritapilot/presets.py +129 -0
- kritapilot-1.0.0/src/kritapilot/providers/__init__.py +4 -0
- kritapilot-1.0.0/src/kritapilot/providers/assets.py +87 -0
- kritapilot-1.0.0/src/kritapilot/providers/catalog.py +97 -0
- kritapilot-1.0.0/src/kritapilot/providers/compat.py +184 -0
- kritapilot-1.0.0/src/kritapilot/providers/free.py +230 -0
- kritapilot-1.0.0/src/kritapilot/providers/gemini.py +80 -0
- kritapilot-1.0.0/src/kritapilot/providers/http.py +226 -0
- kritapilot-1.0.0/src/kritapilot/providers/images.py +886 -0
- kritapilot-1.0.0/src/kritapilot/providers/keys.py +144 -0
- kritapilot-1.0.0/src/kritapilot/providers/video.py +277 -0
- kritapilot-1.0.0/src/kritapilot/providers/vision.py +113 -0
- kritapilot-1.0.0/src/kritapilot/server.py +815 -0
- kritapilot-1.0.0/src/kritapilot/skills.py +161 -0
- kritapilot-1.0.0/src/kritapilot/tracelog.py +67 -0
- kritapilot-1.0.0/src/kritapilot/updater.py +185 -0
- kritapilot-1.0.0/tests/conftest.py +68 -0
- kritapilot-1.0.0/tests/test_agent.py +765 -0
- kritapilot-1.0.0/tests/test_chat_docker.py +649 -0
- kritapilot-1.0.0/tests/test_dialogs_qt.py +109 -0
- kritapilot-1.0.0/tests/test_e2e.py +219 -0
- kritapilot-1.0.0/tests/test_free_and_skills.py +517 -0
- kritapilot-1.0.0/tests/test_gen_tools.py +108 -0
- kritapilot-1.0.0/tests/test_handlers_qt.py +736 -0
- kritapilot-1.0.0/tests/test_meta.py +58 -0
- kritapilot-1.0.0/tests/test_pixels.py +81 -0
- kritapilot-1.0.0/tests/test_presets.py +77 -0
- kritapilot-1.0.0/tests/test_providers.py +489 -0
- kritapilot-1.0.0/tests/test_tracelog.py +45 -0
- kritapilot-1.0.0/tests/test_updater.py +150 -0
- kritapilot-1.0.0/tests/test_watchdog_qt.py +64 -0
|
@@ -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,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).
|
kritapilot-1.0.0/LICENSE
ADDED
|
@@ -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.
|