Skip to content

[P0-0] npx 데이터 손실 위험을 긴급 차단한다 #57

Description

@jsleemaster

문제

npm 1.3.1 installer는 install --forceuninstall에서 .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 완료 조건

  • install --force, uninstall, uninstall --force가 marked/markerless fixture를 byte-for-byte 보존한다.
  • --dry-run이 전체 tree를 변경하지 않는다.
  • 위험 명령은 비정상 종료하고 안전한 수동 복구 절차를 출력한다.
  • 새 target의 일반 install은 기존처럼 동작한다.
  • Node 18/20/24에서 npm run validate가 통과한다.
  • Source fix PR #58이 main에 병합되고 main CI가 통과한다.

Registry 완료 조건

  • Release PR #65에서 Node 18/20/24 validation, git diff --check, npm pack --dry-run, 독립 리뷰가 통과한다.
  • PR #65가 main에 squash merge되고 main CI가 통과한다.
  • current Claude Code/Codex CLI install path를 격리 환경에서 main 1.3.2로 재검증한다.
  • npm에 gooblin@1.3.2를 publish한다.
  • npm view gooblin name version dist-tags --json1.3.2latest: 1.3.2를 반환한다.
  • npx --yes gooblin --version1.3.2를 반환한다.
  • registry 설치본으로 fresh install과 세 파괴적 명령의 full-tree 보존을 재검증한다.
  • immutable v1.3.2 tag/release가 실제 publish source commit을 가리킨다.
  • post-publish 문서가 실제 명령·날짜·결과를 기록한다.

현재 차단 조건 — 2026-07-13

  • filesystem과 registry 네트워크 차단은 해소됐다.
  • Claude Code 2.1.96과 Codex CLI 0.144.1의 격리된 GitHub main 설치 검증을 완료했고 PR #66에 기록했다.
  • npm 계정 jsleemaster의 기존 CLI 인증은 만료되어 npm whoamiE401을 반환한다.
  • 새 npm 웹 로그인은 계정 이메일 OTP를 요구하지만 아직 해당 메일이 도착하지 않았다.
  • 따라서 publish는 실행하지 않았고, OTP 인증 완료 후 publish → live registry/npx 보존 검증 순서로만 재개한다.

증거

인증 차단 해소 경로 — 2026-07-16

CLI 인증 재시도 결과 npm whoami는 여전히 E401이고 registry latest1.3.1이다. 장기 토큰이나 이메일 OTP를 계속 기다리는 대신, #55의 최소 공급망 범위를 이 이슈로 앞당긴다.

  • .github/workflows/publish-npm.yml이 GitHub-hosted runner, Node 24, npm 11.5.1 이상, id-token: write, contents: read만 사용한다.
  • workflow는 main의 정확한 source commit과 package.json version을 검증하고 npm run validate, git diff --check, npm pack --dry-run 뒤에만 publish한다.
  • npmjs.com trusted publisher를 jsleemaster/gooblin, publish-npm.yml, environment npm-release, action npm publish로 제한한다.
  • publish workflow에는 장기 NPM_TOKEN을 두지 않으며 public repository/package provenance가 생성되는지 확인한다.
  • npm UI 인증 또는 trusted-publisher 연결이 불가능하면 publish 성공을 주장하지 않고 이 이슈를 열린 상태로 유지한다.
  • publish 후 기존 Registry 완료 조건을 순서대로 재검증한다.

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를 공개한다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions