made-market 0.1.0 → 0.1.1

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 (47) hide show
  1. package/README.md +17 -56
  2. package/bin/made-market.mjs +9 -5
  3. package/package.json +9 -19
  4. package/{tools → src}/install.mjs +2 -2
  5. package/{tools → src}/publish.mjs +2 -2
  6. package/docs/BACKEND.md +0 -189
  7. package/docs/INSTALL.md +0 -95
  8. package/docs/PUBLISH.md +0 -127
  9. package/docs/SPEC.md +0 -119
  10. package/server/auth.mjs +0 -121
  11. package/server/db.mjs +0 -485
  12. package/server/errors.mjs +0 -7
  13. package/server/server.mjs +0 -210
  14. package/server/service.mjs +0 -254
  15. package/server/store.mjs +0 -97
  16. package/site/glyphs.js +0 -22
  17. package/site/index.html +0 -158
  18. package/site/market.css +0 -915
  19. package/site/market.js +0 -521
  20. package/site/packages/alarm-clock-1.0.0.tar.gz +0 -0
  21. package/site/packages/bamboo-1.0.0.tar.gz +0 -0
  22. package/site/packages/demo-echo-1.0.0.tar.gz +0 -0
  23. package/site/packages/graphite-1.0.0.tar.gz +0 -0
  24. package/site/packages/key-chime-1.0.0.tar.gz +0 -0
  25. package/site/packages/ocean-1.0.0.tar.gz +0 -0
  26. package/site/packages/ollama-agent-1.0.0.tar.gz +0 -0
  27. package/site/packages/shell-agent-1.0.0.tar.gz +0 -0
  28. package/site/packages/sunset-1.0.0.tar.gz +0 -0
  29. package/site/packages/theme-cycler-1.0.0.tar.gz +0 -0
  30. package/site/packages/webhook-notify-1.0.0.tar.gz +0 -0
  31. package/site/registry.js +0 -813
  32. package/tools/build.mjs +0 -79
  33. package/tools/gen-assets.mjs +0 -67
  34. package/tools/lib/assets.mjs +0 -198
  35. package/tools/lib/oss.mjs +0 -75
  36. package/tools/new.mjs +0 -126
  37. package/tools/publish-oss.mjs +0 -119
  38. package/tools/serve.mjs +0 -63
  39. package/tools/validate.mjs +0 -44
  40. /package/{tools/lib → lib}/glyphs.mjs +0 -0
  41. /package/{tools/lib → lib}/icon.mjs +0 -0
  42. /package/{tools/lib → lib}/market.mjs +0 -0
  43. /package/{tools/lib → lib}/pack.mjs +0 -0
  44. /package/{tools/lib → lib}/plugin.mjs +0 -0
  45. /package/{tools/lib → lib}/tar.mjs +0 -0
  46. /package/{tools/lib → lib}/theme.mjs +0 -0
  47. /package/{tools → src}/account.mjs +0 -0
package/README.md CHANGED
@@ -1,70 +1,31 @@
1
- # made-market · 码得公开插件市场
1
+ # made-market · 码得插件市场 CLI
2
2
 
3
- 码得的公开插件市场。**只做包管理**:登记和分发三类包,本身不执行插件、不连接码得、不保存配对令牌或 hook 密钥。
4
-
5
- 包装进固定的用户目录 `~/made`(可用 `MADE_HOME` 覆盖)之后才生效:桥接器每次启动扫描 `~/made/plugins` 与 `~/made/themes`,不需要登记,也不需要和配置文件放在一起。
6
-
7
- | 类别 | 管什么 | 安装到 |
8
- | --- | --- | --- |
9
- | **主题** | 码得的外观:调色板、锁屏图、提示音 | `~/made/themes/<dir>/` |
10
- | **管控** | 接收板侧事件、把命令放进设备队列、调外部 hook | `~/made/plugins/<dir>/` |
11
- | **agent 运行时** | 接上一种助手的执行方式:会话、模型、进度、取消 | `~/made/plugins/<dir>/` |
12
-
13
- 桥接器里另有一份随代码发布的内置包 `bridge/builtin/`;查找顺序是「内置在前、用户目录在后」,同名时 `~/made` 覆盖内置。
14
-
15
- 技能不在本仓库建广场,沿用现成技能广场;人格归专家市场。边界与归类见码得仓库的 `docs/MARKETS.md`。
16
-
17
- ## 安装一个包
3
+ 码得(made)公开插件市场的命令行工具。市场登记与分发主题、管控、agent 运行时三类包,本身不执行插件代码;包装到 `~/made` 后由桥接器自动扫描。
18
4
 
