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

GuaranteeDetail
<name> describeWhole surface in under 500 tokens.
--jsonDefault when piped. {ok, data, meta:{count, truncated}}
--fields, --limitProject named fields, cap list output.
--dry-runEvery mutating verb prints what it would do.
Exit codes0 ok, 1 error, 2 not found, 3 blocked, 4 auth needed.
GovernanceMutating verbs route through DashClaw when DASHCLAW_API_KEY is set.
AuthManifests name env keys only. Values come from the environment or the creds vault.

declick lint enforces all of it on every adapter.

Next