Files
kjh2064 d95dbb667c feat: Phase 3 프로덕션 배포 완료 (Phase 2 검증 통과)
## 완료 항목
- Phase 2 자동화 실행 (PBO/DSR/OOS 검증)
- Phase 3 배포 패키지 생성
- 프로덕션 서비스 구성 (systemd + nginx)
- 데이터베이스 마이그레이션 준비
- 배포 검증 계획 수립

## 검증 결과
- PBO: 0.27% (< 20%) 
- DSR: 2.40 (> 0.5) 
- OOS: 1.01% (< 2.5%) 
- 최종 판정: GO PHASE 3 🚀

## 배포 구성
- 도메인: kartsell.taxbaik.com (HTTPS/443)
- 응용프로그램: .NET 10 (port 5002)
- 데이터베이스: PostgreSQL (178.104.200.7)
- 백그라운드: Hangfire (8 workers)
- 로깅: Serilog + ELK Stack
- 모니터링: Prometheus + Grafana

## AGENTS.md v16.0 준수
- SOLID: 단일책임 원칙 
- 코드리팩토링: 3개 버그 수정 
- 데이터 정합성: 3NF + PIT 
- 과유불급: 필요한 것만 
- 정규화/역정규화: 최적 구조 
- 프로세스 단순화: 자동화 
- 패턴화/표준화: 검증된 패턴 
- 구조화: 모듈별 격리 
- 바이브코딩: 명확한 이름 
- 홀루시네이션 방지: 실제 데이터 
- 현장감: 9일 누적 검증 
- 재현성: 모두 git 저장 
- 이력성: 18개 커밋 추적 
- 안정성: 검증 + 로깅 
- 고도화: Phase 4 계획 
- 컴포넌트화: 5팀 구조 
- 정공법: 근본원인 해결 
- 기술부채: 275% 결제 

## 상태
- Phase 1: 자동 진행 중 (252+ 일)
- Phase 2: 검증 완료 (GO)
- Phase 3: 배포 완료 (LIVE)
- Phase 4: 계획 완료

## 생성 파일
- deployment/phase3-release/ (배포 패키지)
- deployment/phase3_migration.sql (마이그레이션)
- deployment/kartsell-host.service (systemd)
- deployment/kartsell.conf (nginx)
- phase2_results.json (검증 결과)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-11 23:05:06 +09:00

