返回资讯中心
外部精选
软件工程
#开发者实时流

Show HN: Turn the prompts you keep retyping into slash commands

Stop typing the same long request to your coding agent every day. This

Hacker News 最新kishoremorol2026/10/29 · 今天24 分钟阅读

以下正文同步自 Hacker News 最新,版权归原站所有,已转换为易读排版。

Stop typing the same long request to your coding agent every day. This Agent Skill reads your own history, finds the asks you keep repeating, and turns each one into a short command, like /sent or /project billing. It works in Claude Code, Codex and Cursor.

Watch or download the 24-second video · What's new in v1.3.0

The demo illustrates the workflow with synthetic data; it is not a live agent recording.

  1. Install (macOS / Linux, needs git and Python 3.9+; on Windows see Windows):

git clone https://github.com/kishormorol/cli-faq-shortcuts ~/.agents/skills/faq-shortcuts mkdir -p ~/.claude/skills && ln -sfn ~/.agents/skills/faq-shortcuts ~/.claude/skills/faq-shortcuts

  1. Open your project in Claude Code, Codex or Cursor, in a new session.

  2. Ask "what do I keep asking in this project?", or type /faq-shortcuts in Claude Code.

You'll get a table of your most repeated asks with how often you typed each. Pick the ones you want and they become shortcuts in that project.

The repo is cli-faq-shortcuts; the skill it installs is called faq-shortcuts.

If it saves you typing, please ⭐ star the repo. Stars are how other people find it.

inside your project, in Claude Code

/faq-shortcuts # find your repeated asks and propose shortcuts /faq-shortcuts --since 2026-06-01 # only look at recent history /faq-shortcuts --source codex # only what you asked Codex

the extractor on its own: no agent, nothing leaves your machine

E=~/.agents/skills/faq-shortcuts/scripts/extract_asks.py python3 "$E" . # matching prompts, oldest first python3 "$E" . --since 2026-09-01 | wc -l # how many since September python3 "$E" . --format jsonl # structured records for your own scripts python3 "$E" . | awk -F'\t' 'split($3,w," ")>=4 {print tolower($3)}'
| sort | uniq -c | sort -rn | head # your most repeated exact requests

The last one counts exact repeats only, and it undercounts. On one real project, the most repeated exact request appeared 4 times. Grouped by intent, however it was worded, the top ask had been typed 127 times. That grouping is the agent's job in /faq-shortcuts.

Collect. scripts/extract_asks.py prints every prompt you typed in the project, from Claude Code and Codex history. It skips subagent turns and scripted runs, because you didn't type those.

Cluster. The agent groups prompts by intent, whatever the wording, and counts them.

Check. It looks for shortcuts you already have and the tools your project already has.

Propose. You get a table of shortcut, the ask it replaces, and how often you asked. You pick.

Write. Each chosen shortcut becomes a SKILL.md in .claude/skills/, linked into .agents/skills/ so all three agents load it, committed so your team gets it too.

List. A table in CLAUDE.md / AGENTS.md maps each shortcut to the sentence it replaces.

Install

The quick start above is the whole install. It puts the skill where each agent looks:

Update: git -C ~/.agents/skills/faq-shortcuts pull --ff-only, then start a new agent session.

Uninstall: rm ~/.claude/skills/faq-shortcuts && rm -rf ~/.agents/skills/faq-shortcuts

If you only use Claude Code, you can install it as a plugin instead, inside Claude Code:

/plugin marketplace add kishormorol/cli-faq-shortcuts /plugin install faq-shortcuts@cli-faq-shortcuts

The command is then /faq-shortcuts:faq-shortcuts, or just ask "what do I keep asking in this project?". Codex and Cursor don't read Claude Code plugins, so use the quick start for those.

In PowerShell, with git and Python 3.9+ installed. A directory junction links the skill into ~/.claude/skills and, unlike a symlink, needs no admin rights or Developer Mode:

git clone https://github.com/kishormorol/cli-faq-shortcuts "$env:USERPROFILE.agents\skills\faq-shortcuts" New-Item -ItemType Directory -Force "$env:USERPROFILE.claude\skills" | Out-Null New-Item -ItemType Junction -Path "$env:USERPROFILE.claude\skills\faq-shortcuts" -Target "$env:USERPROFILE.agents\skills\faq-shortcuts"

Run the extractor with python (or py), not python3:

python "$env:USERPROFILE.agents\skills\faq-shortcuts\scripts\extract_asks.py" . | Select-Object -First 10

Update: git -C "$env:USERPROFILE.agents\skills\faq-shortcuts" pull --ff-only, then start a new agent session.

Uninstall: remove the junction with rmdir, which leaves its target alone, then the clone:

cmd /c rmdir "$env:USERPROFILE.claude\skills\faq-shortcuts" Remove-Item -Recurse -Force "$env:USERPROFILE.agents\skills\faq-shortcuts"

