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.
Avoid invoking npx during test collection by requiring DOMSHELL_E2E=1
environment variable. This prevents unwanted side effects when running
pytest in environments without DOMShell.
Store the stdio_client context manager to ensure proper cleanup
when stopping daemon mode. Previously, __aexit__ was called on a new
instance, causing subprocess leaks.
Instead of reconstructing navigation via open_url(), directly use the
DOMShell MCP tools for back/forward navigation. This ensures
proper browser history tracking.