Skip to content

Commit 5930a31

Browse files
committed
更新skill
1 parent 1288912 commit 5930a31

8 files changed

Lines changed: 943 additions & 0 deletions

File tree

.claude/skills/update-sdk/SKILL.md

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
---
2+
name: update-sdk
3+
description: |
4+
更新 jpush-react-native 插件的 JPush SDK 版本。自动拉取极光官网 Changelog,分析新增/移除/变更 API,更新 Android(Maven)、iOS(CocoaPods)版本引用,同步更新 Native 层(Java/ObjC)和 Bridge 层(JS/TS)代码,展示变更摘要确认后发布到 npm。
5+
Use when: 更新 JPush SDK、升级推送 SDK 版本、jpush-react-native 发布新版本、RN 插件 SDK 更新。
6+
allowed-tools:
7+
- Bash
8+
- Read
9+
- Edit
10+
- Write
11+
- WebFetch
12+
---
13+
14+
你正在更新 **jpush-react-native** 插件。
15+
16+
**用户参数:** $ARGUMENTS
17+
18+
---
19+
20+
## 第一步:解析参数
21+
22+
`$ARGUMENTS` 中提取版本号:
23+
- `--android X.X.X` → Android JPush SDK 目标版本
24+
- `--ios X.X.X` → iOS JPush SDK 目标版本
25+
26+
如果某端版本号缺失,先询问用户再继续。
27+
28+
---
29+
30+
## 第二步:安装依赖
31+
32+
```bash
33+
pip3 install requests beautifulsoup4 -q 2>&1 | tail -1
34+
```
35+
36+
---
37+
38+
## 第三步:拉取 SDK Changelog
39+
40+
```bash
41+
python3 .claude/skills/update-sdk/scripts/changelog_fetcher.py --android <ANDROID_VERSION> --ios <IOS_VERSION>
42+
```
43+
44+
读取 `.claude/skills/update-sdk/scripts/.changelog_cache.json` 获取 Changelog 内容。
45+
46+
---
47+
48+
## 第四步:AI 分析变更
49+
50+
基于 Changelog,分析并整理:
51+
52+
> **注意**:Changelog 同时包含 JPush 和 JCore 的变更。只关注调用类以 `JPush` 开头的条目,忽略类名以 `JCore` 开头的内容。
53+
54+
1. **新增 API**:同时存在于 Android 和 iOS 的功能 → 合并为一个插件统一 API;仅单端有的 → **先检查另一端是否已有等价实现**(见下方说明),确认缺失才标注平台注释(`// Android only` / `// iOS only`
55+
2. **移除/废弃 API**:确认是否需要从插件中删除或标记 `@deprecated`
56+
3. **行为变更**:影响现有封装逻辑的改动
57+
4. **新插件版本号**:始终升 patch(如 3.4.9 → 3.5.0,3.9.9 → 4.0.0)
58+
59+
> **跨平台等价检查**:当 Changelog 只在某一端出现新增 API 时,**不要直接标为单端 Only**。先读取另一端的 Native 文件(`android/src/.../JPushModule.java``ios/RCTJPushModule/RCTJPushModule.m`)和 Bridge 层(`index.js`),搜索功能相同或名称相近的方法。如果另一端已有对应实现,则合并为统一 API;只有确认另一端完全没有等价功能时,才标注 Android Only / iOS Only。
60+
61+
输出结构化变更计划后再执行后续步骤。
62+
63+
---
64+
65+
## 第五步:更新版本号引用
66+
67+
```bash
68+
python3 .claude/skills/update-sdk/scripts/plugin_updater.py \
69+
--android <ANDROID_VERSION> \
70+
--ios <IOS_VERSION> \
71+
--bump-patch \
72+
--changelog-summary "<ONE_LINE_SUMMARY>"
73+
```
74+
75+
---
76+
77+
## 第六步:更新 Native 层代码
78+
79+
**编写代码前,先通过 WebFetch 查询官网 API 文档,确认新增方法的完整签名、参数类型和返回值:**
80+
- Android 文档:`https://docs.jiguang.cn/jpush/client/Android/android_api`
81+
- iOS 文档:`https://docs.jiguang.cn/jpush/client/iOS/ios_api`
82+
83+
在文档中搜索第四步识别出的新增方法名,确认签名后再编写下方代码。
84+
85+
根据第四步的变更计划,编辑以下文件:
86+
87+
**Android**`android/src/main/java/cn/jiguang/plugins/push/JPushModule.java`
88+
- 为每个新增 API 添加对应的 `@ReactMethod` 方法,内部调用 `JPushInterface.newMethod()`
89+
90+
**iOS**`ios/RCTJPushModule/RCTJPushModule.m`
91+
- 为每个新增 API 添加对应的 `RCT_EXPORT_METHOD`
92+
93+
移除 API:若 SDK 已完全删除则移除封装方法,若仅废弃则保留并添加 `@deprecated` 注释。
94+
95+
---
96+
97+
## 第七步:更新 Bridge 层代码
98+
99+
**JavaScript**`index.js`
100+
- 为每个新增 API 添加对应的导出函数,调用 `NativeModules.JPushModule.newMethod()`
101+
102+
**TypeScript 类型**`index.d.ts`
103+
- 添加对应的函数类型声明
104+
105+
---
106+
107+
## 第八步:展示变更摘要并请求确认
108+
109+
```
110+
========== jpush-react-native 更新摘要 ==========
111+
Android JPush SDK: 旧版本 → 新版本
112+
iOS JPush SDK: 旧版本 → 新版本
113+
插件版本: 旧版本 → 新版本
114+
115+
新增 API:
116+
+ methodName(params) // 说明(双端统一)
117+
+ methodName() // iOS only
118+
119+
移除 API:
120+
- methodName()
121+
122+
行为变更:
123+
! 变更说明
124+
125+
修改的文件:
126+
- android/build.gradle
127+
- JPushRN.podspec
128+
- android/src/.../JPushModule.java
129+
- ios/RCTJPushModule/RCTJPushModule.m
130+
- index.js
131+
- index.d.ts
132+
- package.json
133+
- CHANGELOG.md
134+
==================================================
135+
136+
确认以上变更并发布到 npm? [y/N]
137+
```
138+
139+
---
140+
141+
## 第九步:发布(确认后执行)
142+
143+
用户输入 `y` 后:
144+
145+
```bash
146+
python3 .claude/skills/update-sdk/scripts/publisher.py
147+
```
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"android": "## JPush Android SDK v6.1.0\n### 更新时间\n\n+ 2026-04-27\n\n### Change Log\n\n+ 新增接口[setKeepLongConnInBackground](https://docs.jiguang.cn/jpush/client/Android/android_api#%E9%80%80%E5%90%8E%E5%8F%B0%E6%98%AF%E5%90%A6%E4%BF%9D%E6%8C%81%E6%9E%81%E5%85%89%E9%95%BF%E8%BF%9E%E6%8E%A5-api)\n + 应用退至后台是否保持极光长连接的配置接口\n+ 新增支持厂商 VOIP 能力支持\n + [JPushMessageReceiver 新增 onVoipMessage 回调](https://docs.jiguang.cn/jpush/client/Android/android_api#jpushmessagereceiver-%E5%9B%9E%E8%B0%83%E7%B1%BB)\n+ 更新厂商推送 SDK,各厂商推送 SDK 版本如下\n + 华为推送 SDK V6.13.0.301\n + 荣耀推送 SDK V10.0.13.305\n + 小米推送 SDK V7.9.2\n + OPPO 推送 SDK V3.9.8\n + VIVO 推送 SDK V4.1.3.0\n + 特别注意,JPush Android SDK v5.2.0及其以上版本,请关注 vivo 通道集成指南 更新。\n + 魅族推送 SDK V5.0.5\n + 特别注意,JPush Android SDK v5.2.2及其以上版本,请关注 魅族 通道集成指南 更新。\n + FCM 推送 SDK V24.1.2\n + 蔚来 SDK 从此次版本开始不再支持,具体参考[蔚来通道 Push 自动切换至极光通道通知](https://community.jiguang.cn/notice/232)\n+ 修复已知问题\n\n### 升级提示\n\n+ 必须配合 JCore Android SDK v5.4.0 及以上版本使用\n+ JPush Android SDK v5.9.0 及其以上版本,各厂商 mavenCentral 集成方式优化\n + 依赖包会自动集成,无需再手动添加jar和aar,具体参考极光[厂商通道集成指南](https://docs.jiguang.cn/jpush/client/Android/android_3rd_guide)\n+ JPush Android SDK v5.2.0 及其以上版本升级到 JPush Android SDK v5.4.0 及其以上版本时,需要将消息回调方式从 JPushMessageService 改为 JPushMessageReceiver\n + 详情请查看极光文档:[Android SDK 集成指南](https://docs.jiguang.cn/jpush/client/Android/android_guide)",
3+
"ios": "## JPush iOS SDK v6.1.0\n### 更新时间\n+ 2026-04-27\n\n### Change Log\n+ 修复已知问题\n> 注意:JPush iOS SDK 4.9.0 及以上版本需要使用 Xcode 14 及以上版本,请注意升级!\n\n### 升级提示\n+ 建议配合 JCore iOS SDK v5.4.0 及以上版本使用\n+ 升级到 JPush iOS SDK 4.9.0 及以上版本需删除 armv7 和 armv7s 架构"
4+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
#!/usr/bin/env python3
2+
"""Fetch SDK changelog from JiGuang official docs for a specific version."""
3+
4+
import sys
5+
import json
6+
import re
7+
import argparse
8+
9+
try:
10+
import requests
11+
except ImportError:
12+
print("ERROR: Missing dependencies. Run: pip3 install requests")
13+
sys.exit(1)
14+
15+
CONFIG_PATH = ".claude/skills/update-sdk/scripts/config.json"
16+
HEADERS = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"}
17+
18+
19+
def load_config():
20+
with open(CONFIG_PATH, "r", encoding="utf-8") as f:
21+
return json.load(f)
22+
23+
24+
def fetch_changelog(url: str, target_version: str) -> str:
25+
"""Fetch and extract changelog section for target_version from a Markdown URL."""
26+
md_url = url if url.endswith(".md") else url + ".md"
27+
28+
try:
29+
resp = requests.get(md_url, headers=HEADERS, timeout=30)
30+
resp.raise_for_status()
31+
content = resp.text
32+
except requests.RequestException as e:
33+
return f"ERROR: Failed to fetch {md_url}: {e}"
34+
35+
lines = content.split("\n")
36+
in_section = False
37+
section_lines = []
38+
39+
for line in lines:
40+
# Match headings like: ## JPush Android SDK v6.1.0
41+
if re.match(r'^##\s+.*v?' + re.escape(target_version) + r'\b', line):
42+
in_section = True
43+
section_lines.append(line)
44+
elif in_section:
45+
if re.match(r'^##\s+', line):
46+
break # next version section starts
47+
section_lines.append(line)
48+
49+
if not section_lines:
50+
return f"VERSION_NOT_FOUND: Could not find changelog for version {target_version} at {md_url}"
51+
52+
return "\n".join(section_lines).strip()
53+
54+
55+
def main():
56+
parser = argparse.ArgumentParser(description="Fetch JiGuang SDK changelog")
57+
parser.add_argument("--android", help="Android SDK version")
58+
parser.add_argument("--ios", help="iOS SDK version")
59+
parser.add_argument("--harmony", help="HarmonyOS SDK version")
60+
args = parser.parse_args()
61+
62+
config = load_config()
63+
urls = config.get("changelog_urls", {})
64+
result = {}
65+
66+
platforms = [
67+
("android", args.android),
68+
("ios", args.ios),
69+
("harmony", args.harmony),
70+
]
71+
72+
for platform, version in platforms:
73+
if version and platform in urls:
74+
print(f"\n=== Fetching {platform} changelog for v{version} ===")
75+
content = fetch_changelog(urls[platform], version)
76+
result[platform] = content
77+
print(content)
78+
79+
cache_path = ".claude/skills/update-sdk/scripts/.changelog_cache.json"
80+
with open(cache_path, "w", encoding="utf-8") as f:
81+
json.dump(result, f, ensure_ascii=False, indent=2)
82+
83+
print(f"\n=== Changelog saved to {cache_path} ===")
84+
85+
86+
if __name__ == "__main__":
87+
main()
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
{
2+
"plugin_name": "jpush-react-native",
3+
"sdk_type": "jpush",
4+
"platform": "react-native",
5+
"changelog_urls": {
6+
"android": "https://docs.jiguang.cn/jpush/jpush_changelog/updates_Android",
7+
"ios": "https://docs.jiguang.cn/jpush/jpush_changelog/updates_iOS"
8+
},
9+
"version_refs": {
10+
"android_sdk": {
11+
"integration": "maven",
12+
"files": [
13+
{
14+
"path": "android/build.gradle",
15+
"pattern": "cn.jiguang.sdk:jpush:{VERSION}"
16+
}
17+
]
18+
},
19+
"ios_sdk": {
20+
"integration": "cocoapods",
21+
"files": [
22+
{
23+
"path": "JPushRN.podspec",
24+
"pattern": "s.dependency 'JPush','{VERSION}'"
25+
}
26+
]
27+
},
28+
"plugin": {
29+
"files": [
30+
{
31+
"path": "package.json",
32+
"key": "version"
33+
}
34+
]
35+
}
36+
},
37+
"native_files": {
38+
"android": [
39+
"android/src/main/java/cn/jiguang/plugins/push/JPushModule.java"
40+
],
41+
"ios": [
42+
"ios/RCTJPushModule/RCTJPushModule.h",
43+
"ios/RCTJPushModule/RCTJPushModule.m"
44+
]
45+
},
46+
"bridge_files": {
47+
"js": [
48+
"index.js"
49+
],
50+
"ts": [
51+
"index.d.ts"
52+
]
53+
},
54+
"changelog_file": "CHANGELOG.md",
55+
"publish": {
56+
"type": "npm"
57+
}
58+
}

0 commit comments

Comments
 (0)