@hagicode/hagiscript 0.1.6-dev.45.1.9e41dab → 0.1.6-dev.48.1.a6695c7
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 +134 -259
- package/package.json +2 -3
- package/runtime/lib/runtime-script-lib.mjs +416 -27
- package/runtime/scripts/install-code-server.mjs +21 -3
- package/runtime/scripts/install-omniroute.mjs +26 -3
- package/README_cn.md +0 -321
package/README_cn.md
DELETED
|
@@ -1,321 +0,0 @@
|
|
|
1
|
-
# Hagiscript
|
|
2
|
-
|
|
3
|
-
`@hagicode/hagiscript` 是 Hagiscript 语言工具链的作用域 npm 包基础工程。本次初始化只提供最小运行能力:版本元数据、基础运行时信息 API,以及一个可构建、可测试、可打包、可发布的 CLI 占位入口。
|
|
4
|
-
|
|
5
|
-
## 安装假设
|
|
6
|
-
|
|
7
|
-
- 需要 Node.js 20 或更高版本。
|
|
8
|
-
- 该独立仓库使用 npm 作为包管理器。
|
|
9
|
-
- npm 包名为 `@hagicode/hagiscript`。
|
|
10
|
-
- GitHub Actions 发布使用 `npm publish --provenance`。本地手动发布时,应直接使用普通 `npm publish`,除非当前环境本身就是受支持的 trusted publishing 环境。
|
|
11
|
-
|
|
12
|
-
## 使用方式
|
|
13
|
-
|
|
14
|
-
先从 npm 安装该包:
|
|
15
|
-
|
|
16
|
-
```bash
|
|
17
|
-
npm install @hagicode/hagiscript
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
安装后的 CLI 命令仍然是 `hagiscript`。
|
|
21
|
-
|
|
22
|
-
开发时运行 CLI:
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
npm run dev -- --help
|
|
26
|
-
npm run dev -- info
|
|
27
|
-
npm run dev -- install-node --target .tmp/node-runtime
|
|
28
|
-
npm run dev -- check-node --target .tmp/node-runtime
|
|
29
|
-
npm run dev -- npm-sync --runtime .tmp/node-runtime --manifest manifest.json
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
构建后运行编译产物:
|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
npm run build
|
|
36
|
-
node dist/cli.js --version
|
|
37
|
-
node dist/cli.js info
|
|
38
|
-
node dist/cli.js install-node --target .tmp/node-runtime
|
|
39
|
-
node dist/cli.js check-node --target .tmp/node-runtime
|
|
40
|
-
node dist/cli.js npm-sync --runtime .tmp/node-runtime --manifest manifest.json
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
### 托管 Node.js 运行时命令
|
|
44
|
-
|
|
45
|
-
`install-node` 会从 `https://nodejs.org/dist` 下载官方 Node.js 归档包,解压到目标目录,并在成功前验证 `node` 与 `npm` 都可执行。
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
hagiscript install-node --target /opt/hagiscript/node
|
|
49
|
-
hagiscript install-node --target /opt/hagiscript/node20 --version 20
|
|
50
|
-
hagiscript install-node --target /opt/hagiscript/lts --version lts
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
省略 `--version` 时,Hagiscript 默认安装最新可用的 Node.js 22 版本。支持的选择器包括 `lts`、`latest`、`current`、类似 `22` 的主版本号、类似 `22.12.0` 的精确版本,以及类似 `v22.12.0` 的带 `v` 精确版本。
|
|
54
|
-
|
|
55
|
-
目标路径必须不存在或为空目录。Hagiscript 会拒绝安装到非空目标目录,也不会删除已有用户文件。安装期间,临时 staging 文件会创建在目标目录旁边,并在成功或失败后清理。
|
|
56
|
-
|
|
57
|
-
成功输出示例:
|
|
58
|
-
|
|
59
|
-
```text
|
|
60
|
-
Installing Node.js 22 into /opt/hagiscript/node
|
|
61
|
-
Download progress: 100%
|
|
62
|
-
Node.js runtime installed successfully.
|
|
63
|
-
Target: /opt/hagiscript/node
|
|
64
|
-
Node.js: v22.12.0
|
|
65
|
-
npm: 10.9.0
|
|
66
|
-
node: /opt/hagiscript/node/bin/node
|
|
67
|
-
npm: /opt/hagiscript/node/bin/npm
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
`check-node` 会验证已有运行时目录;只有 `node --version` 和 `npm --version` 都成功时才以退出码 `0` 结束。
|
|
71
|
-
|
|
72
|
-
```bash
|
|
73
|
-
hagiscript check-node --target /opt/hagiscript/node
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
有效运行时输出示例:
|
|
77
|
-
|
|
78
|
-
```text
|
|
79
|
-
Node.js runtime is valid.
|
|
80
|
-
Target: /opt/hagiscript/node
|
|
81
|
-
Node.js: v22.12.0
|
|
82
|
-
npm: 10.9.0
|
|
83
|
-
node: /opt/hagiscript/node/bin/node
|
|
84
|
-
npm: /opt/hagiscript/node/bin/npm
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
无效运行时会以非零退出码结束,并输出失败原因:
|
|
88
|
-
|
|
89
|
-
```text
|
|
90
|
-
Node.js runtime is invalid.
|
|
91
|
-
Target: /opt/hagiscript/node
|
|
92
|
-
Reason: missing executable
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
### npm 全局包同步
|
|
96
|
-
|
|
97
|
-
`npm-sync` 会根据 JSON manifest,把 HagiScript 托管 Node.js 运行时中的 npm 全局包版本同步到约束范围内。默认情况下,它会验证或安装 `~/.hagiscript/node-runtime`,并使用该运行时内的 `npm`;它不会使用或修改当前 shell `PATH` 中的 npm。已有自动化仍可继续传入 `--runtime` 使用显式运行时目录。
|
|
98
|
-
|
|
99
|
-
```bash
|
|
100
|
-
hagiscript npm-sync --manifest ./manifest.json
|
|
101
|
-
hagiscript npm-sync --runtime /opt/hagiscript/node --manifest ./manifest.json
|
|
102
|
-
hagiscript npm-sync --manifest ./manifest.json --registry-mirror https://registry.npmmirror.com/
|
|
103
|
-
hagiscript npm-sync --manifest ./manifest.json --registry-mirror https://registry.npmmirror.com/ --mirror-only
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
兼容模式 manifest 结构:
|
|
107
|
-
|
|
108
|
-
```json
|
|
109
|
-
{
|
|
110
|
-
"packages": {
|
|
111
|
-
"<npm-package-name>": {
|
|
112
|
-
"version": "<semver range>",
|
|
113
|
-
"target": "<optional npm install selector>"
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
必填的 `version` 字段使用 package.json 风格的 semver 范围,例如 `^1.2.0`、`>=1.0.0 <2.0.0` 或 `1.0.0 || 2.0.0`。可选的 `target` 字段用于指定实际执行 `npm install -g` 时使用的选择器;如果省略,Hagiscript 会安装 `<package>@<version>`。
|
|
120
|
-
|
|
121
|
-
可选的顶层 `registryMirror` 字段用于指定 npm 检测与安装命令所使用的镜像地址,必须是非空的绝对 `http:` 或 `https:` URL。配置后,Hagiscript 会先对 `npm list -g --depth=0 --json` 和 `npm install -g <package>@<selector>` 追加 `--registry <registryMirror>` 并优先走镜像;如果镜像对应的 npm 命令失败,则会把同一条 inventory 或 install 命令自动重试一次到官方源 `https://registry.npmjs.org/`。这个自动降级只作用于 npm inventory 与包变更命令,不会重试运行时校验、manifest 校验或同步计划计算。
|
|
122
|
-
|
|
123
|
-
产品托管的工具同步可使用扩展后的 `tools` manifest。必选工具始终会按 `src/runtime/tool-sync-catalog.config.json` 中的内部固定版本纳入同步:OpenSpec skills(`skills@1.5.1`)、OmniRoute(`omniroute@3.6.9`)和 code-server(`code-server@4.117.0`)。可选 agent CLI 同步需要显式启用;如果传入内置 CLI 或自定义 npm 包选择,它们会被加入同步。
|
|
124
|
-
|
|
125
|
-
```json
|
|
126
|
-
{
|
|
127
|
-
"tools": {
|
|
128
|
-
"optionalAgentCliSyncEnabled": true,
|
|
129
|
-
"selectedOptionalAgentCliIds": ["codex", "claude-code", "fission-openspec", "opencode"],
|
|
130
|
-
"customAgentClis": [
|
|
131
|
-
{
|
|
132
|
-
"packageName": "@scope/agent-cli",
|
|
133
|
-
"version": "^1.0.0"
|
|
134
|
-
}
|
|
135
|
-
]
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
首批内置可选 agent CLI ID 为 `codex`(`@openai/codex@0.125.0`)、`claude-code`(`@anthropic-ai/claude-code@2.1.119`)、`fission-openspec`(`@fission-ai/openspec@1.3.1`)、`qoder`(`@qoder-ai/qodercli@0.1.48`)和 `opencode`(`opencode-ai@1.14.24`)。这些内置包版本固定在 `src/runtime/tool-sync-catalog.config.json` 中。HagiScript 会在执行 `npm list` 或 `npm install` 前校验未知工具 ID、npm 包名和版本选择器。
|
|
141
|
-
|
|
142
|
-
使用 `--registry-mirror <url>` 可以在单次运行中覆盖 manifest 中的镜像地址,优先级依次为 CLI 覆盖、manifest 的 `registryMirror`、以及 npm 默认注册表行为。如果 CLI 与 manifest 都没有提供镜像,Hagiscript 就不会附加 `--registry`,现有的 npm 默认设置、`.npmrc` 或环境变量行为会保持不变。
|
|
143
|
-
|
|
144
|
-
如果某次同步必须严格停留在镜像源且不能自动切回官方源,请添加 `--mirror-only`。省略该选项时,只要配置了镜像,Hagiscript 默认就会在镜像失败后自动回退到 `https://registry.npmjs.org/` 一次。
|
|
145
|
-
|
|
146
|
-
简单的产品托管请求也可以直接通过 CLI 选项传入可选 CLI,而不必先写 manifest:
|
|
147
|
-
|
|
148
|
-
```bash
|
|
149
|
-
hagiscript npm-sync --selected-agent-cli codex
|
|
150
|
-
hagiscript npm-sync --selected-agent-cli codex --custom-agent-cli @scope/agent-cli@^1.0.0
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
openspec 和 skills 工具同步示例:
|
|
154
|
-
|
|
155
|
-
```json
|
|
156
|
-
{
|
|
157
|
-
"packages": {
|
|
158
|
-
"@openspec/cli": {
|
|
159
|
-
"version": "^1.0.0"
|
|
160
|
-
},
|
|
161
|
-
"@hagicode/skills": {
|
|
162
|
-
"version": ">=0.5.0 <1.0.0",
|
|
163
|
-
"target": "0.5.4"
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
执行时,Hagiscript 会先验证 manifest 和运行时,再执行任何 npm install 操作;它会用 `/opt/hagiscript/node/bin/npm list -g --depth=0 --json` 检测全局包,生成 no-op、install、upgrade、downgrade 或 sync 计划,然后只对需要变更的包执行 `npm install -g <package>@<selector>`。
|
|
170
|
-
|
|
171
|
-
输出示例:
|
|
172
|
-
|
|
173
|
-
```text
|
|
174
|
-
Manifest validated: ./manifest.json (2 packages, mode=packages)
|
|
175
|
-
Registry mirror: https://registry.npmmirror.com/
|
|
176
|
-
Fallback policy: auto
|
|
177
|
-
Runtime validated: /opt/hagiscript/node
|
|
178
|
-
node: /opt/hagiscript/node/bin/node (v22.12.0)
|
|
179
|
-
npm: /opt/hagiscript/node/bin/npm (10.9.0)
|
|
180
|
-
Detected global packages: 4
|
|
181
|
-
Plan: @openspec/cli noop installed=1.0.2 required=^1.0.0 selector=@openspec/cli@^1.0.0
|
|
182
|
-
Skip: @openspec/cli already satisfies range
|
|
183
|
-
Plan: @hagicode/skills upgrade installed=0.4.0 required=>=0.5.0 <1.0.0 selector=@hagicode/skills@0.5.4
|
|
184
|
-
Install: @hagicode/skills using @hagicode/skills@0.5.4
|
|
185
|
-
Synced: @hagicode/skills (upgrade)
|
|
186
|
-
npm-sync complete.
|
|
187
|
-
Runtime: /opt/hagiscript/node
|
|
188
|
-
Manifest: ./manifest.json
|
|
189
|
-
Mode: packages
|
|
190
|
-
Registry mirror: https://registry.npmmirror.com/
|
|
191
|
-
Fallback policy: auto
|
|
192
|
-
Fallback used: no
|
|
193
|
-
Packages: 2
|
|
194
|
-
No-op: 1
|
|
195
|
-
Changed: 1
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
如果触发了回退,Hagiscript 会在执行期间输出 `Fallback used: ...`,并在最终摘要中记录 `Fallback detail: ...`,这样 CI 或桌面端自动化就能明确知道哪个镜像失败了、是否切到了官方源,以及官方源重试是否成功。
|
|
199
|
-
|
|
200
|
-
### Runtime 包管理
|
|
201
|
-
|
|
202
|
-
`hagiscript runtime` 提供了面向 `hagicode-runtime` 的 manifest 驱动包管理能力。默认情况下,它会加载安装包内置的 `runtime/manifest.yaml`,把托管运行时根目录解析为 `~/.hagicode/runtime`,然后在该根目录下拆分出只读程序目录和可写运行时数据目录;如果某次部署或自动化需要独立路径,可通过 `--runtime-root <path>` 覆盖基础位置。
|
|
203
|
-
|
|
204
|
-
```bash
|
|
205
|
-
hagiscript runtime install
|
|
206
|
-
hagiscript runtime install --components node,npm-packages --dry-run
|
|
207
|
-
hagiscript runtime update --runtime-root /opt/hagicode/runtime --check-only
|
|
208
|
-
hagiscript runtime remove --components code-server --purge
|
|
209
|
-
hagiscript runtime state --json
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
默认运行时布局如下:
|
|
213
|
-
|
|
214
|
-
```text
|
|
215
|
-
<runtime-root>/
|
|
216
|
-
program/
|
|
217
|
-
bin/
|
|
218
|
-
npm/
|
|
219
|
-
components/
|
|
220
|
-
runtime-data/
|
|
221
|
-
config/
|
|
222
|
-
logs/
|
|
223
|
-
data/
|
|
224
|
-
components/
|
|
225
|
-
state.json
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
`hagiscript runtime state --json` 是安装、更新、删除与下游诊断的标准状态接口。它会输出解析后的运行时程序目录、运行时数据根目录、组件级 `HAGICODE_RUNTIME_DATA_HOME`,以及派生出的 `PM2_HOME`,下游工具不需要再自己探测文件系统。
|
|
229
|
-
|
|
230
|
-
运行时脚本和 PM2 托管服务会共享同一套公开环境变量约定:
|
|
231
|
-
|
|
232
|
-
- `HAGICODE_RUNTIME_HOME`:运行时程序目录
|
|
233
|
-
- `HAGICODE_RUNTIME_DATA_HOME`:当前组件的可写运行时数据目录
|
|
234
|
-
- `PM2_HOME`:默认位于 `HAGICODE_RUNTIME_DATA_HOME` 下的独立子目录
|
|
235
|
-
- `PATH`:优先注入托管 Node 运行时、托管 npm 前缀和托管 wrapper,再继承当前 shell 的 PATH
|
|
236
|
-
|
|
237
|
-
### PM2 托管服务命令
|
|
238
|
-
|
|
239
|
-
`hagiscript pm2` 用于管理运行时作用域内的 `omniroute` 和 `code-server` 服务,底层始终调用 `hagiscript runtime install` 安装到托管 npm 前缀中的 PM2。
|
|
240
|
-
|
|
241
|
-
```bash
|
|
242
|
-
hagiscript pm2 omniroute start
|
|
243
|
-
hagiscript pm2 omniroute status
|
|
244
|
-
hagiscript pm2 code-server stop
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
每次 PM2 命令都会先解析运行时 manifest,计算规范化的运行时目录和组件数据目录,再以组件级 `PM2_HOME` 和托管 Node-first PATH 调用 `<runtime-home>/npm` 下的 PM2;它不会依赖系统预装的 PM2 或系统 Node。
|
|
248
|
-
|
|
249
|
-
`runtime/manifest.yaml` 现在支持以下覆盖项:
|
|
250
|
-
|
|
251
|
-
- 运行时级别:`paths.runtimeHome`、`paths.runtimeDataRoot`、`paths.componentDataRoot`、`paths.defaultPm2Home`
|
|
252
|
-
- 组件级别:`runtimeDataDir`
|
|
253
|
-
- 服务级别:`pm2.appName`、`pm2.cwd`、`pm2.script`、`pm2.args`、`pm2.env`、`pm2.pm2Home`
|
|
254
|
-
|
|
255
|
-
在 ESM 项目中使用库 API:
|
|
256
|
-
|
|
257
|
-
```ts
|
|
258
|
-
import { createRuntimeInfo, getPackageMetadata } from "@hagicode/hagiscript";
|
|
259
|
-
|
|
260
|
-
console.log(getPackageMetadata());
|
|
261
|
-
console.log(createRuntimeInfo());
|
|
262
|
-
```
|
|
263
|
-
|
|
264
|
-
## 开发命令
|
|
265
|
-
|
|
266
|
-
所有命令都应在 `repos/hagiscript/` 下执行:
|
|
267
|
-
|
|
268
|
-
```bash
|
|
269
|
-
npm install
|
|
270
|
-
npm run lint
|
|
271
|
-
npm run format:check
|
|
272
|
-
npm test
|
|
273
|
-
npm run build
|
|
274
|
-
npm run pack:check
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
其他常用命令:
|
|
278
|
-
|
|
279
|
-
```bash
|
|
280
|
-
npm run clean
|
|
281
|
-
npm run format
|
|
282
|
-
npm run test:watch
|
|
283
|
-
npm run publish:prepare-dev-version
|
|
284
|
-
npm run publish:verify-release -- v0.1.0
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
## 构建输出
|
|
288
|
-
|
|
289
|
-
`npm run build` 会使用严格的 NodeNext TypeScript 配置编译到 `dist/`。预期入口文件包括:
|
|
290
|
-
|
|
291
|
-
- `dist/index.js`
|
|
292
|
-
- `dist/index.d.ts`
|
|
293
|
-
- `dist/index.js.map`
|
|
294
|
-
- `dist/cli.js`
|
|
295
|
-
- `dist/cli.d.ts`
|
|
296
|
-
- `dist/cli.js.map`
|
|
297
|
-
|
|
298
|
-
`package.json` 的 `exports` 字段指向 `dist/index.js` 和 `dist/index.d.ts`。发布到 npm 后的包名是 `@hagicode/hagiscript`,`bin.hagiscript` 指向 `dist/cli.js`。
|
|
299
|
-
|
|
300
|
-
## 包内容校验
|
|
301
|
-
|
|
302
|
-
`npm run pack:check` 会执行 dry-run 打包检查。如果缺少必要运行文件,或错误包含源码测试、脚本、覆盖率、临时目录等只应存在于开发环境的文件,脚本会失败。
|
|
303
|
-
|
|
304
|
-
## 发布自动化
|
|
305
|
-
|
|
306
|
-
GitHub Actions 提供三类自动化流程:
|
|
307
|
-
|
|
308
|
-
- `ci.yml` 使用 `npm ci` 安装依赖,并执行测试、构建和包内容校验。
|
|
309
|
-
- `npm-publish.yml` 在 `main` 分支解析唯一预发布版本,用 `npm version --no-git-tag-version` 同步 `package.json` 和 `package-lock.json`,再发布到 `dev` dist-tag。
|
|
310
|
-
- `npm-publish.yml` 也会在非草稿、非 prerelease 的 GitHub Release 发布时,校验 `vX.Y.Z` 标签格式,拒绝早于仓库基础版本的标签,并用同样方式写入稳定版本再发布到 `latest` dist-tag。
|
|
311
|
-
- `release-drafter.yml` 通过 `.github/release-drafter.yml` 维护分类清晰的发布草稿。
|
|
312
|
-
|
|
313
|
-
首次发布前,需要先确保 npm 上已经存在组织或用户 scope `hagicode`,并且 `@hagicode/hagiscript` 已授权当前发布主体。GitHub Actions 发布时,需要在 npm trusted publishing 中配置:package `@hagicode/hagiscript`、owner `HagiCode-org`、repository `hagiscript`、workflow filename `npm-publish.yml`。不要把 workflow filename 填成完整路径;如果 npm 表单有 environment 字段,除非 workflow job 显式声明了 environment,否则保持为空。如果 scope 不存在,或 workflow 身份无权在该 scope 下创建包,npm 会在最后的 `PUT https://registry.npmjs.org/@hagicode%2fhagiscript` 发布请求中返回 `E404 Not Found`。
|
|
314
|
-
|
|
315
|
-
重试失败的发布前,先运行发布前置检查:
|
|
316
|
-
|
|
317
|
-
```bash
|
|
318
|
-
npm run publish:check-prereqs
|
|
319
|
-
```
|
|
320
|
-
|
|
321
|
-
本地手动发布时,先登录一个有权发布到 `@hagicode` scope 的 npm 账号,再直接执行普通 `npm publish`。
|