- Add Krita to registry.json (was missing)
- Revert YAML frontmatter additions to cli-anything-plugin/commands/*.md
(tangential to krita harness, belongs in a separate PR)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remove duplicate cli-anything-plugin/.claude-plugin/marketplace.json
- Expand VALID_FILTERS to match all 23 filters advertised by filter list
- Add export_options parameter to krita_backend.export_file()
- Extract _locked_save_json to shared utils/io.py utility
- Replace deprecated datetime.utcnow() with datetime.now(timezone.utc)
- Add encoding="utf-8" to setup.py open() call
- Align setup.py with GIMP harness (url, classifiers, extras_require, etc.)
- Add Krita brand purple accent color to repl_skin.py
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- New cli-anything-krita harness with full project/layer/filter/export/session management
- Click-based CLI with REPL, --json output, and undo/redo support
- Generates valid .kra (ZIP) files and invokes real Krita for export
- 45 tests passing (36 unit + 9 E2E including subprocess tests)
- SKILL.md for AI agent discoverability
- Fix: add YAML frontmatter to cli-anything-plugin commands for Claude Code discovery
- Add marketplace.json for local plugin installation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
E2E tests referenced test-mscore/sia-snowman/ which was not committed
in the PR. Switch to royalty-free "Twinkle Twinkle Little Star" scores
stored in tests/fixtures/twinkle-twinkle/, keeping fixture paths simple
and co-located with the test files.
Replace str.split() with shlex.split() in the REPL loop of 9 harnesses
(Blender, Audacity, Inkscape, KDenlive, LibreOffice, OBS Studio, Ollama,
Zoom, ComfyUI) to correctly handle quoted arguments containing spaces.
The GIMP harness already uses this pattern. A ValueError fallback to
str.split() is included for malformed quotes.
FixesHKUDS/CLI-Anything#127
Three harnesses shipped without the SKILL.md skill definition introduced
in Phase 6.5, and their setup.py files lacked the package_data entry
needed for pip install to include the skill file. This means agents
cannot discover these CLIs through the standard skill system.
Changes:
- Add skills/SKILL.md for adguardhome (12 command groups, 36+ commands)
- Add skills/SKILL.md for comfyui (5 command groups: workflow, queue,
models, images, system)
- Add skills/SKILL.md for mermaid (4 command groups: project, diagram,
export, session)
- Fix adguardhome/setup.py: add package_data and include_package_data
- Fix mermaid/setup.py: add package_data and include_package_data
- Fix comfyui/setup.py: add package_data for skills (was missing despite
include_package_data=True already being set)
- Add comfyui to .gitignore allow-list (was tracked before the gitignore
was tightened, but new files could not be added)
- Expand test_skill_path.py HARNESSES list from 11 to all 18 harnesses
- Fix test assertion to accept mubu-style explicit SKILL.md reference
alongside the glob pattern used by other harnesses
Test results: 79 passed (was 51 tests covering only 11 harnesses)
The DOMShell error message said "Install with" but npx doesn't actually
install packages, it runs them. Clarified the message. Also added a
known limitation comment about daemon mode using asyncio.run() per call,
which creates new event loops - to be addressed in a future PR.
Tests were patching backend.open_url but the code now calls
backend.back() and backend.forward() directly. Updated mocks
to patch the correct functions.
test_daemon_start_with_json had a silent JSONDecodeError pass that
would hide regressions. test_invalid_path_gives_error ended with
assert True which doesn't verify any actual behavior.
The change_directory function was updating session.working_dir even
when the backend returned an error. This could leave the session in an
invalid directory state and break subsequent relative-path operations.
The act type command was echoing the full text value in non-JSON mode,
which could leak passwords or PII into terminal scrollback and logs.
Now only outputs the target path without the typed text.
Store project_path in undo/redo stack entries so that reverting a
mutation correctly points the session back to the original input file,
preventing the next command from reading the wrong file when input and
output paths differ.
Commands now reload project metadata from output files after backend
operations, ensuring session.project_data reflects actual changes.
Previously, snapshot() captured state before mscore operations, but
project_data was never updated afterward—undo restored unchanged
metadata. Now all mutation commands (transpose, add/remove/reorder
instruments) update session state from the output file.
Fixes the issue identified in PR review where undo/redo was
scaffolding-only for backend-driven harnesses.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Update documentation to clarify that daemon mode works within a single
process (REPL or --daemon flag) and that state does not persist across
separate CLI invocations.