A curated skill pack by Elliot Drel for Claude Code and other agents that support the installed skills directory. One command installs the pack.
npx elliot-stack@latestThis installs skills to ~/.agents/skills/ and symlinks them into ~/.claude/skills/, then registers SessionStart hooks for Claude Code and Codex so your skills stay up to date automatically. Agents configured to discover ~/.agents/skills/ can load the pack. Host-specific commands, hooks, and monitoring features depend on the agent integration.
| Skill | Command | Description |
|---|---|---|
| Active Learning Tutor | /estack-active-learning-tutor |
Tutors a student through exam preparation using active learning — questioning, gap diagnosis, and concept mastery tracking |
| Better Title | /estack-better-title |
Renames Claude Code or Codex chat sessions — a short subject you can skim, plus project and keywords you can grep |
| Book Extractor | /estack-book-extractor |
Turns a book or doc set (PDF, EPUB, DOCX, HTML, RTF, TXT/MD) into a standalone, on-demand Agent Skill — deterministic text extraction, then per-chapter reference files, glossary, cheatsheet, and a master index generated by the agent, installed outside the e-stack pack |
| Chris Voss | /estack-chris-voss |
Applies negotiation principles from Never Split the Difference when preparing to negotiate with an outside counterpart; hard conversations with your own team go to Leadership Coach, and the message itself to Email Writer or Cold Message Writer |
| CLAUDE.md Optimizer | /estack-claude-md-optimizer |
Creates, audits, and maintains concise CLAUDE.md / AGENTS.md instructions, preserving project conventions and the chosen canonical file while applying authorized edits |
| Cold Message Writer | /estack-cold-message-writer |
Writes first-touch messages to strangers with a truthful, recipient-specific hook and a clear ask |
| Customer Discovery | /estack-customer-discovery |
Guides through customer discovery — validating ideas, outreach, interviews, and analysis |
| Doc Review Viewer | /estack-doc-review-viewer |
Opens a local Markdown review viewer with versioned snapshots, threaded comments anchored to quoted text, and a feedback handoff to the agent |
| Drive CLI Agent | /estack-drive-cli-agent |
Drives another AI coding agent CLI programmatically — Codex (codex exec) and Claude Code headless (claude -p) — under existing subscriptions, with the invocation templates, structured-output parsing, and documented footguns (stdin hangs, timeout gaps, sandbox traps, false-success signals) needed to do it reliably |
| Email Writer | /estack-email-writer |
Writes, edits, and reviews email to someone who already knows the sender — subject lines, openers, single weightless asks, scheduling without round-trips, and a human voice; first-touch mail to a stranger is Cold Message Writer |
| Flight Planner | /estack-flight-planner |
Finds flights between two airports and pairs them with a ground shuttle on either end of the trip. Automates what is repetitive and easy to get wrong (fetching every route, parsing the results, timezone-aware buffer math) and leaves filtering and ranking to judgment. Saves preferences and reusable trip presets |
| GitHub Issue Tracker | /estack-github-issue-tracker |
Tracks and manages GitHub issues across repos |
| Leadership Coach | /estack-leadership-coach |
Coaches leadership decisions using responsibility-centered frameworks for delegation, team development, management, difficult conversations, meetings, and communication, with practical artifacts sized to the request |
| Migrate Claude Session History | /estack-migrate-claude-session-history |
Moves a Claude Code transcript and subagent sidecars between projects with path rewriting, a migration note, verification, and retained recovery backups |
| Notify | /estack-notify |
Arms a desktop toast at the end of every turn for the current session, per-session so one chat never pings for another, with a bell in the statusline while it is armed |
| PR Description Writer | /estack-pr-description |
Rewrites a PR description for a maintainer who reviews product logic and risk — decisions with tradeoffs, real verification, and DB/migration/operational status, sourced from the actual diff, not the old description |
| Productivity Prioritization Coach | /estack-productivity-prioritization-coach |
Helps choose outcomes and plan execution using RPM, prioritization filters, and momentum exercises, with scope and pace matched to real constraints |
| PDF to Markdown | /estack-pdf-to-md |
Converts PDFs to Markdown or plain text using the RunPulse API — parallel page batching, cost-saving blank-page filter, scanned-PDF OCR support, and encrypted-PDF handling |
| Prompt Builder Coach | /estack-prompt-builder-coach |
Turns an unclear request into a usable prompt or work brief, using goal shaping, scope checks, and definitions of done where needed |
| Purdue Knowledge Lab Stickers | /estack-purdue-stickers |
Takes a sticker idea to submission-ready files for Purdue's Knowledge Lab (free student sticker printing) — designs the SVG, renders a print-ready transparent 300 DPI PNG, and walks the Lab's booking-site submission, with the BuildPurdue design system, logo, six ready-made designs, and the official guide preloaded |
| Read Agent Session History | /estack-read-agent-history |
Searches, reads, recovers, and analyzes local AI coding-agent session history — Claude Code and Codex (OpenAI codex-cli) — across sessions, projects, and backups. A CLI for common lookups and reports (timeline, engagement, and other cross-session modes merge both agents by default via --agent), plus a documented Python library, with a worked example, for the custom queries no mode covers. Batch-checks a list of saved session IDs against live and every backup root in one sweep, separating still-resumable from restorable-from-backup from permanently gone |
| Repo Search | /estack-repo-search |
Clones or reuses external GitHub repositories for source-grounded code research while preserving cached work |
| Sponsorship Offer Builder | /estack-sponsorship-offer-builder |
Coaches you through defining a real sponsorship offer (Hormozi value equation, Enns three-option pricing, sponsorship-industry research preloaded), then optionally builds the packet, the cold email chain, and the sponsor-meeting script |
| VS Code File Recovery | /estack-vscode-file-recovery |
Recovers permanently deleted files from VS Code or Cursor Local History, Claude session transcripts, or Windows Shadow Copies |
| Hook | Purpose |
|---|---|
| estack-statusline | Statusline showing model, context tokens used, project, rate limits, and an estack-notify bell |
| repo-search-nudge | Suggests estack-repo-search when WebFetch/WebSearch hits GitHub |
| estack-startup-update-core | Shared utility that updates the installed E-Stack package |
| estack-claude-startup | Claude Code adapter for the shared SessionStart updater |
| estack-codex-startup | Codex adapter for the shared SessionStart updater |
The shared startup-hook source installs to ~/.agents/hooks/. Claude Code and Codex each register their host-specific adapter in their own configuration files (~/.claude/settings.json and ~/.codex/hooks.json).
Important: E-Stack keeps the reusable startup-hook source in ~/.agents/hooks/,
but each host still needs its own hook registration because Claude Code and Codex
discover lifecycle hooks from different configuration files.
- Skills install to
~/.agents/skills/estack-*/(symlinked from~/.claude/skills/estack-*/; auto-detected by any agent that reads~/.agents/skills/, including OpenClaw, Codex, ChatGPT, and Cursor) - The startup-update core and its two adapters live once in
~/.agents/hooks/; other E-Stack hook scripts remain Claude Code-only under~/.claude/hooks/ SessionStartadapters auto-update skills each time you open Claude Code or Codex; Codex asks you to review and trust its new command once in/hooks- If you've made local edits to a skill or hook, the installer detects the conflict and lets you choose: overwrite, skip, or merge
- Every skill carries its own semver (
version:in SKILL.md frontmatter; hooks use a// @versioncomment), independent of the package version — update messages show exactly what moved, e.g.estack-chris-voss (1.0.0 → 1.1.0). Under the hood, updates are detected by content hash, so a change can never be missed; a release-time check (scripts/check-versions.cjs) guarantees every content change ships with a version bump.
Skills update automatically on session start in Claude Code and Codex. To force an update manually:
npx elliot-stack@latestEverything you configure lives in one file, ~/.e-stack/.env — the same file every skill in the pack reads its API keys from. Format is KEY=value, one per line:
# ~/.e-stack/.env
SERPAPI_KEY=abc123
ESTACK_SKILLS_DIR=/opt/agents/skills
ESTACK_NO_STATUSLINE=1
| Variable | Default | What it does |
|---|---|---|
ESTACK_SKILLS_DIR |
~/.agents/skills |
Where skill files are installed |
ESTACK_HOOKS_DIR |
~/.claude/hooks |
Where Claude hook scripts are installed |
ESTACK_BACKUP_DIR |
~/.estack-backup |
Where your local changes are backed up |
ESTACK_NO_STATUSLINE |
unset | Set to 1 to remove the statusline |
ESTACK_SKILL_PREFIX |
estack- |
Set to none to install skills under their short names |
ESTACK_HOME |
~/.e-stack |
Where this file itself lives (env-only) |
Resolution order is the one every skill uses: the live process environment first, then the file. So exporting a variable overrides it for a single run without editing anything. Path values must be absolute; a relative one is ignored and the default applies. The installer only ever replaces or appends its own line, so your API keys are never disturbed.
Skill names. Skills install prefixed by default: /estack-email-writer, /estack-repo-search. Set ESTACK_SKILL_PREFIX=none (or install with --no-prefix) and they install as /email-writer and /repo-search instead, with every cross-reference inside the skills rewritten to match. Change the value later and the next session start reconciles an existing install to it — the old names are retired and the same skills are reinstalled under the new ones, after backing up the previous files and preserving per-skill .env files. The old name is retired only after its replacement installs successfully. Anything a skill saved stays put: state directories keep their prefixed names either way, so /flight-planner still reads the ~/.e-stack/estack-flight-planner/config.json you already had. Two things to know before turning the prefix off: the short names are ordinary ones like notify and repo-search, so if you already have a skill of your own on one of them it gets copied to ~/.estack-backup/ and replaced (the installer names it in a warning first); and every doc here writes the prefixed form. Silent updates defer a switch when the source is edited or the destination belongs to another skill, preserving both and printing a diagnostic; run the manual installer to review it. Startup updates back up foreign skills before replacement and identify them separately from local edits. Existing backup directories are retained; newer copies get unique suffixes.
Statusline. E-Stack ships a statusline showing the model, tokens used in the current context window, the project folder, rate limits, and an estack-notify bell. A first install claims the statusLine slot even if you already have one configured, so you can see what it does; your previous value is saved to ~/.estack-backup/statusLine.json. From then on it is only updated while it is still E-Stack's. Switch back to your own or clear it, and no later update touches it again. --no-statusline removes it outright and --statusline brings it back.
Installer flags. Opposing flags such as --prefix --no-prefix are rejected before any changes. --dry-run never migrates settings or writes files, even when combined with --startup or --silent. --install applies changes (the installer previews by default when run from a clone). --yes answers the locally-modified prompt with "back up my changes, install the latest" and --skip-modified answers it with "keep my versions" — pass one of them from any script or CI job, since the prompt otherwise reads EOF on a non-interactive stdin and aborts. --statusline / --no-statusline turn the statusline on or off and remember the choice, and --prefix / --no-prefix do the same for the estack- prefix on skill names.
- Claude Code CLI installed (other agents that read
~/.agents/skills/work too) - Node.js 18+
External contributions are welcome via pull request. Direct pushes to main are blocked — fork the repo, push your changes to a branch, and open a PR. Only the maintainer (Elliot) can merge to main and cut releases. This is intentional: elliot-stack is a security-sensitive npm package and the release tag can only be pushed by the maintainer.
The Astra and Fable audit records the prompting rationale, retained skill value, and verification scope.
Adding or editing a skill? Authoring conventions (versioning, doc listings, feedback section) are in docs/skill-authoring.md, and coaching-style skills can start from the scaffold in templates/.
Run the installer straight from your checkout to preview what a real install would do to your ~/.claude/:
node bin/install.cjs # dry run — previews changes, writes nothing
node bin/install.cjs --install # actually sync your local edits to ~/.agents/skills/ + ~/.claude/skills/Run from the repo, the installer dry-runs by default so testing never clobbers your live install. Pass --install once the preview looks right. (--dry-run forces a preview even under npx.)
See docs/publishing.md for the release flow and security model.
MIT