[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>
344 lines
11 KiB
JavaScript
344 lines
11 KiB
JavaScript
import { a as getWindow, g as getDocument } from './ssr-window.esm.mjs';
|
|
|
|
function classesToTokens(classes) {
|
|
if (classes === void 0) {
|
|
classes = '';
|
|
}
|
|
return classes.trim().split(' ').filter(c => !!c.trim());
|
|
}
|
|
|
|
function deleteProps(obj) {
|
|
const object = obj;
|
|
Object.keys(object).forEach(key => {
|
|
try {
|
|
object[key] = null;
|
|
} catch (e) {
|
|
// no getter for object
|
|
}
|
|
try {
|
|
delete object[key];
|
|
} catch (e) {
|
|
// something got wrong
|
|
}
|
|
});
|
|
}
|
|
function nextTick(callback, delay) {
|
|
if (delay === void 0) {
|
|
delay = 0;
|
|
}
|
|
return setTimeout(callback, delay);
|
|
}
|
|
function now() {
|
|
return Date.now();
|
|
}
|
|
function getComputedStyle(el) {
|
|
const window = getWindow();
|
|
let style;
|
|
if (window.getComputedStyle) {
|
|
style = window.getComputedStyle(el, null);
|
|
}
|
|
if (!style && el.currentStyle) {
|
|
style = el.currentStyle;
|
|
}
|
|
if (!style) {
|
|
style = el.style;
|
|
}
|
|
return style;
|
|
}
|
|
function getTranslate(el, axis) {
|
|
if (axis === void 0) {
|
|
axis = 'x';
|
|
}
|
|
const window = getWindow();
|
|
let matrix;
|
|
let curTransform;
|
|
let transformMatrix;
|
|
const curStyle = getComputedStyle(el);
|
|
if (window.WebKitCSSMatrix) {
|
|
curTransform = curStyle.transform || curStyle.webkitTransform;
|
|
if (curTransform.split(',').length > 6) {
|
|
curTransform = curTransform.split(', ').map(a => a.replace(',', '.')).join(', ');
|
|
}
|
|
// Some old versions of Webkit choke when 'none' is passed; pass
|
|
// empty string instead in this case
|
|
transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);
|
|
} else {
|
|
transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');
|
|
matrix = transformMatrix.toString().split(',');
|
|
}
|
|
if (axis === 'x') {
|
|
// Latest Chrome and webkits Fix
|
|
if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41;
|
|
// Crazy IE10 Matrix
|
|
else if (matrix.length === 16) curTransform = parseFloat(matrix[12]);
|
|
// Normal Browsers
|
|
else curTransform = parseFloat(matrix[4]);
|
|
}
|
|
if (axis === 'y') {
|
|
// Latest Chrome and webkits Fix
|
|
if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42;
|
|
// Crazy IE10 Matrix
|
|
else if (matrix.length === 16) curTransform = parseFloat(matrix[13]);
|
|
// Normal Browsers
|
|
else curTransform = parseFloat(matrix[5]);
|
|
}
|
|
return curTransform || 0;
|
|
}
|
|
function isObject(o) {
|
|
return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object';
|
|
}
|
|
function isNode(node) {
|
|
// eslint-disable-next-line
|
|
if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') {
|
|
return node instanceof HTMLElement;
|
|
}
|
|
return node && (node.nodeType === 1 || node.nodeType === 11);
|
|
}
|
|
function extend() {
|
|
const to = Object(arguments.length <= 0 ? undefined : arguments[0]);
|
|
const noExtend = ['__proto__', 'constructor', 'prototype'];
|
|
for (let i = 1; i < arguments.length; i += 1) {
|
|
const nextSource = i < 0 || arguments.length <= i ? undefined : arguments[i];
|
|
if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) {
|
|
const keysArray = Object.keys(Object(nextSource)).filter(key => noExtend.indexOf(key) < 0);
|
|
for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
|
|
const nextKey = keysArray[nextIndex];
|
|
const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
|
|
if (desc !== undefined && desc.enumerable) {
|
|
if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {
|
|
if (nextSource[nextKey].__swiper__) {
|
|
to[nextKey] = nextSource[nextKey];
|
|
} else {
|
|
extend(to[nextKey], nextSource[nextKey]);
|
|
}
|
|
} else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {
|
|
to[nextKey] = {};
|
|
if (nextSource[nextKey].__swiper__) {
|
|
to[nextKey] = nextSource[nextKey];
|
|
} else {
|
|
extend(to[nextKey], nextSource[nextKey]);
|
|
}
|
|
} else {
|
|
to[nextKey] = nextSource[nextKey];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return to;
|
|
}
|
|
function setCSSProperty(el, varName, varValue) {
|
|
el.style.setProperty(varName, varValue);
|
|
}
|
|
function animateCSSModeScroll(_ref) {
|
|
let {
|
|
swiper,
|
|
targetPosition,
|
|
side
|
|
} = _ref;
|
|
const window = getWindow();
|
|
const startPosition = -swiper.translate;
|
|
let startTime = null;
|
|
let time;
|
|
const duration = swiper.params.speed;
|
|
swiper.wrapperEl.style.scrollSnapType = 'none';
|
|
window.cancelAnimationFrame(swiper.cssModeFrameID);
|
|
const dir = targetPosition > startPosition ? 'next' : 'prev';
|
|
const isOutOfBound = (current, target) => {
|
|
return dir === 'next' && current >= target || dir === 'prev' && current <= target;
|
|
};
|
|
const animate = () => {
|
|
time = new Date().getTime();
|
|
if (startTime === null) {
|
|
startTime = time;
|
|
}
|
|
const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);
|
|
const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;
|
|
let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);
|
|
if (isOutOfBound(currentPosition, targetPosition)) {
|
|
currentPosition = targetPosition;
|
|
}
|
|
swiper.wrapperEl.scrollTo({
|
|
[side]: currentPosition
|
|
});
|
|
if (isOutOfBound(currentPosition, targetPosition)) {
|
|
swiper.wrapperEl.style.overflow = 'hidden';
|
|
swiper.wrapperEl.style.scrollSnapType = '';
|
|
setTimeout(() => {
|
|
swiper.wrapperEl.style.overflow = '';
|
|
swiper.wrapperEl.scrollTo({
|
|
[side]: currentPosition
|
|
});
|
|
});
|
|
window.cancelAnimationFrame(swiper.cssModeFrameID);
|
|
return;
|
|
}
|
|
swiper.cssModeFrameID = window.requestAnimationFrame(animate);
|
|
};
|
|
animate();
|
|
}
|
|
function getSlideTransformEl(slideEl) {
|
|
return slideEl.querySelector('.swiper-slide-transform') || slideEl.shadowRoot && slideEl.shadowRoot.querySelector('.swiper-slide-transform') || slideEl;
|
|
}
|
|
function elementChildren(element, selector) {
|
|
if (selector === void 0) {
|
|
selector = '';
|
|
}
|
|
const window = getWindow();
|
|
const children = [...element.children];
|
|
if (window.HTMLSlotElement && element instanceof HTMLSlotElement) {
|
|
children.push(...element.assignedElements());
|
|
}
|
|
if (!selector) {
|
|
return children;
|
|
}
|
|
return children.filter(el => el.matches(selector));
|
|
}
|
|
function elementIsChildOfSlot(el, slot) {
|
|
// Breadth-first search through all parent's children and assigned elements
|
|
const elementsQueue = [slot];
|
|
while (elementsQueue.length > 0) {
|
|
const elementToCheck = elementsQueue.shift();
|
|
if (el === elementToCheck) {
|
|
return true;
|
|
}
|
|
elementsQueue.push(...elementToCheck.children, ...(elementToCheck.shadowRoot ? elementToCheck.shadowRoot.children : []), ...(elementToCheck.assignedElements ? elementToCheck.assignedElements() : []));
|
|
}
|
|
}
|
|
function elementIsChildOf(el, parent) {
|
|
const window = getWindow();
|
|
let isChild = parent.contains(el);
|
|
if (!isChild && window.HTMLSlotElement && parent instanceof HTMLSlotElement) {
|
|
const children = [...parent.assignedElements()];
|
|
isChild = children.includes(el);
|
|
if (!isChild) {
|
|
isChild = elementIsChildOfSlot(el, parent);
|
|
}
|
|
}
|
|
return isChild;
|
|
}
|
|
function showWarning(text) {
|
|
try {
|
|
console.warn(text);
|
|
return;
|
|
} catch (err) {
|
|
// err
|
|
}
|
|
}
|
|
function createElement(tag, classes) {
|
|
if (classes === void 0) {
|
|
classes = [];
|
|
}
|
|
const el = document.createElement(tag);
|
|
el.classList.add(...(Array.isArray(classes) ? classes : classesToTokens(classes)));
|
|
return el;
|
|
}
|
|
function elementOffset(el) {
|
|
const window = getWindow();
|
|
const document = getDocument();
|
|
const box = el.getBoundingClientRect();
|
|
const body = document.body;
|
|
const clientTop = el.clientTop || body.clientTop || 0;
|
|
const clientLeft = el.clientLeft || body.clientLeft || 0;
|
|
const scrollTop = el === window ? window.scrollY : el.scrollTop;
|
|
const scrollLeft = el === window ? window.scrollX : el.scrollLeft;
|
|
return {
|
|
top: box.top + scrollTop - clientTop,
|
|
left: box.left + scrollLeft - clientLeft
|
|
};
|
|
}
|
|
function elementPrevAll(el, selector) {
|
|
const prevEls = [];
|
|
while (el.previousElementSibling) {
|
|
const prev = el.previousElementSibling; // eslint-disable-line
|
|
if (selector) {
|
|
if (prev.matches(selector)) prevEls.push(prev);
|
|
} else prevEls.push(prev);
|
|
el = prev;
|
|
}
|
|
return prevEls;
|
|
}
|
|
function elementNextAll(el, selector) {
|
|
const nextEls = [];
|
|
while (el.nextElementSibling) {
|
|
const next = el.nextElementSibling; // eslint-disable-line
|
|
if (selector) {
|
|
if (next.matches(selector)) nextEls.push(next);
|
|
} else nextEls.push(next);
|
|
el = next;
|
|
}
|
|
return nextEls;
|
|
}
|
|
function elementStyle(el, prop) {
|
|
const window = getWindow();
|
|
return window.getComputedStyle(el, null).getPropertyValue(prop);
|
|
}
|
|
function elementIndex(el) {
|
|
let child = el;
|
|
let i;
|
|
if (child) {
|
|
i = 0;
|
|
// eslint-disable-next-line
|
|
while ((child = child.previousSibling) !== null) {
|
|
if (child.nodeType === 1) i += 1;
|
|
}
|
|
return i;
|
|
}
|
|
return undefined;
|
|
}
|
|
function elementParents(el, selector) {
|
|
const parents = []; // eslint-disable-line
|
|
let parent = el.parentElement; // eslint-disable-line
|
|
while (parent) {
|
|
if (selector) {
|
|
if (parent.matches(selector)) parents.push(parent);
|
|
} else {
|
|
parents.push(parent);
|
|
}
|
|
parent = parent.parentElement;
|
|
}
|
|
return parents;
|
|
}
|
|
function elementTransitionEnd(el, callback) {
|
|
function fireCallBack(e) {
|
|
if (e.target !== el) return;
|
|
callback.call(el, e);
|
|
el.removeEventListener('transitionend', fireCallBack);
|
|
}
|
|
if (callback) {
|
|
el.addEventListener('transitionend', fireCallBack);
|
|
}
|
|
}
|
|
function elementOuterSize(el, size, includeMargins) {
|
|
const window = getWindow();
|
|
if (includeMargins) {
|
|
return el[size === 'width' ? 'offsetWidth' : 'offsetHeight'] + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-right' : 'margin-top')) + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-left' : 'margin-bottom'));
|
|
}
|
|
return el.offsetWidth;
|
|
}
|
|
function makeElementsArray(el) {
|
|
return (Array.isArray(el) ? el : [el]).filter(e => !!e);
|
|
}
|
|
function getRotateFix(swiper) {
|
|
return v => {
|
|
if (Math.abs(v) > 0 && swiper.browser && swiper.browser.need3dFix && Math.abs(v) % 90 === 0) {
|
|
return v + 0.001;
|
|
}
|
|
return v;
|
|
};
|
|
}
|
|
function setInnerHTML(el, html) {
|
|
if (html === void 0) {
|
|
html = '';
|
|
}
|
|
if (typeof trustedTypes !== 'undefined') {
|
|
el.innerHTML = trustedTypes.createPolicy('html', {
|
|
createHTML: s => s
|
|
}).createHTML(html);
|
|
} else {
|
|
el.innerHTML = html;
|
|
}
|
|
}
|
|
|
|
export { setCSSProperty as a, elementParents as b, createElement as c, elementOffset as d, elementChildren as e, now as f, getSlideTransformEl as g, elementOuterSize as h, elementIndex as i, classesToTokens as j, getTranslate as k, elementTransitionEnd as l, makeElementsArray as m, nextTick as n, isObject as o, getRotateFix as p, elementStyle as q, elementNextAll as r, setInnerHTML as s, elementPrevAll as t, animateCSSModeScroll as u, showWarning as v, elementIsChildOf as w, extend as x, deleteProps as y };
|