用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/bam-bam-2/solo-skills --skill discord-agent-fleet命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
AI(ChatGPT·Claude·Gemini 등)가 쓴 한글 텍스트를 "사람이 쓴 글처럼" 윤문해주는 오케스트레이터 스킬. 번역투·영어 인용 과다·기계적 병렬·관용구·피동태 남용·접속사 남발·리듬 균일성·이모지/불릿 과다 등 10대 카테고리 40+ AI 티 패턴을 탐지·분류해 내용은 한 글자도 건드리지 않고 문체·리듬·표현만 자연스러운 한국어로 재작성한다. 트리거 — "AI 티 없애줘", "AI 같은 글 자연스럽게", "GPT/ChatGPT 문체", "AI 번역투 고쳐", "사람이 쓴 것처럼 윤문", "AI 윤문", "ChatGPT 티 제거", "한글 AI 탐지·윤문", "AI 글 사람처럼", "번역투 제거", "영어 인용 많은 글 윤문", "AI 글 티 안 나게", "휴머나이저", "humanize Korean", "AI detector bypass 한글". 후속 작업 — "특정 카테고리만 다시", "윤문 강도 조정", "장르 바꿔서", "이 문단만", "2차 윤문" 도 모두 이 스킬. 단순 맞춤법·오탈자 교정은 직접 처리, 번역은 번역 스킬, 내용 추가·삭제를 동반한 재작성은 별도 집필 스킬.
회의 전사록을 받아 회의록으로 정리하고 노션 DB에 등록한 뒤 디스코드에 공지까지 한 번에 처리한다.
온라인 유료 커뮤니티 개설 전체 프로세스를 지원하는 에이전트 조직 스킬. 커뮤니티 기획부터 모집 카피, 노션 DB 세팅, 운영 SOP까지 한번에 처리. 오케스트레이터가 인터뷰를 진행하고 4개 전문 에이전트가 결과물을 순서대로 생성한다. 트리거: "커뮤니티 만들자", "커뮤니티 개설", "유료 커뮤니티 만들어줘", "커뮤니티 기획해줘", "/community-launch"
基于 SOC 职业分类
正在显示 SKILL.md
| name | discord-agent-fleet |
| description | 디스코드에 상주하는 대화형 AI 봇을 여러 개 만들고 운영한다. 상시 구동 머신에서 겪는 함정(절전 모드, 설정파일 자동로딩, 사용량 한도)을 함께 정리했다. |
사용자의 원격 머신(ssh remote-host)에 대화형 디스코드 봇이 셋 상주한다. 전부 같은 뼈대를 쓴다.
| 봇 | 폴더 | 아는 것 | launchd |
|---|---|---|---|
| 지식봇 | ~/Projects/<프로젝트>/ | 지식봇 8기수 기록 + 원자료 55개 | com.bambam.daolab-agent |
| 스터디봇 | ~/Projects/<프로젝트>/ | 지피터스 글 2,000건 + 지난 아티클 + 사용자 스킬·메모리 | com.bambam.gpters-agent |
| 커뮤니티봇 | ~/Projects/<프로젝트>/discord_bot/ | 커뮤니티 커뮤니티 운영(길드·슬래시명령 등) | com.getback.bamnyangi |
파이썬은 셋 다 ~/Projects/<프로젝트>/.venv/bin/python 를 공유한다.
서버는 ai공작실(1492202577700458797) 하나. 허용 계정은 사용자 483902030243692546, 커뮤니티 1407565803242520586.
bot.py — 디스코드 게이트웨이. DM은 전체 지식, 공개 채널은 멘션받을 때만answer.py — 인격+기억+자료를 조립해 LLM 호출store.py — 단기 대화를 SQLite 에 영구 저장 (재시작·재부팅에도 유지)persona.md — 인격·말투. 매 응답마다 읽으므로 고치면 재시작 없이 반영memory.md — 장기기억. 응답에 MEMORY: 줄을 쓰면 자동 적립기억이 두 층이라는 게 핵심이다. 단기(대명사 받기) + 장기(세션 끊어도 남는 사실).
초기화는 단기만 끊고 장기는 남긴다.
원격 머신에 lowpowermode = 1 이 켜져 있으면, 프로세스가 죽어도 launchd 가 되살리지 않는다.
state = not running
pended nondemand spawn = inefficient
"요청 없이 스스로 재기동하는 건 비효율적"이라며 무기한 보류한다. plist 에 KeepAlive 가 제대로 있어도 소용없고 ProcessType 을 바꿔도 안 통한다. 40초를 기다려도 안 풀리는 걸 실측했다.
launchctl kickstart -k 를 명시적으로 쓴다. bootstrap 만으로는 프로세스가 안 뜬다. kickstart 는 명시적 요청이라 보류 정책을 우회한다.sudo pmset -a lowpowermode 0 인데 비번 없는 sudo 가 안 걸려 있어 SSH 로는 못 한다. 사용자가 직접 쳐야 한다.claude CLI 는 실행 디렉터리에 CLAUDE.md 가 없으면 상위 폴더로 거슬러 올라가며 찾아서 프롬프트에 넣는다.
커뮤니티봇가 호출당 14만 토큰을 쓰던 원인이 이거였다. 밤집사가 실제로 만드는 프롬프트는 4,766자인데, discord_bot/ 한 칸 위의 ~/Projects/<프로젝트>/CLAUDE.md(당시 170KB)가 매번 통째로 붙고 있었다. 2026-08-16 에 밤알바생·옛 작업이력을 docs/CLAUDE-archive-*.md 로 옮겨 1만 4천 자(92% 감소) 로 줄였다.
subprocess 에 cwd 를 그 봇 폴더로 고정하고, 그 폴더에 큰 CLAUDE.md 를 두지 않는다~/.claude/CLAUDE.md(전역, 약 5KB)는 항상 붙는다. 이건 어쩔 수 없다launchd 는 PATH 를 /usr/bin:/bin:/usr/sbin:/sbin 으로만 준다. 그래서 CLI 를 절대경로로 불러도, 그 CLI 자체가 node 스크립트면 죽는다.
Codex rc=127: env: node: No such file or directory
codex 는 /opt/homebrew/lib/node_modules/@openai/codex/bin/codex.js 로 가는 심링크이고 셔뱅이 #!/usr/bin/env node 다. PATH 에 /opt/homebrew/bin 이 없으면 node 를 못 찾는다. claude 는 네이티브 Mach-O 바이너리라 이 문제가 없다 — 그래서 claude 는 멀쩡한데 codex 폴백만 조용히 죽어 있는 상태가 만들어진다. 2026-08-16 프로젝트 조사봇이 주간 한도에 걸렸을 때 폴백도 같이 실패해 15시간 리포트가 끊긴 원인이 이거였다.
두 겹으로 막는다.
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
</dict>
subprocess.run(..., env=_tool_env()) 로 /opt/homebrew/bin 을 PATH 앞에 끼운다.진단 코드도 같이 봐라. subprocess.run 은 셔뱅 실패(rc=127)에 예외를 안 던진다. try/except 만으로 점검하면 죽은 CLI 를 OK 로 찍는다. 프로젝트 조사봇 --check 가 정확히 이 버그였고, 그래서 폴백이 몇 달 고장난 걸 아무도 몰랐다. 반드시 returncode 를 확인할 것.
검증은 launchd 환경을 재현해서 한다.
ssh remote-host 'cd ~/ops/<봇> && env -i HOME=$HOME PATH=/usr/bin:/bin:/usr/sbin:/sbin /opt/homebrew/bin/python3 followup.py --check'
API 키(ANTHROPIC_API_KEY)를 쓰지 않는다. 사용자가 명시적으로 금지했다.
~/Projects/<프로젝트>/agents/llm_cli.py 가 공용 호출 모듈이다. claude -p --output-format text 를 stdin 으로 부르고, CLAUDE_CODE_OAUTH_TOKEN 을 넘긴다. PATH 가 없는 launchd 환경 대비로 /opt/homebrew/bin/claude 하드코딩 폴백이 있다.
사용량 한도(weekly limit) 문구가 나올 때만 Codex 로 한 번 재실행한다. 일반 오류로는 넘어가지 않는다. 자세한 규칙은 claude-codex-fallback 스킬.
모델은 --model 을 안 줘서 CLI 기본값(2026-08 기준 claude-sonnet-5)을 쓴다. 고정하려면 --model sonnet|opus|fable.
# 상태
ssh remote-host 'for S in com.bambam.daolab-agent com.bambam.gpters-agent com.getback.bamnyangi; do echo "=== $S ==="; launchctl print gui/$(id -u)/$S 2>/dev/null | grep -iE "^\s+(state|pid) "; done'
# 재시작 (kickstart 필수)
ssh remote-host 'launchctl kickstart -k gui/$(id -u)/com.bambam.daolab-agent'
# 로그 — 실제 로그는 bot.error.log 에 쌓인다 (bot.log 는 비어있는 경우가 많다)
ssh remote-host 'tail -30 ~/Projects/<프로젝트>/bot.error.log'
# 디스코드 안 거치고 답변 엔진만 시험
ssh remote-host 'cd ~/Projects/<프로젝트> && set -a && . ./.env && set +a && ~/Projects/<프로젝트>/.venv/bin/python answer.py "질문"'
코드는 로컬에서 쓰고 scp 로 보낸다. 히어독으로 원격에 파이썬을 직접 쓰면 따옴표·한글 이스케이프가 깨진다(실제로 깨졌다).
daolab-agent 를 통째로 복사하고 answer.py 의 지식 소스만 바꾸는 게 가장 빠르다. store.py·bot.py·persona.md 는 거의 그대로 간다.
만들기 전에 확인할 것:
📓 [지식봇] 등)allowed_mentions=discord.AllowedMentions.none() 로 멘션 사고를 막는다