--- paths: - "src/apps/desktop/src-tauri/**" - "src/apps/desktop/src/main.ts" --- # Tauri IPC · 권한 규칙 데스크톱은 셸·임의 경로 파일시스템 플러그인을 쓰지 않는다. 모든 파일 접근은 Rust 명령이 열어 둔 현재 프로젝트 세션과 `rfd` 파일 대화상자를 통해서만 한다. ## 명령 작성 - 시그니처는 `Result`. 내부 오류는 `error()` 헬퍼로 문자열화하고, 사용자가 다음에 할 일을 앞에 붙인다: `format!("최근 프로젝트를 열 수 없습니다. 파일 위치와 접근 권한을 확인하세요: {e}")`. - 세션을 바꾸는 명령(열기·새로 만들기·저장·닫기·소스/도구 선택)은 첫 줄에서 `idle(&session)?`로 빌드 중 변경을 막는다. - 파일 IO·해시·도구 실행은 `async fn` + `tauri::async_runtime::spawn_blocking`으로 UI 스레드를 막지 않는다. 짧은 메모리 작업만 동기 `fn`. - `Mutex` 잠금은 함수 범위를 넘기지 않는다. `document()`로 복제해 쓰고 `set_document()`로 돌려놓는다. - 빌드는 `session.busy`를 잡고 종료 시 반드시 풀어야 한다. 취소는 `session.cancel`을 세팅하고 자식 프로세스 종료를 기다린다. - 프런트엔드가 보낸 경로를 그대로 믿지 않는다. 명령 인자로는 ID(`plan_id`, `thumbprint`, `target`)나 선택지만 받고, 실제 경로는 세션 문서에서 가져온다. ## 권한 체크리스트 (명령 하나 추가 시) 1. `main.rs`에 `#[tauri::command] fn ` 추가. 2. `tauri::generate_handler![...]`에 등록. 3. `cargo build -p msix-studio`가 `permissions/autogenerated/.toml`을 생성한다. 이 파일은 직접 편집하지 않는다. 4. `capabilities/main.json`의 `permissions`에 `"allow-"` 추가. 이 단계를 빠뜨리면 런타임에 "not allowed" 오류가 난다. 5. `main.ts`에 반환 타입을 선언하고 `invoke('', { ... })` 호출. 6. `src/README.md`의 기능 설명 갱신. `core:*` 권한은 창 제어(`window-chrome.ts`)에 필요한 항목만 추가한다. `core:default`나 플러그인 전체 허용을 넣지 않는다. ## 설정 - `tauri.conf.json`의 `bundle.active`는 false를 유지한다. 제작기 자체 배포는 범위 밖이다. - `decorations: false`이므로 창 제어는 `window-chrome.ts`에 모은다. 새 창 권한은 거기서만 쓴다. - 앱 데이터 경로(`%APPDATA%\dev.networksetup.msixstudio`)에는 최근 목록만 저장한다. 프로젝트 내용·인증서·토큰을 저장하지 않는다.