diff --git a/.claude/skills/yakcloud-deploy/assets/bin/yakcloud b/.claude/skills/yakcloud-deploy/assets/bin/yakcloud index 94bbfaa..8abdfce 100755 --- a/.claude/skills/yakcloud-deploy/assets/bin/yakcloud +++ b/.claude/skills/yakcloud-deploy/assets/bin/yakcloud @@ -18,7 +18,7 @@ set -euo pipefail REPO="${YAKCLOUD_STARTER_REPO:-https://gitea.yakenator.io/yakenator/yakcloud-starter}" BRANCH="${YAKCLOUD_STARTER_BRANCH:-main}" -VERSION="0.2.0" +VERSION="0.3.0" die() { echo "✗ $*" >&2; exit 1; } info() { echo "▸ $*"; } @@ -89,13 +89,45 @@ cmd_project_check() { python3 scripts/yakcloud_deploy.py yakcloud.yaml --dry-run } +# 전역 CLI 자기 갱신(설치된 yakcloud 를 최신 bin 으로 덮어씀). +cmd_upgrade() { + local self; self="$(command -v yakcloud 2>/dev/null || true)"; [ -n "$self" ] || self="$0" + info "yakcloud CLI 업그레이드… ($self)" + local tmp; tmp="$(mktemp)" + curl -fsSL "$REPO/raw/branch/$BRANCH/bin/yakcloud" -o "$tmp" || { rm -f "$tmp"; die "다운로드 실패"; } + head -1 "$tmp" | grep -q 'bash' || { rm -f "$tmp"; die "받은 파일이 올바르지 않습니다"; } + chmod +x "$tmp" + mv "$tmp" "$self" 2>/dev/null || { rm -f "$tmp"; die "설치 실패(권한) — 'DEST= 재설치' 또는 sudo"; } + echo "✓ 업그레이드 완료: $("$self" version 2>/dev/null || echo yakcloud)" +} + +# 기존 프로젝트의 플러밍(엔진·CI·스킬)만 최신화. 앱/매니페스트/Dockerfile 등 사용자 파일은 보존. +cmd_project_update() { + [ -f yakcloud.yaml ] || die "프로젝트 폴더가 아닙니다 — 'yakcloud project init' 먼저" + command -v git >/dev/null 2>&1 || die "git 이 필요합니다." + info "프로젝트 플러밍 최신화(앱·매니페스트 보존)… ($REPO @ $BRANCH)" + local tmp; tmp="$(mktemp -d)" + git clone -q --depth 1 -b "$BRANCH" "$REPO.git" "$tmp/s" || { rm -rf "$tmp"; die "클론 실패"; } + mkdir -p scripts .gitea/workflows .claude/skills + cp "$tmp/s/scripts/yakcloud_deploy.py" scripts/ 2>/dev/null || true + cp "$tmp/s/scripts/yakcloud_ctl.py" scripts/ 2>/dev/null || true + cp "$tmp/s/.gitea/workflows/deploy.yml" .gitea/workflows/ 2>/dev/null || true + cp "$tmp/s/DATA-SOURCES.md" DATA-SOURCES.md 2>/dev/null || true + rm -rf .claude/skills/yakcloud-deploy + cp -R "$tmp/s/.claude/skills/yakcloud-deploy" .claude/skills/ 2>/dev/null || true + rm -rf "$tmp" + echo "✓ 최신화 완료 — scripts/·.gitea/·.claude 스킬 갱신(app.py·yakcloud.yaml·Dockerfile 그대로)" +} + usage() { cat < [wl] 도메인 등록 + 워크로드 할당(관리형=즉시/배포중이면 라이브) scale replicas 변경 @@ -115,9 +147,11 @@ case "${1:-help}" in deploy) shift; cmd_project_deploy "$@" ;; info) shift; ctl info "$@" ;; check|dry-run) shift; cmd_project_check "$@" ;; - *) echo "yakcloud project "; exit 1 ;; + update) shift; cmd_project_update "$@" ;; + *) echo "yakcloud project "; exit 1 ;; esac ;; domain|scale|set|env|source|bind|unbind) ctl "$@" ;; + upgrade|self-update) cmd_upgrade ;; version|-v|--version) echo "yakcloud $VERSION" ;; help|-h|--help|"") usage ;; *) echo "알 수 없는 명령: $1"; echo; usage; exit 1 ;; diff --git a/bin/yakcloud b/bin/yakcloud index 94bbfaa..8abdfce 100755 --- a/bin/yakcloud +++ b/bin/yakcloud @@ -18,7 +18,7 @@ set -euo pipefail REPO="${YAKCLOUD_STARTER_REPO:-https://gitea.yakenator.io/yakenator/yakcloud-starter}" BRANCH="${YAKCLOUD_STARTER_BRANCH:-main}" -VERSION="0.2.0" +VERSION="0.3.0" die() { echo "✗ $*" >&2; exit 1; } info() { echo "▸ $*"; } @@ -89,13 +89,45 @@ cmd_project_check() { python3 scripts/yakcloud_deploy.py yakcloud.yaml --dry-run } +# 전역 CLI 자기 갱신(설치된 yakcloud 를 최신 bin 으로 덮어씀). +cmd_upgrade() { + local self; self="$(command -v yakcloud 2>/dev/null || true)"; [ -n "$self" ] || self="$0" + info "yakcloud CLI 업그레이드… ($self)" + local tmp; tmp="$(mktemp)" + curl -fsSL "$REPO/raw/branch/$BRANCH/bin/yakcloud" -o "$tmp" || { rm -f "$tmp"; die "다운로드 실패"; } + head -1 "$tmp" | grep -q 'bash' || { rm -f "$tmp"; die "받은 파일이 올바르지 않습니다"; } + chmod +x "$tmp" + mv "$tmp" "$self" 2>/dev/null || { rm -f "$tmp"; die "설치 실패(권한) — 'DEST= 재설치' 또는 sudo"; } + echo "✓ 업그레이드 완료: $("$self" version 2>/dev/null || echo yakcloud)" +} + +# 기존 프로젝트의 플러밍(엔진·CI·스킬)만 최신화. 앱/매니페스트/Dockerfile 등 사용자 파일은 보존. +cmd_project_update() { + [ -f yakcloud.yaml ] || die "프로젝트 폴더가 아닙니다 — 'yakcloud project init' 먼저" + command -v git >/dev/null 2>&1 || die "git 이 필요합니다." + info "프로젝트 플러밍 최신화(앱·매니페스트 보존)… ($REPO @ $BRANCH)" + local tmp; tmp="$(mktemp -d)" + git clone -q --depth 1 -b "$BRANCH" "$REPO.git" "$tmp/s" || { rm -rf "$tmp"; die "클론 실패"; } + mkdir -p scripts .gitea/workflows .claude/skills + cp "$tmp/s/scripts/yakcloud_deploy.py" scripts/ 2>/dev/null || true + cp "$tmp/s/scripts/yakcloud_ctl.py" scripts/ 2>/dev/null || true + cp "$tmp/s/.gitea/workflows/deploy.yml" .gitea/workflows/ 2>/dev/null || true + cp "$tmp/s/DATA-SOURCES.md" DATA-SOURCES.md 2>/dev/null || true + rm -rf .claude/skills/yakcloud-deploy + cp -R "$tmp/s/.claude/skills/yakcloud-deploy" .claude/skills/ 2>/dev/null || true + rm -rf "$tmp" + echo "✓ 최신화 완료 — scripts/·.gitea/·.claude 스킬 갱신(app.py·yakcloud.yaml·Dockerfile 그대로)" +} + usage() { cat < [wl] 도메인 등록 + 워크로드 할당(관리형=즉시/배포중이면 라이브) scale replicas 변경 @@ -115,9 +147,11 @@ case "${1:-help}" in deploy) shift; cmd_project_deploy "$@" ;; info) shift; ctl info "$@" ;; check|dry-run) shift; cmd_project_check "$@" ;; - *) echo "yakcloud project "; exit 1 ;; + update) shift; cmd_project_update "$@" ;; + *) echo "yakcloud project "; exit 1 ;; esac ;; domain|scale|set|env|source|bind|unbind) ctl "$@" ;; + upgrade|self-update) cmd_upgrade ;; version|-v|--version) echo "yakcloud $VERSION" ;; help|-h|--help|"") usage ;; *) echo "알 수 없는 명령: $1"; echo; usage; exit 1 ;;