19
5
  ```sh
20
- npx made-market install sunset # 主题
21
- npx made-market install alarm-clock # 管控插件
22
- npx made-market list # 看看有什么
6
+ npx made-market list # 列出索引里的全部包
7
+ npx made-market search 日落 # 在包名、简介和标签里搜索
8
+ npx made-market info sunset # 看一个包的详情
9
+ npx made-market install sunset # 装到 ~/made/themes/,重启桥接器后生效
23
10
  ```
24
11
 
25
- 包从哪里下载?索引解析顺序是 `--registry` > 环境变量 `MADE_MARKET_REGISTRY`(指向 OSS 上的公开索引)> npm 包内自带的索引快照。**权威分发源是 OSS**,日常安装走它;远端不可达时自动回落到包内快照,离线也能装。发布流程见 [docs/PUBLISH.md](docs/PUBLISH.md)。
26
-
27
- ## 目录
12
+ ## 发布新包
28
13
 
29
- ```
30
- bin/ npx 入口(made-market)
31
- packages/ 包源:themes/ control/ agents/,每包一个目录
32
- registry/ 公开索引 index.json(生成物,是分发的唯一入口)
33
- site/ 公开站点(静态,直接托管 site/ 即可)+ 归档 site/packages/
34
- tools/ 校验、构建、打包、安装、发布(OSS / 上传服务)、脚手架
35
- server/ 上传分发服务(用户上传 → 服务端校验 → 动态索引)
36
- docs/ 包规范、安装说明、提交说明、后端部署
37
- test/ 校验/打包/安装/上传服务的测试
38
- ```
39
-
40
- ## 维护者命令
14
+ 发布需要先登录(下载安装永远匿名,无需账号):
41
15
 
42
16
  ```sh
43
- node tools/validate.mjs # 校验全部包
44
- node tools/build.mjs # 生成索引与下载归档
45
- node tools/serve.mjs # 本地预览站点 http://127.0.0.1:8899
46
- node tools/install.mjs alarm-clock --home ~/made # 不经 npx 直接装
47
- npm test # 跑测试
17
+ npx made-market register <用户名>
18
+ npx made-market login <用户名>
19
+ npx made-market publish <包目录>
48
20
  ```
49
21
 
50
- ## 文档
51
-
52
- - [包规范 v1](docs/SPEC.md) — 目录结构、`market.json`、三类包的桥接器文件
53
- - [安装说明](docs/INSTALL.md) — 一条命令或手动解包,卸载与安全边界
54
- - [提交说明](docs/PUBLISH.md) — 从脚手架到发布(含 OSS)
55
- - [上传服务](docs/BACKEND.md) — 自建后端:用户上传、服务端校验、动态索引、部署
56
-
57
- ## 用户上传
58
-
59
- 开放上传靠自建的上传分发服务(`server/`,无依赖 Node 服务):作者
60
- `npx made-market publish <包目录>` 上传,服务端用与 `validate.mjs` 相同的规则
61
- 校验("CI 过审即上架"),版本不可变,索引动态重建,归档与元数据存阿里云 OSS。
62
- 部署与 token 管理见 [docs/BACKEND.md](docs/BACKEND.md)。
22
+ 会话有效期 90 天,凭证存放在 `~/made/credentials.json`(权限 0600)。
63
23
 
64
- ## 安全
24
+ ## 服务地址
65
25
 
66
- 插件是本机 JavaScript,拥有桥接器进程的权限。只安装你信任的代码。市场能提供的是源码公开、静态校验和逐文件校验和;运行时的权限边界由桥接器决定。
26
+ - 默认索引:GitHub 上的 `registry/index.json`(离线时回落到包内自带快照)
27
+ - 自建市场:`--server` 指定市场服务地址,或设 `MADE_MARKET_REGISTRY` / `MADE_MARKET_SERVER` 环境变量
67
28
 
68
- ## 许可
29
+ ## 服务端
69
30
 
70
- MIT
31
+ 本仓库([github.com/jobop/made-market](https://github.com/jobop/made-market))同时包含市场服务端(`server/`)与站点(`site/`),它们**不随本 npm 包分发**;`cli/lib` 里的包格式核心库与仓库内服务端共用同一份源码。
@@ -12,10 +12,14 @@
12
12
  */
13
13
  import fs from 'node:fs';
14
14
  import path from 'node:path';
15
- import { ROOT } from '../tools/lib/market.mjs';
16
- import { install, loadRegistry, resolveHome, resolveRegistry } from '../tools/install.mjs';
17
- import { publish } from '../tools/publish.mjs';
18
- import { login, logout, register, resolvePassword, whoami } from '../tools/account.mjs';
15
+ import { fileURLToPath } from 'node:url';
16
+ import { ROOT } from '../lib/market.mjs';
17
+ import { install, loadRegistry, resolveHome, resolveRegistry } from '../src/install.mjs';
18
+ import { publish } from '../src/publish.mjs';
19
+ import { login, logout, register, resolvePassword, whoami } from '../src/account.mjs';
20
+
21
+ // 版本号读 CLI 自己的 package.json(cli/),发布后即 node_modules/made-market/package.json。
22
+ const CLI_PACKAGE_JSON = fileURLToPath(new URL('../package.json', import.meta.url));
19
23
 
20
24
  const KIND_LABELS = { theme: '主题', control: '管控', agent: 'agent 运行时' };
21
25
  const KIND_ORDER = ['theme', 'control', 'agent'];
@@ -165,7 +169,7 @@ async function main() {
165
169
  }
166
170
 
167
171
  if (options.version) {
168
- const pkg = JSON.parse(fs.readFileSync(path.join(ROOT, 'package.json'), 'utf8'));
172
+ const pkg = JSON.parse(fs.readFileSync(CLI_PACKAGE_JSON, 'utf8'));
169
173
  console.log(pkg.version);
170
174
  return;
171
175
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "made-market",
3
- "version": "0.1.0",
4
- "description": "码得(made)公开插件市场:登记与分发主题、管控、agent 运行时三类包,本身不执行插件。装到 ~/made 后由桥接器自动扫描。",
3
+ "version": "0.1.1",
4
+ "description": "码得(made)公开插件市场的命令行工具:列出、搜索、安装主题/管控/agent 包,以及登录后发布新包。市场服务端在 github.com/jobop/made-market 仓库内,不随本包分发。",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "engines": {
@@ -12,18 +12,16 @@
12
12
  },
13
13
  "files": [
14
14
  "bin/",
15
- "tools/",
16
- "!tools/oss.config.json",
17
- "server/",
18
- "registry/",
19
- "site/",
20
- "docs/",
15
+ "src/",
16
+ "lib/",
17
+ "registry/index.json",
21
18
  "README.md",
22
19
  "LICENSE"
23
20
  ],
24
21
  "repository": {
25
22
  "type": "git",
26
- "url": "git+https://github.com/jobop/made-market.git"
23
+ "url": "git+https://github.com/jobop/made-market.git",
24
+ "directory": "cli"
27
25
  },
28
26
  "homepage": "https://jobop.github.io/made-market/",
29
27
  "bugs": {
@@ -44,15 +42,7 @@
44
42
  "registry": "https://registry.npmjs.org/"
45
43
  },
46
44
  "scripts": {
47
- "validate": "node tools/validate.mjs",
48
- "assets": "node tools/gen-assets.mjs",
49
- "build": "node tools/build.mjs",
50
- "serve": "node tools/serve.mjs",
51
- "install": "node tools/install.mjs",
52
- "publish:oss": "node tools/publish-oss.mjs",
53
- "rebuild-index": "node bin/made-market.mjs rebuild-from-store",
54
- "test": "node --test",
55
- "test:pg": "node --test --test-timeout=120000 --test-concurrency=1",
56
- "prepublishOnly": "node tools/validate.mjs && node tools/build.mjs && node --test"
45
+ "prepublishOnly": "cd .. && node tools/validate.mjs && node tools/build.mjs && node --test",
46
+ "prepack": "mkdir -p registry && cp ../registry/index.json registry/index.json"
57
47
  }
58
48
  }
@@ -15,8 +15,8 @@ import fs from 'node:fs';
15
15
  import os from 'node:os';
16
16
  import path from 'node:path';
17
17
  import zlib from 'node:zlib';
18
- import { KINDS, ROOT, sha256 } from './lib/market.mjs';
19
- import { extractTar } from './lib/tar.mjs';
18
+ import { KINDS, ROOT, sha256 } from '../lib/market.mjs';
19
+ import { extractTar } from '../lib/tar.mjs';
20
20
 
21
21
  const BUNDLED_REGISTRY = path.join(ROOT, 'registry', 'index.json');
22
22
 
@@ -9,8 +9,8 @@
9
9
  import fs from 'node:fs';
10
10
  import path from 'node:path';
11
11
  import { loadCredentials } from './account.mjs';
12
- import { KINDS, validatePackage } from './lib/market.mjs';
13
- import { packPackage } from './lib/pack.mjs';
12
+ import { KINDS, validatePackage } from '../lib/market.mjs';
13
+ import { packPackage } from '../lib/pack.mjs';
14
14
 
15
15
  export function resolvePublishArgs(dir, options = {}) {
16
16
  // 登录凭证兜底:一次 login,publish 不再需要重复给 token
package/docs/BACKEND.md DELETED
@@ -1,189 +0,0 @@
1
- # 上传分发服务
2
-
3
- 用户自己上传包的后端。**"CI 过审即上架"的那道 CI 就是这个服务**:归档在服务端解包、
4
- 复用与 `tools/validate.mjs` 完全相同的规则校验,过不了就永远进不了索引。
5
-
6
- ## 形态
7
-
8
- 一个**无依赖的 Node HTTP 服务**(`node:http`,无 npm 依赖,连 PG 客户端都是自带的):
9
-
10
- ```
11
- server/
12
- ├── server.mjs HTTP 路由:上传 / 索引 / 归档下载 / 版本查询 / 搜索
13
- ├── service.mjs 发布流水线:校验 → 入库 → 同步索引(核心逻辑,测试直接驱动)
14
- ├── store.mjs 存储驱动:local(开发/测试)| oss(生产,阿里云)—— 事实源
15
- └── db.mjs Postgres 派生索引:零依赖线协议客户端(SCRAM-SHA-256)+ 表结构 + 查询
16
- ```
17
-
18
- 事实源与索引的分工:
19
-
20
- - **存储(local/oss)里的 manifests 是唯一事实源**,每条事实一个不可变对象,随时可以从它全量重建任何派生数据;
21
- - **Postgres 是派生索引**:发布时同步一行版本事实,搜索/查询/统计走 SQL。索引库没配、断了、报错,服务都自动回落到存储路径照常工作,修好后用 `rebuild-from-store` 补数据。
22
-
23
- ## 接口
24
-
25
- | 方法 | 路径 | 说明 |
26
- | --- | --- | --- |
27
- | `POST` | `/api/register` | 注册账号 `{name, password, displayName?}` → `{token}`,注册即登录 |
28
- | `POST` | `/api/login` | 登录 `{name, password}` → `{token}`(90 天会话) |
29
- | `GET` | `/api/me` | 当前登录的账号(Bearer 会话 token) |
30
- | `POST` | `/api/logout` | 吊销当前会话 |
31
- | `POST` | `/api/packages` | 发布一个包。Bearer = **登录会话**(或服务令牌),body = tar.gz(**带** market.json) |
32
- | `GET` | `/registry/index.json` | 公开索引(有 PG 从索引库拼装,没有则从 manifests 重建),与 CLI/站点约定完全一致 |
33
- | `GET` | `/packages/<归档名>` | 归档下载。oss 存储 302 跳公共读直链(客户端直连 OSS,服务不经手流量);local 存储由服务读文件返回 |
34
- | `GET` | `/api/packages/<id>` | 一个包的全部版本(install API 模式按这个直查,不拉全量索引) |
35
- | `GET` | `/api/search?q=&kind=&limit=` | 搜索:包名/英文名/简介/标签/创建人 ILIKE,kind 过滤 |
36
- | `GET` | `/` | 状态(含索引层 postgres/store) |
37
-
38
- **鉴权边界一句话:发布要登录,下载永远匿名。** 索引、搜索、版本查询、归档下载
39
- 都不需要任何凭证;只有 `POST /api/packages` 检查 Bearer。
40
-
41
- ## 发布流水线(服务端,上传方无法绕过)
42
-
43
- 1. 归档 ≤ 10 MB,gunzip + 解 tar,条目路径检查(拒绝 `..` / 绝对路径);
44
- 2. 读 `market.json`:id / kind / version 合法性;
45
- 3. **服务端校验**:`validatePackage` —— 与 `npm run validate` 同一套规则,
46
- 含 plugin.json 逐字段规范、主题资产存在性与尺寸、WAV 格式、indexed4 图标;
47
- 4. **版本不可变**:同 id + version 已存在即 409,只能提升版本重新发布;
48
- 5. 服务端**重新打包**(剥离 market.json),sha256 以服务端算的为准,不信任上传方;
49
- 6. 写入 `packages/<id>-<version>.tar.gz` 与 `manifests/<id>/<version>.json`,同步 PG 索引,刷新存储索引。
50
-
51
- 每次发布记录两个人:**`createdBy` = 该包首个版本的发布者(创建人,跨版本固定)**、
52
- `publishedBy` = 本版本的发布者。两者都进 manifest、公开索引、PG 搜索结果,可追溯。
53
-
54
- ## 存储是事实源,PG 是派生索引
55
-
56
- 存储(local/oss)里的对象布局不变:
57
-
58
- ```
59
- packages/<id>-<version>.tar.gz 归档本体(分发,不含 market.json)
60
- manifests/<id>/<version>.json 版本清单 = 索引条目 + createdBy/publishedBy/publishedAt(事实)
61
- registry/index.json 兼容用的公开索引快照(发布时刷新)
62
- users/<名>.json 账号:scrypt 加盐口令散列,不含明文
63
- sessions/<token>.json 登录会话:user + expiresAt(吊销 = 覆盖为 revoked 记录)
64
- access/tokens.json 服务令牌(CI/管理员兜底通道,可选,也可用环境变量)
65
- ```
66
-
67
- 配了 `DATABASE_URL` 时,PG 里有两张表:
68
-
69
- ```
70
- packages 每包一行:kind/name/summary/tags + latest_version/total_versions(搜索摘要)
71
- versions 每版本一行:entry = 整条 manifest(jsonb),version_key = 可数值排序的 bigint
72
- ```
73
-
74
- - `versions.entry` 与存储里的 manifest 一字不差——**PG 丢了可以从 manifests 全量重建,存储坏了以 PG 为准读,两条腿互为备份**;
75
- - 发布只写受影响的行,不再全量扫描,10 万包规模下发布仍是 O(1);
76
- - 搜索/未来登录、审核流、下载统计都在这层做,OSS 只管存放。
77
-
78
- 规模化路径:几千包以内不配 `DATABASE_URL` 也完全够用;包量上万或要上账号体系时加一行环境变量即可,客户端接口不变。
79
-
80
- ## PG 客户端为什么是自带的
81
-
82
- 延续仓库零 npm 依赖的原则,`db.mjs` 内置了最小 Postgres 线协议实现:
83
- 协议 3.0 握手、SCRAM-SHA-256(RFC 7677,测试含密钥推导交叉验证)、md5/明文/信任兜底、
84
- 简单查询协议、带断线重连的小连接池。**无 TLS**:仅限内网/同机部署,公网请套反向代理。
85
-
86
- ## 账号与登录
87
-
88
- 发布必须先登录;账号直接存进存储驱动(与 manifests 同一套事实源,local/OSS 通用,
89
- 不依赖 PG),口令用 scrypt 加盐散列,会话 90 天有效。
90
-
91
- ```sh
92
- npx made-market register alice --server https://market.example.com
93
- # 或:login(已有账号)。凭证存 <home>/credentials.json(0600)
94
- npx made-market publish ./my-theme --server https://market.example.com
95
- # 登录过就不再需要 --token
96
- npx made-market whoami # 看当前账号
97
- npx made-market logout # 吊销服务端会话并删除本地凭证
98
- ```
99
-
100
- 会话 token 只用于**上传**;下载和索引是公开的。
101
-
102
- ## 服务令牌(CI / 管理员兜底)
103
-
104
- 自动化通道可以不走账号,用预签的服务令牌,两个来源(可并用):
105
-
106
- - 环境变量 `MADE_MARKET_TOKENS=name:token,name:token`(重启生效);
107
- - 存储里的 `access/tokens.json`:`[{"name":"alice","token":"…"}]`(写入即生效)。
108
-
109
- 服务令牌发布的包,创建人/发布者记录为令牌名(如 `ci-bot`)。生成一个随机令牌:
110
-
111
- ```sh
112
- openssl rand -hex 24
113
- ```
114
-
115
- ## 部署
116
-
117
- 配置全部走环境变量:
118
-
119
- ```sh
120
- PORT=8787 # 监听端口
121
- MADE_MARKET_STORE=oss # local | oss
122
- MADE_MARKET_PUBLIC_URL=https://market.example.com # 对外基地址(写进索引 registryUrl)
123
- MADE_MARKET_TOKENS=alice:…,bob:… # 发布 token
124
- DATABASE_URL=postgres://made:…@pg:5432/made_market # 可选:PG 派生索引
125
- OSS_REGION=oss-cn-hangzhou # 以下为 oss 驱动所需
126
- OSS_BUCKET=made-market
127
- OSS_ACCESS_KEY_ID=…
128
- OSS_ACCESS_KEY_SECRET=…
129
- OSS_PREFIX= # 可选,key 前缀
130
- ```
131
-
132
- 直接跑(Node ≥ 22,无依赖):
133
-
134
- ```sh
135
- node server/server.mjs
136
- ```
137
-
138
- 或 Docker(PG 一起起:`docker compose up -d`,见 `docker-compose.yml`):
139
-
140
- ```sh
141
- docker build -t made-market-server .
142
- docker run -d -p 8787:8787 --env-file server.env made-market-server
143
- ```
144
-
145
- **安全提示**:OSS AccessKey 与数据库口令只放在服务端环境变量里,绝不进前端代码、仓库或
146
- `site/`——静态站点托管(GitHub Pages / OSS 静态托管)上的任何文件都是公开的。
147
-
148
- ## 索引自愈
149
-
150
- ```sh
151
- # 从存储 manifests 全量重建 PG 索引(换库、丢库、补数据都走这里)
152
- DATABASE_URL=postgres://… npx made-market rebuild-from-store
153
- ```
154
-
155
- ## 客户端怎么接
156
-
157
- 服务上线后,它就是一个普通的索引来源,三种接法任选:
158
-
159
- ```sh
160
- # 单次安装(拉全量索引)
161
- npx made-market install alarm-clock --registry https://market.example.com/registry/index.json
162
-
163
- # 大市场推荐:按包直查 API,不拉全量索引
164
- npx made-market install alarm-clock --server https://market.example.com
165
-
166
- # 设为默认下载源(服务优先,断网回落包内快照)
167
- export MADE_MARKET_REGISTRY=https://market.example.com/registry/index.json
168
-
169
- # 上传(作者侧):先注册/登录一次,之后 publish 不再需要凭证参数
170
- npx made-market register me --server https://market.example.com
171
- npx made-market publish ./my-theme --server https://market.example.com
172
- ```
173
-
174
- ## 本地开发
175
-
176
- ```sh
177
- docker compose up -d # 起 PG
178
- DATABASE_URL=postgres://made:made@127.0.0.1:5432/made_market \
179
- node server/server.mjs &
180
- npx made-market register me --server http://127.0.0.1:8787 --password dev123
181
- npx made-market publish packages/themes/sunset --server http://127.0.0.1:8787
182
- curl -s 'http://127.0.0.1:8787/api/search?q=日落'
183
- ```
184
-
185
- `local` 驱动的数据落在 `./data/`(已 gitignore)。测试覆盖:SCRAM/协议单元测试、
186
- 口令散列与会话生命周期、发布鉴权(未登录 401 / 登录可发 / 创建人跨版本固定 / 下载匿名)、
187
- CLI 账号链路(register → publish 免 token → whoami → logout)、真实 PG 集成测试
188
- (设 `DATABASE_URL` 启用,未设自动跳过)、无 PG 时服务全链路、索引库故障自动回落存储、
189
- rebuild-from-store CLI 端到端。
package/docs/INSTALL.md DELETED
@@ -1,95 +0,0 @@
1
- # 安装市场包
2
-
3
- 市场只发包,安装就是下载、校验、落盘到**一个固定目录**。桥接器每次启动自己扫这个目录,所以不需要登记,也不需要把包和配置文件放在一起。
4
-
5
- ## 一条命令
6
-
7
- ```sh
8
- npx made-market install <包 ID>
9
- ```
10
-
11
- 装到 `~/made`:
12
-
13
- - 主题包 → `~/made/themes/<dir>/`
14
- - 管控包、agent 包 → `~/made/plugins/<dir>/`
15
-
16
- 装完重启桥接器即可生效。也可以一次装多个:
17
-
18
- ```sh
19
- npx made-market install sunset alarm-clock demo-echo
20
- ```
21
-
22
- 常用命令与参数:
23
-
24
- ```sh
25
- npx made-market list # 列出全部包
26
- npx made-market search 主题 # 搜索
27
- npx made-market info sunset # 看详情:文件、校验和、安装位置
28
- npx made-market install sunset --dry-run # 只校验,不落盘
29
- ```
30
-
31
- | 参数 | 说明 |
32
- | --- | --- |
33
- | `--home <目录>` | 包目录根。默认 `$MADE_HOME`,再默认 `~/made` |
34
- | `--registry <路径或 URL>` | 指定索引来源。默认优先 `$MADE_MARKET_REGISTRY`(OSS 公开索引),不可达时自动回落到包内自带索引(离线可用) |
35
- | `--kind theme\|control\|agent` | 只列某一类(配合 `list` / `search`) |
36
- | `--json` | 以 JSON 输出,便于脚本消费 |
37
- | `--force` | 目标目录已存在时覆盖 |
38
- | `--dry-run` | 只校验和展示将要写入的文件,不落盘 |
39
-
40
- **包从哪里下载**:索引解析顺序是 `--registry` > `$MADE_MARKET_REGISTRY` > 包内自带快照,归档永远从索引进驻的同一位置按约定取(`<根>/registry/index.json` ↔ `<根>/packages/`)。权威分发源是 OSS,设一次环境变量即可:
41
-
42
- ```sh
43
- export MADE_MARKET_REGISTRY=https://<bucket>.<region>.aliyuncs.com/registry/index.json
44
- ```
45
-
46
- 每个归档的 `sha256` 都记录在索引里,安装前逐字节核对,改过一个字节都会拒绝。
47
-
48
- 安装工具**不执行**任何插件代码,也不写入任何密钥。
49
-
50
- ## 包目录在哪
51
-
52
- 固定的用户目录,桥接器启动时扫描 `<home>/plugins` 与 `<home>/themes`:
53
-
54
- | 优先级 | 目录 | 谁写 |
55
- | --- | --- | --- |
56
- | 1(被覆盖) | `bridge/builtin/plugins/`、`bridge/builtin/themes/` | 随桥接器代码发布,只读 |
57
- | 2(覆盖上面) | `~/made/plugins/`、`~/made/themes/` | 市场安装,以及你自己放进去的包 |
58
-
59
- **同名时 `~/made` 覆盖内置**。所以在 `~/made/plugins/` 放一个和内置同名的目录,就能本地顶掉内置那版。
60
-
61
- 改根目录的两种办法,优先级从高到低:命令行 `--home`、环境变量 `MADE_HOME`、桥接器 `config.local.json` 里的 `madeHome`、默认 `~/made`。
62
-
63
- ## 不用 npx 的两种装法
64
-
65
- 仓库内直接跑(开发时用):
66
-
67
- ```sh
68
- node tools/install.mjs alarm-clock --home ~/made
69
- ```
70
-
71
- 手动解包:从站点下载 `<id>-<version>.tar.gz`,解开覆盖到目标目录即可。
72
-
73
- ```sh
74
- mkdir -p ~/made/themes/sunset
75
- tar -xzf sunset-1.0.0.tar.gz -C ~/made/themes/sunset
76
- ```
77
-
78
- 归档里只有桥接器需要的文件,没有 `market.json`,可以直接解开覆盖。
79
-
80
- ## 卸载
81
-
82
- 在桥接器工作台的「插件」页点移除,或直接删掉目录:
83
-
84
- ```sh
85
- rm -rf ~/made/themes/sunset
86
- rm -rf ~/made/plugins/alarm-clock
87
- ```
88
-
89
- 内置包不能从工作台移除——它跟代码走。要停用就在工作台点停用,要覆盖就放同名目录到 `~/made`。
90
-
91
- 桥接器重启后生效。已下发的主题需要码得重新拉取才会回退。
92
-
93
- ## 安全
94
-
95
- 插件是本机 JavaScript,拥有桥接器进程的权限。**只安装你信任的代码。**市场侧能做的是:静态校验、公开源码、逐文件校验和(归档 sha256 + 每个文件的 sha256)。管控插件调用外部 hook 用的地址与密钥应当留在桥接器本机配置里,不要写进包。
package/docs/PUBLISH.md DELETED
@@ -1,127 +0,0 @@
1
- # 提交一个包
2
-
3
- ## 1. 生成骨架
4
-
5
- ```sh
6
- node tools/new.mjs theme sunrise "日出"
7
- node tools/new.mjs control desk-clock "桌面时钟"
8
- node tools/new.mjs agent my-agent "我的助手"
9
- ```
10
-
11
- 会在 `packages/<类别>/<ID>/` 建好 `market.json` 和必需的占位桥接器文件。
12
-
13
- ## 2. 写桥接器文件
14
-
15
- 按 [包规范](SPEC.md) 填内容。管控/agent 包先看 `made` 仓库的 `docs/PLUGINS.md`;主题包先看 `made` 仓库的 `bridge/builtin/themes/README.md`。
16
-
17
- 生成二进制资产(主题的 `chime.wav` / `icon.bin` / `bg.bin`、agent 的 `icon.json`):
18
-
19
- ```sh
20
- node tools/gen-assets.mjs --force
21
- ```
22
-
23
- 它以确定性方式重算 `tools/lib/assets.mjs` 里声明的资产;改设计就改那份声明,不要手改二进制。
24
-
25
- ## 3. 校验
26
-
27
- ```sh
28
- node tools/validate.mjs
29
- ```
30
-
31
- 只认静态检查结果。校验点包括包结构与命名、`market.json` 必填字段与版本号、`plugin.json` 的配置规范(逐字段与桥接器同规则)、主题资产存在性与尺寸、WAV 格式、`indexed4` 图标协议。任何一条不过都会列出文件与原因。
32
-
33
- ## 4. 构建
34
-
35
- ```sh
36
- node tools/build.mjs
37
- ```
38
-
39
- 产物:
40
-
41
- - `registry/index.json` — 公开索引
42
- - `site/registry.js` — 站点内嵌索引
43
- - `site/packages/<id>-<version>.tgz` — 下载归档
44
-
45
- **这三样是生成物,必须一并提交**,站点和 `install.mjs` 都只读它们。归档是确定性的:同样的输入得到同样的 `sha256`,重复构建不会有 diff。
46
-
47
- ## 5. 检查
48
-
49
- ```sh
50
- node tools/serve.mjs # 打开 http://127.0.0.1:8899
51
- node --test test/ # 跑校验、打包、安装的测试
52
- ```
53
-
54
- 站点上确认卡片、详情、下载链接与安装命令都对;再用 `npx made-market install <id> --home /tmp/试装目录 --dry-run` 试装一次(`tools/install.mjs` 参数相同)。
55
-
56
- ## 6. 审核要点
57
-
58
- - 一个包只进一个类别,不把人格、技能和码得控制写进同一个包。
59
- - 不改 `made` 里已有的运行目录结构,不假设市场会执行代码。
60
- - 不放密钥、令牌、配对信息。
61
- - 主题的 `title` 与 agent 的 `label` 用设备字库能显示的常用汉字或英文。
62
- - 版本号只在包内容变化时提升;索引里的 `sha256` 会随内容变化。
63
-
64
- ## 发布
65
-
66
- 索引与归档的**权威分发源是 OSS**(国内访问稳定);GitHub raw 与 npm 包是备用通道。三个来源内容相同,只是新鲜度不同:
67
-
68
- | 来源 | 新鲜度 | 用途 |
69
- | --- | --- | --- |
70
- | **OSS** | 每次 `publish:oss` 后即最新 | 日常安装的默认来源(`MADE_MARKET_REGISTRY` 指向它) |
71
- | GitHub raw | 每次 push 后即最新 | 备用 |
72
- | npm 包内自带 | 发布时冻结的快照 | 离线兜底,`npx made-market` 入口 |
73
-
74
- 无论哪个来源,目录约定一致:索引在 `<根>/registry/index.json`,归档在隔壁 `<根>/packages/`,客户端按这个形状拼接归档地址。
75
-
76
- ### 发布到 OSS
77
-
78
- ```sh
79
- # 1. 配置凭证(环境变量或 tools/oss.config.json,后者已 gitignore)
80
- cat > tools/oss.config.json <<'EOF'
81
- {
82
- "OSS_REGION": "oss-cn-hangzhou",
83
- "OSS_BUCKET": "你的bucket",
84
- "OSS_ACCESS_KEY_ID": "…",
85
- "OSS_ACCESS_KEY_SECRET": "…",
86
- "OSS_PREFIX": ""
87
- }
88
- EOF
89
-
90
- # 2. 预览将要上传的文件
91
- node tools/publish-oss.mjs --dry-run
92
-
93
- # 3. 上传(默认逐个回读比对字节)
94
- node tools/publish-oss.mjs # 索引 + 归档
95
- node tools/publish-oss.mjs --site # 连静态站点一起发(OSS 静态托管)
96
- ```
97
-
98
- 上传完成后会打印索引地址,把它设为默认下载源(发 npm 前也写进 `bin` 说明或让用户设环境变量):
99
-
100
- ```sh
101
- export MADE_MARKET_REGISTRY=https://<bucket>.<region>.aliyuncs.com/registry/index.json
102
- npx made-market install alarm-clock # 现在默认走 OSS
103
- ```
104
-
105
- CLI 的索引解析顺序是 `--registry` > `$MADE_MARKET_REGISTRY` > 包内自带索引;远端不可达(断网、超时)时自动回落到自带索引,离线也能装。
106
-
107
- ### 发到 npm
108
-
109
- 命令行工具以 `made-market` 的名字发布到 npm 公共仓库,用户可以直接 `npx made-market …`。包里自带 `registry/index.json` 与 `site/packages/`,所以 OSS 不可用时不传 `--registry` 也完全离线可用;`package.json` 的 `files` 决定哪些内容进包。
110
-
111
- 发布前 `prepublishOnly` 会依次跑校验、构建和测试。然后:
112
-
113
- ```sh
114
- npm login # 只能你自己登录,工具不会代做
115
- npm whoami # 确认账号
116
- npm publish # 公开仓库,package.json 里已设 access: public
117
- ```
118
-
119
- 发下一个版本时先改 `package.json` 的 `version`,再 `npm publish`。改动包内容后要重新 `node tools/build.mjs`,让索引与新归档一致再发。
120
-
121
- 装到本机试跑(不发布):
122
-
123
- ```sh
124
- npm pack # 产出 made-market-0.1.0.tgz
125
- npx ./made-market-0.1.0.tgz list
126
- npx ./made-market-0.1.0.tgz install sunset --home /tmp/made-home
127
- ```