Skip to content

Butler rename, one-off contract-call, standalone tools + composite action - #2

Merged
kahwaipd merged 1 commit into
mainfrom
feat/butler-rename-standalone-tools
Sep 4, 2026
Merged

kahwaipd merged 1 commit into
mainfrom
feat/butler-rename-standalone-tools

Conversation

@kahwaipd

@kahwaipd kahwaipd commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Follow-up to #1 (already merged). Three owner decisions in one pass — do not merge without review; nothing under `skills/` is edited here, the pins move to the skill repos' `v1.0.1` tags.

Decision 1 — "Bevo" → "Butler"

  • `skills/bevo-copytrade` → `skills/butler-copytrade`, `skills/bevo-contract-call` → `skills/butler-contract-call`, both pinned at `v1.0.1` (`ca8df7e`, `b199720`). Container command/SDK names (`bevo-read`, `bevo-hub`, `bevo.trade()`, `import bevo`, …) are untouched.
  • Prefix rule: `butler-` is maintainer-only; `bevo-` is refused outright (the container's bundled-skill namespace — bevo-hub, bevo-onchain, bevo-automation-creator). `validate.py`, `new_skill.py`, `reserved-names.json`, README, SKILL_STANDARD, CONTRIBUTING, CLAUDE.md, CATALOG (regenerated), the README worked example (regenerated) and the tests follow.
  • `butler-contract-call` is one-off only (no `duty.py`): the validator lets a web3 skill declare `contracts: []` with no `## Contracts` section; selector recomputation runs only over listed entries.
  • "A skill is the delta over AGENTS.md" is now in README §6, SKILL_STANDARD (body sections) and CLAUDE.md.

Decision 2 — a skill repo never clones the registry

  • `scripts/publish_tools.py` + `publish.yml`: `tools/{validate.py,replay.py,stub_bevo.py,check_selectors.mjs,fixtures/*}` are published to the Pages site.
  • `validate.py` is a single stdlib-only file (reserved names embedded, kept in sync with `schema/reserved-names.json` by a test; `check_selectors.mjs` looked up beside it; warns when downloaded tooling sits in a skill tree).
  • `replay.py` finds `stub_bevo.py` + `fixtures/` beside itself and downloads what is missing from `https://virtual-protocol.github.io/butler-skills/tools/\` (`BUTLER_SKILLS_TOOLS_URL` overrides, `--no-download` forbids); a skill without `duty.py` is "nothing to replay", exit 0.
  • `.github/actions/validate/action.yml`: composite action (inputs `path`, `standalone`, `maintainer`, `fixture`) — checks out the skill, fetches this registry at `main` into `$RUNNER_TEMP`, installs viem, runs validator + replay. The template's whole CI is `uses: Virtual-Protocol/butler-skills/.github/actions/validate@main`.
  • Every "how to validate" now shows the two `curl -sSLO` lines; `tests/test_standalone_tools.py` runs that path from an empty directory against a `file://` mirror.

Verified locally

`check_pins.py` OK ×2 · `validate.py --all --maintainer` OK ×2 · `pytest tests -q` 76 passed · `build_index.py --dry-run` 2 skills · `sync_readme.py --check` in sync · the curl path from an empty dir on the cloned `butler-skill-copytrade` (3 recorded trades, stub + fixture downloaded) and `butler-skill-contract-call` (nothing to replay, exit 0).

Related: Virtual-Protocol/butler-skill-copytrade `v1.0.1` (on `main`), Virtual-Protocol/butler-skill-contract-call#1 (`v1.0.1` tagged), Virtual-Protocol/butler-skill-template#1.

🤖 Generated with Claude Code

…tion

Decision 1 — "Bevo" -> "Butler" in the sample skills and the prose:
- skills/bevo-copytrade -> skills/butler-copytrade, skills/bevo-contract-call ->
  skills/butler-contract-call (submodules re-added under the new paths, both pinned at
  their v1.0.1 tags). Container command/SDK names (bevo-read, bevo-hub, bevo.trade(),
  import bevo, ...) are untouched — they are the runtime's real names.
- validate.py / new_skill.py: the maintainer-only prefix is now `butler-`; `bevo-` names
  are refused outright (the container's bundled-skill namespace: bevo-hub, bevo-onchain,
  bevo-automation-creator). reserved-names.json comment, README, SKILL_STANDARD,
  CONTRIBUTING, CLAUDE.md, CATALOG (regenerated), sync_readme.py + README worked example,
  and every test follow.
- butler-contract-call is one-off only (modes ["one-off"], no duty.py): validate.py now
  lets a web3 skill declare contracts: [] (or omit it) with no `## Contracts` section;
  selector recomputation runs only over listed entries. build_index lists whatever files
  the pinned checkout has.
- "A skill is the delta over AGENTS.md" written into README §6, SKILL_STANDARD (body
  sections) and CLAUDE.md.

Decision 2 — a skill repo never clones the registry to validate:
- scripts/publish_tools.py + publish.yml: dist/tools/{validate.py,replay.py,stub_bevo.py,
  check_selectors.mjs,fixtures/*} go to the Pages site next to stable/ and canary/.
- validate.py is a single stdlib-only file: reserved names embedded (test asserts they
  match schema/reserved-names.json), check_selectors.mjs looked up beside the script,
  warns when downloaded tooling sits in a skill tree.
- tests/replay.py finds stub_bevo.py and fixtures/ beside itself and downloads whatever
  is missing from https://virtual-protocol.github.io/butler-skills/tools/
  (BUTLER_SKILLS_TOOLS_URL overrides; --no-download forbids); stub_bevo.py fetches a
  missing read()/rpc() fixture on first use; a skill without duty.py is "nothing to
  replay", exit 0.
- .github/actions/validate/action.yml: composite action (inputs path, standalone,
  maintainer, fixture) that checks out the skill, fetches this registry at main into
  $RUNNER_TEMP, installs viem and runs validator + replay — the template's whole CI.
- tests/test_standalone_tools.py exercises the published layout from an empty directory
  with a file:// mirror standing in for Pages.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: kw <kahwai@pathdao.io>
@kahwaipd
kahwaipd merged commit 5ad2588 into main Sep 4, 2026
1 check passed
@kahwaipd
kahwaipd deleted the feat/butler-rename-standalone-tools branch September 9, 2026 05:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant