- 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>
3.3 KiB
3.3 KiB
name, description
| name | description |
|---|---|
| project-model-change | .isproj(JSON v2) 프로젝트 모델이나 local 설정 모델을 바꿀 때 package-domain DTO, 검증, manifest, JSON Schema 파일, TypeScript 타입, fixture·예제 파일, 설계 문서 13번을 빠짐없이 동기화한다. "필드 추가", "프로젝트 형식", "schema", "DTO 변경", "local.json 필드"에 사용한다. |
프로젝트 모델 변경
Project(.isproj)와 LocalConfig(.isproj.local.json)는 src/crates/package-domain/src/lib.rs에 정의되며 deny_unknown_fields로 엄격하게 읽는다. 호환 정책: 필드 추가는 #[serde(default)]로 기존 파일을 열 수 있게, 필드 제거는 자동 변환 없이 거부. schemaVersion은 2를 유지한다.
먼저 판단할 것
- 이 값이 공유 가능한 제품 설정(→
Project)인가, 이 PC에만 있는 경로·인증서(→LocalConfig)인가. 절대 경로, 지문, SDK 위치는 local로. - 비밀(개인 키, 비밀번호, 토큰)이면 어디에도 저장하지 않는다.
- 1차 MSIX 범위 밖(EXE, Store, bundle)이면 필드를 추가하지 않고 거부 오류를 유지한다.
동기화 체크리스트
- DTO —
lib.rs. 단순 구조체는model!, 기본값이 필요하면 직접 선언 +#[serde(default)].JsonSchemaderive 유지. - 검증 —
package_domain::validate()에check(valid, "Code", "field.path", "메시지")추가. 오류 코드는 PascalCase 한 단어. 의미 검증(경로 안전성·버전 형식·대상)도 여기. - manifest —
package_domain::manifest()가 영향을 받으면 XML 이스케이프를 거쳐 출력.inspect_manifest(infra)에서 역추출 검증도 추가. - 계획 고정 — 빌드 결과에 영향을 주는 값이면
Plan에 포함되어 자동 고정된다(project전체가 들어감). local 값이면Plan에 명시 필드 추가 +pack()전 재검사. - JSON Schema 파일 —
src/에서:
cargo run -q -p package-builder -- schema | Out-File -Encoding utf8 schemas/package-project.schema.json
생성 후 git diff schemas/로 의도한 변경만 있는지 확인한다. 줄 끝은 LF.
- TypeScript 타입 —
src/apps/desktop/src/main.ts의Project/Documenttype. 선택 필드는field?: T | null. - UI — 편집 가능한 값이면 해당 탭의
field()/select()추가. JSON 편집기만으로 다루는 값이면 README에 그렇게 적는다. - fixture·예제 —
src/fixtures/InstallerProject.isproj,docs/code-design/examples/msix.isproj,src/scripts/New-Fixtures.ps1,src/crates/package-infra/tests/workflow.rs의fixture().create_project()의 기본값도 확인. - 테스트 —
project_format.rs에 (a) 필드 없는 기존 파일이 열림, (b) 라운드트립 저장, (c) 잘못된 값 거부 세 가지. 제거한 필드는 "unknown field" 거부 테스트. - 문서 —
docs/code-design/13-isproj-project-format.md(형식),02-project-model.md(모델 표),src/README.md(사용자 절차).change-record스킬로 변경 기록. check스킬.
금지
#[serde(alias)]나 마이그레이션 코드로 옛 이름을 조용히 받아들이기.deny_unknown_fields제거.- 스키마 파일을 손으로 편집하기.
schemaVersion을 올리기(사용자 결정 필요).