Turn anything into a CLI.
Your agents stop clicking.
declick compiles an OpenAPI spec or a native Windows app into a command line tool. Every generated CLI honors the same output contract, so an agent learns it once and never reads a screenshot again.
Install
npm i -g declick
declick add https://petstore3.swagger.io/api/v3/openapi.json --name petstore
petstore describe
petstore (openapi) source: https://petstore3.swagger.io/api/v3/openapi.json
get-pet-by-id <petId> Find pet by ID
find-pets-by-status Finds Pets by status
...
common: --json --fields --limit --dry-run exit: 0 ok 1 err 2 missing 3 blocked 4 auth
petstore get-pet-by-id 7 --json
Each adapter also gets a two line launcher and a generated SKILL.md, so Claude Code and other agents discover it without being told.
Windows apps, without a model in the loop at run time
Web pages and MCP servers already have converters. Native Windows apps did not. declick owns that engine, built on deskclaw UI Automation.
declick add app:Calculator --goal "multiply two numbers and return the display" --verb multiply
saved ~/.declick/calculator/recipes/multiply.json (replay returned "Display is 12")
calculator multiply Three Four --json
{"ok":true,"data":"Display is 12","meta":{"count":1,"truncated":false}}
Authoring runs one bounded Claude Code session that may only read the window tree. It proposes a recipe with an example and an expected result. declick dry-runs the recipe to prove every element path resolves, replays it once for real while you watch, and saves it only when the result matches. After that, replay is deterministic: element paths by ControlType:Name, never coordinates, never screenshots.
When the app changes, replay does not guess. The missing path exits 2 with a diff of the recorded tree against the live one, and declick repair reruns authoring seeded with that diff.
The output contract
| Guarantee | Detail |
|---|---|
<name> describe | Whole surface in under 500 tokens. |
--json | Default when piped. {ok, data, meta:{count, truncated}} |
--fields, --limit | Project named fields, cap list output. |
--dry-run | Every mutating verb prints what it would do. |
| Exit codes | 0 ok, 1 error, 2 not found, 3 blocked, 4 auth needed. |
| Governance | Mutating verbs route through DashClaw when DASHCLAW_API_KEY is set. |
| Auth | Manifests name env keys only. Values come from the environment or the creds vault. |
declick lint enforces all of it on every adapter.
Next
- MCP servers through mcporter and websites through OpenCLI, behind the same contract.
declick uialready ships: one local page with every adapter, last run, and build, repair, remove buttons.