@nggaigc/cli 0.1.55 → 0.1.56

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/README.md CHANGED
@@ -12,10 +12,12 @@ CLI 保留 macOS npm symlink 入口与 packed-TGZ launcher 检查,并验证随
12
12
 
13
13
  从 CLI `0.1.52` 起,Intel Mac 仅放开安装限制,安装的签名包与 macOS 辅助程序字节保持不变;未做 Intel 兼容性适配或真机验收,不保证登录及工作流可用,运行失败按原有机制报告。实际公开版本和 `@latest` 状态以 npm registry 为准,Apple Silicon 真机验收需单独进行。
14
14
 
15
- CLI `0.1.55` 是兼容修复候选,实际公开版本与 `latest` 以 registry 为准。它通过官方签名 ZIP 的完整文件闭包识别现有根 Skill `1.1.49`/`1.1.50`;本地安装标记仅作提示。兼容时直接复用现有启动器,当前目录确实要求新版根时才安全升级;不会降级已验证的新版安装。旧目录仍使用根149时,保留已装150,并在不可发现为 active Skill 的私有缓存内验证、使用官方149兼容运行文件;目录切到新版后使用150,启动回执指向实际受信运行文件。保留豆包工作识别和 Intel Mac 安装放行的原边界。
15
+ CLI `0.1.56` 延续 `0.1.55` 的版本兼容修复,实际公开版本与 `latest` 以 registry 为准。它通过官方签名 ZIP 的完整文件闭包识别现有根 Skill `1.1.49`/`1.1.50`;本地安装标记仅作提示。兼容时直接复用现有启动器,当前目录确实要求新版根时才安全升级;不会降级已验证的新版安装。旧目录仍使用根149时,保留已装150,并在不可发现为 active Skill 的私有缓存内验证、使用官方149兼容运行文件;目录切到新版后使用150,启动回执指向实际受信运行文件。保留豆包工作识别和 Intel Mac 安装放行的原边界。
16
16
 
17
17
  升级在原安装锁内先验证私有临时目录的文件类型、哈希和系统可表达的执行位,再原子替换并复验。失败时恢复已验证旧安装;进程中断后先按原事务读回恢复,不盲目开始新升级。Windows 不把 POSIX 执行位当作其系统权限证明,真机验收另记。
18
18
 
19
+ CLI `0.1.56` 修复 Windows 写盘句柄:校验缓存和升级暂存文件使用不截断文件的读写句柄执行 `fsync`,保留验签和失败停止。更新已发布安装器时,使用 `npx --yes @nggaigc/cli@0.1.56 install`;项目级或指定宿主安装保留原命令中的 `--skills-dir` 或 `--agent`,不要另换目录、删除配置或重提已有付费任务。发布状态以 npm 为准。本次原生 Windows 实测尚未完成,不能把模拟回归或 Mac 验收视为 Windows 已通过。维护者在原生 Windows 的 Node 22、24 上构建后,必须分别运行 `node --test packages/cli/scripts/windows-root-flush.integration.test.mjs`,覆盖新装、149→150 升级、重复安装及失败恢复;非 Windows 环境会明确拒绝该验收。模拟约束的回归测试不能代替此项。
20
+
19
21
  旧的显式 `start-skill skill.<id> <version>` 只有在官方受签、精确绑定当前目录的有限迁移许可内,才可转到同一 Skill 的当前版本;结果分别返回 `requestedVersion` 与 `resolvedVersion`,在线准入使用真实新版本及哈希。未列版本、目录变化、停用或验签失败均停止。确需固定版本可加 `--exact-version`,此时绝不迁移到其他版本。无版本调用仍要求唯一 active 入口,不激活旧版本。
20
22
 
21
23
  此许可仅用于新启动。已经受理或结果未知的任务保留原请求和任务身份;`client` 将原参数交给已验证启动器,不为恢复任务重新准入、提交或付费。
@@ -89,7 +89,9 @@ export async function saveProof(skills, bundle, vendor = rootVendor) {
89
89
  path.join(temp, `nggaigc-plugin-${bundle.version}.zip`),
90
90
  path.join(temp, "manifest.json"),
91
91
  ]) {
92
- const fd = await open(file, "r");
92
+ // Windows FlushFileBuffers requires a writable handle. r+ preserves bytes
93
+ // and fails if the already-verified staging file is missing (unlike w).
94
+ const fd = await open(file, "r+");
93
95
  try {
94
96
  await fd.sync();
95
97
  }
@@ -315,7 +315,8 @@ export async function installVerifiedRootLocked(skills, bundle, options = {}) {
315
315
  await verifyInstalledSkill(p.stage, bundle.files, bundle.executableFiles);
316
316
  // Flush all payloads before recording intent; directory renames then survive process interruption.
317
317
  for (const name of Object.keys(bundle.files).filter((x) => x.startsWith("skills/nggaigc/"))) {
318
- const fd = await open(path.join(p.stage, name.slice(15)), "r");
318
+ // Flush existing staged payloads without truncating or creating files.
319
+ const fd = await open(path.join(p.stage, name.slice(15)), "r+");
319
320
  try {
320
321
  await fd.sync();
321
322
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nggaigc/cli",
3
- "version": "0.1.55",
3
+ "version": "0.1.56",
4
4
  "description": "Secure NGGAIGC Skill installer for Codex, WorkBuddy and compatible agents.",
5
5
  "type": "module",
6
6
  "bin": {