- 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>
2.5 KiB
2.5 KiB
paths
| paths | ||
|---|---|---|
|
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)나 선택지만 받고, 실제 경로는 세션 문서에서 가져온다.
권한 체크리스트 (명령 하나 추가 시)
main.rs에#[tauri::command] fn <snake_name>추가.tauri::generate_handler![...]에 등록.cargo build -p msix-studio가permissions/autogenerated/<snake_name>.toml을 생성한다. 이 파일은 직접 편집하지 않는다.capabilities/main.json의permissions에"allow-<kebab-name>"추가. 이 단계를 빠뜨리면 런타임에 "not allowed" 오류가 난다.main.ts에 반환 타입을 선언하고invoke<T>('<snake_name>', { ... })호출.src/README.md의 기능 설명 갱신.
core:* 권한은 창 제어(window-chrome.ts)에 필요한 항목만 추가한다. core:default나 플러그인 전체 허용을 넣지 않는다.
설정
tauri.conf.json의bundle.active는 false를 유지한다. 제작기 자체 배포는 범위 밖이다.decorations: false이므로 창 제어는window-chrome.ts에 모은다. 새 창 권한은 거기서만 쓴다.- 앱 데이터 경로(
%APPDATA%\dev.networksetup.msixstudio)에는 최근 목록만 저장한다. 프로젝트 내용·인증서·토큰을 저장하지 않는다.