문제
npm 1.3.1 installer는 install --force와 uninstall에서 .gooblin/ 전체를 재귀 삭제한다. marker가 있어도 설치 뒤 사용자가 추가하거나 수정한 파일의 소유권은 알 수 없으므로 자동 삭제는 데이터 손실 위험이 있다.
목표
ownership manifest 기반 installer v2가 준비되기 전까지 파괴적 경로를 보수적으로 차단하고, 수정된 버전을 npm registry까지 전달한다.
긴급 패치 범위
- 기존
.gooblin/이 있으면 install --force도 자동 삭제·교체하지 않고 실패
uninstall은 자동 재귀 삭제하지 않고 백업 후 수동 검토 경로를 안내
--dry-run은 파일을 0개 변경
- runtime 행동 테스트로 전체 fixture tree의 path와 byte hash 보존 검증
- Node 지원 범위와 npm tarball payload 검증
- 고정된 새 패치 버전을 publish하고 실제 registry 경로 재검증
제외
- manifest/hash 기반 소유권 추적
- 자동 update/migration
- host activation 구조 변경
위 항목은 후속 #49에서 처리한다.
Source 완료 조건
Registry 완료 조건
현재 차단 조건 — 2026-07-13
- filesystem과 registry 네트워크 차단은 해소됐다.
- Claude Code
2.1.96과 Codex CLI 0.144.1의 격리된 GitHub main 설치 검증을 완료했고 PR #66에 기록했다.
- npm 계정
jsleemaster의 기존 CLI 인증은 만료되어 npm whoami가 E401을 반환한다.
- 새 npm 웹 로그인은 계정 이메일 OTP를 요구하지만 아직 해당 메일이 도착하지 않았다.
- 따라서 publish는 실행하지 않았고, OTP 인증 완료 후 publish → live registry/npx 보존 검증 순서로만 재개한다.
증거
인증 차단 해소 경로 — 2026-07-16
CLI 인증 재시도 결과 npm whoami는 여전히 E401이고 registry latest는 1.3.1이다. 장기 토큰이나 이메일 OTP를 계속 기다리는 대신, #55의 최소 공급망 범위를 이 이슈로 앞당긴다.
Publish source SHA 보정
- OIDC workflow를 추가한 PR의 merge SHA를 최종 publish source
S로 사용한다.
- 기존
d3ab29c2... prepublish 결과는 역사적 증거로 남기되, S에서 validation과 tarball review를 다시 수행하고 새 shasum을 기록한다.
- tag-push 기반 publish는 tag-first 순서를 강제하므로 이번 릴리스는
workflow_dispatch로 publish한다.
- repository release immutability를 먼저 활성화한 뒤
v1.3.2 draft release/tag를 S에 만들고, 검증한 동일 .tgz와 checksum을 첨부한다. 그 tarball을 OIDC로 npm에 publish하고 registry version, integrity, provenance, npx safety를 검증한 뒤에만 draft release를 공개한다.
문제
npm 1.3.1 installer는
install --force와uninstall에서.gooblin/전체를 재귀 삭제한다. marker가 있어도 설치 뒤 사용자가 추가하거나 수정한 파일의 소유권은 알 수 없으므로 자동 삭제는 데이터 손실 위험이 있다.목표
ownership manifest 기반 installer v2가 준비되기 전까지 파괴적 경로를 보수적으로 차단하고, 수정된 버전을 npm registry까지 전달한다.
긴급 패치 범위
.gooblin/이 있으면install --force도 자동 삭제·교체하지 않고 실패uninstall은 자동 재귀 삭제하지 않고 백업 후 수동 검토 경로를 안내--dry-run은 파일을 0개 변경제외
위 항목은 후속 #49에서 처리한다.
Source 완료 조건
install --force,uninstall,uninstall --force가 marked/markerless fixture를 byte-for-byte 보존한다.--dry-run이 전체 tree를 변경하지 않는다.install은 기존처럼 동작한다.npm run validate가 통과한다.Registry 완료 조건
git diff --check,npm pack --dry-run, 독립 리뷰가 통과한다.gooblin@1.3.2를 publish한다.npm view gooblin name version dist-tags --json이1.3.2와latest: 1.3.2를 반환한다.npx --yes gooblin --version이1.3.2를 반환한다.v1.3.2tag/release가 실제 publish source commit을 가리킨다.현재 차단 조건 — 2026-07-13
2.1.96과 Codex CLI0.144.1의 격리된 GitHubmain설치 검증을 완료했고 PR #66에 기록했다.jsleemaster의 기존 CLI 인증은 만료되어npm whoami가E401을 반환한다.증거
553adf31d48daf6449dd57ca94ac4a1df32e2499d3ab29c2b4d7a71bd60268d9eab751e378cfd66bgooblin@1.3.2, 88 files, shasum305b7f4c85c582e38655bbaa7f5b5b420b3e10e0인증 차단 해소 경로 — 2026-07-16
CLI 인증 재시도 결과
npm whoami는 여전히E401이고 registrylatest는1.3.1이다. 장기 토큰이나 이메일 OTP를 계속 기다리는 대신, #55의 최소 공급망 범위를 이 이슈로 앞당긴다..github/workflows/publish-npm.yml이 GitHub-hosted runner, Node 24, npm 11.5.1 이상,id-token: write,contents: read만 사용한다.main의 정확한 source commit과package.jsonversion을 검증하고npm run validate,git diff --check,npm pack --dry-run뒤에만 publish한다.jsleemaster/gooblin,publish-npm.yml, environmentnpm-release, actionnpm publish로 제한한다.NPM_TOKEN을 두지 않으며 public repository/package provenance가 생성되는지 확인한다.Publish source SHA 보정
S로 사용한다.d3ab29c2...prepublish 결과는 역사적 증거로 남기되,S에서 validation과 tarball review를 다시 수행하고 새 shasum을 기록한다.workflow_dispatch로 publish한다.v1.3.2draft release/tag를S에 만들고, 검증한 동일.tgz와 checksum을 첨부한다. 그 tarball을 OIDC로 npm에 publish하고 registry version, integrity, provenance, npx safety를 검증한 뒤에만 draft release를 공개한다.