@geoly-ai/skills-hub 0.1.0

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.
Files changed (46) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -0
  3. package/bin/skills-hub.mjs +26 -0
  4. package/package.json +44 -0
  5. package/src/adapters/index.mjs +832 -0
  6. package/src/artifact.mjs +376 -0
  7. package/src/atomic-fs.mjs +166 -0
  8. package/src/attestation.mjs +136 -0
  9. package/src/canonical-json.mjs +147 -0
  10. package/src/cli.mjs +208 -0
  11. package/src/commands/check.mjs +295 -0
  12. package/src/commands/context.mjs +235 -0
  13. package/src/commands/install.mjs +430 -0
  14. package/src/commands/locks.mjs +197 -0
  15. package/src/commands/output.mjs +127 -0
  16. package/src/commands/query.mjs +266 -0
  17. package/src/commands/recover.mjs +438 -0
  18. package/src/commands/registry.mjs +123 -0
  19. package/src/commands/resolve.mjs +171 -0
  20. package/src/commands/snapshot-access.mjs +91 -0
  21. package/src/commands/sync-lock.mjs +189 -0
  22. package/src/crc32c.mjs +27 -0
  23. package/src/exit-codes.mjs +265 -0
  24. package/src/fault-inject.mjs +379 -0
  25. package/src/install.mjs +732 -0
  26. package/src/journal.mjs +435 -0
  27. package/src/ledger.mjs +671 -0
  28. package/src/lock.mjs +98 -0
  29. package/src/lockfile.mjs +0 -0
  30. package/src/pack.mjs +792 -0
  31. package/src/packer.mjs +351 -0
  32. package/src/plan.mjs +519 -0
  33. package/src/recover.mjs +1345 -0
  34. package/src/safe-fs.mjs +252 -0
  35. package/src/sigstore.mjs +480 -0
  36. package/src/snapshot.mjs +528 -0
  37. package/src/stats.mjs +59 -0
  38. package/src/target.mjs +738 -0
  39. package/src/telemetry.mjs +393 -0
  40. package/src/tree-digest.mjs +103 -0
  41. package/src/trust-roots/README.md +31 -0
  42. package/src/trust-roots/sigstore-public-good.json +126 -0
  43. package/src/trust.mjs +563 -0
  44. package/src/untar.mjs +570 -0
  45. package/src/upload.mjs +268 -0
  46. package/src/vendor.mjs +465 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 geoly-ai
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,98 @@
1
+ # skills-hub
2
+
3
+ > npm 包名:**`@geoly-ai/skills-hub`**,bin `skills-hub`。
4
+ > (M0 正文写的是 `@geoly/skills-hub`,那是拍板时没核实 org —— 见 [`docs/m0/ERRATA.md`](docs/m0/ERRATA.md) E-7)
5
+
6
+ `geoly-ai` 的 skill 分发中心:一条命令装单个 skill、装矩阵包,
7
+ 并支持外部投稿与过审。
8
+
9
+ > ⚠️ **M0 规格已封版,M1 实现刚起步** —— 目前只有基础模块和埋点子系统,
10
+ > 装 skill 的主流程还没接通。
11
+
12
+ ## 现在在哪一步
13
+
14
+ | 阶段 | 状态 |
15
+ |---|---|
16
+ | **M0 · 制品与信任模型** | ✅ **已通过**(v45,2026-08-25) |
17
+ | M1 · 只读分发(单 skill 的 resolve / install / list / check) | 🚧 进行中 —— 信任链与 adapter 已就绪,事务内核在做 |
18
+ | M2 · pack 与受控 catalog | — |
19
+ | M3 · 投稿与审核 | — |
20
+ | M4 · update / remove / 正式发包 | — |
21
+
22
+ ## 从哪读起
23
+
24
+ - **[`docs/m0/00-decisions.md`](docs/m0/00-decisions.md)** —— 决策台账、术语、
25
+ 以及 🔴 **M1 开工前的两道硬门**(§6)
26
+ - [`docs/m0/01-artifacts.md`](docs/m0/01-artifacts.md) 起是规范正文,共 12 份
27
+ - `docs/m0/CHANGES-v*.md` 是 v2 → v45 的逐轮变更台账
28
+ (**变更台账不是现行规范**,以正文为准 —— 见
29
+ [`11-wire-contract.md`](docs/m0/11-wire-contract.md))
30
+
31
+ ## 已经能跑的
32
+
33
+ ```sh
34
+ node bin/skills-hub.mjs --help
35
+ node bin/skills-hub.mjs stats # 本地埋点文本报表
36
+ node bin/skills-hub.mjs telemetry status # 埋点/上报开关
37
+ npm test # 60 个测试
38
+ npm run test:matrix # 在 Node 22.13 / 24.19 上各跑一遍
39
+ ```
40
+
41
+ 基础模块:`canonical-json`、`atomic-fs`、`safe-fs`、`tree-digest`/`tx-digest`、
42
+ `lock`(`node:sqlite` 的 `BEGIN EXCLUSIVE`,内核释放)、故障注入框架、
43
+ 信任与制品链(Sigstore 验签 + 受限 tar 解包)、adapter 与 target 预检。
44
+
45
+ - 两道 M1 前置 gate 的实测记录:[`docs/m1/00-gates.md`](docs/m1/00-gates.md)
46
+ - 🔴 **已知且接受的残余风险**:[`docs/m1/01-residual-risks.md`](docs/m1/01-residual-risks.md)
47
+ - M0 勘误(正文已封版,冲突以勘误为准):[`docs/m0/ERRATA.md`](docs/m0/ERRATA.md)
48
+
49
+ **当前可安装的组合**:`claude` / `codex` / `agents` × 全局 / 项目级。
50
+
51
+ - `agents` 是 **present-only**:只在 `.agents` 已存在时加入,**不会被创建**
52
+ (它是共享约定路径,读者是 codex,不是独立客户端)
53
+ - ⚠️ `codex` 与 `agents` 同时装时,同一个 skill 会在 codex 的 catalog 里出现两次 ——
54
+ CLI 会告警但不拦截
55
+ - `cursor` 未启用:本机无运行时证据,且静态读它的加载器**预判会失败**,见 R-8
56
+
57
+ ## 项目级安装:先改 `.gitignore`
58
+
59
+ 装到项目级(`<repo>/.claude/skills` 等)时,状态目录 `.geoly/` 会落在仓库里。
60
+ 把下面几条加进 `.gitignore` —— 🔴 注意是 **adapter 派生的实际路径**,
61
+ 不是根上的 `/.geoly/`:
62
+
63
+ ```gitignore
64
+ /.claude/skills/.geoly/
65
+ /.codex/skills/.geoly/
66
+ /.cursor/skills/.geoly/
67
+ /.agents/skills/.geoly/
68
+ ```
69
+
70
+ (`skills-hub` 会在项目级安装时提示缺哪几条;`gitignorePatternsFor()` 按启用的
71
+ client 生成,`test/adapters.test.mjs` 用真 git 仓库验证过它确实忽略状态目录、
72
+ 且**不误伤 skill 本体**。)
73
+
74
+ ### ⚠️ `git clean -xfd` 会删掉整个 `.geoly/`
75
+
76
+ 不只是「进行中的事务状态」,**还包括本地审计历史**(live `audit` 与 `audit-archive/`)。
77
+ 清掉之后 `event_id` 序列会从头开始。这是规范承认的「放弃本地 audit」边界,
78
+ 但它**不可恢复** —— 清之前想清楚。
79
+
80
+ ## 埋点与面板
81
+
82
+ 规格:[`docs/telemetry/00-spec.md`](docs/telemetry/00-spec.md)(v2,已过 Codex 评审)。
83
+
84
+ 🔴 **默认不向任何地方发数据** —— 没有内置端点,不配 `GEOLY_TELEMETRY_ENDPOINT`
85
+ 就是纯本地。事件只含制品坐标、客户端、操作、结果、耗时,**不含路径、目录清单、
86
+ 文件内容、用户名**;这条契约由 `assertValidEvent()` 在落盘/读回/上报/导出四个边界执行。
87
+
88
+ - 关掉:`GEOLY_TELEMETRY=0` 只留本地:`GEOLY_TELEMETRY_UPLOAD=0` 断网:`--offline`
89
+ - 面板:[`docs/dashboard/`](docs/dashboard/)(零依赖静态页,
90
+ `skills-hub stats --export` 出的 JSON 拖进去即可)
91
+
92
+ ## M0 定了什么
93
+
94
+ 不可变制品布局与树摘要、签名快照 + timestamp 防回放、pack lock 与 yank 闭包、
95
+ 崩溃安全的安装事务(幂等前向恢复 / retirement rename / repair intent)、
96
+ 投稿与三阶段发布、威胁模型、CLI 命令面与退出码、JSON wire contract。
97
+
98
+ 平台:**macOS / Linux / WSL**,**Node ≥ 22.13**(锁用内建 `node:sqlite`)。
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env node
2
+ // 🔴 必须在任何 import 之前抑制 node:sqlite 的 ExperimentalWarning。
3
+ // 依据:04-install.md §5.1「代价」第 2 条 —— 警告在模块导入时发出,
4
+ // 放在适配层里抑制来不及。此处是进程内最早的可执行位置。
5
+ const origEmit = process.emit;
6
+ process.emit = function (name, data, ...rest) {
7
+ if (
8
+ name === 'warning' &&
9
+ data?.name === 'ExperimentalWarning' &&
10
+ /SQLite/i.test(data?.message ?? '')
11
+ ) return false;
12
+ return origEmit.call(this, name, data, ...rest);
13
+ };
14
+
15
+ // 🔴 生产 CLI 里绝不允许故障注入被环境变量武装起来。
16
+ // 注入器支持 throw / exit / SIGKILL / powerfail —— 用户环境里一个残留的
17
+ // GEOLY_FAULT_ENABLE=1 就能让正经安装在半路被杀。先清环境,再上锁,
18
+ // 两道都在**任何 import 之前**,因为模块求值时就可能读这些变量。
19
+ for (const k of Object.keys(process.env)) {
20
+ if (k.startsWith('GEOLY_FAULT')) delete process.env[k];
21
+ }
22
+ const { lockdown } = await import('../src/fault-inject.mjs');
23
+ lockdown();
24
+
25
+ const { main } = await import('../src/cli.mjs');
26
+ process.exitCode = await main(process.argv.slice(2));
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@geoly-ai/skills-hub",
3
+ "version": "0.1.0",
4
+ "description": "geoly-ai 的 skill 分发中心 —— 安装、校验、审计",
5
+ "type": "module",
6
+ "bin": {
7
+ "skills-hub": "./bin/skills-hub.mjs"
8
+ },
9
+ "engines": {
10
+ "node": ">=22.13"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/geoly-ai/skills-hub.git"
15
+ },
16
+ "homepage": "https://github.com/geoly-ai/skills-hub#readme",
17
+ "bugs": {
18
+ "url": "https://github.com/geoly-ai/skills-hub/issues"
19
+ },
20
+ "license": "MIT",
21
+ "publishConfig": {
22
+ "access": "public",
23
+ "provenance": true
24
+ },
25
+ "files": [
26
+ "bin",
27
+ "src"
28
+ ],
29
+ "scripts": {
30
+ "test": "node --test test/*.test.mjs",
31
+ "test:matrix": "bash scripts/test-matrix.sh",
32
+ "test:fault": "FX_FULL=1 node --test test/fault-matrix.test.mjs",
33
+ "test:fault:kernel": "FX_FULL=1 node --test test/kernel-fault-matrix.test.mjs",
34
+ "check:node-matrix": "node scripts/check-node-matrix.mjs",
35
+ "check:pack": "node scripts/check-pack-contents.mjs",
36
+ "check:identities": "node --no-warnings scripts/check-signing-identities.mjs",
37
+ "check:all": "npm run check:node-matrix && npm run check:identities && npm run check:pack",
38
+ "check:publish": "node scripts/publish-check.mjs",
39
+ "q12": "node scripts/q12/run.mjs"
40
+ },
41
+ "dependencies": {
42
+ "@sigstore/verify": "4.1.2"
43
+ }
44
+ }