Skip to main content

Build, install, and migrate portable agent packs across Codex, Claude Code, and Cursor.

Project description

Packwright dovetail mark

Packwright

Build your agent once. Carry it everywhere.

Compile one agent definition—rules, memory, skills, and workspace—into native packs
for Codex, Claude Code, and Cursor. Build, install, migrate, and verify with plain files.

Explore the live product website →
Watch the animated CLI, follow a Claude Code → Codex migration, and switch the Quickstart between Claude Code, Codex, and Cursor.
English · 简体中文

Open the Packwright live product website

Packwright website CI status MIT license 中文 README

Native packs. Portable state. Preview every migration before any files are written.

[!NOTE] Packwright itself makes no network requests and sends no telemetry. Your coding runtime may still send files it reads to its own model provider; its data policy continues to apply.

Start with your coding agent

The shortest interface is a conversation. Install Packwright, then paste the operating prompt into Codex, Claude Code, or Cursor:

python -m pip install packwright==0.1.0

Open the paste-ready agent prompt →

For a new agent, describe what it should do and choose its name. The prompt makes your coding agent draft a canonical intake, confirm it with you, build the pack, and verify the installed target. For migration, it previews the receipt and waits for approval before writing.

Create your own

Generate Packwright's interviewer contract, then let your coding agent turn the conversation into a confirmed character_intake.yaml:

packwright draft-character \
  --user-name Morgan \
  --prompt-out work/character-interviewer.md

After the agent saves the confirmed intake, create editable source and build it:

packwright init work/nova-intake.yaml -o work/nova
packwright build work/nova --adapter claude-code -o pack/nova-claude
packwright install pack/nova-claude --adapter claude-code --target project/nova-claude

Already have an agent or workspace? Inventory it before importing anything:

packwright adopt --from existing-agent --dry-run

Or use a nameless starter

Three presets cover common starting points. Customize responsibilities, capabilities, voice, boundaries, and emotional feedback; the preset shapes how the agent works, while you always choose its name.

Preset Starting role
code Expert engineer — builds, reviews, debugs, tests, and ships technical work
work Versatile assistant — plans projects, drafts deliverables, clarifies decisions, and keeps execution moving
companion Personal secretary — supports daily routines, life decisions, travel planning, and emotional support

Choose a preset, answer a few simple questions, and supply the character name yourself.

packwright init --template code --name Nova --user-name Morgan -o work/nova
packwright build work/nova --adapter claude-code -o pack/nova-claude
packwright install pack/nova-claude --adapter claude-code --target project/nova-claude

Nova is only an example of a user-chosen name. Edit the generated name, relationship, voice, and boundaries whenever you need.

Preview a move from Claude Code to Codex. The destination is not created during this step:

packwright migrate project/nova-claude \
  --to codex \
  --target project/nova-codex --dry-run

The plan names four kinds of paths:

Receipt section Meaning
generated Files compiled for the destination runtime
carried Portable user files copied and SHA-256 verified
rewritten Packwright-managed routing lines changed for the destination
excluded Runtime-specific files deliberately left behind

After reviewing the receipt, apply that exact move and verify the result:

packwright migrate project/nova-claude \
  --to codex \
  --target project/nova-codex --yes
packwright doctor project/nova-codex
packwright score project/nova-codex

Add --json to the dry run and confirmed run for a machine-readable packwright-migration/v1 receipt. Packwright refuses to overwrite an existing target unless you separately opt into --force.

Why not just prompts?

A working coding agent is more than its top-level instructions, and each runtime expects a different native layout:

Runtime Native entry Reusable procedures
Codex AGENTS.md .agents/skills/<name>/SKILL.md
Claude Code CLAUDE.md .claude/skills/<name>/SKILL.md
Cursor .cursor/rules/<name>.mdc .cursor/rules/<name>-save-context.mdc

Packwright treats those files as compiled projections. Your editable source owns the behavior; adapters own the runtime layout; migration carries portable state and reports the seams instead of hiding them.

Build once, carry everywhere

editable source
  identity · memory contract · skills · workspace rules
         │
         ├── packwright build --adapter codex       → AGENTS.md + .agents/skills/
         ├── packwright build --adapter claude-code → CLAUDE.md + .claude/skills/
         └── packwright build --adapter cursor      → .cursor/rules/*.mdc

Every pack and installed target includes self-contained .packwright/ metadata: the canonical source snapshot, artifact lock, and checker receipt. You can relocate a target and still run migrate, doctor, and score without its original build directory.

Move a working agent

migrate recompiles runtime-native files and carries portable state into the destination. It reports what cannot carry before it writes, then waits for an explicit --yes. The receipt is the proof behind “carry it everywhere,” not a promise that unlike runtimes have no seams.

What the checks prove

  • score evaluates the public pack structure and artifact contract. 100.0 is a structural pass, not a promise that a runtime will behave perfectly.
  • doctor verifies Packwright-managed projection hashes and can repair reproducible drift without treating portable user state as generated output.
  • Migration verifies carried and rewritten files by hash and records planned and installed scores.
  • Packwright ships six directed migration paths across the three current adapters. New adapters land when they pass the checker.

Current release boundary

0.1.0 is Packwright's first stable release. The supported destination adapters are Codex, Claude Code, and Cursor. Packwright is local tooling, not cloud sync, and its plain-file structure score is separate from real runtime compatibility.

Documentation

Packwright is open source under the MIT License.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

packwright-0.1.0.tar.gz (528.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

packwright-0.1.0-py3-none-any.whl (100.2 kB view details)

Uploaded Python 3

File details

Details for the file packwright-0.1.0.tar.gz.

File metadata

  • Download URL: packwright-0.1.0.tar.gz
  • Upload date:
  • Size: 528.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for packwright-0.1.0.tar.gz
Algorithm Hash digest
SHA256 0d5c314103f8f9f77a6cbff6e442fb90b9b880070383fea1882e7b3ce7b7797a
MD5 1a64d0fdba1ac4a9fe67d78cf2459533
BLAKE2b-256 c90e5d3a0d89bc89980de3f952fff1b0563204fb93a2f602db507aaac1355f24

See more details on using hashes here.

Provenance

The following attestation bundles were made for packwright-0.1.0.tar.gz:

Publisher: release.yml on pioneerjeff-labs/packwright

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file packwright-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: packwright-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 100.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for packwright-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 fbb8820af76d56c5a10412082d8741101a2a5589240c2042cbd187e210381148
MD5 5711149c05bbfbe0cdbdeb2255c0e7e1
BLAKE2b-256 6004e4e64a55cb445991713207846ac0c22cab55af8753d5310f9baf8d44b35b

See more details on using hashes here.

Provenance

The following attestation bundles were made for packwright-0.1.0-py3-none-any.whl:

Publisher: release.yml on pioneerjeff-labs/packwright

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page