@algocare/react-native-code-push 12.6.3 → 12.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/release.md +78 -0
- package/.claude/skills/npm-release/SKILL.md +89 -0
- package/CLAUDE.md +83 -0
- package/package.json +2 -2
- package/scripts/release.sh +86 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# npm 배포
|
|
2
|
+
|
|
3
|
+
인자: $ARGUMENTS (patch, minor, major 중 하나. 기본값: patch)
|
|
4
|
+
|
|
5
|
+
아래 단계를 순서대로 실행하세요. 각 단계 완료 후 다음 단계로 넘어가세요.
|
|
6
|
+
|
|
7
|
+
## 1단계: 사전 검증
|
|
8
|
+
|
|
9
|
+
다음을 모두 확인하세요:
|
|
10
|
+
- `git status`: working tree가 clean한지
|
|
11
|
+
- `git branch --show-current`: master 브랜치인지
|
|
12
|
+
- `npm whoami`: npm 로그인 상태인지
|
|
13
|
+
|
|
14
|
+
로그인이 안 되어 있으면 사용자에게 안내:
|
|
15
|
+
```
|
|
16
|
+
npm 로그인이 필요합니다.
|
|
17
|
+
계정 정보: https://www.notion.so/algocare/npm-1d59954bcc7b8056b6b6c84612592266
|
|
18
|
+
터미널에서 실행: npm login --scope=@algocare
|
|
19
|
+
```
|
|
20
|
+
로그인 완료 후 다시 확인하세요.
|
|
21
|
+
|
|
22
|
+
검증 실패 시 해당 문제를 안내하고 중단하세요.
|
|
23
|
+
|
|
24
|
+
## 2단계: 버전 bump + commit + tag
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm version $ARGUMENTS --no-git-tag-version
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
package.json만 변경됩니다. 이후:
|
|
31
|
+
```bash
|
|
32
|
+
git add package.json package-lock.json
|
|
33
|
+
git commit -m "v{새버전}"
|
|
34
|
+
git tag "v{새버전}"
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 3단계: npm publish (사용자 터미널 필요)
|
|
38
|
+
|
|
39
|
+
npm OTP 브라우저 인증이 필요하므로 Claude Code에서 직접 실행할 수 없습니다.
|
|
40
|
+
|
|
41
|
+
사용자에게 다음을 안내하세요:
|
|
42
|
+
```
|
|
43
|
+
터미널에서 실행해주세요:
|
|
44
|
+
npm publish --access public --ignore-scripts
|
|
45
|
+
|
|
46
|
+
브라우저 인증 완료 후 알려주세요.
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
사용자가 완료했다고 하면 배포 확인:
|
|
50
|
+
```bash
|
|
51
|
+
npm view @algocare/react-native-code-push version
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
배포된 버전이 새 버전과 일치하면 다음 단계로. 실패 시 복구 안내:
|
|
55
|
+
```
|
|
56
|
+
복구: git tag -d v{새버전} && git reset --soft HEAD~1 && git checkout package.json
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## 4단계: git push + GitHub Release
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
git push && git push --tags
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
이후 GitHub Release 생성:
|
|
66
|
+
```bash
|
|
67
|
+
PREV_TAG=$(git tag --sort=-v:refname | sed -n '2p')
|
|
68
|
+
# PREV_TAG..새태그 사이의 커밋으로 릴리스 노트 생성
|
|
69
|
+
gh release create "v{새버전}" --title "{새버전}" --notes "{릴리스노트}"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## 5단계: 완료 보고
|
|
73
|
+
|
|
74
|
+
배포 결과를 요약하세요:
|
|
75
|
+
- 패키지: @algocare/react-native-code-push@{새버전}
|
|
76
|
+
- npm: 배포 완료
|
|
77
|
+
- git: push 완료
|
|
78
|
+
- GitHub Release: 생성 완료
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: npm-release
|
|
3
|
+
description: Use when user asks to publish, release, or deploy an npm package. Triggers on "배포", "publish", "release", "npm 배포", "버전 올려". Guides step-by-step npm publish workflow with OTP browser auth handoff.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# npm Release
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
npm 패키지 배포를 단계별로 수행한다. OTP 브라우저 인증이 필요한 `npm publish`는 사용자 터미널로 넘기고, 나머지는 자동 처리한다.
|
|
11
|
+
|
|
12
|
+
## When to Use
|
|
13
|
+
|
|
14
|
+
- 사용자가 "배포해줘", "publish 해줘", "npm 배포", "버전 올려줘", "release 해줘" 등 요청
|
|
15
|
+
- 프로젝트에 package.json이 있고 npm 배포가 필요한 경우
|
|
16
|
+
|
|
17
|
+
## When NOT to Use
|
|
18
|
+
|
|
19
|
+
- CodePush 번들 배포 (code-push CLI 사용)
|
|
20
|
+
- 앱스토어 배포
|
|
21
|
+
|
|
22
|
+
## Workflow
|
|
23
|
+
|
|
24
|
+
### 1. 사전 검증
|
|
25
|
+
|
|
26
|
+
모두 확인:
|
|
27
|
+
- `git status`: clean working tree
|
|
28
|
+
- `git branch --show-current`: 기본 브랜치 (master/main)
|
|
29
|
+
- `npm whoami`: npm 로그인 상태
|
|
30
|
+
|
|
31
|
+
로그인 안 됨 → 안내:
|
|
32
|
+
```
|
|
33
|
+
npm 로그인이 필요합니다.
|
|
34
|
+
터미널에서 실행: npm login
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
프로젝트에 release 스크립트나 `/release` 커맨드가 있으면 그것의 로그인 안내를 따른다.
|
|
38
|
+
|
|
39
|
+
### 2. 버전 bump + commit + tag
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
VERSION_TYPE=patch # 사용자 지정 시 minor/major
|
|
43
|
+
npm version $VERSION_TYPE --no-git-tag-version
|
|
44
|
+
git add package.json package-lock.json
|
|
45
|
+
git commit -m "v{새버전}"
|
|
46
|
+
git tag "v{새버전}"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 3. npm publish (사용자 핸드오프)
|
|
50
|
+
|
|
51
|
+
**Claude Code에서 직접 실행 불가 (OTP 브라우저 인증 필요)**
|
|
52
|
+
|
|
53
|
+
사용자에게 안내:
|
|
54
|
+
```
|
|
55
|
+
터미널에서 실행해주세요:
|
|
56
|
+
npm publish --access public --ignore-scripts
|
|
57
|
+
|
|
58
|
+
브라우저 인증 완료 후 알려주세요.
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
사용자 완료 후 확인:
|
|
62
|
+
```bash
|
|
63
|
+
npm view {패키지명} version
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
실패 시 복구 안내:
|
|
67
|
+
```
|
|
68
|
+
복구: git tag -d v{새버전} && git reset --soft HEAD~1 && git checkout package.json
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 4. git push + GitHub Release
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
git push && git push --tags
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
GitHub Release 생성 (이전 태그 이후 커밋 기반 노트).
|
|
78
|
+
|
|
79
|
+
### 5. 완료 보고
|
|
80
|
+
|
|
81
|
+
패키지명, 버전, npm/git/GitHub Release 상태 요약.
|
|
82
|
+
|
|
83
|
+
## Common Mistakes
|
|
84
|
+
|
|
85
|
+
| 실수 | 해결 |
|
|
86
|
+
|------|------|
|
|
87
|
+
| Claude Code에서 npm publish 직접 실행 | OTP URL이 마스킹됨. 반드시 사용자 터미널로 넘길 것 |
|
|
88
|
+
| package.json에 `"publish"` lifecycle script | `--ignore-scripts`로 재귀 호출 방지 |
|
|
89
|
+
| publish 에러 코드만 보고 실패 판정 | `npm view`로 실제 배포 여부 재확인 |
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Microsoft react-native-code-push의 알고케어 포크. AWS S3/CDN 기반 자체 CodePush 배포 시스템으로, 네이티브 모듈(iOS/Android)이 런타임에 JS 번들 업데이트를 확인·다운로드·설치하고, CLI가 번들 생성·업로드·히스토리 관리를 담당한다.
|
|
8
|
+
|
|
9
|
+
## Commands
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# 테스트
|
|
13
|
+
npm run jest # versioning 단위 테스트 (Jest)
|
|
14
|
+
npm test # 전체 테스트 (빌드 → 셋업 → 실행)
|
|
15
|
+
npm run test:ios # iOS 통합 테스트
|
|
16
|
+
npm run test:android # Android 통합 테스트
|
|
17
|
+
|
|
18
|
+
# 린트
|
|
19
|
+
npm run eslint # ESLint (eslint.config.mjs, 플랫 설정)
|
|
20
|
+
npm run tslint # TSLint (test/ 디렉토리)
|
|
21
|
+
|
|
22
|
+
# 빌드
|
|
23
|
+
npm run build:tests # tsc로 테스트 빌드
|
|
24
|
+
|
|
25
|
+
# npm 배포 — `/release` 커맨드 또는 "배포해줘"로 실행
|
|
26
|
+
# 상세 워크플로우: .claude/commands/release.md 참조
|
|
27
|
+
npm run release # patch (기본)
|
|
28
|
+
npm run release -- minor # minor
|
|
29
|
+
npm run release -- major # major
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Architecture
|
|
33
|
+
|
|
34
|
+
### JS ↔ Native 브릿지
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
CodePush.js (진입점, sync/checkForUpdate/HOC)
|
|
38
|
+
└─ package-mixins.js (remote.download, local.install)
|
|
39
|
+
└─ NativeCodePush (RCT_EXPORT_METHOD)
|
|
40
|
+
├─ iOS: CodePush.m → CodePushPackage.m → CodePushDownloadHandler.m
|
|
41
|
+
└─ Android: CodePushNativeModule.java → CodePushUpdateManager.java
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
- `CodePush.js`: `sync()`, `checkForUpdate()`, SyncStatus/InstallMode 상수, React HOC (`codePush()`)
|
|
45
|
+
- `package-mixins.js`: 네이티브 이벤트(`CodePushDownloadProgress`, `CodePushDownloadComplete`) 구독하여 다운로드 진행률 전달
|
|
46
|
+
- 네이티브 모듈은 `RCT_EXPORT_METHOD`로 JS에 노출, `NativeEventEmitter`로 이벤트 전달
|
|
47
|
+
|
|
48
|
+
### 업데이트 흐름
|
|
49
|
+
|
|
50
|
+
1. `checkForUpdate()` → `releaseHistoryFetcher`로 릴리스 히스토리 JSON 조회
|
|
51
|
+
2. `versioning/` 모듈이 버전 비교·필수 업데이트·롤백 판단 (`SemverVersioning` 기본)
|
|
52
|
+
3. `remotePackage.download()` → 네이티브 다운로드 → unzip → `LocalPackage` 반환
|
|
53
|
+
4. `localPackage.install(installMode)` → InstallMode에 따라 즉시/다음 재시작 시 적용
|
|
54
|
+
|
|
55
|
+
### CLI (`cli/index.js`, `code-push` 명령)
|
|
56
|
+
|
|
57
|
+
주요 명령: `bundle`, `release`, `create-history`, `update-history`, `show-history`, `get-package-hash`
|
|
58
|
+
|
|
59
|
+
`code-push.config.ts`에서 앱별(user, device, b2c-device, home-device, home-mobile) S3 경로·CDN URL·환경(STG/PRD) 설정.
|
|
60
|
+
|
|
61
|
+
### 앱별 설정
|
|
62
|
+
|
|
63
|
+
| 앱 | 타입 | 플랫폼 | 환경변수 |
|
|
64
|
+
|---|---|---|---|
|
|
65
|
+
| user | B2B | iOS/Android | Infisical |
|
|
66
|
+
| device | B2B | Android | Infisical |
|
|
67
|
+
| b2c-device | B2C MVP | Android | Infisical |
|
|
68
|
+
| home-device | B2C Home | Android | .env |
|
|
69
|
+
| home-mobile | B2C Home | iOS/Android | .env |
|
|
70
|
+
|
|
71
|
+
### Versioning (`versioning/`)
|
|
72
|
+
|
|
73
|
+
- `BaseVersioning.js` - 릴리스 히스토리 정렬/필터/롤백 로직 (추상)
|
|
74
|
+
- `SemverVersioning.js` - Semver 기반 (기본값)
|
|
75
|
+
- `IncrementalVersioning.js` - 증분 버전 관리
|
|
76
|
+
|
|
77
|
+
## Key Conventions
|
|
78
|
+
|
|
79
|
+
- 패키지: `@algocare/react-native-code-push` (npm scoped, public)
|
|
80
|
+
- iOS 네이티브: Objective-C, `NSURLSession` 기반 다운로드, `SSZipArchive`로 unzip
|
|
81
|
+
- Android 네이티브: Java, `com.microsoft.codepush.react` 패키지
|
|
82
|
+
- TypeScript 타입: `typings/react-native-code-push.d.ts`
|
|
83
|
+
- CocoaPods: `CodePush.podspec`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@algocare/react-native-code-push",
|
|
3
|
-
"version": "12.6.
|
|
3
|
+
"version": "12.6.4",
|
|
4
4
|
"description": "React Native plugin for the CodePush service",
|
|
5
5
|
"main": "CodePush.js",
|
|
6
6
|
"typings": "typings/react-native-code-push.d.ts",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"test:debugger:android": "mocha --recursive --inspect-brk=0.0.0.0 bin/test --android",
|
|
33
33
|
"test:debugger:ios": "mocha --recursive --inspect-brk=0.0.0.0 bin/test --ios",
|
|
34
34
|
"tslint": "tslint -c tslint.json test/**/*.ts",
|
|
35
|
-
"
|
|
35
|
+
"release": "bash scripts/release.sh",
|
|
36
36
|
"eslint": "eslint --quiet .",
|
|
37
37
|
"jest": "jest versioning/*"
|
|
38
38
|
},
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# npm 배포 + GitHub Release 자동화
|
|
5
|
+
# 사용법: npm run release [-- patch|minor|major]
|
|
6
|
+
|
|
7
|
+
VERSION_TYPE="${1:-patch}"
|
|
8
|
+
VALID_TYPES=("patch" "minor" "major")
|
|
9
|
+
|
|
10
|
+
if [[ ! " ${VALID_TYPES[*]} " =~ " ${VERSION_TYPE} " ]]; then
|
|
11
|
+
echo "Error: Invalid version type '${VERSION_TYPE}'. Use: patch, minor, major"
|
|
12
|
+
exit 1
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
PACKAGE_NAME=$(node -p "require('./package.json').name")
|
|
16
|
+
|
|
17
|
+
# 1. npm 로그인 확인
|
|
18
|
+
if ! npm whoami &>/dev/null; then
|
|
19
|
+
echo "npm 로그인이 필요합니다."
|
|
20
|
+
echo "계정 정보: https://www.notion.so/algocare/npm-1d59954bcc7b8056b6b6c84612592266"
|
|
21
|
+
npm login --scope=@algocare
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
# 2. clean working tree 확인
|
|
25
|
+
if [[ -n "$(git status --porcelain)" ]]; then
|
|
26
|
+
echo "Error: Working tree is not clean. Commit or stash changes first."
|
|
27
|
+
exit 1
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
# 3. master 브랜치 확인
|
|
31
|
+
CURRENT_BRANCH=$(git branch --show-current)
|
|
32
|
+
if [[ "${CURRENT_BRANCH}" != "master" ]]; then
|
|
33
|
+
echo "Error: Must be on master branch. Current: ${CURRENT_BRANCH}"
|
|
34
|
+
exit 1
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
# 4. 버전 bump
|
|
38
|
+
NEW_VERSION=$(npm version "${VERSION_TYPE}" --no-git-tag-version)
|
|
39
|
+
echo "Bumped to ${NEW_VERSION}"
|
|
40
|
+
|
|
41
|
+
# 5. commit + tag
|
|
42
|
+
git add package.json
|
|
43
|
+
git commit -m "${NEW_VERSION}"
|
|
44
|
+
git tag "${NEW_VERSION}"
|
|
45
|
+
|
|
46
|
+
# 6. npm publish (OTP/브라우저 인증 시 에러 코드 반환 후 백그라운드에서 성공할 수 있음)
|
|
47
|
+
echo "Publishing to npm..."
|
|
48
|
+
if ! npm publish --access public --ignore-scripts; then
|
|
49
|
+
echo "npm publish가 에러를 반환했습니다. 실제 배포 여부 확인 중..."
|
|
50
|
+
sleep 3
|
|
51
|
+
PUBLISHED=$(npm view "${PACKAGE_NAME}@${NEW_VERSION}" version 2>/dev/null || true)
|
|
52
|
+
if [[ "${PUBLISHED}" == "${NEW_VERSION#v}" ]]; then
|
|
53
|
+
echo "확인 완료: ${NEW_VERSION} 이미 배포되어 있습니다. 계속 진행합니다."
|
|
54
|
+
else
|
|
55
|
+
echo "Error: npm publish 실패. 수동으로 확인해주세요."
|
|
56
|
+
echo "복구: git tag -d ${NEW_VERSION} && git reset --soft HEAD~1"
|
|
57
|
+
exit 1
|
|
58
|
+
fi
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
# 7. git push
|
|
62
|
+
if ! git push || ! git push --tags; then
|
|
63
|
+
echo "Error: git push 실패. npm에는 이미 배포됨."
|
|
64
|
+
echo "수동으로 push해주세요: git push && git push --tags"
|
|
65
|
+
exit 1
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
# 8. GitHub Release (최근 태그 이후 커밋 기반 노트 생성)
|
|
69
|
+
PREV_TAG=$(git tag --sort=-v:refname | sed -n '2p')
|
|
70
|
+
RELEASE_NOTES=""
|
|
71
|
+
|
|
72
|
+
if [[ -n "${PREV_TAG}" ]]; then
|
|
73
|
+
RELEASE_NOTES=$(git log "${PREV_TAG}..${NEW_VERSION}" --merges --pretty=format:"- %s" 2>/dev/null || true)
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
if [[ -z "${RELEASE_NOTES}" ]]; then
|
|
77
|
+
RELEASE_NOTES=$(git log "${PREV_TAG:-HEAD~5}..${NEW_VERSION}" --no-merges --pretty=format:"- %s" 2>/dev/null | head -20)
|
|
78
|
+
fi
|
|
79
|
+
|
|
80
|
+
if ! gh release create "${NEW_VERSION}" --title "${NEW_VERSION#v}" --notes "${RELEASE_NOTES}"; then
|
|
81
|
+
echo "Warning: GitHub Release 생성 실패. 수동으로 생성해주세요:"
|
|
82
|
+
echo " gh release create ${NEW_VERSION} --title \"${NEW_VERSION#v}\""
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
echo ""
|
|
86
|
+
echo "Done! ${NEW_VERSION} published and released."
|