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>
This commit is contained in:
1 parent
7f5540f148
commit
905e6d4eaa
13 files changed
+654
No files matched your search
@@ -0,0 +1,46 @@
|
||||
---
|
||||
name: add-tauri-command
|
||||
description: Installer Studio 데스크톱에 Tauri IPC 명령을 추가하거나 바꾼다. Rust 명령 작성, generate_handler 등록, 자동 생성 권한, capabilities/main.json 허용, TypeScript invoke 타입, README 갱신까지 한 번에 끝낸다. "명령 추가", "IPC", "프런트에서 호출", "capability", "not allowed 오류"에 사용한다.
|
||||
---
|
||||
|
||||
# Tauri 명령 추가
|
||||
|
||||
파일 위치: `src/apps/desktop/src-tauri/src/main.rs`, `src/apps/desktop/src-tauri/capabilities/main.json`, `src/apps/desktop/src/main.ts`.
|
||||
|
||||
## 설계 먼저 결정
|
||||
|
||||
- 비즈니스 로직은 `package-infra`에 함수로 두고 명령은 그 함수를 호출만 한다. CLI(`apps/cli/src/main.rs`)에서도 같은 함수를 쓸 수 있어야 한다.
|
||||
- 인자로 받을 것은 ID·선택지·사용자 입력값이다. 파일 경로를 프런트엔드에서 받지 않는다. 경로가 필요하면 `rfd` 대화상자 또는 세션 문서에서 얻는다.
|
||||
- 세션을 바꾸는가? → `idle(&session)?`를 첫 줄에.
|
||||
- 파일 IO·해시·외부 도구를 실행하는가? → `async fn` + `spawn_blocking`.
|
||||
- 반환 DTO가 새 타입이면 `#[derive(serde::Serialize)]` + `#[serde(rename_all = "camelCase")]`. 바이트 수는 문자열.
|
||||
|
||||
## 절차
|
||||
|
||||
1. **Rust 명령**
|
||||
|
||||
```rust
|
||||
#[tauri::command]
|
||||
async fn example_action(id: String, session: State<'_, Session>) -> Result<ExampleView, String> {
|
||||
idle(&session)?; // 세션을 바꾸는 경우만
|
||||
let doc = document(&session)?;
|
||||
tauri::async_runtime::spawn_blocking(move || infra::example(&doc, &id).map_err(error))
|
||||
.await
|
||||
.map_err(error)?
|
||||
}
|
||||
```
|
||||
|
||||
2. `main.rs` 하단 `tauri::generate_handler![ ... ]` 목록에 `example_action` 추가.
|
||||
3. `cargo build --locked -p msix-studio --features custom-protocol` 실행. `permissions/autogenerated/example_action.toml`이 생긴다. 이 파일은 수정하지 않는다.
|
||||
4. `capabilities/main.json`의 `permissions` 배열에 `"allow-example-action"` 추가(snake → kebab). 기존 순서를 따라 명령 그룹 근처에 넣는다.
|
||||
5. **TypeScript**: `main.ts`(또는 담당 모듈)에 반환 `type` 선언 후 `await invoke<ExampleView>('example_action', { id })`. 호출은 `action()` 분기 안에서 `busy` 보호를 받게 한다.
|
||||
6. 순수 로직이 생겼으면 별도 모듈로 빼고 `tests/<module>.test.mjs`에 테스트 추가.
|
||||
7. `src/README.md`에서 해당 화면·CLI 절을 갱신한다. 새 오류 코드가 있으면 적는다.
|
||||
8. `check` 스킬로 전체 검사.
|
||||
|
||||
## 자주 나는 오류
|
||||
|
||||
- 런타임 `example_action not allowed by ACL`: 4단계 누락.
|
||||
- `permissions/autogenerated`에 파일이 없음: 2단계 누락 또는 빌드 미실행.
|
||||
- TS에서 `undefined` 필드: Rust `snake_case` ↔ TS `camelCase` 불일치. `rename_all` 확인.
|
||||
- 빌드 중 명령이 실행됨: 1단계 `idle` 누락.
|
||||
@@ -0,0 +1,37 @@
|
||||
---
|
||||
name: backlog-status
|
||||
description: docs/backlog/README.md의 BL-xx 항목 상태(미착수·진행 중·검증 중·완료·차단)를 운영 규칙에 맞게 갱신하고 변경 기록·검증 증빙과 연결한다. 완료 기준이 모두 충족되지 않은 항목을 완료로 표시하지 않는다. "백로그 갱신", "BL-", "상태 변경", "마일스톤", "완료 처리"에 사용한다.
|
||||
---
|
||||
|
||||
# 백로그 상태 갱신
|
||||
|
||||
백로그는 `docs/backlog/README.md` 하나로 관리하며 Gitea 이슈를 만들지 않는다. 53개 ID는 유지하고 번호를 재사용·삭제하지 않는다.
|
||||
|
||||
## 상태 규칙 (운영 규칙 절 그대로)
|
||||
|
||||
| 상태 | 조건 |
|
||||
| --- | --- |
|
||||
| 미착수 | 기본값 |
|
||||
| 진행 중 | 코드·문서 작업 시작. 동시에 1개 항목만 |
|
||||
| 검증 중 | 구현은 끝났고 완료 기준의 검사가 남음 |
|
||||
| 완료 | 해당 행의 **완료 기준 전체**가 충족되고 증빙(변경 기록 + 검증 JSON)이 연결됨 |
|
||||
| 차단 | 원인·필요 자료·해제 조건을 같은 행에 기록 |
|
||||
|
||||
"일부 구현"은 상태가 아니다. 일부만 됐으면 `진행 중` 또는 `검증 중`으로 두고 `src/README.md`의 "현재 구현 범위" 문장에서 어떤 부분이 됐는지 적는다(현재 BL-09/10/11/14/16/29/47/48/49/50이 이 상태).
|
||||
|
||||
## 절차
|
||||
|
||||
1. 대상 행을 읽고 **완료 기준** 열을 항목별로 나눈다.
|
||||
2. 각 항목에 대해 증빙을 찾는다: 테스트 이름, 변경 기록 절, 검증 JSON의 check 키. 없는 항목은 미충족이다.
|
||||
3. 상태를 결정한다. 하나라도 미충족이면 완료가 아니다. Windows VM 설치·업데이트·제거 증빙이 요구되는 항목(BL-06, BL-53, MS6)은 VM 기록 없이는 완료가 될 수 없다.
|
||||
4. 행을 수정한다. 상태 뒤에 날짜와 링크를 괄호로 붙인다: `검증 중 (2026-10-23, [서명](../changes/2026-10-23-developer-signing.md))`.
|
||||
5. 선행 조건이 바뀌었으면 의존하는 행의 선행 조건 열도 확인한다. 1차 항목이 후속 항목에 의존하게 만들지 않는다.
|
||||
6. 마일스톤 영향이 있으면 `docs/plan/10-development-schedule.md`의 해당 MS 줄을 갱신한다. 날짜를 앞당기는 결정은 사용자 확인 사항이다.
|
||||
7. `src/README.md` 끝의 백로그 요약 문장을 맞춘다.
|
||||
|
||||
## 금지
|
||||
|
||||
- 시안·설계 문서 작성을 구현 증빙으로 인정.
|
||||
- 완료 기준 문구를 줄여서 완료로 만들기. 기준 변경은 별도 변경 기록과 사용자 승인이 필요하다.
|
||||
- P0/P1 우선순위를 상태 갱신과 함께 조용히 바꾸기.
|
||||
- 범위 이동(1차 ↔ 후속). 이는 `12-msix-first-builder.md`와 일정 문서를 함께 바꾸는 별도 결정이다.
|
||||
@@ -0,0 +1,75 @@
|
||||
---
|
||||
name: change-record
|
||||
description: 기능·정책 변경을 마친 뒤 docs/changes/YYYY-MM-DD-<slug>.md 변경 기록과 src/tests/verification-YYYY-MM-DD-<slug>.json 검증 기록을 저장소 관례대로 작성하고 README·백로그 링크를 연결한다. "변경 기록", "문서화해", "검증 기록", "changes 작성"에 사용한다.
|
||||
---
|
||||
|
||||
# 변경 기록 작성
|
||||
|
||||
기존 예: `docs/changes/2026-10-23-developer-signing.md`, `src/tests/verification-2026-10-23-developer-signing.json`. 먼저 가장 최근 기록 하나를 읽고 같은 어조와 구조를 따른다.
|
||||
|
||||
## 수집할 사실
|
||||
|
||||
기록을 쓰기 전에 실제로 확인한다. 기억이나 추정으로 채우지 않는다.
|
||||
|
||||
- `cargo test --locked --workspace` 통과 개수, `npm.cmd test` 통과 개수.
|
||||
- 실제 도구를 실행했다면 결과 JSON(`releases/<id>/release.json`, `signing-report.json`)의 `buildId`, `status`, `sha256`, `signing`, `installationTest`, `deploymentReady`.
|
||||
- 실행하지 않은 것: GUI 클릭 시험, Windows VM 설치, 대용량 샘플 재생성 등. 이것도 기록 대상이다.
|
||||
- 바뀐 오류 코드·CLI 옵션·종료 코드.
|
||||
|
||||
## 변경 기록 (`docs/changes/<date>-<slug>.md`)
|
||||
|
||||
```markdown
|
||||
# <기능 이름>
|
||||
|
||||
<YYYY-MM-DD>. <무엇을 어디에 추가/변경했는지 두 문장>. <이 변경이 의미하지 않는 것 한 문장>.
|
||||
|
||||
## 사용 ← 사용자 절차가 있으면. 정책 변경이면 "## 결정"
|
||||
1. ...
|
||||
|
||||
## 모델과 실행
|
||||
- 프로젝트: `field = a | b`; 기존 파일 기본값.
|
||||
- 로컬: ...
|
||||
- 계획: 무엇을 고정하고 언제 재검사하는지.
|
||||
- 빌드: 실행 순서.
|
||||
- 결과: 상태 문자열, 보고서 파일.
|
||||
- 범위 밖: 이번에 하지 않은 것.
|
||||
|
||||
## 확인 결과
|
||||
- Rust 테스트 N개 통과. 프런트엔드 테스트 N개 통과; TypeScript/Vite 빌드 통과.
|
||||
- <실제 도구 시험 결과: 상태, 해시 코드>
|
||||
- <실행하지 않은 검사>를 수행하지 않았다.
|
||||
|
||||
증빙: [시험 결과 JSON](../../src/tests/verification-<date>-<slug>.json)
|
||||
|
||||
## 근거
|
||||
- [Microsoft Learn 등 외부 문서](URL)
|
||||
```
|
||||
|
||||
## 검증 JSON (`src/tests/verification-<date>-<slug>.json`)
|
||||
|
||||
```json
|
||||
{
|
||||
"date": "YYYY-MM-DD",
|
||||
"checks": { "<camelCaseCheckName>": true },
|
||||
"builds": { "<label>": { "buildId": "", "status": "", "artifact": "", "sha256": "", "signing": "", "installationTest": "notRun", "deploymentReady": false } },
|
||||
"tests": { "cargoTestWorkspace": "passed (N)", "npmTest": "passed (N)", "makeAppxIntegration": "notRun" },
|
||||
"installationTest": "notRun",
|
||||
"notRun": ["guiClickTest", "windowsVmInstall"]
|
||||
}
|
||||
```
|
||||
|
||||
- 실제 도구를 돌리지 않았으면 `builds`를 생략하고 `notRun`에 적는다.
|
||||
- `checks` 값은 실제 확인한 것만 `true`. 확인하지 않은 항목은 넣지 않거나 `"notRun"`.
|
||||
- 로컬 절대 경로가 포함되면 사용자에게 공유 전 검토를 안내한다. 토큰·개인 키·PFX 비밀번호 금지.
|
||||
- LF 줄 끝, 2칸 들여쓰기, 끝 개행.
|
||||
|
||||
## 연결
|
||||
|
||||
1. 루트 `README.md`의 적절한 목록에 한 줄 추가(설계 문서면 "현재 설계와 시안", 그 외 "문서").
|
||||
2. `src/README.md`에서 바뀐 사용자 절차·CLI·오류 코드 절을 갱신하고 변경 기록으로 링크.
|
||||
3. 백로그 항목이 진척됐으면 `backlog-status` 스킬.
|
||||
4. 관련 설계 문서(`docs/code-design/NN-*.md`)에 결정 날짜와 한 단락을 추가. 설계 문서를 다시 쓰지 않는다.
|
||||
|
||||
## 어조
|
||||
|
||||
선언형 종결. 수식어 없이 사실만. "성공적으로", "완벽히", "안전하게" 같은 평가 단어 금지. 실행하지 않은 것을 숨기지 않는다.
|
||||
@@ -0,0 +1,56 @@
|
||||
---
|
||||
name: check
|
||||
description: Installer Studio 저장소의 전체 검사(fmt, clippy, Rust 테스트, 프런트엔드 테스트·빌드, 데스크톱 빌드)를 scripts/Check.ps1과 같은 순서로 실행하고 결과를 보고한다. 커밋 전, PR 전, "검사해", "테스트 돌려", "빌드 확인"에 사용한다.
|
||||
---
|
||||
|
||||
# 전체 검사
|
||||
|
||||
`src/scripts/Check.ps1`과 같은 순서를 따른다. 스크립트를 그대로 실행해도 되지만, 어느 단계에서 실패했는지 보고하려면 단계별로 실행한다. 모든 명령은 `D:\networkSetup\src`에서 실행한다.
|
||||
|
||||
## 사전 조건
|
||||
|
||||
1. 실행 중인 `vite`/`tauri dev`/`msix-studio.exe` 프로세스가 있으면 먼저 종료한다. `npm ci`가 esbuild 파일을 교체하지 못하고, debug 빌드가 실행 파일을 덮어쓰지 못한다.
|
||||
2. 변경 범위를 보고 빠른 모드와 전체 모드를 정한다.
|
||||
- Rust만 바뀜: 1~3단계 + 5단계.
|
||||
- 프런트엔드만 바뀜: 4단계.
|
||||
- `src-tauri`, 공용 DTO, IPC 계약이 바뀜: 전체.
|
||||
|
||||
## 단계
|
||||
|
||||
```powershell
|
||||
# 1. 포맷
|
||||
cargo fmt --all --check
|
||||
# 2. 린트 (경고도 실패)
|
||||
cargo clippy --locked --workspace --all-targets -- -D warnings
|
||||
# 3. Rust 단위·통합 테스트 (SDK 통합 테스트는 ignored)
|
||||
cargo test --locked --workspace
|
||||
# 4. 프런트엔드
|
||||
cd apps/desktop
|
||||
npm.cmd ci --no-audit --no-fund
|
||||
npm.cmd test
|
||||
npm.cmd run build
|
||||
cd ../..
|
||||
# 5. 데스크톱 실행 파일
|
||||
cargo build --locked -p msix-studio --features custom-protocol
|
||||
```
|
||||
|
||||
MakeAppx 통합 시험까지 요청받았으면 `msix-integration-test` 스킬을 따른다.
|
||||
|
||||
## 실패 처리
|
||||
|
||||
- `cargo fmt --check` 실패: `cargo fmt --all`을 실행해 고치고 다시 검사한다. 포맷 변경만 커밋 범위에 들어가게 한다.
|
||||
- clippy 경고: `#[allow]`로 덮지 않는다. 코드를 고친다. 정말 의도된 패턴이면 이유를 주석으로 적고 `allow`를 가장 좁은 범위에 붙인다.
|
||||
- 테스트 실패: 테스트를 약화시키지 않는다. 실패 출력 전문을 보고에 포함한다.
|
||||
- `--locked` 실패: `Cargo.lock`/`package-lock.json`이 변경돼야 한다는 뜻이다. 의존성을 의도적으로 바꾼 경우에만 잠금 파일 갱신을 커밋한다.
|
||||
|
||||
## 보고 형식
|
||||
|
||||
단계별로 통과/실패를 표로 적고, 실행하지 않은 단계는 "실행 안 함"으로 적는다. 실패한 단계는 오류 출력을 코드 블록으로 붙인다. "모두 통과"는 다섯 단계를 실제로 모두 실행했을 때만 쓴다.
|
||||
|
||||
| 단계 | 결과 |
|
||||
| --- | --- |
|
||||
| fmt | 통과 |
|
||||
| clippy | 통과 |
|
||||
| cargo test | 통과 (N개) |
|
||||
| npm test / build | 통과 (N개) |
|
||||
| msix-studio build | 실행 안 함 (프런트엔드만 변경) |
|
||||
@@ -0,0 +1,67 @@
|
||||
---
|
||||
name: msix-integration-test
|
||||
description: Windows SDK MakeAppx.exe를 찾아 MSIX_TEST_MAKEAPPX로 지정하고 package-infra의 ignored 통합 테스트(실제 pack/unpack, 계획 거부, 중복 빌드, 내보내기, 취소)를 실행한 뒤 결과를 해석·기록한다. 선택적으로 FixtureAlpha/Beta 시험 앱을 생성한다. "통합 테스트", "MakeAppx", "실제 빌드 시험", "SDK 테스트", "--ignored"에 사용한다.
|
||||
---
|
||||
|
||||
# MakeAppx 통합 시험
|
||||
|
||||
`cargo test --workspace`는 SDK 테스트를 건너뛴다. 실제 MSIX 생성 경로는 이 절차로만 검증된다. 이 시험은 **설치 시험이 아니다**. 결과를 "설치 검증"이라고 쓰지 않는다.
|
||||
|
||||
## 1. MakeAppx 찾기
|
||||
|
||||
```powershell
|
||||
Get-ChildItem 'C:\Program Files (x86)\Windows Kits\10\bin\*\x64\makeappx.exe' |
|
||||
Sort-Object FullName -Descending | Select-Object -First 1 -ExpandProperty FullName
|
||||
```
|
||||
|
||||
- 없으면 중단하고 사용자에게 Windows SDK 설치가 필요하다고 알린다. 자동 설치하지 않는다.
|
||||
- 여러 버전이 있으면 가장 높은 버전을 쓰되, 사용한 경로와 SHA-256을 기록한다:
|
||||
|
||||
```powershell
|
||||
(Get-FileHash -Algorithm SHA256 '<경로>').Hash.ToLower()
|
||||
```
|
||||
|
||||
- 서명 테스트는 같은 폴더의 `signtool.exe`를 자동으로 쓴다. 없으면 서명 관련 테스트가 실패하므로 결과 해석 시 구분한다.
|
||||
|
||||
## 2. 실행
|
||||
|
||||
`D:\networkSetup\src`에서. 실행 중인 `msix-studio.exe`/`tauri dev`는 종료한다.
|
||||
|
||||
```powershell
|
||||
$env:MSIX_TEST_MAKEAPPX = '<makeappx.exe 절대 경로>'
|
||||
cargo test --locked -p package-infra --test workflow -- --ignored --nocapture
|
||||
Remove-Item Env:MSIX_TEST_MAKEAPPX
|
||||
```
|
||||
|
||||
또는 전체 검사와 함께: `.\scripts\Check.ps1 -MakeAppx '<경로>'`.
|
||||
|
||||
시험 앱이 필요하면(GUI에서 열어 볼 fixture):
|
||||
|
||||
```powershell
|
||||
.\scripts\New-Fixtures.ps1 -MakeAppx '<경로>' # 기존 .work/demo 폴더는 덮어쓰지 않음
|
||||
```
|
||||
|
||||
## 3. 결과 해석
|
||||
|
||||
통합 테스트가 확인하는 것: 두 identity의 pack/unpack, 원본 변경 후 계획 거부(`InputChanged`), 같은 계획 중복 실행 거부, 내보내기 해시 무결성, 취소 시 자식 프로세스 종료.
|
||||
|
||||
| 증상 | 원인 |
|
||||
| --- | --- |
|
||||
| `MissingTool` | 경로 오타 또는 환경 변수 미설정 |
|
||||
| `UnsupportedTool` | 파일 이름이 `makeappx.exe`가 아님 |
|
||||
| `ToolFailed ... pack.log` | manifest 또는 자산 문제. 로그 파일 경로를 열어 MakeAppx 메시지를 읽는다 |
|
||||
| `ToolTimeout` | 15분 초과. 안티바이러스 실시간 검사 또는 디스크 문제 |
|
||||
| `IdentityMismatch`, `ArtifactMismatch` | 역추출 결과가 계획과 다름. 엔진 버그 가능성, 재현 후 보고 |
|
||||
| 서명 테스트만 실패 | `signtool.exe` 부재 또는 인증서 저장소 상태. 테스트 PC의 저장소를 바꾸지 않는다 |
|
||||
|
||||
## 4. 기록
|
||||
|
||||
- `change-record` 스킬의 검증 JSON에 `makeAppx: { path, sha256 }`, 통과한 테스트 이름, 실패/미실행 항목을 적는다.
|
||||
- `installationTest`는 `"notRun"`, `deploymentReady`는 `false`.
|
||||
- 생성된 샘플이 `output/samples/` 아래면 커밋되지 않는다. 다른 위치에 만들었으면 추적 여부를 확인한다.
|
||||
|
||||
## 금지
|
||||
|
||||
- `Install-TestCertificate.ps1` 실행, `Add-AppxPackage`, 인증서 저장소 변경.
|
||||
- 실패한 테스트를 `#[ignore]`로 바꾸거나 단언을 약화.
|
||||
- 결과를 "두 제품 MSIX 설치/업데이트/제거 검증 완료"(BL-53)로 기록.
|
||||
@@ -0,0 +1,42 @@
|
||||
---
|
||||
name: project-model-change
|
||||
description: .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)이면 필드를 추가하지 않고 거부 오류를 유지한다.
|
||||
|
||||
## 동기화 체크리스트
|
||||
|
||||
1. **DTO** — `lib.rs`. 단순 구조체는 `model!`, 기본값이 필요하면 직접 선언 + `#[serde(default)]`. `JsonSchema` derive 유지.
|
||||
2. **검증** — `package_domain::validate()`에 `check(valid, "Code", "field.path", "메시지")` 추가. 오류 코드는 PascalCase 한 단어. 의미 검증(경로 안전성·버전 형식·대상)도 여기.
|
||||
3. **manifest** — `package_domain::manifest()`가 영향을 받으면 XML 이스케이프를 거쳐 출력. `inspect_manifest`(infra)에서 역추출 검증도 추가.
|
||||
4. **계획 고정** — 빌드 결과에 영향을 주는 값이면 `Plan`에 포함되어 자동 고정된다(`project` 전체가 들어감). local 값이면 `Plan`에 명시 필드 추가 + `pack()` 전 재검사.
|
||||
5. **JSON Schema 파일** — `src/`에서:
|
||||
|
||||
```powershell
|
||||
cargo run -q -p package-builder -- schema | Out-File -Encoding utf8 schemas/package-project.schema.json
|
||||
```
|
||||
|
||||
생성 후 `git diff schemas/`로 의도한 변경만 있는지 확인한다. 줄 끝은 LF.
|
||||
|
||||
6. **TypeScript 타입** — `src/apps/desktop/src/main.ts`의 `Project`/`Document` type. 선택 필드는 `field?: T | null`.
|
||||
7. **UI** — 편집 가능한 값이면 해당 탭의 `field()`/`select()` 추가. JSON 편집기만으로 다루는 값이면 README에 그렇게 적는다.
|
||||
8. **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()`의 기본값도 확인.
|
||||
9. **테스트** — `project_format.rs`에 (a) 필드 없는 기존 파일이 열림, (b) 라운드트립 저장, (c) 잘못된 값 거부 세 가지. 제거한 필드는 "unknown field" 거부 테스트.
|
||||
10. **문서** — `docs/code-design/13-isproj-project-format.md`(형식), `02-project-model.md`(모델 표), `src/README.md`(사용자 절차). `change-record` 스킬로 변경 기록.
|
||||
11. `check` 스킬.
|
||||
|
||||
## 금지
|
||||
|
||||
- `#[serde(alias)]`나 마이그레이션 코드로 옛 이름을 조용히 받아들이기.
|
||||
- `deny_unknown_fields` 제거.
|
||||
- 스키마 파일을 손으로 편집하기.
|
||||
- `schemaVersion`을 올리기(사용자 결정 필요).
|
||||
Reference in new issue
Block a user