Contributing

August 21, 2026 · View on GitHub

中文版:贡献指南

skillferry is a headless CLI built around three promises: target neutrality, a portability contract, and secrets that never move. A contribution that weakens any of them is a regression, not a feature.

Ground rules

  • No network requests in the engine. Every command is local-only.
  • No resolved secrets in reports, logs, JSON output, exports, or the state ledger. References only.
  • No grade without evidence: update docs/AGENT_MATRIX.md and the acceptance record before changing any native/translated/… label.
  • Conflicts are never silent. New takeover paths must go through the ownership ledger and --resolve.
  • Windows and macOS acceptance stay independent records; CI greenness is automated evidence, not native acceptance.

Development loop

$ python -m pip install -e ".[dev]"
$ python -m pytest          # everything must stay green
$ python -m ruff check .    # E, F, I, UP, B
$ python scripts/audit_public_tree.py .
$ python scripts/check_seed_skills_parity.py
$ python scripts/validate_workspace.py examples/starter-workspace

Every change that affects behavior needs tests; security-relevant behavior needs negative tests (prohibited files, symlinks, path traversal, secret leakage).

Adding an adapter

Implement the Adapter interface in src/skillferry/adapters/base.py (asset locations, grade derivations, MCP rendering), register it in src/skillferry/adapters/registry.py, add shape tests for the rendered files, and record the capability evidence in the matrix. A new adapter without evidence stays out of native by construction.

Release checklist

The release-checklist seed skill is the canonical gate list for this repo; run it before any tag or publish.