- Updated test to check for 'project.json' filename instead of 'test_project.json'
- Project structure changed to use project_dir/project.json format
- All core tests now passing (4/4)
- Fixed missing JSON closing braces between unimol_tools and safari entries
- Both CLIs are now properly separated in the registry
- Validated JSON syntax
- Remove incorrect --json flag from models rank debug output
- Fix --json option position in example commands (must be before subcommand)
- Improve empty metrics detection in compare output with len() check
- Add clearer warning message when no metrics available
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add warning message when no metrics found in model comparison
- Fix run_id extraction in demo script using proper JSON parsing
- Add debug output in demo to show model metrics before comparison
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add Windows compatibility for fcntl (fallback to atomic rename)
- Fix global _json_output leak in REPL by using ctx.obj
- Add @functools.wraps to handle_error decorator
- Remove duplicate setup.py, keep only pyproject.toml
- Fix package-data glob to match SKILL.md location
- Add REPL mode when no subcommand specified
- Fix compare_models output (use 'comparisons' key)
- Fix batch_cleanup output (use list lengths instead of _count keys)
- Add Uni-Mol Tools to main README.md software table
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add complete agent harness for Uni-Mol Tools molecular property prediction
- Include 5 task types: classification, regression, multiclass, multilabel
- Add interactive model management with storage analysis and cleanup
- Provide comprehensive documentation and 67 passing tests (100%)
- Add demo script with instructions
- Include project management and performance tracking features
Test data available at: https://github.com/545487677/CLI-Anything-unimol-tools/tree/main/unimol_tools/examples
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace string-concatenation with ElementTree for proper XML generation
- Generate Gen 5 (doc v1.1) nested structure: per-track tractors,
sequence tractor with UUID, main_bin playlist, project tractor
- Fix filters not taking effect: add id attribute and kdenlive_id
property on filter elements (closes#213)
- Fix "removed effect" dialog: use child <property> for mlt_service
instead of XML attribute
- Add kdenlive_name mappings for fade/brightness/speed effects
- Rewrite tests from string-matching to ET-based assertions
Fix#213
The hub previously always prepended the monorepo base URL to skill_md
values, breaking links for CLIs that moved to standalone repos. Now
absolute URLs (starting with "http") are passed through directly.
Also restores the zotero skill_md link pointing to its standalone repo.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remove unused `sanitize_dom_text` and `_PROMPT_INJECTION_PATTERNS`
from security.py (and 11 corresponding tests). The function was
never called in the CLI pipeline.
- Add explicit `return` after `_handle_error` in `_validate_url_or_exit`
so control flow is unambiguous if `sys.exit` is mocked.
- Replace manual `__name__`/`__doc__` copy with `functools.wraps` in
`handle_error` decorator.
- Document `asyncio.run()` limitation in `call()` docstring.
- Add `safari` entry to `_ACCENT_COLORS` in repl_skin.py (was falling
back to default).
- Add conflict-of-interest disclosure to HARNESS.md and SAFARI.md.
- Strip promotional language, cost comparisons, and benchmark tables
from HARNESS.md, SAFARI.md, SKILL.md, and README.md. Keep factual
per-call overhead note; remove dollar-amount positioning.
- Remove DOMShell comparison table from HARNESS.md.
All 49 non-E2E tests pass.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- search_query() now hits POST /search/ with JSON body per SOP
- search_simple() stays on POST /search/simple/ with query params
- Remove unused api_patch() and its test (v3.x API changed PATCH semantics)
- Add generic except Exception catch-all to handle_error decorator
Brings safari-mcp (https://github.com/achiya-automation/safari-mcp)
to CLI-Anything as a schema-driven harness. Every one of the 84 MCP
tools is auto-generated as a Click command from the bundled tool
schema (resources/tools.json) — guaranteed 1:1 parity with the
upstream server.
Architecture highlights:
- Schema-driven CLI generation via scripts/extract_tools.py (offline
parser of safari-mcp's Zod schemas with depth-aware modifier
detection for nested z.array(z.object(...)).describe() patterns)
- Dynamic Click command registration at import time from tools.json
- TestCLISubprocess with _resolve_cli() per HARNESS.md Phase 5
- URL validation with scheme blocking and optional private-network
lockdown (utils/security.py)
- 95 tests: 16 unit + 36 security + 24 parity + 19 E2E (all pass
against real Safari; SAFARI_E2E=1 to enable live tests)
Honest positioning:
The harness is STRICTLY slower than using safari-mcp directly for
MCP-compatible agents (Claude Code, Cursor, Cline). Per-call
latency: 119ms (persistent MCP session) vs 3,023ms (CLI subprocess
spawn). See HARNESS.md "Performance Tradeoffs" for the full
benchmark — MCP wins by ~25× on latency. The CLI is optimized for
a different audience:
- Agents that do not speak MCP (Codex CLI, GitHub Copilot CLI)
- Bash scripting and jq pipelines
- CI/CD and cron jobs
- Long-running Opus sessions where tool-definition token overhead
(~8K tokens per API call with MCP vs ~100 with CLI) dominates cost
Both paths return byte-identical output (verified live with Unicode
titles via list_tabs).
Files:
- safari/agent-harness/HARNESS.md architecture deep-dive
- safari/agent-harness/SAFARI.md software-specific SOP
- safari/agent-harness/setup.py PyPI package metadata
- safari/agent-harness/scripts/
extract_tools.py offline Zod parser → tools.json
- safari/agent-harness/cli_anything/safari/
safari_cli.py Click CLI with dynamic tool group
core/session.py in-memory REPL state
utils/safari_backend.py sync MCP stdio client wrapper
utils/security.py URL validation + DOM sanitization
utils/tool_registry.py loads tools.json, kebab↔camel
utils/repl_skin.py copied verbatim from plugin
resources/tools.json 84-tool schema bundle (safari-mcp 2.7.8)
skills/SKILL.md agent discovery manifest
README.md user-facing docs
tests/ 11/36/24/19 test files + TEST.md
Add CLI harness for Obsidian knowledge management via the Obsidian
Local REST API plugin. Includes vault CRUD, search, active note
operations, command execution, and interactive REPL mode.
- 48 unit tests (mocked, no backend required)
- 7 E2E tests (requires Obsidian with Local REST API plugin)
- Full documentation (SOP, README, SKILL.md, TEST.md)
- Registry entry for CLI-Hub