[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|<key> 파라미터
- 설치 완료 후 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 <noreply@anthropic.com>
96 lines
2.6 KiB
AppleScript
96 lines
2.6 KiB
AppleScript
(*
|
|
Copyright (c) 2015-present, Facebook, Inc.
|
|
|
|
This source code is licensed under the MIT license found in the
|
|
LICENSE file at
|
|
https://github.com/facebookincubator/create-react-app/blob/master/LICENSE
|
|
*)
|
|
|
|
property targetTab: null
|
|
property targetTabIndex: -1
|
|
property targetWindow: null
|
|
property theProgram: "Google Chrome"
|
|
|
|
on run argv
|
|
set theURL to item 1 of argv
|
|
|
|
-- Allow requested program to be optional,
|
|
-- default to Google Chrome
|
|
if (count of argv) > 1 then
|
|
set theProgram to item 2 of argv
|
|
end if
|
|
|
|
using terms from application "Google Chrome"
|
|
tell application theProgram
|
|
|
|
if (count every window) = 0 then
|
|
make new window
|
|
end if
|
|
|
|
-- 1: Looking for tab running debugger
|
|
-- then, Reload debugging tab if found
|
|
-- then return
|
|
set found to my lookupTabWithUrl(theURL)
|
|
if found then
|
|
set targetWindow's active tab index to targetTabIndex
|
|
tell targetTab to reload
|
|
tell targetWindow to activate
|
|
set index of targetWindow to 1
|
|
return
|
|
end if
|
|
|
|
-- 2: Looking for Empty tab
|
|
-- In case debugging tab was not found
|
|
-- We try to find an empty tab instead
|
|
set found to my lookupTabWithUrl("chrome://newtab/")
|
|
if found then
|
|
set targetWindow's active tab index to targetTabIndex
|
|
set URL of targetTab to theURL
|
|
tell targetWindow to activate
|
|
return
|
|
end if
|
|
|
|
-- 3: Create new tab
|
|
-- both debugging and empty tab were not found
|
|
-- make a new tab with url
|
|
tell window 1
|
|
activate
|
|
make new tab with properties {URL:theURL}
|
|
end tell
|
|
end tell
|
|
end using terms from
|
|
end run
|
|
|
|
-- Function:
|
|
-- Lookup tab with given url
|
|
-- if found, store tab, index, and window in properties
|
|
-- (properties were declared on top of file)
|
|
on lookupTabWithUrl(lookupUrl)
|
|
using terms from application "Google Chrome"
|
|
tell application theProgram
|
|
-- Find a tab with the given url
|
|
set found to false
|
|
set theTabIndex to -1
|
|
repeat with theWindow in every window
|
|
set theTabIndex to 0
|
|
repeat with theTab in every tab of theWindow
|
|
set theTabIndex to theTabIndex + 1
|
|
if (theTab's URL as string) contains lookupUrl then
|
|
-- assign tab, tab index, and window to properties
|
|
set targetTab to theTab
|
|
set targetTabIndex to theTabIndex
|
|
set targetWindow to theWindow
|
|
set found to true
|
|
exit repeat
|
|
end if
|
|
end repeat
|
|
|
|
if found then
|
|
exit repeat
|
|
end if
|
|
end repeat
|
|
end tell
|
|
end using terms from
|
|
return found
|
|
end lookupTabWithUrl
|