Butler rename, one-off contract-call, standalone tools + composite action - #2
Merged
Merged
Conversation
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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"
Decision 2 — a skill repo never clones the registry
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