{
  "markdown": "# devenv-skills\n\nThree skills for the one-time work of setting a machine and its toolchain up —\nmigrate a legacy Python venv project onto mise + uv, move a config file into\ndotfiles and link it back, replace ad-hoc `ssh-copy-id` with an audited key\nmanifest. Packaged as a single plugin named `devenv`, installable on six\ncoding-agent harnesses.\n\n## Skills\n\n| Skill | Invoke | What it does |\n|-------|--------|--------------|\n| `mise-migrate` | `/devenv:mise-migrate [path] [--apply]` | Converts a pyenv / `python -m venv` + pip + setuptools project into `mise.toml` (tools, env, tasks) with uv owning the venv and dependencies. Python-venv projects only; dry-run unless `--apply`. |\n| `symlink-manager` | `/devenv:symlink-manager <file>` | Moves a config file into the dotfiles repo, links it back from its original path with a `.backup` of the original, generates `<app>_init` / `<app>_edit_*` helpers, updates help, and commits. |\n| `ssh-delegate` | `/devenv:ssh-delegate <sync\\|add\\|list\\|test\\|revoke\\|doctor>` | Manages SSH key delegation through `~/.ssh/delegations.yml` (mode 0600) instead of one-shot `ssh-copy-id` — identity pinning, host-fingerprint pinning, and a `flock`-serialized JSONL audit log. |\n\nAll three write. None of them is a read-only auditor — see\n[Harness support](#harness-support) and [`CLAUDE.md`](CLAUDE.md) for each\nskill's safety contract.\n\n### Visual guides and worked examples (GitHub Pages)\n\n- `mise-migrate` — [visual guide](https://deity719.github.io/devenv-skills/skill-guides/mise-migrate.html) · [usage example](https://deity719.github.io/devenv-skills/skill-output/mise-migrate-usage.html) (legacy venv project to mise + uv migration plan)\n- `symlink-manager` — [visual guide](https://deity719.github.io/devenv-skills/skill-guides/symlink-manager.html) · [usage example](https://deity719.github.io/devenv-skills/skill-output/symlink-manager-usage.html) (config file to dotfiles symlink and commit)\n- `ssh-delegate` — [visual guide](https://deity719.github.io/devenv-skills/skill-guides/ssh-delegate.html) · [usage example](https://deity719.github.io/devenv-skills/skill-output/ssh-delegate-usage.html) (ad-hoc ssh-copy-id to audited manifest)\n\nEach page is generated from a Markdown source under\n[`docs/skill-guides/`](docs/skill-guides) and [`docs/skill-output/`](docs/skill-output).\n\n## Install\n\n### Claude Code\n\n```\n/plugin marketplace add dEitY719/devenv-skills\n/plugin install devenv@devenv-skills\n```\n\n### Codex\n\n```\ncodex plugin install dEitY719/devenv-skills\n```\n\n### Kimi CLI\n\n```\nkimi plugin install dEitY719/devenv-skills\n```\n\n### Hermes Agent\n\n```\nhermes plugins install dEitY719/devenv-skills\n```\n\n### OpenCode\n\nSee [`.opencode/INSTALL.md`](.opencode/INSTALL.md).\n\n### Gemini CLI / Antigravity\n\n```\ngemini extensions install https://github.com/dEitY719/devenv-skills\n```\n\nAntigravity (`agy`) shares `~/.gemini`, so it inherits the install.\n\n## Harness support\n\nThese skills are written in Claude Code's vocabulary, but none of them depends\non a Claude-Code-only tool: `mise-migrate` and `symlink-manager` need only\nread/write/shell, and `ssh-delegate` is a thin router over a POSIX-sh script in\n`skills/ssh-delegate/lib/`. What varies between harnesses is not the tool\nvocabulary but the *environment* each one runs in. Per-harness tool names are\nmapped in [`harness-skills/references/`](https://github.com/dEitY719/harness-skills/tree/main/references);\nread the one file for the harness you are on.\n\n| Skill | Claude Code | Codex | Kimi | Gemini / Antigravity | Hermes | OpenCode |\n|-------|:-----------:|:-----:|:----:|:--------------------:|:------:|:--------:|\n| `mise-migrate` | full | full | full | full | full | full |\n| `symlink-manager` | full | full | full | full | full | full |\n| `ssh-delegate` | full | needs a TTY for `add` | needs a TTY for `add` | needs a TTY for `add` | needs a TTY for `add` | needs a TTY for `add` |\n\n*needs a TTY for `add`* — `ssh-copy-id` prompts once for the remote password and\nthat prompt cannot be answered from a non-interactive session. `ssh_delegate.sh`\ndetects this and fails fast with the exact command to run in a real terminal;\nevery other sub-command (`sync`, `list`, `test`, `revoke`, `doctor`) works\nunattended. This applies to Claude Code's non-interactive `!` sessions too.\n\nTwo environment dependencies apply everywhere: `mise-migrate --apply` runs\n`uv sync`, so `uv` must be on `PATH`; `symlink-manager` assumes a dotfiles repo\nlaid out as `bash/{claude,app,config,env}/` and commits with `git`.\n\n## Layout\n\nManifests live at the repo root and all point at one flat `skills/` directory:\n\n```\n.\n├── skills/{mise-migrate,symlink-manager,ssh-delegate}/\n│   ├── SKILL.md\n│   ├── references/\n│   └── lib/                                   ssh-delegate only\n├── .claude-plugin/{marketplace,plugin}.json   Claude Code\n├── .codex-plugin/plugin.json                  Codex\n├── .kimi-plugin/plugin.json                   Kimi CLI\n├── .hermes-plugin/{plugin.yaml,__init__.py}   Hermes Agent\n├── .opencode/plugins/devenv.js + INSTALL.md   OpenCode\n├── .agents/plugins/marketplace.json           Antigravity\n├── gemini-extension.json + GEMINI.md          Gemini CLI\n├── package.json\n├── CLAUDE.md · AGENTS.md -> CLAUDE.md\n└── LICENSE\n```\n\nOnly Claude Code understands a nested `plugins/<name>/skills/` layout. The other\nfive harnesses resolve manifests at the repo root and a skills tree at\n`./skills/`, so this repo keeps everything flat. See [`CLAUDE.md`](CLAUDE.md) for\nthe full rationale and contribution rules.\n\nThere is deliberately **no `references/` directory at this repo's root**. The\nshared per-harness tool mappings are owned solely by\n[`dEitY719/harness-skills`](https://github.com/dEitY719/harness-skills)\n(dEitY719/dotfiles#1410 F-5 / NF-2); this repo links to them rather than\ncarrying copies, so one tool rename stays one edit.\n\nThe `.kimi-plugin/` manifest is pre-provisioned: Kimi CLI is not installed on the\nmaintainer's machines yet, and shipping the manifest now costs nothing and saves\na migration later.\n\n## CI\n\n[`.github/workflows/validate.yml`](.github/workflows/validate.yml) is a thin\ncaller. The checks themselves — manifests, skill frontmatter, progressive\ndisclosure, the Codex description budget, version agreement, shell scripts,\nemoji — live once in\n[`dEitY719/harness-skills`](https://github.com/dEitY719/harness-skills)'\nreusable `skill-check.yml` workflow, which every split-out skill repo calls:\n\n```yaml\njobs:\n  validate:\n    uses: dEitY719/harness-skills/.github/workflows/skill-check.yml@main\n    with:\n      plugin-name: devenv\n```\n\nTo change what is checked, edit that workflow, not this repo.\n\n## Provenance\n\nThese skills were extracted from\n[`dEitY719/dotfiles`](https://github.com/dEitY719/dotfiles)\n(`claude/skills/devx-{mise-migrate,symlink-manager,ssh-delegate}`, since removed\nin that repo's Phase 4-1) as a content snapshot — no history rewriting. The\nsource commit SHA is recorded in this\nrepo's first commit message. The `devx-` prefix is dropped here because the\nplugin namespace (`devenv:`) now supplies it.\n\nOne thing the rename deliberately did not touch: `ssh-delegate` still writes\n`~/.ssh/config.d/devx-delegations` and `~/.local/state/devx/ssh-delegations.log`\nand reads `DEVX_SSH_*` environment variables. Those are live on-disk state;\nrenaming them is a separate change with a migration attached.\n\nThis is Phase 1 of the dotfiles #1410 migration; `packaging-skills` was Phase 0.\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n",
  "bytes": 7482,
  "sha": "d80a66e5586c339acb4bb71318608c387d014ebb55397e8661976de159d38fd2",
  "repo_slug": "deity719/devenv-skills",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_deity719_devenv_skills_f3453834/readme"
}