bama
BAMA: 모든 Mac 앱을 만들 수 있습니다
반복되는 Claude Code·Codex·Cursor 프롬프트를 재사용 가능한 슬래시 명령으로 변환, 로컬 파이썬 히스토리 추출·에이전트 스킬
Turn repeated Claude Code, Codex, and Cursor prompts into reusable slash commands. Local Python history extractor + Agent Skill.
스킬PythonGitHub @kishormorol직접 설치운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
설치형 프로젝트는 배포 도메인 없이도 확인할 수 있습니다. 개인 저장소는 GitHub 로그인으로, 조직 저장소는 위의 저장소 확인 파일로 직접 확인해 주세요.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗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.
[REDACTED] before your agent reads the list.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
2. Open your project in Claude Code, Codex or Cursor, in a new session.
3. 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 calledfaq-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 14 times. Grouped by intent, however it was worded, the top
ask had been typed 230 times. That grouping is the agent's job in /faq-shortcuts.
| You kept typing | You type now |
|---|---|
| "how many people signed up this week, not counting test accounts?" | /signups |
| "did the newsletter actually go out? did it reach everyone?" | /sent |
| "any update on the billing migration? what's blocked?" | /project billing |
| "add this CSV of new customers, skip the ones we already have" | /import new.csv |
Each shortcut is a small file in your project, .claude/skills/<name>/SKILL.md, for example:
---
name: sent
description: Check whether a batch email actually reached people. Use for "did the
newsletter go out?", "did it reach everyone?", "did X get the email?".
---
# Did it go out
Report only. Never re-send from this shortcut.
## Query
scripts/email-status.js --batch <name> ← the script your project already has
## Traps
- A "delivered" status to a shared inbox proves nobody read it (happened 3 May).
## Report
Sent / delivered / bounced counts, then the bounced addresses. Then ask.
The shortcuts point at the scripts and queries your project already uses, and they
record the mistakes already made on that path. /sent checks the send record, not the
earlier message where the agent said it sent it. So a shortcut is shorter to type, and it
verifies the outcome instead of trusting a previous claim. Anything that writes or sends
does a dry run first and waits for your yes, so a typo stops at the preview.
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.SKILL.md in .claude/skills/, linked into
.agents/skills/ so all three agents load it, committed so your team gets it too.CLAUDE.md / AGENTS.md maps each shortcut to the sentence it replaces.The quick start above is the whole install. It puts the skill where each agent looks:
| Agent | Reads skills from |
|---|---|
| Codex | ~/.agents/skills/ |
| Claude Code | ~/.claude/skills/ (the link) |
| Cursor | both |
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"
| 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.
--max-len if your usual requests are longer.| 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. |
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.