@nggaigc/cli 0.1.20 → 0.1.22
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 +2 -2
- package/dist/bin.js +4 -75
- package/dist/bundle.js +1 -1
- package/dist/independent-skill.js +29 -5
- package/dist/install.js +4 -2
- package/dist/main.js +70 -0
- package/dist/skill-command.js +1 -1
- package/package.json +5 -6
- package/vendor/manifest.json +13 -13
- package/vendor/{nggaigc-plugin-1.1.21.zip → nggaigc-plugin-1.1.22.zip} +0 -0
package/README.md
CHANGED
|
@@ -8,6 +8,6 @@ npx --yes @nggaigc/cli@latest install
|
|
|
8
8
|
|
|
9
9
|
安装器会先验证内置 Plugin 的 Ed25519 签名、归档哈希和逐文件哈希,再原子安装 Skill。首次运行会打开 NGGAIGC 浏览器授权页;浏览器仅接收短期连接挑战,安装器通过内存中的独立轮询凭据获取连接结果,设备凭据只通过标准输入进入操作系统受保护的凭据存储(Windows Credential Manager 或 macOS Keychain)。安装器不接受 API Key、授权码或设备凭据参数,也不从环境变量读取这些值。
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
CLI 保留 macOS npm symlink 入口与 packed-TGZ launcher 检查,并验证随包的已签名 Plugin 1.1.21。支持 Windows x64/arm64 与 Apple 芯片 Mac arm64,使用本机 Node.js 22.x(22.13 起)或 24.x,不下载或内嵌 Node.js。Windows PowerShell 5.1 默认 `Restricted` 时,安装器仅为受信凭据辅助脚本的子进程指定 `RemoteSigned`;不修改系统或用户执行策略。安装成功但连接失败会明确分开报告,无需重装;由于系统 URL 处理器退出码不能证明浏览器窗口已显示,安装器会同时给出短期一次性手动授权链接。
|
|
12
12
|
|
|
13
|
-
macOS arm64
|
|
13
|
+
macOS arm64 辅助程序沿用已签名 Plugin 中通过完整性校验的字节;Intel Mac 不在支持范围内。实际公开版本和 `@latest` 状态以 npm registry 为准,Apple Silicon 真机验收需单独进行。
|
package/dist/bin.js
CHANGED
|
@@ -1,76 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
import { runSkillStartCommand, } from "./skill-command.js";
|
|
7
|
-
const messages = {
|
|
8
|
-
authorizing: "浏览器已成功启动,请在 NGGAIGC 页面确认连接…",
|
|
9
|
-
connected: "NGGAIGC Skill 已安装,设备连接验证成功。",
|
|
10
|
-
installing: "正在安全安装已签名的 NGGAIGC Skill…",
|
|
11
|
-
launching: "正在请求系统打开默认浏览器…",
|
|
12
|
-
"manual-authorizing": "请在手动打开的网页中完成授权,安装器正在等待结果…",
|
|
13
|
-
verifying: "正在验证 NGGAIGC 签名安装包…",
|
|
14
|
-
};
|
|
15
|
-
const errorMessages = {
|
|
16
|
-
ARCHIVE_EXTRACTION_FAILED: "安装包无法安全解压,请稍后重试。",
|
|
17
|
-
BROWSER_AUTHORIZATION_FAILED: "网页授权未完成;请在新 Codex 任务中调用 NGGAIGC 继续连接,无需重装。",
|
|
18
|
-
BROWSER_OPEN_FAILED: "系统未能打开默认浏览器,也无法提供手动授权入口;请在新 Codex 任务中调用 NGGAIGC 重试连接,无需重装。",
|
|
19
|
-
CONNECTION_VERIFICATION_FAILED: "设备连接验证未完成;请在新 Codex 任务中检查连接状态,无需重装。",
|
|
20
|
-
POWERSHELL_EXECUTION_POLICY_BLOCKED: "Windows 脚本执行受到系统或组织策略限制,设备连接未完成。安装器没有更改执行策略。",
|
|
21
|
-
INSTALLATION_FAILED: "本地安装未完成,请检查现有文件状态后重试。",
|
|
22
|
-
SKILL_PAIR_UPGRADE_REQUIRED: "检测到无法安全配套迁移的本地 Seedream Skill,已停止升级。请保留旧 Skill 和任务文件并联系支持。",
|
|
23
|
-
SKILL_PAIR_RECOVERY_REQUIRED: "检测到本地组合安装中断或目录变化,已停止自动操作。请保留相关目录和任务文件并联系支持。",
|
|
24
|
-
INVALID_INPUT: "命令格式无效。请使用 install,或 start-skill skill.<id> [version]。",
|
|
25
|
-
PACKAGE_VERIFICATION_FAILED: "安装包签名或完整性验证失败,已停止安装。",
|
|
26
|
-
RUNTIME_UNSUPPORTED: "请使用 Node.js 22.x(22.13 起)或 24.x 版本。",
|
|
27
|
-
UNSUPPORTED_PLATFORM: "当前系统或架构尚未获得此签名安装包支持,请使用已支持的平台。",
|
|
28
|
-
};
|
|
29
|
-
export async function main(args, runtime = {}) {
|
|
30
|
-
const output = runtime.output ?? ((line) => process.stdout.write(line));
|
|
31
|
-
const errorOutput = runtime.error ?? ((line) => process.stderr.write(line));
|
|
32
|
-
if (args[0] === "start-skill" && (args.length === 2 || args.length === 3)) {
|
|
33
|
-
try {
|
|
34
|
-
const result = await (runtime.startSkill ?? runSkillStartCommand)(args[1], args[2], runtime.skillOptions);
|
|
35
|
-
output(`${JSON.stringify({ status: "ready", ...result })}\n`);
|
|
36
|
-
return 0;
|
|
37
|
-
}
|
|
38
|
-
catch (error) {
|
|
39
|
-
const code = fixedErrorCode(error) ?? "SKILL_START_UNAVAILABLE";
|
|
40
|
-
errorOutput(`${JSON.stringify({ error: { code } })}\n`);
|
|
41
|
-
return 1;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
if (args.length !== 1 || args[0] !== "install") {
|
|
45
|
-
errorOutput(`${errorMessages.INVALID_INPUT}\n`);
|
|
46
|
-
return 1;
|
|
47
|
-
}
|
|
48
|
-
try {
|
|
49
|
-
const result = await (runtime.install ?? runInstall)({
|
|
50
|
-
reporter: (event) => output(`${messages[event]}\n`),
|
|
51
|
-
launcherOptionsFactory: () => ({
|
|
52
|
-
browserManualLink: (url) => {
|
|
53
|
-
output(`如果没有看到授权网页,请勿分享以下一次性链接,请尽快在本机浏览器打开:\n${url}\n`);
|
|
54
|
-
},
|
|
55
|
-
browserFallback: (url) => {
|
|
56
|
-
// This is a short-lived, single-use browser challenge, not the device
|
|
57
|
-
// credential. Keep it in the local terminal only; never persist it.
|
|
58
|
-
output(`默认浏览器未能自动打开。请勿分享以下一次性链接,请尽快手动打开:\n${url}\n`);
|
|
59
|
-
},
|
|
60
|
-
}),
|
|
61
|
-
});
|
|
62
|
-
if (result.status === "installed-unconnected") {
|
|
63
|
-
errorOutput(`NGGAIGC Skill ${result.version} 文件已${result.installation === "unchanged" ? "存在" : "安装"},但设备尚未连接。${errorMessages[result.connectionError] ?? "请在新 Codex 任务中检查连接状态。"}\n`);
|
|
64
|
-
return 2;
|
|
65
|
-
}
|
|
66
|
-
return 0;
|
|
67
|
-
}
|
|
68
|
-
catch (error) {
|
|
69
|
-
const code = error instanceof CliError ? error.code : "INSTALLATION_FAILED";
|
|
70
|
-
errorOutput(`${errorMessages[code] ?? errorMessages.INSTALLATION_FAILED}\n`);
|
|
71
|
-
return 1;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
if (process.argv[1] &&
|
|
75
|
-
path.resolve(process.argv[1]) === fileURLToPath(import.meta.url))
|
|
76
|
-
process.exitCode = await main(process.argv.slice(2));
|
|
2
|
+
// Executable entry only (package.json "bin" target); never imported. main runs
|
|
3
|
+
// unconditionally so it works under the npm/npx symlink shims on macOS/Unix.
|
|
4
|
+
import { main } from "./main.js";
|
|
5
|
+
process.exitCode = await main(process.argv.slice(2));
|
package/dist/bundle.js
CHANGED
|
@@ -47,7 +47,7 @@ export async function verifyBundle(input) {
|
|
|
47
47
|
!exactKeys(manifestValue, manifestKeys) ||
|
|
48
48
|
manifestValue.schemaVersion !== "nggaigc-plugin-package/v1" ||
|
|
49
49
|
manifestValue.artifactId !== "plugin.nggaigc" ||
|
|
50
|
-
manifestValue.version !== "1.1.
|
|
50
|
+
manifestValue.version !== "1.1.22" ||
|
|
51
51
|
manifestValue.artifactPath !==
|
|
52
52
|
`packages/plugins/nggaigc-plugin-${manifestValue.version}.zip` ||
|
|
53
53
|
typeof manifestValue.sourceCommit !== "string" ||
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createHash, createPublicKey, randomUUID, verify } from "node:crypto";
|
|
2
|
-
import { open, lstat, mkdir, readFile, readdir,
|
|
2
|
+
import { open, lstat, mkdir, readFile, readdir, rename, rm, writeFile, } from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
const ID = /^skill\.[a-z0-9][a-z0-9.-]{0,79}$/;
|
|
5
5
|
const VERSION = /^\d+\.\d+\.\d+$/;
|
|
@@ -17,6 +17,26 @@ export class IndependentSkillError extends Error {
|
|
|
17
17
|
function fail(code) {
|
|
18
18
|
throw new IndependentSkillError(code);
|
|
19
19
|
}
|
|
20
|
+
async function hasLinkedPathComponent(value, allowMissing = false) {
|
|
21
|
+
const absolute = path.resolve(value);
|
|
22
|
+
const root = path.parse(absolute).root;
|
|
23
|
+
let current = root;
|
|
24
|
+
for (const component of absolute.slice(root.length).split(path.sep)) {
|
|
25
|
+
if (!component)
|
|
26
|
+
continue;
|
|
27
|
+
current = path.join(current, component);
|
|
28
|
+
try {
|
|
29
|
+
if ((await lstat(current)).isSymbolicLink())
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (allowMissing && error.code === "ENOENT")
|
|
34
|
+
return false;
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
20
40
|
function record(value) {
|
|
21
41
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
22
42
|
}
|
|
@@ -679,11 +699,15 @@ export async function prepareIndependentSkill(options) {
|
|
|
679
699
|
fail("INSTALL_PATH_UNSAFE");
|
|
680
700
|
const skillsRoot = path.join(options.codexHome, "skills");
|
|
681
701
|
const stateRoot = path.join(options.codexHome, ".nggaigc-managed");
|
|
702
|
+
if (await hasLinkedPathComponent(skillsRoot, true).catch(() => true))
|
|
703
|
+
fail("INSTALL_PATH_UNSAFE");
|
|
704
|
+
if (await hasLinkedPathComponent(stateRoot, true).catch(() => true))
|
|
705
|
+
fail("INSTALL_PATH_UNSAFE");
|
|
682
706
|
await mkdir(skillsRoot, { recursive: true });
|
|
683
707
|
await mkdir(stateRoot, { recursive: true });
|
|
684
|
-
if (
|
|
708
|
+
if (await hasLinkedPathComponent(skillsRoot).catch(() => true))
|
|
685
709
|
fail("INSTALL_PATH_UNSAFE");
|
|
686
|
-
if (
|
|
710
|
+
if (await hasLinkedPathComponent(stateRoot).catch(() => true))
|
|
687
711
|
fail("INSTALL_PATH_UNSAFE");
|
|
688
712
|
const fetcher = options.fetcher ?? fetch;
|
|
689
713
|
let result;
|
|
@@ -820,9 +844,9 @@ export async function rollbackIndependentSkill(options) {
|
|
|
820
844
|
fail("INSTALL_PATH_UNSAFE");
|
|
821
845
|
const skillsRoot = path.join(options.codexHome, "skills");
|
|
822
846
|
const stateRoot = path.join(options.codexHome, ".nggaigc-managed");
|
|
823
|
-
if (
|
|
847
|
+
if (await hasLinkedPathComponent(skillsRoot).catch(() => true))
|
|
824
848
|
fail("INSTALL_PATH_UNSAFE");
|
|
825
|
-
if (
|
|
849
|
+
if (await hasLinkedPathComponent(stateRoot).catch(() => true))
|
|
826
850
|
fail("INSTALL_PATH_UNSAFE");
|
|
827
851
|
const slug = options.skillId.slice("skill.".length);
|
|
828
852
|
const target = path.join(skillsRoot, slug);
|
package/dist/install.js
CHANGED
|
@@ -8,7 +8,7 @@ import { CliError, fixedErrorCode } from "./errors.js";
|
|
|
8
8
|
function defaultBundle() {
|
|
9
9
|
const vendor = fileURLToPath(new URL("../vendor/", import.meta.url));
|
|
10
10
|
return {
|
|
11
|
-
archive: path.join(vendor, "nggaigc-plugin-1.1.
|
|
11
|
+
archive: path.join(vendor, "nggaigc-plugin-1.1.22.zip"),
|
|
12
12
|
manifest: path.join(vendor, "manifest.json"),
|
|
13
13
|
trust: path.join(vendor, "trusted-keys.json"),
|
|
14
14
|
};
|
|
@@ -180,7 +180,9 @@ function assertDisposableRoot(value, expectedParent) {
|
|
|
180
180
|
export async function runInstall(options = {}) {
|
|
181
181
|
validateRuntime(options.platform ?? process.platform, options.architecture ?? process.arch);
|
|
182
182
|
const profile = safeProfile(options.profile ?? os.homedir());
|
|
183
|
-
const codexHome = safeProfile(options.codexHome ??
|
|
183
|
+
const codexHome = safeProfile(options.codexHome ??
|
|
184
|
+
(options.profile ? undefined : process.env.CODEX_HOME) ??
|
|
185
|
+
path.join(profile, ".codex"));
|
|
184
186
|
const report = options.reporter ?? (() => undefined);
|
|
185
187
|
report("verifying");
|
|
186
188
|
const bundle = await verifyBundle(options.bundle ?? defaultBundle());
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { CliError, fixedErrorCode } from "./errors.js";
|
|
2
|
+
import { runInstall } from "./install.js";
|
|
3
|
+
import { runSkillStartCommand, } from "./skill-command.js";
|
|
4
|
+
const messages = {
|
|
5
|
+
authorizing: "浏览器已成功启动,请在 NGGAIGC 页面确认连接…",
|
|
6
|
+
connected: "NGGAIGC Skill 已安装,设备连接验证成功。",
|
|
7
|
+
installing: "正在安全安装已签名的 NGGAIGC Skill…",
|
|
8
|
+
launching: "正在请求系统打开默认浏览器…",
|
|
9
|
+
"manual-authorizing": "请在手动打开的网页中完成授权,安装器正在等待结果…",
|
|
10
|
+
verifying: "正在验证 NGGAIGC 签名安装包…",
|
|
11
|
+
};
|
|
12
|
+
const errorMessages = {
|
|
13
|
+
ARCHIVE_EXTRACTION_FAILED: "安装包无法安全解压,请稍后重试。",
|
|
14
|
+
BROWSER_AUTHORIZATION_FAILED: "网页授权未完成;请在新 Codex 任务中调用 NGGAIGC 继续连接,无需重装。",
|
|
15
|
+
BROWSER_OPEN_FAILED: "系统未能打开默认浏览器,也无法提供手动授权入口;请在新 Codex 任务中调用 NGGAIGC 重试连接,无需重装。",
|
|
16
|
+
CONNECTION_VERIFICATION_FAILED: "设备连接验证未完成;请在新 Codex 任务中检查连接状态,无需重装。",
|
|
17
|
+
POWERSHELL_EXECUTION_POLICY_BLOCKED: "Windows 脚本执行受到系统或组织策略限制,设备连接未完成。安装器没有更改执行策略。",
|
|
18
|
+
INSTALLATION_FAILED: "本地安装未完成,请检查现有文件状态后重试。",
|
|
19
|
+
SKILL_PAIR_UPGRADE_REQUIRED: "检测到无法安全配套迁移的本地 Seedream Skill,已停止升级。请保留旧 Skill 和任务文件并联系支持。",
|
|
20
|
+
SKILL_PAIR_RECOVERY_REQUIRED: "检测到本地组合安装中断或目录变化,已停止自动操作。请保留相关目录和任务文件并联系支持。",
|
|
21
|
+
INVALID_INPUT: "命令格式无效。请使用 install,或 start-skill skill.<id> [version]。",
|
|
22
|
+
PACKAGE_VERIFICATION_FAILED: "安装包签名或完整性验证失败,已停止安装。",
|
|
23
|
+
RUNTIME_UNSUPPORTED: "请使用 Node.js 22.x(22.13 起)或 24.x 版本。",
|
|
24
|
+
UNSUPPORTED_PLATFORM: "当前系统或架构尚未获得此签名安装包支持,请使用已支持的平台。",
|
|
25
|
+
};
|
|
26
|
+
export async function main(args, runtime = {}) {
|
|
27
|
+
const output = runtime.output ?? ((line) => process.stdout.write(line));
|
|
28
|
+
const errorOutput = runtime.error ?? ((line) => process.stderr.write(line));
|
|
29
|
+
if (args[0] === "start-skill" && (args.length === 2 || args.length === 3)) {
|
|
30
|
+
try {
|
|
31
|
+
const result = await (runtime.startSkill ?? runSkillStartCommand)(args[1], args[2], runtime.skillOptions);
|
|
32
|
+
output(`${JSON.stringify({ status: "ready", ...result })}\n`);
|
|
33
|
+
return 0;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
const code = fixedErrorCode(error) ?? "SKILL_START_UNAVAILABLE";
|
|
37
|
+
errorOutput(`${JSON.stringify({ error: { code } })}\n`);
|
|
38
|
+
return 1;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (args.length !== 1 || args[0] !== "install") {
|
|
42
|
+
errorOutput(`${errorMessages.INVALID_INPUT}\n`);
|
|
43
|
+
return 1;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
const result = await (runtime.install ?? runInstall)({
|
|
47
|
+
reporter: (event) => output(`${messages[event]}\n`),
|
|
48
|
+
launcherOptionsFactory: () => ({
|
|
49
|
+
browserManualLink: (url) => {
|
|
50
|
+
output(`如果没有看到授权网页,请勿分享以下一次性链接,请尽快在本机浏览器打开:\n${url}\n`);
|
|
51
|
+
},
|
|
52
|
+
browserFallback: (url) => {
|
|
53
|
+
// This is a short-lived, single-use browser challenge, not the device
|
|
54
|
+
// credential. Keep it in the local terminal only; never persist it.
|
|
55
|
+
output(`默认浏览器未能自动打开。请勿分享以下一次性链接,请尽快手动打开:\n${url}\n`);
|
|
56
|
+
},
|
|
57
|
+
}),
|
|
58
|
+
});
|
|
59
|
+
if (result.status === "installed-unconnected") {
|
|
60
|
+
errorOutput(`NGGAIGC Skill ${result.version} 文件已${result.installation === "unchanged" ? "存在" : "安装"},但设备尚未连接。${errorMessages[result.connectionError] ?? "请在新 Codex 任务中检查连接状态。"}\n`);
|
|
61
|
+
return 2;
|
|
62
|
+
}
|
|
63
|
+
return 0;
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
const code = error instanceof CliError ? error.code : "INSTALLATION_FAILED";
|
|
67
|
+
errorOutput(`${errorMessages[code] ?? errorMessages.INSTALLATION_FAILED}\n`);
|
|
68
|
+
return 1;
|
|
69
|
+
}
|
|
70
|
+
}
|
package/dist/skill-command.js
CHANGED
|
@@ -15,7 +15,7 @@ function record(value) {
|
|
|
15
15
|
async function productionDependencies(codexHome) {
|
|
16
16
|
const vendor = fileURLToPath(new URL("../vendor/", import.meta.url));
|
|
17
17
|
const bundle = await verifyBundle({
|
|
18
|
-
archive: path.join(vendor, "nggaigc-plugin-1.1.
|
|
18
|
+
archive: path.join(vendor, "nggaigc-plugin-1.1.22.zip"),
|
|
19
19
|
manifest: path.join(vendor, "manifest.json"),
|
|
20
20
|
trust: path.join(vendor, "trusted-keys.json"),
|
|
21
21
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nggaigc/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.22",
|
|
4
4
|
"description": "Secure one-command NGGAIGC Skill installer for Codex.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -22,12 +22,11 @@
|
|
|
22
22
|
"x64",
|
|
23
23
|
"arm64"
|
|
24
24
|
],
|
|
25
|
+
"license": "UNLICENSED",
|
|
25
26
|
"scripts": {
|
|
26
27
|
"build": "tsc -p tsconfig.build.json",
|
|
27
|
-
"
|
|
28
|
-
"test": "vitest run src --exclude 'src/windows-secure-store.integration.test.ts'",
|
|
28
|
+
"test": "tsc -p tsconfig.build.json && vitest run src --exclude 'src/windows-secure-store.integration.test.ts'",
|
|
29
29
|
"test:credential:os": "tsc -p tsconfig.build.json && vitest run src/windows-secure-store.integration.test.ts",
|
|
30
30
|
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
}
|
|
31
|
+
}
|
|
32
|
+
}
|
package/vendor/manifest.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "nggaigc-plugin-package/v1",
|
|
3
3
|
"artifactId": "plugin.nggaigc",
|
|
4
|
-
"version": "1.1.
|
|
5
|
-
"sourceCommit": "
|
|
6
|
-
"artifactPath": "packages/plugins/nggaigc-plugin-1.1.
|
|
7
|
-
"sha256": "
|
|
8
|
-
"sizeBytes":
|
|
4
|
+
"version": "1.1.22",
|
|
5
|
+
"sourceCommit": "8d64f0dd8e1d6e20553318ee453a03d651972413",
|
|
6
|
+
"artifactPath": "packages/plugins/nggaigc-plugin-1.1.22.zip",
|
|
7
|
+
"sha256": "cf545624fbee7739c73a66100bd4e1f0dce2e474d579410863c752fbd61c84df",
|
|
8
|
+
"sizeBytes": 405920,
|
|
9
9
|
"fileCount": 22,
|
|
10
10
|
"platforms": [
|
|
11
11
|
"win32-x64",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"darwin-arm64"
|
|
14
14
|
],
|
|
15
15
|
"files": {
|
|
16
|
-
".codex-plugin/plugin.json": "
|
|
16
|
+
".codex-plugin/plugin.json": "57ed9dcce9f7929b9f60cdd88eb2fa4fe83779ba7b4b78b049b04a5913d0028c",
|
|
17
17
|
"installer/install.cjs": "a0c94ed71edf4cd7eb4a66609a4dcf73049abbd14aa273ee65b9b3029be2da2b",
|
|
18
18
|
"installer/legacy-root-digests.json": "922552646a5aa6cff8616c372912a37b1d5f263351206b85785ed9b2eae31641",
|
|
19
19
|
"installer/signed-pair-1.1.16.json": "ccb22a90302cc5c9c585067ebc211a27b0c9d8a177c2740a5678a58a3d70bfe9",
|
|
@@ -21,17 +21,17 @@
|
|
|
21
21
|
"migration/seedream-1.1.3/agents/openai.yaml": "3cbf034ddccd64a7972acd37e7433683a3944f3d8c7b5bdccbbd70e517bf5a8c",
|
|
22
22
|
"migration/seedream-1.1.3/references/image-generation.md": "208389b3ea4647040232c65a9b91ebcc20787818f57535f16664a7c4db842b3f",
|
|
23
23
|
"migration/seedream-1.1.3/references/source.json": "75998d079a229435d1097b00bd008703bd38026fc6485c312254925bf55398a8",
|
|
24
|
-
"migration/seedream-1.1.3/scripts/seedream.mjs": "
|
|
24
|
+
"migration/seedream-1.1.3/scripts/seedream.mjs": "5e6ea3ec48772ce88c21011d17ea8b18d7f2ca002b290d43f50d3daceb01e2ba",
|
|
25
25
|
"migration/seedream-1.1.3/SKILL.md": "5c5cf3c2d99376f246425e873c5566436ed528256372ac3208abb60364c4517c",
|
|
26
26
|
"skills/nggaigc/agents/openai.yaml": "8936d97b9821e687e224e9349cc42be2ee5fc20988562efffbcb70080aedf87c",
|
|
27
27
|
"skills/nggaigc/references/catalog-and-updates.md": "b53e6da29caf1652a90d1daa8d19f8ef172986f6d74702560b6d83edf0483be8",
|
|
28
|
-
"skills/nggaigc/references/source.json": "
|
|
29
|
-
"skills/nggaigc/scripts/bootstrap-public.json": "
|
|
30
|
-
"skills/nggaigc/scripts/launch-ngg-client.cjs": "
|
|
28
|
+
"skills/nggaigc/references/source.json": "8cfa8df60c1faf325bd8550dd996d5b9b016c6ad476e3f6ac66c09495bef0389",
|
|
29
|
+
"skills/nggaigc/scripts/bootstrap-public.json": "3e1583818151b1b9486603d90e809a1b73264fb36f7f628b3acca4eff267e840",
|
|
30
|
+
"skills/nggaigc/scripts/launch-ngg-client.cjs": "8f98bd0a758a9d6c0666712abc786bb96c2f51d2fc6664dcacad1d2a169081a4",
|
|
31
31
|
"skills/nggaigc/scripts/macos-keychain": "b0bdf29d14219d38ca18c7e5c599deb0daa8c8ac70b0babbc7d4fb23673079ec",
|
|
32
32
|
"skills/nggaigc/scripts/macos-keychain.swift": "1b57e74fde66c824fe970547dd8ca0883a3334c34c065e85a8a2a90d4556a7f5",
|
|
33
|
-
"skills/nggaigc/scripts/ngg_client.mjs": "
|
|
34
|
-
"skills/nggaigc/scripts/ngg-session.mjs": "
|
|
33
|
+
"skills/nggaigc/scripts/ngg_client.mjs": "7c14dd8018e8e904d2497bb4de11279cedbdbce0c14b03a6bdc466f31fdb0256",
|
|
34
|
+
"skills/nggaigc/scripts/ngg-session.mjs": "df0efeeda65d209ae292365b7a356c6332fd9a148a40e7e4b42b73aa91b44bc3",
|
|
35
35
|
"skills/nggaigc/scripts/supported-platforms.json": "ec8b0754c489e04534a1d9880dd6664ba9c5bcd07789e06d138e0923f23575ff",
|
|
36
36
|
"skills/nggaigc/scripts/windows-credential.ps1": "ce097f2a8601664522fcfa8c9505243439ff786a45f15a1dba702b8f9b13dab1",
|
|
37
37
|
"skills/nggaigc/SKILL.md": "9572e4cddaa2799d06417c21c326d25a6b3107824d042a757c41b0a56efa1bb8"
|
|
@@ -40,6 +40,6 @@
|
|
|
40
40
|
"algorithm": "ed25519",
|
|
41
41
|
"keyId": "ngg-signing-skill-release-1",
|
|
42
42
|
"scope": "artifact-bytes",
|
|
43
|
-
"value": "
|
|
43
|
+
"value": "yK9Nr0GlxcJOHbubFJ9GpMDXg8IWhg9XCWLMdfHo21Mo6pO5INedDyilzFRTW9RGu78uJUwOuC9k0Z5QCvXODg=="
|
|
44
44
|
}
|
|
45
45
|
}
|
|
index 6941935..354780c 100644
|
|
|
Binary file
|