From s-skills
S-skills 하네스. 프로젝트 상태를 감지하고 docs-organize, test-scenario 스킬을 오케스트레이션한다. /s-skills 하나로 지금 무엇이 필요한지 판단해 적절한 스킬을 호출.
How this skill is triggered — by the user, by Claude, or both
Slash command
/s-skills:harnessThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
프로젝트 상태를 읽고 docs-organize → test-scenario 흐름을 오케스트레이션한다.
프로젝트 상태를 읽고 docs-organize → test-scenario 흐름을 오케스트레이션한다. 각 스킬은 독립 호출도 가능하지만, 이 하네스가 "지금 무엇을 해야 하는가"를 판단한다.
# ── 문서 상태 ──
_HAS_DOCS="no"
_DOC_SCORE="0"
if [ -f "docs/STATUS.md" ]; then
_HAS_DOCS="yes"
_DOC_SCORE_RAW=$(grep -m1 '^\*\*Score:' docs/STATUS.md 2>/dev/null | grep -oE '[0-9]+' | head -1)
_DOC_SCORE="${_DOC_SCORE_RAW:-0}"
fi
# ── 테스트 시나리오 상태 ──
_HAS_SCENARIOS="no"
_TS_CYCLE="0"
_TS_PASS_RATE="0"
_TS_THRESHOLD="80"
_TS_STATUS="NOT_STARTED"
_SCENARIO_COUNT="0"
if [ -d "docs/test-scenarios" ]; then
_HAS_SCENARIOS="yes"
# 사이클 읽기 (숫자 검증)
_TS_CYCLE_RAW=$(cat "docs/test-scenarios/.state/cycle.txt" 2>/dev/null)
_TS_CYCLE="${_TS_CYCLE_RAW:-0}"
case "$_TS_CYCLE" in ''|*[!0-9]*) _TS_CYCLE=0 ;; esac
# 임계값 읽기 (숫자 검증)
_TS_THRESHOLD_RAW=$(cat "docs/test-scenarios/.state/threshold.txt" 2>/dev/null)
_TS_THRESHOLD="${_TS_THRESHOLD_RAW:-80}"
case "$_TS_THRESHOLD" in ''|*[!0-9]*) _TS_THRESHOLD=80 ;; esac
# 시나리오 파일 수
_SCENARIO_COUNT=$(find "docs/test-scenarios/" -maxdepth 1 -name "*.md" ! -name "README.md" 2>/dev/null | wc -l | tr -d ' ')
# 현재 사이클 보고서 카운트
if [ "$_TS_CYCLE" -gt 0 ]; then
_TOTAL=$(find "docs/test-scenarios/reports/" -maxdepth 1 -name "*-c${_TS_CYCLE}-*.md" 2>/dev/null | wc -l | tr -d ' ')
_PASS=$(grep -rl "판정: PASS" "docs/test-scenarios/reports/" 2>/dev/null | grep -c -- "-c${_TS_CYCLE}-" || echo 0)
else
_TOTAL=0
_PASS=0
fi
# 통과율 계산
if [ "$_TOTAL" -gt 0 ]; then
_TS_PASS_RATE=$(( (_PASS * 100) / _TOTAL ))
fi
# 상태 판정
if [ "$_TS_PASS_RATE" -ge "$_TS_THRESHOLD" ] && [ "$_TOTAL" -gt 0 ]; then
_TS_STATUS="COMPLETE"
elif [ "$_TOTAL" -gt 0 ]; then
_TS_STATUS="IN_PROGRESS"
elif [ "$_SCENARIO_COUNT" -gt 0 ]; then
_TS_STATUS="GENERATED"
else
_TS_STATUS="NOT_STARTED"
fi
fi
echo "HAS_DOCS: $_HAS_DOCS"
echo "DOC_SCORE: $_DOC_SCORE"
echo "HAS_SCENARIOS: $_HAS_SCENARIOS"
echo "TS_CYCLE: $_TS_CYCLE"
echo "TS_PASS_RATE: $_TS_PASS_RATE%"
echo "TS_STATUS: $_TS_STATUS"
echo "SCENARIO_COUNT: ${_SCENARIO_COUNT:-0}"
# ── 버전 확인 (best-effort, 3초 제한) ──
_SS_LOCAL_VER=$(find ~/.claude/plugins/cache/s-skills -name "VERSION" -maxdepth 6 2>/dev/null \
| head -1 | xargs cat 2>/dev/null | tr -d '[:space:]')
_SS_LOCAL_VER="${_SS_LOCAL_VER:-unknown}"
_SS_REMOTE_VER=$(timeout 3 git ls-remote --tags \
https://github.com/s0613/S-skills.git 2>/dev/null \
| grep -oE 'refs/tags/[0-9]+\.[0-9]+\.[0-9]+$' \
| grep -oE '[0-9]+\.[0-9]+\.[0-9]+' \
| sort -t. -k1,1n -k2,2n -k3,3n | tail -1 || true)
echo "S_SKILLS_VERSION: ${_SS_LOCAL_VER}"
if [ -n "$_SS_REMOTE_VER" ] && [ "$_SS_REMOTE_VER" != "$_SS_LOCAL_VER" ]; then
echo "UPGRADE_AVAILABLE: ${_SS_LOCAL_VER} → ${_SS_REMOTE_VER}"
fi
Preamble 결과를 바탕으로 아래 순서로 판단한다.
UPGRADE_AVAILABLE 감지 시)다른 케이스보다 먼저 처리. AskUserQuestion:
s-skills {old} → {new} 업데이트가 있습니다.
옵션:
A 선택 시:
claude plugin update s-skills@s-skills
실행 완료 후: "업그레이드 완료. /s-skills를 다시 호출하면 새 버전으로 시작됩니다."
B 선택 시: 바로 Case 1 판단으로 이동.
HAS_DOCS=no)AskUserQuestion으로 확인:
지금 이 프로젝트에 docs/가 없습니다.
먼저 docs-organize를 실행해 문서와 건강 점수를 만드는 걸 추천합니다.
옵션:
s-skills:docs-organize 호출HAS_DOCS=yes, TS_STATUS=NOT_STARTED)AskUserQuestion:
docs/가 있습니다. (점수: {DOC_SCORE}/100)
다음 단계로 test-scenario를 시작해 기능 검증을 할 수 있습니다.
옵션:
s-skills:test-scenario 호출s-skills:docs-organize 호출TS_STATUS=GENERATED 또는 IN_PROGRESS)AskUserQuestion:
테스트 사이클 {TS_CYCLE} 진행 중. 현재 통과율: {TS_PASS_RATE}% / 목표: {TS_THRESHOLD}%
옵션:
선택 후 Skill 호출 전 pending-mode 기록:
mkdir -p docs/test-scenarios/.state
# A 선택 시
echo "report" > docs/test-scenarios/.state/pending-mode.txt
# B 선택 시
echo "generate" > docs/test-scenarios/.state/pending-mode.txt
# D 선택 시
echo "dashboard" > docs/test-scenarios/.state/pending-mode.txt
# E 선택 시
echo "threshold" > docs/test-scenarios/.state/pending-mode.txt
이후:
s-skills:test-scenario 호출s-skills:docs-organize 호출 (pending-mode 기록 불필요)TS_STATUS=COMPLETE)모든 단계 완료.
- 문서 점수: {DOC_SCORE}/100
- 테스트 통과율: {TS_PASS_RATE}% ({TS_CYCLE}사이클)
AskUserQuestion:
옵션:
s-skills:docs-organize 호출s-skills:test-scenario 호출B 선택 시 Skill 호출 전:
mkdir -p docs/test-scenarios/.state
echo "generate" > docs/test-scenarios/.state/pending-mode.txt
각 스킬은 Agent 도구가 아닌 Skill 도구로 호출한다. 하네스는 컨텍스트를 유지한 채 스킬 실행을 위임하고 결과를 받아 다음 판단에 활용한다.
Skill("s-skills:docs-organize")
Skill("s-skills:test-scenario")
Skill 호출이 완료되면 아래를 순서대로 실행한다:
rm -f docs/test-scenarios/.state/pending-mode.txt 2>/dev/null || true
상태 재감지 — 위 "Preamble — 프로젝트 상태 감지" 섹션의 bash 블록을 그대로 다시 실행한다.
최종 상태 요약을 아래 형식으로 출력한다.
추가 작업이 필요한지 AskUserQuestion으로 확인한다:
어떤 케이스든 액션 완료 후 출력:
S-skills 상태 요약
──────────────────
문서 : {HAS_DOCS} (점수: {DOC_SCORE}/100)
시나리오 : {TS_STATUS} (사이클: {TS_CYCLE}, 통과율: {TS_PASS_RATE}%)
다음 추천 : {다음 액션 한 줄}
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
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 s0613/s-skills --plugin s-skills