skills/development/migrate-to-earl/SKILL.md
Scans a codebase for raw API/CLI calls (curl, gh, stripe-cli, psql, grpcurl, etc.) and replaces them with Earl templates — one provider at a time. Use when migrating a project from direct CLI tool usage to Earl, or when replacing raw HTTP calls with reviewed templates.
npx skillsauth add mathematic-inc/earl migrate-to-earlInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Converts existing raw CLI/API calls in a codebase to Earl templates. Works one provider at a time to keep changes reviewable and reversible.
These rules prevent context window exhaustion and partial-migration messes:
# TODO: migrate to earl comments and note them in the final report.curl | jq | xargs) are not rewritten.
Add # TODO: migrate to earl (complex pipeline — review manually) and move on.Read references/cli-to-earl-mapping.md (or fetch from https://raw.githubusercontent.com/mathematic-inc/earl/main/skills/development/migrate-to-earl/references/cli-to-earl-mapping.md) for the full list of patterns and files to scan.
Grep across all relevant files for every pattern in the mapping table. Even on repeated invocations, always do a full scan first.
Present a summary before asking the user to pick a provider:
"Found API/CLI calls to:
- GitHub (12 sites in 4 files)
- Stripe (8 sites in 2 files)
- Slack (3 sites in 1 file)
Which provider would you like to migrate first?"
If only one provider is found, proceed with it directly.
Note the remaining providers in the report so the user knows what's left for follow-up runs.
Check if a pre-built template exists for the chosen provider (see references/cli-to-earl-mapping.md).
If pre-built exists:
Check earl templates list first — if the provider is already imported, skip the import
command below and go directly to showing available commands.
earl templates import https://raw.githubusercontent.com/mathematic-inc/earl/main/examples/<provider>.hcl
earl templates list
Show the user which commands are available in the imported template.
If no pre-built exists:
Invoke create-template for the provider. The create-template skill includes its own
human review, validation, and secrets steps — do not duplicate those steps here.
For each found call site, determine the corresponding Earl command:
earl templates list --json
Match each raw call to an Earl command:
curl -X GET https://api.github.com/repos/... → earl call github.get_repogh issue create ... → earl call github.create_issuestripe customers list → earl call stripe.list_customersFor calls that don't map to any existing command, invoke create-template to add it.
Skip this phase only if Phase 2 took the "no pre-built" path and invoked create-template
directly (i.e., no bare earl templates import was run). In that case, create-template
already ran secrets setup (its own Phase 7 and Phase 8) and confirmed secrets are set.
Proceed to Phase 5.
Do NOT skip if Phase 2 ran a bare earl templates import — even if Phase 3 also invoked
create-template for an unmapped command. The Phase 3 create-template only set secrets for
the new command it created, not for the Phase 2 pre-built import. Phase 4 must still run for
the pre-built provider's secrets.
Check annotations.secrets in the template file for required secret keys. For pre-built
imports, read the imported file at ~/.config/earl/templates/<provider>.hcl (macOS/Linux)
or %APPDATA%\earl\templates\<provider>.hcl (Windows) to find them.
Print the checklist of required secrets for the imported templates:
Before replacing call sites, set the required secrets in your terminal:
earl secrets set <provider>.<key>
Tell me when you're done and I'll verify before we proceed.
On macOS: First run of earl secrets set may show a system keychain access dialog.
Click "Always Allow" to avoid repeated prompts.
After the user confirms, verify:
earl secrets list
Check that all required keys appear. Re-print missing ones if needed.
Run a test call for each mapped command before touching any call sites:
earl call --yes --json <provider>.<command> --<param> <representative_value>
Important: If a command has annotations.mode = "write", the test call will create/modify/
delete real data. If the template defines environments (check the environments block for
valid names), use --env <name> to select a non-production environment for the test call.
Otherwise, use read-only commands for verification where possible, or use a test/sandbox
account. Warn the user before running any write-mode test calls.
If any call fails, resolve it (via troubleshoot-earl if needed) before proceeding.
Show the user:
Ask explicitly:
"I'm about to rewrite these X call sites. This will modify your source files. Should I proceed? (You should commit your current changes first if you haven't.)"
Do not rewrite anything until the user approves.
For each approved call site, rewrite to the Earl equivalent:
# Before:
curl -H "Authorization: Bearer $GITHUB_TOKEN" https://api.github.com/repos/$OWNER/$REPO
# After:
earl call --yes --json github.get_repo --owner $OWNER --repo $REPO
For source files (Python, JavaScript, etc.): curl calls typically appear inside subprocess invocations — replace the subprocess call with the Earl equivalent for that language:
# Before (Python):
subprocess.run(["curl", "-H", f"Authorization: Bearer {token}", url])
# After (Python):
subprocess.run(["earl", "call", "--yes", "--json", "github.get_repo", "--owner", owner, "--repo", repo])
// Before (Node.js):
execSync(`curl -H "Authorization: Bearer ${token}" ${url}`);
// After (Node.js):
execSync(
`earl call --yes --json github.get_repo --owner ${owner} --repo ${repo}`,
);
For flagged complex pipelines, add a comment but leave the original:
# TODO: migrate to earl (complex pipeline — review manually)
curl ... | jq ... | xargs ...
earl templates validate
Summarize what was done:
migrate-to-earl againcreate-templatesecure-agenttroubleshoot-earltools
Use when you need to call an API, run a database query, or execute a shell command via Earl. Discovers available commands and calls them correctly. Do not use raw curl, gh, psql, or similar tools when Earl is available.
tools
Diagnoses and fixes Earl problems including installation failures, template errors, authentication issues, MCP connectivity, and SSRF blocks. Use when Earl isn't working, when earl call returns errors, when MCP tools are not visible, or when earl doctor reports failures.
tools
Installs Earl, configures MCP integration for your agent platform, writes CLAUDE.md instructions, and routes to template creation or migration. Use when setting up Earl for the first time, when a new developer is onboarding to a project that uses Earl, or when Earl needs to be connected to an agent platform.
tools
Locks down an AI agent by configuring platform-level tool restrictions (deniedTools) and Earl network egress rules. Use after Earl is working and templates are created, to make Earl's security guarantee enforceable rather than advisory.