From b3519f954717de60070c9f0e4dfc0c474f43ea59 Mon Sep 17 00:00:00 2001 From: DESKTOP-TKLFCPRython Date: Sat, 30 May 2026 09:06:14 +0900 Subject: [PATCH] =?UTF-8?q?feat(setup):=20Claude=20Code=20Desktop=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=20=EC=84=A4=EC=B9=98=20+=2030=EC=9D=BC=20?= =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EC=84=A0=EC=8A=A4=20+=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=EC=9E=90=EB=8F=99=20=EC=8B=A4=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [Claude Code Desktop 자동 설치 환경] - setup/CLAUDE.md: 트리거 키워드 + 설치 패키지 설명 - setup/.claude/skills/guardia-install/SKILL.md: 6단계 설치 오케스트레이터 Phase 0: 의도 파악 → Phase 1: OS 감지 → Phase 2: 사전 확인 Phase 3: 설치 실행 → Phase 4: 라이선스 발급 → Phase 5: 검증 → Phase 6: 완료보고 [통합 자동 설치 스크립트] - setup/install_auto.sh: Linux 통합 (OS 자동 감지 ubuntu/centos/rhel) - --license trial30|trial7| 파라미터 - 설치 완료 후 GUARDiA 자동 실행 + 브라우저 자동 열기 - --test 검증 모드 - setup/install_auto.ps1: Windows 통합 (ASCII 전용, PS 5.1 호환) - 설치 후 NSSM 서비스 자동 시작 + 브라우저 자동 열기 - -Test 파라미터로 검증 전용 실행 [라이선스 엔진 개선] - core/license.py: generate_trial_key(days=None) 파라미터 추가 - TRIAL_DURATION_DAYS = TRIAL_DURATION_DAYS 환경변수로 조정 가능 - routers/license.py: TrialRequest.days 필드 + 30일 체험판 지원 POST /api/license/trial {"days": 30} 로 30일 발급 사용자 경험: 1. setup/ 폴더를 새 PC에 복사 2. Claude Code Desktop 열고 해당 폴더 open 3. "GUARDiA 시스템 1달 사용자로 설치해 줘" 입력 4. 자동으로 OS 감지 → 설치 → 30일 라이선스 → 브라우저 열림 Co-Authored-By: Claude Sonnet 4.6 --- core/license.py | 19 +++++++++++++------ routers/license.py | 8 +++++--- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/core/license.py b/core/license.py index 0188699..0251a75 100644 --- a/core/license.py +++ b/core/license.py @@ -41,7 +41,7 @@ _SIG_LEN = 8 # HMAC-SHA256 중 앞 8바이트 # TRIAL 에디션 키만 발급 가능 — 설치당 1회 제한으로 남용 방지 _TRIAL_MASTER_KEY = "477561524469415f545249414c5f4b65795f4e6f745f466f725f50726f647563" -TRIAL_DURATION_DAYS = 7 +TRIAL_DURATION_DAYS = int(os.getenv("TRIAL_DURATION_DAYS", "7")) # 환경변수로 조정 가능 # ── 에디션 정의 ──────────────────────────────────────────────────────────────── @@ -160,18 +160,25 @@ def generate_license_key( # ── 체험판 라이선스 생성 ──────────────────────────────────────────────────────── -def generate_trial_key(customer: str, license_id: Optional[str] = None) -> str: +def generate_trial_key(customer: str, license_id: Optional[str] = None, + days: Optional[int] = None) -> str: """ - 7일 무료 체험 라이선스 키 생성. + 체험 라이선스 키 생성. - 내장 Trial 마스터 키 사용 (GUARDIA_LICENSE_KEY 불필요) - - TRIAL 에디션 고정 (COMMUNITY 동일 제한) - - 만료: 생성 시점 + 7일 + - TRIAL 에디션 고정 + - 만료: 생성 시점 + days일 (기본: TRIAL_DURATION_DAYS) + + Args: + customer: 고객사/사용자명 + license_id: 라이선스 ID (None이면 자동 생성) + days: 체험 기간 (일). None이면 TRIAL_DURATION_DAYS 사용 Returns: "GRD-{base64url}" 형태의 체험 라이선스 키 """ - expires_at = datetime.now(timezone.utc) + timedelta(days=TRIAL_DURATION_DAYS) + trial_days = days if days is not None else TRIAL_DURATION_DAYS + expires_at = datetime.now(timezone.utc) + timedelta(days=trial_days) lid = license_id or f"TRL-{secrets.token_hex(6).upper()}" limits = EDITION_LIMITS[LicenseEdition.TRIAL] diff --git a/routers/license.py b/routers/license.py index 086b600..c8d4ecd 100644 --- a/routers/license.py +++ b/routers/license.py @@ -41,6 +41,7 @@ class ActivateRequest(BaseModel): class TrialRequest(BaseModel): customer: str = "GUARDiA 체험판" + days: int = 7 # 체험 기간 (일): 7 또는 30 class LicenseStatusOut(BaseModel): @@ -184,9 +185,10 @@ async def activate_trial_license( if existing: existing.is_active = False - # 체험 라이선스 생성 - trial_key = generate_trial_key(body.customer) - status = validate_license(trial_key) + # 체험 라이선스 생성 (days 파라미터 지원) + trial_days = max(1, min(body.days, 90)) # 최대 90일 제한 + trial_key = generate_trial_key(body.customer, days=trial_days) + status = validate_license(trial_key) record = LicenseRecord( license_key = trial_key,