diff --git a/.github/workflows/release-dsh-plugin.yml b/.github/workflows/release-dsh-plugin.yml index 5c0442063..848b9554e 100644 --- a/.github/workflows/release-dsh-plugin.yml +++ b/.github/workflows/release-dsh-plugin.yml @@ -99,13 +99,13 @@ jobs: PACKAGE_NAME: ${{ needs.validate.outputs.package_name }} VERSION: ${{ needs.validate.outputs.version }} run: | - # Public metadata can remain cached for up to five minutes after upload. + # npm scans uploads before availability; processing can exceed 15 minutes. # Retry only the read; never repeat npm publish after an uncertain response. - for attempt in {1..12}; do + for attempt in {1..40}; do if npm view "$PACKAGE_NAME@$VERSION" dist.integrity --json --prefer-online --fetch-retries=0 --fetch-timeout=10000 > published-integrity.json; then break fi - if [ "$attempt" -eq 12 ]; then + if [ "$attempt" -eq 40 ]; then exit 1 fi sleep 30 diff --git a/openspec/changes/add-dsh-native-plugin/release-guide.md b/openspec/changes/add-dsh-native-plugin/release-guide.md index ac75fd93a..a3327e031 100644 --- a/openspec/changes/add-dsh-native-plugin/release-guide.md +++ b/openspec/changes/add-dsh-native-plugin/release-guide.md @@ -173,7 +173,7 @@ SaaS 使用其现有流水线部署;公共接口契约、测试数据规则与 1. 审核包名及正式版本,将可发布 manifest 显式设为 `private: false`,完成候选版本验收并创建对应 tag。 2. 核验仓库现有 `NPM_TOKEN` 对目标包和 tag 的发布权限,可以复用 CLI 使用的仓库 secret,无需重复配置。工作流引用的 `dsh-npm` Environment 不存在时 GitHub 会自动创建,但不自动配置审批规则;如设置了保护规则,发布还须满足这些规则。 3. 从同一 tag 手动运行工作流并选择 `publish=true`。版本身份校验后复用 `check-dsh-plugin.yml` 的完整矩阵,所有组合成功才进入发布环境。发布负责人须下载本次运行的 `skillhub-dsh-release-candidate`,核对 tarball 与 SHA512SUMS,并关联该候选包的隔离 DSH 验收记录及本次明确授权;配置了审批规则时由审批者核对后批准。缺少验收结果时不继续发布。`publish=false` 和后续 `publish=true` 是两次独立构建,不能仅凭 tag 相同认定包字节相同;如果复用前次验收,须先确认 SHA-512 一致,否则重新验收本次候选包。 -4. 发布固定的 Linux/Node 24.2.0 检查产物,不在发布阶段重新构建。候选归档前读取 tarball 内的 `package/package.json`,重新验证包名、版本与 private 条件;不只信任源码 manifest。上传前校验 SHA-512,npm 返回成功后比较 Registry 的 `dist.integrity` 与候选 tarball。新版本刚上传后,公开读取可能短暂返回 404;使用 `--prefer-online` 读取,最多读取 12 次、失败后间隔 30 秒,单次 fetch 超时为 10 秒,以覆盖观察到的五分钟公开元数据缓存;不重复执行 `npm publish`。这些是读取重试参数,不是 npm 进程的严格墙钟时限。上传成功与公开包验证成功分别记录,超过验证期限仍须报告未完成。 +4. 发布固定的 Linux/Node 24.2.0 检查产物,不在发布阶段重新构建。候选归档前读取 tarball 内的 `package/package.json`,重新验证包名、版本与 private 条件;不只信任源码 manifest。上传前校验 SHA-512,npm 返回成功后比较 Registry 的 `dist.integrity` 与候选 tarball。npm 会在开放安装前扫描新上传的包,处理期间公开读取可能返回 404,并非单纯客户端缓存。使用 `--prefer-online` 读取,最多读取 40 次、失败后间隔 30 秒,单次 fetch 超时为 10 秒,提供约 20 分钟的等待窗口;不重复执行 `npm publish`。npm 处理可能超过该窗口,参见 [官方发布扫描说明](https://github.blog/changelog/2026-07-28-npm-publish-time-malware-scanning-and-dual-use-metadata/)。这些是读取重试参数,不是 npm 进程的严格墙钟时限。上传成功与公开包验证成功分别记录,超过验证期限仍须报告未完成。 预发行版本使用 npm `next`,正式版本使用 `latest`。版本已经存在或发布失败时工作流失败,不把错误当成成功;排查后按实际 Registry 状态处理,不覆盖已发布版本。该工作流不创建 GitHub Release、不部署服务端;发布后仍须按下节在干净 DSH 环境安装验收,完整性相同不能替代功能验收。 diff --git a/openspec/changes/add-dsh-native-plugin/release-notes.md b/openspec/changes/add-dsh-native-plugin/release-notes.md index aa435de8b..0597ca55e 100644 --- a/openspec/changes/add-dsh-native-plugin/release-notes.md +++ b/openspec/changes/add-dsh-native-plugin/release-notes.md @@ -2,9 +2,20 @@ ## 版本与交付状态 -本次交付版本为 `@astron-team/skillhub-dsh@0.2.1`,对应独立标签 `dsh-v0.2.1`。本节描述待发布版本;npm 上传、公开包完整性及发布后验收须分别确认。已发布的 `0.1.0`、`0.1.1` 和 `0.2.0` 保持不变。 +本次交付版本为 `@astron-team/skillhub-dsh@0.3.0`,对应独立标签 `dsh-v0.3.0`。[功能 PR #986](https://github.com/iflytek/skillhub/pull/986) 已合并;发布流水线、公开包完整性和发布后验收分别记录于 [验证摘要](verification.md)。已发布版本保持不变。 -DSH 基线仍为 `0.2.0-rc.2`,Node 为 `>=24.2.0 <25`,沿用下述两组完整 Cordis 组合。`0.2.0` 搜索安装状态已通过 Linux Host、真实浏览器和真实模型验收;本轮正式 SaaS 基线测试使用已发布 `0.2.0`,不调用模型。`0.2.1` 候选及平台 CI 结果以本轮实际验收为准,个人电脑桌面客户端和其他 DSH 发行版仍未验收。 +DSH 基线为 `0.2.0-rc.2`,Node 为 `>=24.2.0 <25`,沿用既有两组完整 Cordis 组合。浏览器与真实模型验收使用 Linux 官方 Host;三平台原生 Host 由 CI 验证,不扩大为个人电脑桌面客户端或其他 DSH 发行版验收。 + +## 0.3.0 市场交互与版本管理 + +- **卡片直接操作**:点击卡片进入详情,安装、卸载和检查升级使用独立按钮;仅存在当前来源安装时显示状态。内置标签中文展示,未识别标签保留来源名称。 +- **详情与版本**:隐藏完整 Markdown frontmatter,改善正文排版;短期缓存避免返回详情时反复空白加载。版本接口支持可选 `downloadableOnly`,过滤后再分页并按发布新旧排序,默认管理历史查询保持不变。SaaS 新接口契约需单独同步。 +- **范围选择**:项目范围只写当前可信工作区,用户范围供当前 DSH Host 的该用户多个项目读取;已有安装默认选中实际范围。对话省略范围时优先使用输入框旁原生问题,取消不写入,缺少问答服务则回退确认卡片。 +- **安装和卸载**:确认后安装弹窗向右展开,仅展示阶段与结果;当前库存与历史回执分开。卸载从市场、列表和详情原地确认,精简非必要技术信息,保留原预检、幂等和恢复保护。 +- **版本升级**:支持从已安装版本升级到选定的较新版本,也保留检查最新版入口。切换版本只读取信息,执行升级需要单独确认全部实际目标;同版不重复,旧版不降级,不可可靠排序时阻止升级,本地文件修改仍阻止覆盖。 +- **默认来源**:保持 `https://skill.xfyun.cn`;自定义地址与显式空地址的断开行为保持不变。不要求单独安装 CLI,不读取 CLI 登录信息,不新增登录或权限功能。 + +候选完成构建、类型、Lint、357 项测试及 Linux 官方 DSH 浏览器生命周期验证,覆盖精确非最新版升级、最新版升级、取消、本地修改保护和真实文件核对。真实模型验证原生范围选择及项目安装,不代表技能内容执行。发布后公开包验证独立记录,不以候选结果替代。 ## 0.2.1 默认正式来源 @@ -35,7 +46,7 @@ DSH 基线仍为 `0.2.0-rc.2`,Node 为 `>=24.2.0 <25`,沿用下述两组完 - **原生技能中心**:侧栏使用专用 SVG 入口;浏览和已安装视图独立。紧凑头像卡支持首字回退、实际统计、分页、排序和来源提供的标签筛选。 - **详情与版本**:文档、版本、安全审核和评论按 `auto/show/hide` 展示;评论只读。可查看并安装指定的可下载版本,重新获取精确凭据,不绕过已有版本的冲突保护。 -- **对话交互**:搜索结果使用紧凑卡片和明确详情按钮,详情抽屉沿用固定版本与来源校验。搜索本身不安装;用户明确选择并要求安装时,可直接核验原搜索快照后执行。 +- **对话交互**:搜索结果使用紧凑卡片,详情抽屉沿用固定版本与来源校验。搜索本身不安装;用户明确要求安装时核验原搜索快照,未指定范围则先确认范围,再执行安装。 - **安装结果**:主区呈现简洁结果和查看已安装入口,展开安装记录可核验原操作与当前库存;历史完成、当前记录变化、发现状态和模型执行保持区分。 - **本地管理**:用户/可信项目安装、主动检查更新、完整目标集合升级、单位置卸载及失效记录清理。不存在自动更新、技能降级或强制覆盖。 - **配置与主题**:来源和详情标签使用 shadcn/Radix 组件;支持保存、重置修改、只读与 revision 冲突。“测试连接”读取当前草稿地址而不保存,显示公开目录或基础搜索可读性及耗时,10 秒超时可重试,改地址清除旧结果;不据此宣称下载和所有模块可用。界面跟随 DSH 深浅主题,提供窄屏布局、骨架加载及减少动画设置。 diff --git a/openspec/changes/add-dsh-native-plugin/tasks.md b/openspec/changes/add-dsh-native-plugin/tasks.md index 42e29d48c..18a9a0c59 100644 --- a/openspec/changes/add-dsh-native-plugin/tasks.md +++ b/openspec/changes/add-dsh-native-plugin/tasks.md @@ -283,6 +283,6 @@ ## 36. 0.3.0 合并与 npm 发布 -- [ ] 36.1 同步主线,独立评审和最终检查通过后合并 PR。 -- [ ] 36.2 使用 `dsh-v0.3.0` tag 执行官方 npm 发布工作流,验证公开包完整性。 -- [ ] 36.3 公开包执行官方隔离 Host 安装验收,保留现有人工预览和会话。 +- [x] 36.1 同步主线,独立评审和最终检查通过后合并 PR(#986)。 +- [x] 36.2 使用 `dsh-v0.3.0` tag 执行官方 npm 发布工作流;上传后等待扫描完成,独立验证公开包与 CI tarball 一致。 +- [x] 36.3 公开包完成官方隔离 Profile 安装及生命周期验收;现有预览升级并核对会话和技能文件保留。 diff --git a/openspec/changes/add-dsh-native-plugin/verification.md b/openspec/changes/add-dsh-native-plugin/verification.md index 43b596131..e9f920940 100644 --- a/openspec/changes/add-dsh-native-plugin/verification.md +++ b/openspec/changes/add-dsh-native-plugin/verification.md @@ -2,7 +2,7 @@ ## 1. 当前结论 -`0.2.1` 已通过 [PR #979](https://github.com/iflytek/skillhub/pull/979) 合并并发布;默认来源为 `https://skill.xfyun.cn`。本轮准备发布 `0.3.0` 开源交互改进,不以历史发布结果代替新代码验证。 +`0.2.1` 已通过 [PR #979](https://github.com/iflytek/skillhub/pull/979) 合并并发布;默认来源为 `https://skill.xfyun.cn`。`0.3.0` 开源交互改进已通过 PR #986 合并、发布并完成公开包独立验收,结果见本文发布验收记录,不以历史版本结果代替新代码验证。 2026-10-19 使用公开 npm `0.2.0` 的真实 Linux DSH 插件连接 `https://skill.xfyun.cn`,连接测试、目录、搜索、Markdown 和版本选择通过;选择 `global/scientella@20260724.052402` 实际安装到隔离项目,7 个文件及归档 fingerprint 一致,inventory 来源与目标正确,再搜索显示项目已安装旧版,DSH 发现成功。评论接口 404 按可选能力处理,安全审核 401 按匿名拒绝处理。本轮未调用模型,不据此声明技能实际执行或生产 Pod 已核验。该技能使用日期格式的非 SemVer 版本,版本比较返回 `blocked/unknown-order`,按既有策略不提供升级入口;不得把固定版本安装通过写成升级通过。升级阻断前后文件保持不变;真实卸载后 DSH 发现消失,inventory 与重新搜索的安装记录清空。公开 `0.2.0` 的正式来源基线共 9 项浏览器检查通过,无页面脚本异常。 @@ -144,3 +144,12 @@ 自动化回归位于 `plugins/dsh/test/`,包括 `native-scope-choice.test.ts`、`install-control-state.test.tsx`、`installation-progress.test.tsx`、`removal-confirmation.test.tsx`、`upgrade-presentation.test.tsx`、`prepare-upgrade.test.ts` 与 `update-check.test.ts`。详细运行报告和截图保留在仓库外,不作为发布包内容。 浏览器与真实模型验收环境为 Linux 官方 DSH `0.2.0-rc.2`;macOS/Windows 原生 Host 兼容性由发布 CI 单独验证。升级故障恢复依赖现有事务自动化测试,本次浏览器结果不扩大为所有故障环境验收。发布状态以实际 tag、CI 和公开 npm 包为准。 + +## 0.3.0 发布与公开包验收(2026-10-20) + +- [PR #986](https://github.com/iflytek/skillhub/pull/986) 合并;独立 tag 为 `dsh-v0.3.0`。PR 的 15 项检查成功、1 项按配置跳过,包含服务端、Web、真实服务 E2E 与三平台 DSH。 +- [正式发布运行](https://github.com/iflytek/skillhub/actions/runs/39385741792) 的六组 Linux/macOS/Windows、两档 Node 检查通过,包括原生 Host 及保留 Cordis 组合。npm 接收上传后进入扫描处理,原约五分钟的公开读取校验超时,发布运行因此标为失败;未重复上传。 +- 扫描结束后,官方 Registry 的 `latest` 确认为 `0.3.0`;独立下载 [公开 npm 包](https://www.npmjs.com/package/@astron-team/skillhub-dsh/v/0.3.0),`dist.integrity`、SHA-512 和全部 tarball 字节均与本次 CI 发布候选一致。上传接收、自动核验超时与后续公开包验收分别记录,不将失败的工作流描述为全绿。 +- 使用公开 tarball,通过官方安装器装入干净隔离 Profile;复用已安装的官方 DSH 程序,运行基线和插件生命周期探针均通过。该路径不等于重新从网络安装整套 DSH 依赖。 +- 现有 Linux 预览升级到公开 `0.3.0`,81 个交付文件逐字节核对;15 个历史对话归档及技能状态文件在升级和重启后保持一致。浏览器技能中心加载 3 张联调技能卡片,无页面脚本异常。 +- 本轮发布后未新增模型请求,不将先前候选的真实模型验收写为公开包的新模型验收;预览使用本地开源市场,不代表 SaaS 新契约已部署。后续发布将公开读取窗口扩大到 40 次、间隔 30 秒,保留严格完整性比对与不重复发布边界。