Files
networkSetup/.claude/rules/tauri-ipc.md
T
jychoi4andClaude Opus 5.5 905e6d4eaa chore: add Claude Code guidelines, rules and skills
- CLAUDE.md: product principles, crate layering, common commands, commits.
- .claude/rules: common, Rust, frontend, Tauri IPC, docs and security rules.
- .claude/skills: check, add-tauri-command, project-model-change,
  change-record, msix-integration-test, backlog-status.

Refs #16

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 11:09:05 +09:00

2.5 KiB

paths
paths
src/apps/desktop/src-tauri/**
src/apps/desktop/src/main.ts

Tauri IPC · 권한 규칙

데스크톱은 셸·임의 경로 파일시스템 플러그인을 쓰지 않는다. 모든 파일 접근은 Rust 명령이 열어 둔 현재 프로젝트 세션과 rfd 파일 대화상자를 통해서만 한다.

명령 작성

  • 시그니처는 Result<T, String>. 내부 오류는 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 <snake_name> 추가.
  2. tauri::generate_handler![...]에 등록.
  3. cargo build -p msix-studio가 permissions/autogenerated/<snake_name>.toml을 생성한다. 이 파일은 직접 편집하지 않는다.
  4. capabilities/main.json의 permissions에 "allow-<kebab-name>" 추가. 이 단계를 빠뜨리면 런타임에 "not allowed" 오류가 난다.
  5. main.ts에 반환 타입을 선언하고 invoke<T>('<snake_name>', { ... }) 호출.
  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)에는 최근 목록만 저장한다. 프로젝트 내용·인증서·토큰을 저장하지 않는다.