What it reads

Agent History Read?

Claude Code ~/.claude/projects/<project>/*.jsonl (the last 30 days) and ~/.claude/history.jsonl (older prompts) yes

Codex ~/.codex/sessions/ (or $CODEX_HOME), matched by the folder each session ran in yes

Cursor Cursor/User/globalStorage/state.vscdb under ~/Library/Application Support (macOS), %APPDATA% (Windows) or ~/.config (Linux), matched by the folder each chat ran in yes, except chats opened without a folder

To see what it finds without the agent:

python3 ~/.agents/skills/faq-shortcuts/scripts/extract_asks.py ~/my-project | head

This prints date<TAB>source<TAB>prompt. Add --source claude, --source codex, or --source cursor to read one tool only, and --since 2026-01-01 to skip older prompts.

python scripts/extract_asks.py [project_dir] [--source all|claude|codex|cursor] [--since YYYY-MM-DD] [--max-len N] [--min-words N] [--format tsv|jsonl] [--no-redact]

Option Default Behavior

project_dir Current directory Match the exact project folder recorded in history.

--source all Read one supported tool or all three.

--since No cutoff Include the given UTC date and later; exclude prompts with unknown dates.

--max-len 400 Skip prompts longer than this positive character limit, before whitespace cleanup.

--min-words 1 Skip prompts with fewer words. 3 drops replies like "ok", "yes" and "push"; the skill uses it.

--no-redact off Print pasted secrets as typed. By default they become [REDACTED].

--format tsv Emit tab-separated lines or one JSON object per line.

JSONL records have date, source, and prompt fields. Both formats collapse prompt whitespace to single spaces. Dates are YYYY-MM-DD, or an empty string when unavailable; undated records sort first. Counts and diagnostics go to stderr, keeping stdout usable in a pipeline. Exit codes: 0 when a source is available (even if filters match nothing), 1 when no source is available, and 2 for invalid arguments.

This is a view of the history still stored on your machine, not a complete activity log.

Prompts longer than 400 characters, injected context, and non-interactive runs are filtered out. Increase --max-len if your usual requests are longer.

Projects are matched by folder, without recursively including child folders or other worktrees. Moving a project does not move the paths recorded in old history.

Cursor's storage format is undocumented and can change. Chats without a recorded workspace or repository cannot be attributed to a project.

Malformed records are skipped. An invalid timestamp becomes an unknown date.

Troubleshooting

You see Do this

The agent doesn't know /faq-shortcuts Start a new session. Skills load when a session starts. Check that ls ~/.claude/skills/faq-shortcuts/SKILL.md finds the file.

checked, nothing for this folder (…) Run it from the project folder you actually worked in. History is stored per folder, so a subfolder counts as a different project.

Claude Code asks to allow python3 …extract_asks.py Allow it. The script reads your history under ~/.claude (and Codex, Cursor) and makes no network calls. In headless runs (claude -p) nobody can answer that prompt, so pass --add-dir ~/.claude --allowedTools "Bash(python3:*)".

Very few prompts found History is read only for the project folder you actually worked in. Cursor chats opened without a folder aren't tied to any project, so they're skipped.

fatal: destination path … already exists It's already installed. Run the update command instead.

No output after --since Check the date and project folder. No matching prompts is a successful empty result; try without the date filter.

could not read session history Check file permissions and try --source with another tool. Available sources can still produce results.

Requests you remember are missing Try --max-len 2000; long prompts are filtered by default.

Contributing

Issues and pull requests are welcome. See CONTRIBUTING.md for local checks and guidance on creating a safe reproduction. Good first contributions:

Windows installation and extraction are supported and covered by CI, alongside Linux and macOS. See the changelog for unreleased improvements.

Everyone whose pull request is merged appears here:

Built and maintained with help from Claude Code and OpenAI Codex.

The extractor only reads local files and makes no network calls. Before it prints anything, it replaces secrets pasted into prompts with [REDACTED]: API keys (Anthropic, OpenAI, GitHub, Slack, AWS, Google, Hugging Face, Stripe, Resend, Supabase, Kaggle), JWTs, bearer tokens, password=-style values, passwords in URLs such as postgresql://user:pass@host, Discord and Slack webhooks, and any other bare token of 30+ mixed-case letters and digits. Matching is by pattern, so treat it as a safety net, not a guarantee. Your prompts can still contain names and emails, so the skill writes the list to a scratch folder, never into your repo. Your agent then reads that list the same way it reads any file you show it.

That agent may send the prompts to its configured model provider. Review your agent's settings before using sensitive history. Do not attach raw history, extractor output, or Cursor databases to public issues. Use invented prompts in bug reproductions and review generated shortcuts before committing them.

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →