diff --git a/.vendor/stage-pilot/.claude/commands/bootstrap-baseline.md b/.vendor/stage-pilot/.claude/commands/bootstrap-baseline.md new file mode 100644 index 0000000..2e6e18f --- /dev/null +++ b/.vendor/stage-pilot/.claude/commands/bootstrap-baseline.md @@ -0,0 +1 @@ +Follow the instructions in `.github/skills/bootstrap-baseline/SKILL.md` exactly. diff --git a/.vendor/stage-pilot/.claude/commands/capture-release-feedback.md b/.vendor/stage-pilot/.claude/commands/capture-release-feedback.md new file mode 100644 index 0000000..0604399 --- /dev/null +++ b/.vendor/stage-pilot/.claude/commands/capture-release-feedback.md @@ -0,0 +1 @@ +Follow the instructions in `.github/skills/capture-release-feedback/SKILL.md` exactly. diff --git a/.vendor/stage-pilot/.claude/commands/change-req.md b/.vendor/stage-pilot/.claude/commands/change-req.md new file mode 100644 index 0000000..743e120 --- /dev/null +++ b/.vendor/stage-pilot/.claude/commands/change-req.md @@ -0,0 +1 @@ +Follow the instructions in `.github/skills/change-req/SKILL.md` exactly. diff --git a/.vendor/stage-pilot/.claude/commands/confirm-batch-verification.md b/.vendor/stage-pilot/.claude/commands/confirm-batch-verification.md new file mode 100644 index 0000000..286652b --- /dev/null +++ b/.vendor/stage-pilot/.claude/commands/confirm-batch-verification.md @@ -0,0 +1 @@ +Follow the instructions in `.github/skills/confirm-batch-verification/SKILL.md` exactly. diff --git a/.vendor/stage-pilot/.claude/commands/confirm-discovery.md b/.vendor/stage-pilot/.claude/commands/confirm-discovery.md new file mode 100644 index 0000000..f5767be --- /dev/null +++ b/.vendor/stage-pilot/.claude/commands/confirm-discovery.md @@ -0,0 +1 @@ +Follow the instructions in `.github/skills/confirm-discovery/SKILL.md` exactly. diff --git a/.vendor/stage-pilot/.claude/commands/confirm-release.md b/.vendor/stage-pilot/.claude/commands/confirm-release.md new file mode 100644 index 0000000..6b7b2a0 --- /dev/null +++ b/.vendor/stage-pilot/.claude/commands/confirm-release.md @@ -0,0 +1 @@ +Follow the instructions in `.github/skills/confirm-release/SKILL.md` exactly. diff --git a/.vendor/stage-pilot/.claude/commands/confirm-req-implemented.md b/.vendor/stage-pilot/.claude/commands/confirm-req-implemented.md new file mode 100644 index 0000000..7ac5496 --- /dev/null +++ b/.vendor/stage-pilot/.claude/commands/confirm-req-implemented.md @@ -0,0 +1 @@ +Follow the instructions in `.github/skills/confirm-req-implemented/SKILL.md` exactly. diff --git a/.vendor/stage-pilot/.claude/commands/confirm-req.md b/.vendor/stage-pilot/.claude/commands/confirm-req.md new file mode 100644 index 0000000..c55db18 --- /dev/null +++ b/.vendor/stage-pilot/.claude/commands/confirm-req.md @@ -0,0 +1 @@ +Follow the instructions in `.github/skills/confirm-req/SKILL.md` exactly. diff --git a/.vendor/stage-pilot/.claude/commands/draft-batch-design.md b/.vendor/stage-pilot/.claude/commands/draft-batch-design.md new file mode 100644 index 0000000..b300379 --- /dev/null +++ b/.vendor/stage-pilot/.claude/commands/draft-batch-design.md @@ -0,0 +1 @@ +Follow the instructions in `.github/skills/draft-batch-design/SKILL.md` exactly. diff --git a/.vendor/stage-pilot/.claude/commands/draft-batch-planning.md b/.vendor/stage-pilot/.claude/commands/draft-batch-planning.md new file mode 100644 index 0000000..92f505e --- /dev/null +++ b/.vendor/stage-pilot/.claude/commands/draft-batch-planning.md @@ -0,0 +1 @@ +Follow the instructions in `.github/skills/draft-batch-planning/SKILL.md` exactly. diff --git a/.vendor/stage-pilot/.claude/commands/draft-batch-verification.md b/.vendor/stage-pilot/.claude/commands/draft-batch-verification.md new file mode 100644 index 0000000..34cd2c2 --- /dev/null +++ b/.vendor/stage-pilot/.claude/commands/draft-batch-verification.md @@ -0,0 +1 @@ +Follow the instructions in `.github/skills/draft-batch-verification/SKILL.md` exactly. diff --git a/.vendor/stage-pilot/.claude/commands/draft-batch.md b/.vendor/stage-pilot/.claude/commands/draft-batch.md new file mode 100644 index 0000000..cf0e34a --- /dev/null +++ b/.vendor/stage-pilot/.claude/commands/draft-batch.md @@ -0,0 +1 @@ +Follow the instructions in `.github/skills/draft-batch/SKILL.md` exactly. diff --git a/.vendor/stage-pilot/.claude/commands/draft-release.md b/.vendor/stage-pilot/.claude/commands/draft-release.md new file mode 100644 index 0000000..b8a0266 --- /dev/null +++ b/.vendor/stage-pilot/.claude/commands/draft-release.md @@ -0,0 +1 @@ +Follow the instructions in `.github/skills/draft-release/SKILL.md` exactly. diff --git a/.vendor/stage-pilot/.claude/commands/draft-req.md b/.vendor/stage-pilot/.claude/commands/draft-req.md new file mode 100644 index 0000000..373dccd --- /dev/null +++ b/.vendor/stage-pilot/.claude/commands/draft-req.md @@ -0,0 +1 @@ +Follow the instructions in `.github/skills/draft-req/SKILL.md` exactly. diff --git a/.vendor/stage-pilot/.claude/commands/new-discovery.md b/.vendor/stage-pilot/.claude/commands/new-discovery.md new file mode 100644 index 0000000..8e73514 --- /dev/null +++ b/.vendor/stage-pilot/.claude/commands/new-discovery.md @@ -0,0 +1 @@ +Follow the instructions in `.github/skills/new-discovery/SKILL.md` exactly. diff --git a/.vendor/stage-pilot/.claude/commands/review-discovery.md b/.vendor/stage-pilot/.claude/commands/review-discovery.md new file mode 100644 index 0000000..e459ab1 --- /dev/null +++ b/.vendor/stage-pilot/.claude/commands/review-discovery.md @@ -0,0 +1 @@ +Follow the instructions in `.github/skills/review-discovery/SKILL.md` exactly. diff --git a/.vendor/stage-pilot/.claude/commands/run-batch-implementation.md b/.vendor/stage-pilot/.claude/commands/run-batch-implementation.md new file mode 100644 index 0000000..fa4fe14 --- /dev/null +++ b/.vendor/stage-pilot/.claude/commands/run-batch-implementation.md @@ -0,0 +1 @@ +Follow the instructions in `.github/skills/run-batch-implementation/SKILL.md` exactly. diff --git a/.vendor/stage-pilot/.claude/commands/run-sdlc.md b/.vendor/stage-pilot/.claude/commands/run-sdlc.md new file mode 100644 index 0000000..7519b14 --- /dev/null +++ b/.vendor/stage-pilot/.claude/commands/run-sdlc.md @@ -0,0 +1 @@ +Follow the instructions in `.github/skills/run-sdlc/SKILL.md` exactly. diff --git a/.vendor/stage-pilot/.claude/commands/suggest-batch-reqs.md b/.vendor/stage-pilot/.claude/commands/suggest-batch-reqs.md new file mode 100644 index 0000000..5f1c5f0 --- /dev/null +++ b/.vendor/stage-pilot/.claude/commands/suggest-batch-reqs.md @@ -0,0 +1 @@ +Follow the instructions in `.github/skills/suggest-batch-reqs/SKILL.md` exactly. diff --git a/.vendor/stage-pilot/.claude/commands/suggest-next-discovery.md b/.vendor/stage-pilot/.claude/commands/suggest-next-discovery.md new file mode 100644 index 0000000..b6da810 --- /dev/null +++ b/.vendor/stage-pilot/.claude/commands/suggest-next-discovery.md @@ -0,0 +1 @@ +Follow the instructions in `.github/skills/suggest-next-discovery/SKILL.md` exactly. diff --git a/.vendor/stage-pilot/.github/skills/new-discovery/SKILL.md b/.vendor/stage-pilot/.github/skills/new-discovery/SKILL.md index 144494c..b7ad283 100644 --- a/.vendor/stage-pilot/.github/skills/new-discovery/SKILL.md +++ b/.vendor/stage-pilot/.github/skills/new-discovery/SKILL.md @@ -269,36 +269,21 @@ Discovery 문서의 `# 3. 문제점의 요약` 중 `현재 상태`를 채우기 1. 입력 원문이 있으면 이슈명을 한 문장으로 정리하고, 없으면 저장소 상태를 먼저 분류한다. 2. 파라미터 없는 실행이면 discovery/srs/batches/releases/baseline 문서 상태를 읽어 `no-history`, `active-cycle`, `ready-for-next-iteration` 중 하나로 판정한다. -<<<<<<< HEAD 3. 입력 원문이 없고 `active-cycle`이면 새 Discovery 자동 생성을 중단하고 현재 반복을 계속 진행해야 하는 이유와 추천 skill을 보고한다. -4. 입력 원문이 없고 `no-history`이면 baseline Discovery를 생성 대상으로 확정한다. -5. 입력 원문이 없고 `ready-for-next-iteration`이면 이전 Discovery, SRS, 구현 상태, baseline 문서 상태를 바탕으로 추천 follow-up Discovery 주제를 정한다. -6. 입력 원문, 이슈 링크, 신규 요구 요약처럼 명시적 신규 입력이 있으면 `active-cycle` 여부와 무관하게 위 `확인 절차`에 따라 issue 번호/링크, 제목 키워드, 기능명, 범위 키워드를 추출하고 기존 후보 주기를 찾는다. -7. 입력 원문이 없고 추천 Discovery 주제가 정해졌으면 위 `확인 절차`에 따라 issue 번호/링크, 제목 키워드, 기능명, 범위 키워드를 추출하고 기존 후보 주기를 찾는다. -8. 후보 비교 결과를 바탕으로 `기존 Discovery 갱신` 또는 `새 Discovery 생성`으로 판정한다. -9. `active-cycle` 상태에서 명시적 신규 입력으로 새 Discovery를 진행하는 경우, 기존 active unit와의 범위 충돌 여부와 병렬 진행 사유를 함께 기록한다. -10. 판정이 애매하면 사용자 확인 전까지 자동 생성 또는 자동 갱신을 중단하고 후보와 근거를 보고한다. -11. 저장소 현황 탐색을 수행한다. -12. 판정 결과가 `새 Discovery 생성`이면 기존 `docs/discovery/` 경로를 다시 스캔해 다음 번호를 계산한다. -13. `새 Discovery 생성`이면 날짜와 slug를 조합해 `DISCOVERY_ID`를 만든다. -14. `새 Discovery 생성`이면 `docs/discovery/.md` 파일을 생성한다. -15. `기존 Discovery 갱신`이면 대상 Discovery 문서를 갱신한다. -16. 아래 플레이스홀더를 우선 치환한다. -======= -3. `active-cycle`이면 새 Discovery 생성을 중단하고 현재 반복을 계속 진행해야 하는 이유와 추천 skill을 보고한다. 4. `no-history`이고 baseline 문서 또는 active index가 비어 있으면 `bootstrap-baseline`을 우선 추천하고 Discovery 생성을 중단한다. 5. `no-history`이지만 baseline 초기화가 끝나 있으면 첫 real Discovery 생성 대상으로 확정한다. -6. `ready-for-next-iteration`이면 이전 Discovery, SRS, 구현 상태, baseline 문서 상태를 바탕으로 추천 follow-up Discovery 주제를 정한다. -7. 입력 원문이 있거나 추천 Discovery 주제가 정해졌으면 위 `확인 절차`에 따라 issue 번호/링크, 제목 키워드, 기능명, 범위 키워드를 추출하고 기존 후보 주기를 찾는다. -8. 후보 비교 결과를 바탕으로 `기존 Discovery 갱신` 또는 `새 Discovery 생성`으로 판정한다. -9. 판정이 애매하면 사용자 확인 전까지 자동 생성 또는 자동 갱신을 중단하고 후보와 근거를 보고한다. -10. 저장소 현황 탐색을 수행한다. -11. 판정 결과가 `새 Discovery 생성`이면 기존 `docs/discovery/` 경로를 다시 스캔해 다음 번호를 계산한다. -12. `새 Discovery 생성`이면 날짜와 slug를 조합해 `DISCOVERY_ID`를 만든다. -13. `새 Discovery 생성`이면 `docs/discovery/.md` 파일을 생성한다. -14. `기존 Discovery 갱신`이면 대상 Discovery 문서를 갱신한다. -15. 아래 플레이스홀더를 우선 치환한다. ->>>>>>> e15c3d2 (feat: introduce lightweight change path, change-req skill, and release feedback loop) +6. 입력 원문이 없고 `ready-for-next-iteration`이면 이전 Discovery, SRS, 구현 상태, baseline 문서 상태를 바탕으로 추천 follow-up Discovery 주제를 정한다. +7. 입력 원문, 이슈 링크, 신규 요구 요약처럼 명시적 신규 입력이 있으면 `active-cycle` 여부와 무관하게 위 `확인 절차`에 따라 issue 번호/링크, 제목 키워드, 기능명, 범위 키워드를 추출하고 기존 후보 주기를 찾는다. +8. 입력 원문이 없고 추천 Discovery 주제가 정해졌으면 위 `확인 절차`에 따라 issue 번호/링크, 제목 키워드, 기능명, 범위 키워드를 추출하고 기존 후보 주기를 찾는다. +9. 후보 비교 결과를 바탕으로 `기존 Discovery 갱신` 또는 `새 Discovery 생성`으로 판정한다. +10. `active-cycle` 상태에서 명시적 신규 입력으로 새 Discovery를 진행하는 경우, 기존 active unit와의 범위 충돌 여부와 병렬 진행 사유를 함께 기록한다. +11. 판정이 애매하면 사용자 확인 전까지 자동 생성 또는 자동 갱신을 중단하고 후보와 근거를 보고한다. +12. 저장소 현황 탐색을 수행한다. +13. 판정 결과가 `새 Discovery 생성`이면 기존 `docs/discovery/` 경로를 다시 스캔해 다음 번호를 계산한다. +14. `새 Discovery 생성`이면 날짜와 slug를 조합해 `DISCOVERY_ID`를 만든다. +15. `새 Discovery 생성`이면 `docs/discovery/.md` 파일을 생성한다. +16. `기존 Discovery 갱신`이면 대상 Discovery 문서를 갱신한다. +17. 아래 플레이스홀더를 우선 치환한다. - `{{DOC_STATUS:draft|review|confirmed}}` -> `draft` - `{{DISCOVERY_ID:dcy-<3자리>__}}` -> 계산한 `DISCOVERY_ID` - `{{ISSUE_NAME:짧은 한글 또는 영문 이슈명}}` -> 입력 원문 또는 요약 이슈명 @@ -311,23 +296,13 @@ Discovery 문서의 `# 3. 문제점의 요약` 중 `현재 상태`를 채우기 - `{{FOLLOW_UP_DISCOVERY_REF:없음 또는 docs/discovery/.md}}` -> `없음` 또는 후속 Discovery 경로 - `{{OUTPUT_PATH}}` -> 생성 파일 경로 - `{{FILE_RESULT:생성|갱신|미생성}}` -> `생성` -<<<<<<< HEAD -17. baseline Discovery 또는 baseline 문서 보완 Discovery면 `docs/project-structure.md`와 `docs/runtime-flows.md` 생성/갱신 요구를 핵심 변경과 FR에 반영한다. -18. `기존 Discovery 갱신`인 경우 `{{OUTPUT_PATH}}`와 `{{FILE_RESULT}}`는 갱신 대상 파일과 `갱신`으로 해석한다. -19. `새 Discovery 생성`이면서 기존 Discovery를 대체하거나 이어받는 경우, 기존 Discovery 문서에 `대체됨` 또는 `후속 주기 참조` 필드를 새 문서 경로로 갱신한다. -20. Discovery 문서에서는 추론 가능한 플레이스홀더를 적극적으로 실제 내용으로 치환한다. -21. 추론 불가능하거나 사용자 확인이 필요한 항목만 플레이스홀더로 남긴다. -22. `새 Discovery 생성`인 경우에만 `docs/discovery/index.md` 전역 인덱스에 새 행을 추가한다. -23. `기존 Discovery 갱신`인 경우 전역 인덱스에 새 행을 추가하지 않는다. -======= -16. Discovery가 구조 또는 runtime baseline 갭을 직접 다루면 `docs/project-structure.md`와 `docs/runtime-flows.md` 갱신 요구를 핵심 변경과 FR에 반영한다. -17. `기존 Discovery 갱신`인 경우 `{{OUTPUT_PATH}}`와 `{{FILE_RESULT}}`는 갱신 대상 파일과 `갱신`으로 해석한다. -18. `새 Discovery 생성`이면서 기존 Discovery를 대체하거나 이어받는 경우, 기존 Discovery 문서에 `대체됨` 또는 `후속 주기 참조` 필드를 새 문서 경로로 갱신한다. -19. Discovery 문서에서는 추론 가능한 플레이스홀더를 적극적으로 실제 내용으로 치환한다. -20. 추론 불가능하거나 사용자 확인이 필요한 항목만 플레이스홀더로 남긴다. -21. `새 Discovery 생성`인 경우에만 `docs/discovery/index.md` 전역 인덱스에 새 행을 추가한다. -22. `기존 Discovery 갱신`인 경우 전역 인덱스에 새 행을 추가하지 않는다. ->>>>>>> e15c3d2 (feat: introduce lightweight change path, change-req skill, and release feedback loop) +18. Discovery가 구조 또는 runtime baseline 갭을 직접 다루면 `docs/project-structure.md`와 `docs/runtime-flows.md` 갱신 요구를 핵심 변경과 FR에 반영한다. +19. `기존 Discovery 갱신`인 경우 `{{OUTPUT_PATH}}`와 `{{FILE_RESULT}}`는 갱신 대상 파일과 `갱신`으로 해석한다. +20. `새 Discovery 생성`이면서 기존 Discovery를 대체하거나 이어받는 경우, 기존 Discovery 문서에 `대체됨` 또는 `후속 주기 참조` 필드를 새 문서 경로로 갱신한다. +21. Discovery 문서에서는 추론 가능한 플레이스홀더를 적극적으로 실제 내용으로 치환한다. +22. 추론 불가능하거나 사용자 확인이 필요한 항목만 플레이스홀더로 남긴다. +23. `새 Discovery 생성`인 경우에만 `docs/discovery/index.md` 전역 인덱스에 새 행을 추가한다. +24. `기존 Discovery 갱신`인 경우 전역 인덱스에 새 행을 추가하지 않는다. # Global Index Rules diff --git a/.vendor/stage-pilot/README.md b/.vendor/stage-pilot/README.md index 883d1e3..574f1ab 100644 --- a/.vendor/stage-pilot/README.md +++ b/.vendor/stage-pilot/README.md @@ -396,6 +396,17 @@ Discovery는 구현 완료 상태를 표현하는 단위가 아니다. Discovery - `docs/batches/index.md` - `docs/releases/index.md` +### 12.1 새 skill 추가 시 체크리스트 + +skill을 새로 추가할 때는 아래 두 파일을 반드시 함께 추가한다. + +| 파일 | 역할 | +| --- | --- | +| `.github/skills//SKILL.md` | Copilot용 skill 본문 | +| `.claude/commands/.md` | Claude Code용 wrapper (내용: `Follow the instructions in \`.github/skills//SKILL.md\` exactly.`) | + +skill을 삭제하거나 이름을 변경할 때도 두 경로를 함께 처리한다. + ## 13. 빠른 점검표 ### 13.1 Requirements 진입 전 diff --git a/.vendor/stage-pilot/bootstrap/bootstrap.sh b/.vendor/stage-pilot/bootstrap/bootstrap.sh index 08a7b6d..57ee383 100644 --- a/.vendor/stage-pilot/bootstrap/bootstrap.sh +++ b/.vendor/stage-pilot/bootstrap/bootstrap.sh @@ -26,6 +26,7 @@ ensure_host_structure() { ".github/runbooks/services" ".github/scripts" ".github/templates" + ".claude/commands" "docs/discovery" "docs/srs" "docs/batches" diff --git a/.vendor/stage-pilot/bootstrap/install.sh b/.vendor/stage-pilot/bootstrap/install.sh index f77f3bf..6f81623 100644 --- a/.vendor/stage-pilot/bootstrap/install.sh +++ b/.vendor/stage-pilot/bootstrap/install.sh @@ -68,6 +68,7 @@ done HOST_ROOT="${ARGS[0]:-$(pwd)}" POLICY="${ARGS[1]:-${STAGEPILOT_CONFLICT_POLICY:-preserve}}" TARGET_GITHUB="${HOST_ROOT}/.github" +TARGET_CLAUDE="${HOST_ROOT}/CLAUDE.md" STAGEPILOT_BEGIN="" STAGEPILOT_END="" @@ -177,11 +178,95 @@ merge_stagepilot_section() { rm -f "${payload_file}" "${output_file}" } +install_claude_section() { + local src_copilot="${SOURCE_GITHUB}/copilot-instructions.md" + [ -f "${src_copilot}" ] || { log "copilot-instructions.md not found; skipping CLAUDE.md"; return 0; } + + if [ ! -e "${TARGET_CLAUDE}" ]; then + local payload_file + payload_file="$(mktemp)" + if grep -Fq "${STAGEPILOT_BEGIN}" "${src_copilot}" && grep -Fq "${STAGEPILOT_END}" "${src_copilot}"; then + awk -v begin="${STAGEPILOT_BEGIN}" -v end="${STAGEPILOT_END}" ' + $0 == begin { in_block=1; next } + $0 == end { in_block=0; exit } + in_block { print } + ' "${src_copilot}" > "${payload_file}" + else + cat "${src_copilot}" > "${payload_file}" + fi + if [ "${DRY_RUN}" -eq 1 ]; then + log "[dry-run] create: CLAUDE.md" + else + { + printf '%s\n' "${STAGEPILOT_BEGIN}" + cat "${payload_file}" + printf '%s\n' "${STAGEPILOT_END}" + } > "${TARGET_CLAUDE}" + fi + rm -f "${payload_file}" + else + merge_stagepilot_section "${src_copilot}" "${TARGET_CLAUDE}" + fi +} + +# NOTE: skill을 추가/삭제/이름변경할 때는 .github/skills//SKILL.md와 +# .claude/commands/.md를 반드시 함께 처리한다. (README 12.1 참고) +install_claude_commands() { + local source_commands="${PACKAGE_ROOT}/.claude/commands" + local target_commands="${HOST_ROOT}/.claude/commands" + + [ -d "${source_commands}" ] || { log "no .claude/commands source; skipping"; return 0; } + + while IFS= read -r -d '' src_file; do + local cmd_name + cmd_name="$(basename "${src_file}")" + local dst_file="${target_commands}/${cmd_name}" + + if [ ! -e "${dst_file}" ]; then + if [ "${DRY_RUN}" -eq 1 ]; then + log "[dry-run] create: .claude/commands/${cmd_name}" + else + mkdir -p "${target_commands}" + cp -a "${src_file}" "${dst_file}" + fi + claude_installed=$((claude_installed + 1)) + continue + fi + + if cmp -s "${src_file}" "${dst_file}"; then + claude_skipped=$((claude_skipped + 1)) + continue + fi + + case "${POLICY}" in + replace) + if [ "${DRY_RUN}" -eq 1 ]; then + log "[dry-run] replace: .claude/commands/${cmd_name}" + else + cp -a "${src_file}" "${dst_file}" + fi + claude_installed=$((claude_installed + 1)) + ;; + preserve) + claude_skipped=$((claude_skipped + 1)) + ;; + fail) + printf '[install] CONFLICT: .claude/commands/%s\n' "${cmd_name}" >&2 + failed=$((failed + 1)) + ;; + esac + done < <(find "${source_commands}" -maxdepth 1 -name "*.md" -print0 | sort -z) + + log "claude_commands: installed=${claude_installed} skipped=${claude_skipped}" +} + copied=0 skipped=0 conflicted=0 failed=0 merged=0 +claude_installed=0 +claude_skipped=0 mkdir -p "${TARGET_GITHUB}" @@ -255,6 +340,9 @@ if [ "${CLEANUP_LEGACY_BASE}" -eq 1 ]; then fi fi +install_claude_section +install_claude_commands + log "host_root=${HOST_ROOT}" log "source=${SOURCE_GITHUB}" log "source_path=${SOURCE_PATH}"