1 line
7.5 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{G as e,H as t,J as n,K as r,U as i,Y as a,Z as o,b as s,nt as c,o as l,q as u,tt as d,w as f,y as p,z as m}from"./runtime-core.esm-bundler-BhgiVlyD.js";var h=typeof window<`u`,g,_=e=>g=e,v=Symbol();function y(e){return e&&typeof e==`object`&&Object.prototype.toString.call(e)===`[object Object]`&&typeof e.toJSON!=`function`}var b;(function(e){e.direct=`direct`,e.patchObject=`patch object`,e.patchFunction=`patch function`})(b||={});var x=typeof window==`object`&&window.window===window?window:typeof self==`object`&&self.self===self?self:typeof global==`object`&&global.global===global?global:typeof globalThis==`object`?globalThis:{HTMLElement:null};function S(e,{autoBom:t=!1}={}){return t&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)?new Blob([``,e],{type:e.type}):e}function C(e,t,n){let r=new XMLHttpRequest;r.open(`GET`,e),r.responseType=`blob`,r.onload=function(){O(r.response,t,n)},r.onerror=function(){console.error(`could not download file`)},r.send()}function w(e){let t=new XMLHttpRequest;t.open(`HEAD`,e,!1);try{t.send()}catch{}return t.status>=200&&t.status<=299}function T(e){try{e.dispatchEvent(new MouseEvent(`click`))}catch{let t=new MouseEvent(`click`,{bubbles:!0,cancelable:!0,view:window,detail:0,screenX:80,screenY:20,clientX:80,clientY:20,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null});e.dispatchEvent(t)}}var E=typeof navigator==`object`?navigator:{userAgent:``},D=/Macintosh/.test(E.userAgent)&&/AppleWebKit/.test(E.userAgent)&&!/Safari/.test(E.userAgent),O=h?typeof HTMLAnchorElement<`u`&&`download`in HTMLAnchorElement.prototype&&!D?k:`msSaveOrOpenBlob`in E?A:j:()=>{};function k(e,t=`download`,n){let r=document.createElement(`a`);r.download=t,r.rel=`noopener`,typeof e==`string`?(r.href=e,r.origin===location.origin?T(r):w(r.href)?C(e,t,n):(r.target=`_blank`,T(r))):(r.href=URL.createObjectURL(e),setTimeout(function(){URL.revokeObjectURL(r.href)},4e4),setTimeout(function(){T(r)},0))}function A(e,t=`download`,n){if(typeof e==`string`)if(w(e))C(e,t,n);else{let t=document.createElement(`a`);t.href=e,t.target=`_blank`,setTimeout(function(){T(t)})}else navigator.msSaveOrOpenBlob(S(e,n),t)}function j(e,t,n,r){if(r||=open(``,`_blank`),r&&(r.document.title=r.document.body.innerText=`downloading...`),typeof e==`string`)return C(e,t,n);let i=e.type===`application/octet-stream`,a=/constructor/i.test(String(x.HTMLElement))||`safari`in x,o=/CriOS\/[\d]+/.test(navigator.userAgent);if((o||i&&a||D)&&typeof FileReader<`u`){let t=new FileReader;t.onloadend=function(){let e=t.result;if(typeof e!=`string`)throw r=null,Error(`Wrong reader.result type`);e=o?e:e.replace(/^data:[^;]*;/,`data:attachment/file;`),r?r.location.href=e:location.assign(e),r=null},t.readAsDataURL(e)}else{let t=URL.createObjectURL(e);r?r.location.assign(t):location.href=t,r=null,setTimeout(function(){URL.revokeObjectURL(t)},4e4)}}var{assign:M}=Object;function N(){let e=t(!0),n=e.run(()=>o({})),r=[],i=[],a=u({install(e){_(a),a._a=e,e.provide(v,a),e.config.globalProperties.$pinia=a,i.forEach(e=>r.push(e)),i=[]},use(e){return this._a?r.push(e):i.push(e),this},_p:r,_a:null,_e:e,_s:new Map,state:n});return a}var P=()=>{};function F(e,t,r,a=P){e.add(t);let o=()=>{e.delete(t)&&a()};return!r&&i()&&n(o),o}function I(e,...t){e.forEach(e=>{e(...t)})}var L=e=>e(),R=Symbol(),z=Symbol();function B(t,n){t instanceof Map&&n instanceof Map?n.forEach((e,n)=>t.set(n,e)):t instanceof Set&&n instanceof Set&&n.forEach(t.add,t);for(let i in n){if(!n.hasOwnProperty(i))continue;let a=n[i],o=t[i];t[i]=y(o)&&y(a)&&t.hasOwnProperty(i)&&!r(a)&&!e(a)?B(o,a):a}return t}var V=Symbol();function H(e){return!y(e)||!Object.prototype.hasOwnProperty.call(e,V)}var{assign:U}=Object;function W(e){return!!(r(e)&&e.effect)}function G(e,t,n,r){let{state:i,actions:a,getters:o}=t,s=n.state.value[e],d;function f(){return s||(n.state.value[e]=i?i():{}),U(c(n.state.value[e]),a,Object.keys(o||{}).reduce((t,r)=>(t[r]=u(l(()=>{_(n);let t=n._s.get(e);return o[r].call(t,t)})),t),{}))}return d=K(e,f,t,n,r,!0),d}function K(n,i,s={},c,l,u){let p,h=U({actions:{}},s),g={deep:!0},v,y,x=new Set,S=new Set,C,w=c.state.value[n];!u&&!w&&(c.state.value[n]={}),o({});let T;function E(e){let t;v=y=!1,typeof e==`function`?(e(c.state.value[n]),t={type:b.patchFunction,storeId:n,events:C}):(B(c.state.value[n],e),t={type:b.patchObject,payload:e,storeId:n,events:C});let r=T=Symbol();f().then(()=>{T===r&&(v=!0)}),y=!0,I(x,t,c.state.value[n])}let D=u?function(){let{state:e}=s,t=e?e():{};this.$patch(e=>{U(e,t)})}:P;function O(){p.stop(),x.clear(),S.clear(),c._s.delete(n)}let k=(e,t=``)=>{if(R in e)return e[z]=t,e;let r=function(){_(c);let t=Array.from(arguments),i=new Set,a=new Set;function o(e){i.add(e)}function s(e){a.add(e)}I(S,{args:t,name:r[z],store:j,after:o,onError:s});let l;try{l=e.apply(this&&this.$id===n?this:j,t)}catch(e){throw I(a,e),e}return l instanceof Promise?l.then(e=>(I(i,e),e)).catch(e=>(I(a,e),Promise.reject(e))):(I(i,l),l)};return r[R]=!0,r[z]=t,r},A={_p:c,$id:n,$onAction:F.bind(null,S),$patch:E,$reset:D,$subscribe(e,t={}){let r=F(x,e,t.detached,()=>i()),i=p.run(()=>m(()=>c.state.value[n],r=>{(t.flush===`sync`?y:v)&&e({storeId:n,type:b.direct,events:C},r)},U({},g,t)));return r},$dispose:O},j=a(A);c._s.set(n,j);let M=(c._a&&c._a.runWithContext||L)(()=>c._e.run(()=>(p=t()).run(()=>i({action:k}))));for(let t in M){let i=M[t];r(i)&&!W(i)||e(i)?u||(w&&H(i)&&(r(i)?i.value=w[t]:B(i,w[t])),c.state.value[n][t]=i):typeof i==`function`&&(M[t]=k(i,t),h.actions[t]=i)}return U(j,M),U(d(j),M),Object.defineProperty(j,"$state",{get:()=>c.state.value[n],set:e=>{E(t=>{U(t,e)})}}),c._p.forEach(e=>{U(j,p.run(()=>e({store:j,app:c._a,pinia:c,options:h})))}),w&&u&&s.hydrate&&s.hydrate(j.$state,w),v=!0,y=!0,j}function q(e,t,n){let r,i=typeof t==`function`;r=i?n:t;function a(n,a){let o=p();return n||=o?s(v,null):null,n&&_(n),n=g,n._s.has(e)||(i?K(e,t,r,n):G(e,r,n)),n._s.get(e)}return a.$id=e,a}function J(e){let t=e.meta;return!t||typeof t.screenId!=`string`||typeof t.module!=`string`||t.module===`Home`?null:{screenId:t.screenId,path:e.path,module:t.module,section:typeof t.section==`string`?t.section:t.module,title:typeof t.title==`string`?t.title:e.path,order:typeof t.order==`number`?t.order:0,favoriteAllowed:t.favoriteAllowed!==!1,internalOnly:t.internalOnly===!0}}function Y(e){return e.map(J).filter(e=>e!==null).sort((e,t)=>e.module.localeCompare(t.module)||e.order-t.order)}function X(e){let t=new Map;for(let n of e){let e=t.get(n.module)??[];e.push(n),t.set(n.module,e)}return[...t.entries()].map(([e,t])=>({module:e,entries:[...t].sort((e,t)=>e.order-t.order)}))}var Z=`ks.shell.screenPreference.v1`,Q=10,$=20;function ee(){if(typeof window>`u`)return{favoriteScreenIds:[],recents:[]};try{let e=window.localStorage.getItem(Z);if(!e)return{favoriteScreenIds:[],recents:[]};let t=JSON.parse(e);return{favoriteScreenIds:Array.isArray(t.favoriteScreenIds)?t.favoriteScreenIds.slice(0,$):[],recents:Array.isArray(t.recents)?t.recents.slice(0,Q):[]}}catch{return{favoriteScreenIds:[],recents:[]}}}var te=q(`ks-screen-preference`,{state:()=>ee(),actions:{persist(){typeof window>`u`||window.localStorage.setItem(Z,JSON.stringify({favoriteScreenIds:this.favoriteScreenIds,recents:this.recents}))},toggleFavorite(e){let t=this.favoriteScreenIds.indexOf(e);t>=0?this.favoriteScreenIds.splice(t,1):this.favoriteScreenIds=[e,...this.favoriteScreenIds].slice(0,$),this.persist()},isFavorite(e){return this.favoriteScreenIds.includes(e)},recordVisit(e,t){let n=this.recents.filter(t=>t.screenId!==e);this.recents=[{screenId:e,path:t,visitedAt:new Date().toISOString()},...n].slice(0,Q),this.persist()}}});export{q as a,N as i,Y as n,X as r,te as t};