Skip to main content

portable-resume-skills

Local coding-agent session stores flow into a sealed context archive, then into fresh destination sessions

Offline, local-only context migration · 17 sources × 18 hosts (derived from registries) · inert handoff, not live restore

English · 繁體中文 · 简体中文 · 日本語 · 한국어 · Español · Português · Français · Deutsch · Русский · العربية · हिन्दी · All languages

Clean-room-oriented Agent Skills for migrating bounded local coding-agent context into a fresh session. Readers never invoke the source agent CLI and never add a network path; recovered text is marked untrusted and stale.

Current release: 0.4.4 · PyPI · 306/306 packaging and Ubuntu installed-runner cells (17 sources × 18 destinations). Windows native mutating install is supported (#125); Windows hard gate is focused product-install smoke (3 hosts), not full 306/306 on Windows. Published v0.4.3 / v0.4.2 / v0.4.1 / v0.4.0 remain historical; published v0.3.4 remains historical 81.

Host evidence boundary: v0.3.2-era checks cover 7/7 exact native local plugin/extension installs, 8/8 host-native headless Skill invocations, 6/6 compatible public marketplace installs, and Cursor/Kimi pickers. Fresh through 0.4.4 host reinstall/picker flows and Pi/OpenClaw native UI remain not-run (still not re-run on this tip).

Current main version: 0.4.5 release candidate (untagged; v0.4.5 is not published yet). Explicit build/release reports add +g<commit>[.dirty] while package metadata keeps the PEP 440 base. Artifact builds pin one canonical identity before producing bytes. Repository-level immutable v* tag enforcement remains active (ruleset 20148806).

Sources and destinations

Resume skill Source store family
resume-claude Claude Code projects JSONL
resume-codex Codex SQLite / rollout JSONL
resume-cursor Cursor CLI chats / Desktop vscdb
resume-opencode OpenCode SQLite / file store
resume-antigravity Antigravity transcript JSONL
resume-grok Grok Build session updates JSONL
resume-qwen Qwen Code chat JSONL, including archived chats
resume-kimi Current Kimi Code wire JSONL + legacy Kimi CLI context JSONL
resume-pi Pi agent versioned tree JSONL (agent/sessions/--cwd-slug--/)
resume-openclaw OpenClaw per-agent SQLite (agents/<id>/agent/openclaw-agent.sqlite)
resume-goose goose sessions.db SQLite (sessions/sessions.db, schema v15)
resume-crush Crush project SQLite (crush.db, goose_db_version 7)
resume-cline Cline sessions index + messages JSON (~/.cline/data)
resume-openhands OpenHands CLI conversation events (~/.openhands/conversations)
resume-hermes Hermes Agent state.db sessions (~/.hermes/state.db)
resume-gemini Gemini CLI session JSONL (~/.gemini/tmp/.../chats) — not Antigravity
resume-github-copilot GitHub Copilot CLI local session-state/<id>/events.jsonl

Destination profiles: Claude Code, Codex, Cursor, OpenCode, Antigravity, Grok Build, Qwen Code, Kimi Code CLI, Pi agent, OpenClaw, goose, Crush, Cline, OpenHands, Hermes Agent, GitHub Copilot CLI, Gemini CLI (compat, not Antigravity), and Kilo CLI (destination-only).

Requirements

  • Python 3.11+; CI covers 3.11–3.14 on Ubuntu and macOS.
  • Product runtime is stdlib-only.
  • Optional trusted zstd binary for compressed Codex rollouts.

Quick start

Install the published package, then install every destination profile into its user-global Skill root:

pipx install portable-resume
install-resume-skills quick-install all

From a source checkout, use pipx install . instead. To install only one host or one project:

install-resume-skills quick-install qwen
install-resume-skills quick-install qwen --project "$PWD"

Windows without pipx

Use Python's actual user-base Scripts directory rather than a hard-coded Python311 path (the directory changes with the interpreter and install layout):

python -m pip install --user portable-resume
$scripts = python -c "import sysconfig; print(sysconfig.get_path('scripts', 'nt_user'))"
$userPath = [Environment]::GetEnvironmentVariable('Path', 'User')
$parts = @($userPath -split ';' | Where-Object { $_ })
if ($parts -notcontains $scripts) {
  [Environment]::SetEnvironmentVariable('Path', (@($parts + $scripts) -join ';'), 'User')
}

Open a new PowerShell after changing the User PATH, then install and verify the profiles you use:

install-resume-skills quick-install claude
install-resume-skills verify --host claude --scope global

Start with and verify the hosts you actually use. quick-install all is a transactional convenience across the registry-derived profiles, not evidence that every destination UI was activated. On Windows, the release hard gate is the focused Claude/Cursor/Codex product smoke, not 306/306. Shared symlink/junction roots are grouped by their physical root and require an ownership claim for every intended host. See Windows user install and shared Skill roots.

For a host-native public marketplace install, add the portable-resume-marketplace:

# Claude Code
claude plugin marketplace add ImL1s/portable-resume-marketplace
claude plugin install portable-resume@portable-resume --scope user

# Codex
codex plugin marketplace add ImL1s/portable-resume-marketplace
codex plugin add portable-resume@portable-resume

Verified Cursor, Qwen, Grok, Kimi and Antigravity CLI commands plus the direct OpenCode fallback are in docs/install-hosts.md.

The lower-level transactional command remains available for previews, custom roots, verification, and uninstall:

Installed (pipx/pip):

# Inspect capabilities and the registry-derived matrix
portable-resume --version
install-resume-skills --version
portable-resume self-check --json
install-resume-skills matrix
install-resume-skills hosts --json

# Preview, install, verify, and uninstall one destination
install-resume-skills install \
  --host qwen --scope project --project "$PWD" --dry-run
install-resume-skills install \
  --host qwen --scope project --project "$PWD"
# Selected sources are recorded in the ownership claim; verify intentionally
# takes no --sources argument and checks the recorded install plan.
install-resume-skills install \
  --host qwen --scope project --project "$PWD" --sources codex,grok
install-resume-skills verify \
  --host qwen --scope project --project "$PWD"
install-resume-skills uninstall \
  --host qwen --scope project --project "$PWD" --dry-run

From a source checkout (no install):

PYTHONPATH=src python3 scripts/portable-resume --version
PYTHONPATH=src python3 scripts/install-resume-skills --version
python3 scripts/check_version_state.py --require-git --json
PYTHONPATH=src python3 scripts/portable-resume self-check --json
PYTHONPATH=src python3 scripts/install-resume-skills matrix
PYTHONPATH=src python3 scripts/install-resume-skills hosts --json
PYTHONPATH=src python3 scripts/install-resume-skills install \
  --host qwen --scope project --project "$PWD" --dry-run

The synthetic fixture exists only in a source checkout:

PYTHONPATH=src python3 scripts/portable-resume claude show latest \
  --cwd /workspace/project \
  --source-root tests/fixtures/claude/s-cla-01-ordered-parent-chain/root \
  --format handoff

Full roots, activation grammar, direct archives, and marketplace/plugin routes are in docs/install-hosts.md. Release assets are generated with:

python3 scripts/build_host_packages.py --output-dir host-packages

Published v0.3.4 archives include nine direct-skill ZIPs (including Pi) plus supported Claude, Codex, Cursor, Antigravity, Grok, Qwen, and Kimi plugin/marketplace bundles. Current main development builds derive direct ZIPs from all 18 enabled destinations. OpenCode remains a direct Skill install because its plugin surface is executable JavaScript/TypeScript rather than a Skill bundle.

Skill contract

python3 <skill>/scripts/run_reader.py show latest --cwd "$PWD" --json
python3 <skill>/scripts/run_reader.py show <session-id|path|text> --cwd "$PWD" --json
python3 <skill>/scripts/run_reader.py list --cwd "$PWD" --json

Activate resume-<source> using the host's documented grammar, run only the installed reader, and summarize its inert output after re-checking the repository. portable-resume/request-v1 files remain an optional advanced interface.

Safety invariants

  • Source stores are immutable; stable no-follow reads fail closed on races.
  • Source CLIs are never invoked.
  • Recovered text is inert/untrusted and only best-effort redacted.
  • Installer paths are contained under the selected skill root.
  • Non-owned collisions require --force-with-backup; multi-root installs compensate on failure.
  • Shared physical roots with divergent host renders fail before mutation.

Tests and CI/CD

Run all required local gates:

python3 scripts/self_verify.py
python3 scripts/check_secrets.py
PYTHONPATH=src python3 -m unittest discover -s tests -q
PYTHONPATH=src python3 scripts/smoke_installed_matrix.py

.github/workflows/ci.yml runs those gates across Ubuntu/macOS and Python 3.11–3.14, then builds the wheel/sdist twice from one identity pin and epoch under different parent umasks, requires byte-for-byte reproducibility, proves the source package was not mutated, verifies the same embedded identity across all 27 generated artifacts in four artifact families, and smoke-installs the exact wheel and sdist with poisoned build-pin environment variables removed from child processes. .github/workflows/release.yml accepts only annotated vMAJOR.MINOR.PATCH tags reachable from main, re-runs dual-OS gates, builds release bytes once from one pinned identity, tests those exact bytes, creates SHA-256 checksums and GitHub attestations, stages a GitHub Release, and publishes through PyPI Trusted Publishing.

src/portable_resume/resources/latest-release.json records the immutable latest published identity. Normal CI fetches release tags and fails if changed source reuses a published stable version. The protected release path rejects development versions; after every release, main advances immediately to the next .dev0 line.

Published release v0.3.4 also verifies the GitHub Release layout itself: every SHA256SUMS entry is a flat asset basename, and both Ubuntu and macOS validate a simulated flat download before publication. The immutable v0.3.4 release run, commit, public checksum/attestation checks, GitHub Release, PyPI, and marketplace evidence are archived in docs/evidence-summary.md.

Key documentation


Support

If this project saved you some time, you can buy me a coffee.

License and limitations

Apache-2.0. This project is not affiliated with the host vendors. Do not copy ~/.grok/bundled/skills/** into this tree.

Eight host CLI surfaces have recorded headless slash/name activation evidence; Pi native activation remains not-run. Public marketplace installation on six compatible hosts, including Cursor and Kimi picker flows, is recorded for v0.3.2; fresh through 0.4.1 host-by-host reinstall remains not-run. Other visual Skill pickers are not claimed. Vendor-curated directory listings (OpenAI Plugins Directory, Claude Code community marketplace, xAI Grok Build marketplace): the OpenAI Plugins Directory listing was published on 2026-09-09 (public page), the xAI catalog PR is awaiting review, and the Claude Code submission is pending review; the listing status is tracked in docs/STATUS.md. Cursor's full bubble graph is not claimed; redaction is not complete DLP.

Download files

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

Source Distribution

portable_resume-0.4.5.tar.gz (349.6 kB view details)

Uploaded Source

Built Distribution

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

portable_resume-0.4.5-py3-none-any.whl (389.5 kB view details)

Uploaded Python 3

File details

Details for the file portable_resume-0.4.5.tar.gz.

File metadata

  • Download URL: portable_resume-0.4.5.tar.gz
  • Upload date:
  • Size: 349.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for portable_resume-0.4.5.tar.gz
Algorithm Hash digest
SHA256 3c13b326e1811120df830075bc7c7d058ca2efb9120419de28d89fe11b8b69fa
MD5 874fb0956042b1e7e59b15ad4328fbe0
BLAKE2b-256 bce493014c2d31031122f26fc48aa2cbc72392ef0822e1a00bcbb2169629be95

See more details on using hashes here.

Provenance

The following attestation bundles were made for portable_resume-0.4.5.tar.gz:

Publisher: release.yml on ImL1s/resume-skills

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

File details

Details for the file portable_resume-0.4.5-py3-none-any.whl.

File metadata

  • Download URL: portable_resume-0.4.5-py3-none-any.whl
  • Upload date:
  • Size: 389.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for portable_resume-0.4.5-py3-none-any.whl
Algorithm Hash digest
SHA256 b6d78934000fd9b4f964a45bc7516c8f52f97938843ac0cfd0186bf422471443
MD5 1b16e87bd29981816b54f9f9e68d9745
BLAKE2b-256 494b00e92932f12683c935d93d93165da02a87266805cdda9520ba04de213e7b

See more details on using hashes here.

Provenance

The following attestation bundles were made for portable_resume-0.4.5-py3-none-any.whl:

Publisher: release.yml on ImL1s/resume-skills

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

Release history Release notifications | RSS feed

This release

0.4.5 This release

2 files

0.4.4

2 files

0.4.3

2 files

0.4.2

2 files

0.4.1

2 files

0.4.0

2 files

0.3.4

2 files

0.3.3

2 files

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page