From mj-experiencing
경험 지식 저장소 오케스트레이터. 도메인별 누적 학습 조회, 실행, 버전 관리. Use when invoked via /mj-experiencing, or when user says "경험", "학습 실행", "버전업".
How this skill is triggered — by the user, by Claude, or both
Slash command
/mj-experiencing:experiencingThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
4개 도메인은 mj-experiencing-v4과 같은 레벨의 plugins/ 디렉토리에 위치합니다:
4개 도메인은 mj-experiencing-v4과 같은 레벨의 plugins/ 디렉토리에 위치합니다:
plugins/
├── mj-experiencing-v4/ ← 이 플러그인 (오케스트레이터, v4)
├── MJ-test-v13/ ← 14-agent 웹 테스트 도메인
├── MJ-plan-v11/ ← TDD+CleanArch 4-agent 플랜 도메인
├── MJ-codebase-review-v13/ ← 5-agent 코드 리뷰 도메인
└── mj-design-v8/ ← 5-agent 디자인 리뷰 도메인
마켓플레이스 절대 경로: ~/.claude/plugins/marketplaces/MJnCompany_2-0/plugins/
/mj-experiencing # 도메인 목록 + 버전 현황 표시
/mj-experiencing test [URL] # MJ-test 실행 (14-agent 웹 테스트)
/mj-experiencing plan [task] # MJ-plan 실행
/mj-experiencing review [path] [--focus aspect] # MJ-codebase-review 실행 (5-관점 코드 리뷰)
/mj-experiencing design [path] [--focus aspect] [--fix] # MJ-design 실행 (5-관점 디자인 리뷰)
/mj-experiencing update # 4개 스킬 모두 버전업 (version-up all 단축키)
/mj-experiencing version-up [domain] # 도메인 버전 증가 (test/plan/review/design)
/mj-experiencing version-up all # 4개 도메인 한번에 버전 증가
/mj-experiencing status # 모든 도메인 VERSION 파일 읽기
/mj-experiencing btw [idea] # [v4 신규] 세션 중 개선 아이디어 즉시 캡처
/mj-experiencing checkpoint # [v4 신규] WIP 체크포인트 커밋 생성
/mj-experiencing pipeline [project] # 전체 파이프라인 실행 (review→design→test)
/experiencing (인수 없음)도메인 목록과 현재 버전을 표시:
BASE="$HOME/.claude/plugins/marketplaces/MJnCompany_2-0/plugins"
for domain in MJ-test MJ-plan MJ-codebase-review; do
VERSION=$(cat "$BASE/${domain}-v"*/VERSION 2>/dev/null || echo "?")
echo "📦 $domain | 현재 콘텐츠 버전: $VERSION"
done
/mj-experiencing test [URL]BASE="$HOME/.claude/plugins/marketplaces/MJnCompany_2-0/plugins"
LATEST_TEST=$(ls -d "$BASE/MJ-test-v"* 2>/dev/null | sort -V | tail -1)
$LATEST_TEST/VERSION 읽기 → 현재 버전 확인$LATEST_TEST/skills/MJ-test/SKILL.md 프로토콜 실행/mj-experiencing plan [task]BASE="$HOME/.claude/plugins/marketplaces/MJnCompany_2-0/plugins"
LATEST_PLAN=$(ls -d "$BASE/MJ-plan-v"* 2>/dev/null | sort -V | tail -1)
$LATEST_PLAN/VERSION 읽기 → 현재 버전 확인$LATEST_PLAN/skills/MJ-plan/SKILL.md 프로토콜 실행/mj-experiencing review [path] [--focus aspect]BASE="$HOME/.claude/plugins/marketplaces/MJnCompany_2-0/plugins"
LATEST_REVIEW=$(ls -d "$BASE/MJ-codebase-review-v"* 2>/dev/null | sort -V | tail -1)
$LATEST_REVIEW/VERSION 읽기 → 현재 버전 확인$LATEST_REVIEW/skills/MJ-codebase-review/SKILL.md 프로토콜 실행[path] 없음 → 현재 작업 디렉토리 전체 분석[path] 있음 → 해당 경로만 분석--focus [aspect] 있음 → 해당 관점만 집중 분석 (architecture/quality/security/performance/maintainability)/mj-experiencing updateversion-up all의 단축 명령어. 3개 도메인(MJ-test, MJ-plan, MJ-codebase-review)을 순차적으로 버전업합니다.
아래 version-up all 프로토콜과 동일하게 실행.
/mj-experiencing design [path] [--focus aspect] [--fix]BASE="$HOME/.claude/plugins/marketplaces/MJnCompany_2-0/plugins"
LATEST_DESIGN=$(ls -d "$BASE/mj-design-v"* 2>/dev/null | sort -V | tail -1)
$LATEST_DESIGN/VERSION 읽기 → 현재 버전 확인$LATEST_DESIGN/skills/mj-design/SKILL.md 프로토콜 실행[path] 없음 → 현재 작업 디렉토리--focus [aspect] 있음 → 해당 관점만 집중 분석 (visual/interaction/consistency/responsive/antipatterns)--fix 있음 → 발견된 안티패턴 자동 수정 활성화/mj-experiencing version-up [domain|all]정책: 직전 버전 + 현재 버전 2개만 유지. 더 오래된 버전은 자동 삭제.
all 키워드: test → plan → review → design 4개 도메인 순차 처리.
각 도메인마다 아래 순서로 실행:
AI가 먼저 세션 컨텍스트를 분석해서 핵심 노하우를 추출한다. 발견 시 제안 → 사용자 확인. 없으면 직접 질문.
1-A. AI 자동 분석
현재 세션 대화에서 해당 도메인과 관련된 다음 항목을 탐색:
1-B. 발견사항이 있으면 → 제안 후 확인 (AskUserQuestion 1회)
💡 CS-[DOMAIN] — AI가 분석한 이번 세션 핵심 학습:
"[AI가 추출한 학습 제목]: [구체적 발견 내용 1-2줄]"
이대로 저장할까요?
옵션:
1-C. 발견사항이 없으면 → 자동 스킵 (질문 없음)
AskUserQuestion 호출하지 않음. 그냥 "📝 학습 스킵 (이번 세션 발견사항 없음)" 출력 후 STEP 3으로 진행.
### 15. → 다음은 ### 16.)date +%Y-%m-%dprinciple — 플랫폼 동작·언어 특성·아키텍처 패턴 등 시간이 지나도 안정적인 지식tactical — 특정 버전·설정·워크어라운드 등 변경 가능성이 있는 전술적 지식 (기본값)### [N]. [학습 제목] ([YYYY-MM-DD])
<!-- tier: principle|tactical -->
- **상황**: [어떤 작업 중에 발견했는지]
- **발견**: [구체적으로 무엇을 배웠는지]
- **교훈**: [다음에 어떻게 적용할지]
tier 분류 가이드:
principle 예시: "/compact는 스킬에서 직접 호출 불가 (Claude Code 내장)", "훅 non-zero exit code는 UI 블로킹"tactical 예시: "osascript choose folder 특정 파라미터 금지", "bun --watch 파일변경 미감지"Knowledge Decay 정책: tactical 항목은 mj-end의 Forget Gate가 30일 경과 시 자동으로 재검토를 권장한다. principle 항목은 decay 검토 대상에서 제외된다.
BASE_PATH="$HOME/.claude/plugins/marketplaces/MJnCompany_2-0/plugins"
ALL_DIRS=($(ls -d "$BASE_PATH/CS-${DOMAIN}-v"* 2>/dev/null | sort -V))
LATEST_DIR="${ALL_DIRS[-1]}"
CURRENT_VERSION=$(cat "$LATEST_DIR/VERSION" 2>/dev/null || echo "1")
NEXT_VERSION=$((CURRENT_VERSION + 1))
NEW_DIR="$BASE_PATH/CS-${DOMAIN}-v${NEXT_VERSION}"
cp -r "$LATEST_DIR" "$NEW_DIR"
echo "$NEXT_VERSION" > "$NEW_DIR/VERSION"
파일: ~/.claude/plugins/marketplaces/MJnCompany_2-0/.claude-plugin/marketplace.json
Edit 도구로:
"./plugins/CS-[DOMAIN]-v[CURRENT]" → "./plugins/CS-[DOMAIN]-v[NEXT]"TOTAL=${#ALL_DIRS[@]}
DELETE_COUNT=$((TOTAL - 1))
if [ $DELETE_COUNT -gt 0 ]; then
for dir in "${ALL_DIRS[@]:0:$DELETE_COUNT}"; do
echo "🗑️ 삭제: $(basename $dir)"
rm -rf "$dir"
done
fi
✅ CS-[DOMAIN] 버전업 완료
📦 현재 버전: CS-[DOMAIN]-v[NEXT] (VERSION=[NEXT])
📦 보관 버전: CS-[DOMAIN]-v[CURRENT] (직전)
🗑️ 삭제됨: [삭제된 버전들]
📝 학습 추가: "[제목]" (노하우 #[N]) ← 입력 있을 경우
📝 학습 스킵 ← 입력 없을 경우
version-up all 실행 순서: test → plan → review → design → ceo (5개 순차)
version-up ceo 프로토콜 (6-step):
CEO 버전업은 다른 4개 도메인과 동일한 구조이나 학습 캡처 내용이 다르다.
STEP 1: 학습 분석 (CEO 특화)
이번 세션에서 CEO가 내린 배분 결정을 회고한다:
발견사항이 있으면 AskUserQuestion으로 1회 확인. 없으면 자동 스킵.
STEP 2: 학습 추가 (입력 있을 경우)
⚠️ 두 파일 동시 업데이트 필수 — 에이전트(ceo.md)와 스킬(SKILL.md)이 항상 동기화되어야 한다.
$LATEST_CEO/agents/ceo.md의 ## CEO 노하우 섹션 끝에 추가$LATEST_CEO/skills/mj-ceo/SKILL.md의 ## CEO 노하우 섹션 끝에 추가두 파일 모두 동일한 내용을 추가한다:
### [N]. [학습 제목] ([YYYY-MM-DD])
- **상황**: [어떤 요청이었는가]
- **판단**: [CEO가 내린 결정]
- **결과**: [효과적이었는가]
- **교훈**: [다음에 유사 상황에서 어떻게 판단할 것인가]
STEP 3: 버전 디렉토리 생성
BASE_PATH="$HOME/.claude/plugins/marketplaces/MJnCompany_2-0/plugins"
ALL_DIRS=($(ls -d "$BASE_PATH/mj-ceo-v"* 2>/dev/null | sort -V))
LATEST_DIR="${ALL_DIRS[-1]}"
CURRENT_VERSION=$(cat "$LATEST_DIR/VERSION" 2>/dev/null || echo "1")
NEXT_VERSION=$((CURRENT_VERSION + 1))
NEW_DIR="$BASE_PATH/mj-ceo-v${NEXT_VERSION}"
cp -r "$LATEST_DIR" "$NEW_DIR"
echo "$NEXT_VERSION" > "$NEW_DIR/VERSION"
STEP 4: marketplace.json 업데이트
Edit 도구로: "./plugins/mj-ceo-v[CURRENT]" → "./plugins/mj-ceo-v[NEXT]"
STEP 5: 오래된 버전 정리 (2개 유지)
TOTAL=${#ALL_DIRS[@]}
DELETE_COUNT=$((TOTAL - 1))
if [ $DELETE_COUNT -gt 0 ]; then
for dir in "${ALL_DIRS[@]:0:$DELETE_COUNT}"; do
rm -rf "$dir"
done
fi
STEP 6: 완료 안내
✅ mj-ceo 버전업 완료
📦 현재 버전: mj-ceo-v[NEXT] (VERSION=[NEXT])
📦 보관 버전: mj-ceo-v[CURRENT] (직전)
📝 학습 추가: "[제목]" (노하우 #[N]) 또는 📝 학습 스킵
all 완료 후 종합 안내:
✅ 전체 버전업 완료
📦 MJ-test: v[N] → v[N+1] (학습 추가/스킵)
📦 MJ-plan: v[N] → v[N+1] (학습 추가/스킵)
📦 MJ-codebase-review: v[N] → v[N+1] (학습 추가/스킵)
📦 mj-design: v[N] → v[N+1] (학습 추가/스킵)
📦 mj-ceo: v[N] → v[N+1] (학습 추가/스킵)
/mj-experiencing pipeline [project]전체 파이프라인을 순서대로 실행합니다. experiencing-lead 에이전트가 오케스트레이션을 담당합니다.
review → design → test (순차, 각 단계 후 체크포인트)경험 lead 에이전트 스폰:
BASE="$HOME/.claude/plugins/marketplaces/MJnCompany_2-0/plugins"
LEAD_DIR=$(ls -d "$BASE/mj-experiencing-v"* 2>/dev/null | sort -V | tail -1)
에이전트 파일: $LEAD_DIR/agents/experiencing-lead.md
/mj-experiencing btw [idea] ← v4 신규 (bkit btw 패턴)세션 중 발견한 개선 아이디어를 즉시 캡처합니다.
BTW_FILE="$(dirname $(ls -d "$HOME/.claude/plugins/marketplaces/MJnCompany_2-0" 2>/dev/null || echo "/tmp"))/.experiencing-btw.json"
# {id, idea, date, status: "pending"} 형태로 JSON 배열에 추가
저장 후: 💡 BTW #[N] 캡처됨: "[아이디어]" 출력. version-up 시 pending 항목 자동 제안.
/mj-experiencing checkpoint ← v4 신규 (gstack 패턴)현재 작업 상태를 WIP 커밋으로 보존합니다.
DATE=$(date +%Y-%m-%d-%H%M)
git -C "$HOME/.claude/plugins/marketplaces/MJnCompany_2-0" add -A
git -C "$HOME/.claude/plugins/marketplaces/MJnCompany_2-0" commit -m "wip: mj-experiencing checkpoint $DATE"
완료 후: ✅ 체크포인트 저장됨 (${DATE}) 출력.
/mj-experiencing status모든 도메인의 VERSION 파일 표시:
BASE="$HOME/.claude/plugins/marketplaces/MJnCompany_2-0/plugins"
for PATTERN in "MJ-test-v" "MJ-plan-v" "MJ-codebase-review-v" "mj-design-v"; do
LATEST=$(ls -d "$BASE/${PATTERN}"* 2>/dev/null | sort -V | tail -1)
if [ -n "$LATEST" ]; then
VER=$(cat "$LATEST/VERSION" 2>/dev/null || echo "?")
DOMAIN=$(basename "$LATEST")
echo "📋 $DOMAIN: v$VER"
fi
done
MJ-test-v2): 스키마/구조 버전 — 큰 구조 변경 시에만 변경all 키워드로 3개 도메인 한번에 버전업 (2026-04-11)test → plan → review 순서로 순차 처리하면 한 번의 명령으로 모두 처리 가능/mj-experiencing version-up all 지원으로 워크플로우 간소화. 각 도메인마다 학습 캡처 인터랙션이 뜨므로 3번의 입력 기회가 생김./mj-experiencing btw [idea] 명령 추가. 세션 중 발견사항을 즉시 캡처하면 version-up의 AI 분석 단계를 보완할 수 있음.version-up all 프로토콜에 도메인별 retry 상한(2회) 추가. 실패 도메인은 스킵하고 ⚠️ [DOMAIN] 스킵됨 — 수동 확인 필요 출력 후 계속 진행.GET /api/pick-folder가 즉시 {"error":"cancelled"} 반환 — 브라우저에서 폴더 선택 다이얼로그가 열리지 않음.curl → API 응답 ② osascript -e '...' 직접 실행 → OS/스크립트 문법 ③ bun -e "Bun.spawn..." → 런타임. 직접 실행이 성공하면 서버 코드(문법 오류 또는 stale 프로세스) 안에 원인이 있음. 실제 원인: choose folder with prompt "..." invisibles shown true — invisibles shown true는 choose folder에 없는 파라미터로 error -2741 발생 → on error → 빈 반환. 추가 원인: bun --watch가 Claude Code Edit 도구의 파일 변경을 감지 못해 old 코드가 계속 실행됨.choose folder에 invisibles shown true 사용 금지 — 올바른 문법: choose folder with prompt "..." 만. ② API 서버 코드 수정 후 curl 테스트 전 반드시 프로세스 재시작 확인 — bun --watch 미감지 가능. ③ osascript는 temp 파일(Bun.write + osascript path) 방식이 stdin Blob보다 안정적.<url|label> 포맷은 Slack Web API 전송 전용 — 클립보드 붙여넣기에서는 리터럴 문자열로 표시됨. 정답은 navigator.clipboard.write()에 ClipboardItem({ "text/html": Blob([html]), "text/plain": Blob([plain]) })를 동시에 담는 것. Slack 리치텍스트 에디터는 text/html을 우선 소비하여 <a href="url">label</a>를 클릭 가능한 하이퍼링크로 렌더링. HTML 미지원 앱은 text/plain fallback 사용.try/catch로 감싸고 실패 시 writeText() fallback 필수 (Firefox 등 미지원 브라우저 대응). navigator.clipboard.write()는 HTTPS 또는 localhost + 사용자 제스처(클릭) 핸들러 내에서만 동작./compact는 스킬에서 직접 호출 불가 — 생성된 요약을 제안하는 패턴으로 우회 (2026-05-01)/compact(context 압축)는 별도로 실행해야 했음. 사용자가 "원커맨드 종결"을 원했으나 mj-end가 compact를 수행하지 않았음./compact는 Claude Code 내장 명령으로, 스킬/커맨드에서 프로그래밍적으로 호출이 불가능함. allowed-tools에도 invoke-command 같은 도구가 없음./compact [요약] 형식으로 출력 → 사용자가 그대로 실행. --no-compact 플래그로 생략 가능..env가 없는 폴더에서 작업할 때마다 Claude Code 입력창이 회색으로 굳어버림notification-hook.sh, stop-hook.sh 모두 .env 없을 시 exit 1 반환 → Claude Code는 훅 비정상 종료를 UI 블로킹으로 처리. 훅이 "해당 없음"인 경우에도 exit 1이면 입력창이 그레이아웃됨.env, 토큰 등)이 충족되지 않을 때는 반드시 exit 0으로 종료. exit 1은 의도적으로 사용자를 멈춰야 할 진짜 오류에만 사용. "이 훅은 여기에 해당 없음" = exit 0window.open() silent 실패 — 외부 URL은 항상 API.openInChrome (2026-04-26)window.open(url, '_blank')를 사용했더니 Tauri 앱에서 아무 반응 없음. 에러도 없고 브라우저도 안 열림.window.open)는 silent 실패. Rust 커맨드 open_in_chrome을 통해야 동작. 실패가 조용해서 개발 중 발견이 어려움.API.openInChrome(url).catch(()=>{}). window.open 사용 금지. 새 UI 요소 추가 체크리스트: 기능 코드 → data-help-key → guideContent.ts 항목 — 세 가지를 같은 커밋에 포함.Provides a checklist for code reviews covering functionality, security, performance, maintainability, tests, and quality. Use for pull requests, audits, team standards, and developer training.
npx claudepluginhub nh-investment-squad1/mjncompany_2-0 --plugin mj-experiencing