@hagicode/hagiscript 0.1.0 → 0.1.2
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 +51 -6
- package/README_cn.md +42 -6
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +14 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/npm-sync-commands.js +80 -8
- package/dist/commands/npm-sync-commands.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/runtime/node-installer.d.ts +21 -0
- package/dist/runtime/node-installer.js +39 -0
- package/dist/runtime/node-installer.js.map +1 -1
- package/dist/runtime/npm-global.d.ts +1 -0
- package/dist/runtime/npm-global.js +7 -2
- package/dist/runtime/npm-global.js.map +1 -1
- package/dist/runtime/npm-sync.d.ts +26 -0
- package/dist/runtime/npm-sync.js +159 -6
- package/dist/runtime/npm-sync.js.map +1 -1
- package/dist/runtime/tool-sync-catalog.config.json +77 -0
- package/dist/runtime/tool-sync-catalog.d.ts +48 -0
- package/dist/runtime/tool-sync-catalog.js +189 -0
- package/dist/runtime/tool-sync-catalog.js.map +1 -0
- package/dist/version.d.ts +2 -2
- package/dist/version.js +19 -5
- package/dist/version.js.map +1 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -94,16 +94,19 @@ Reason: missing executable
|
|
|
94
94
|
|
|
95
95
|
### npm Global Package Synchronization
|
|
96
96
|
|
|
97
|
-
`npm-sync` aligns npm global packages inside
|
|
97
|
+
`npm-sync` aligns npm global packages inside a HagiScript-managed Node.js runtime with a JSON manifest. By default, it verifies or installs the managed runtime at `~/.hagiscript/node-runtime` and uses that runtime's `npm`; it does not use or mutate npm from the ambient shell `PATH`. Existing automation can keep passing `--runtime` to use an explicit runtime directory.
|
|
98
98
|
|
|
99
99
|
```bash
|
|
100
|
+
hagiscript npm-sync --manifest ./manifest.json
|
|
100
101
|
hagiscript npm-sync --runtime /opt/hagiscript/node --manifest ./manifest.json
|
|
102
|
+
hagiscript npm-sync --manifest ./manifest.json --registry-mirror https://registry.npmmirror.com/
|
|
101
103
|
```
|
|
102
104
|
|
|
103
|
-
|
|
105
|
+
Compatibility manifest schema:
|
|
104
106
|
|
|
105
107
|
```json
|
|
106
108
|
{
|
|
109
|
+
"registryMirror": "https://registry.npmmirror.com/",
|
|
107
110
|
"packages": {
|
|
108
111
|
"<npm-package-name>": {
|
|
109
112
|
"version": "<semver range>",
|
|
@@ -115,6 +118,37 @@ Manifest schema:
|
|
|
115
118
|
|
|
116
119
|
The required `version` field accepts package.json-style semver ranges such as `^1.2.0`, `>=1.0.0 <2.0.0`, or `1.0.0 || 2.0.0`. The optional `target` field controls the selector used for `npm install -g`; when omitted, Hagiscript installs `<package>@<version>`.
|
|
117
120
|
|
|
121
|
+
The optional top-level `registryMirror` field configures the npm registry used for both inventory and install commands. It must be a non-empty absolute `http:` or `https:` URL. When present, HagiScript appends `--registry <registryMirror>` to `npm list -g --depth=0 --json` and `npm install -g <package>@<selector>` without changing package selection. This is useful for public mirrors such as `https://registry.npmmirror.com/` or enterprise registries such as `https://npm.company.example/repository/npm/`.
|
|
122
|
+
|
|
123
|
+
Product-managed tool sync can use the expanded `tools` manifest shape. Mandatory tools are always included using internally pinned versions from `src/runtime/tool-sync-catalog.config.json`: OpenSpec skills (`skills@1.5.1`), OmniRoute (`omniroute@3.6.9`), and code-server (`code-server@4.117.0`). Optional agent CLI sync is enabled explicitly; selected built-in CLIs or custom npm packages are added when provided.
|
|
124
|
+
|
|
125
|
+
```json
|
|
126
|
+
{
|
|
127
|
+
"registryMirror": "https://npm.company.example/repository/npm/",
|
|
128
|
+
"tools": {
|
|
129
|
+
"optionalAgentCliSyncEnabled": true,
|
|
130
|
+
"selectedOptionalAgentCliIds": ["codex", "claude-code", "fission-openspec", "opencode"],
|
|
131
|
+
"customAgentClis": [
|
|
132
|
+
{
|
|
133
|
+
"packageName": "@scope/agent-cli",
|
|
134
|
+
"version": "^1.0.0"
|
|
135
|
+
}
|
|
136
|
+
]
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
The first built-in optional agent CLI IDs are `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`), and `opencode` (`opencode-ai@1.14.24`). These built-in package versions are pinned in `src/runtime/tool-sync-catalog.config.json`. HagiScript validates unknown tool IDs, npm package names, and version selectors before `npm list` or `npm install` runs.
|
|
142
|
+
|
|
143
|
+
Use `--registry-mirror <url>` when automation needs to override the manifest registry for a single run. Precedence is CLI override first, manifest `registryMirror` second, and npm's default registry behavior third. If neither the CLI nor manifest provides a mirror, HagiScript does not add `--registry` and existing npm defaults, `.npmrc`, or environment configuration continue to apply.
|
|
144
|
+
|
|
145
|
+
For simple product-managed requests, optional CLI selections can be provided directly without writing a manifest:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
hagiscript npm-sync --selected-agent-cli codex
|
|
149
|
+
hagiscript npm-sync --selected-agent-cli codex --custom-agent-cli @scope/agent-cli@^1.0.0
|
|
150
|
+
```
|
|
151
|
+
|
|
118
152
|
Example manifest for openspec and skills tooling:
|
|
119
153
|
|
|
120
154
|
```json
|
|
@@ -136,7 +170,8 @@ During execution, Hagiscript validates the manifest and runtime before any npm i
|
|
|
136
170
|
Example output:
|
|
137
171
|
|
|
138
172
|
```text
|
|
139
|
-
Manifest validated: ./manifest.json (2 packages)
|
|
173
|
+
Manifest validated: ./manifest.json (2 packages, mode=packages)
|
|
174
|
+
Registry mirror: https://registry.npmmirror.com/
|
|
140
175
|
Runtime validated: /opt/hagiscript/node
|
|
141
176
|
node: /opt/hagiscript/node/bin/node (v22.12.0)
|
|
142
177
|
npm: /opt/hagiscript/node/bin/npm (10.9.0)
|
|
@@ -149,6 +184,8 @@ Synced: @hagicode/skills (upgrade)
|
|
|
149
184
|
npm-sync complete.
|
|
150
185
|
Runtime: /opt/hagiscript/node
|
|
151
186
|
Manifest: ./manifest.json
|
|
187
|
+
Mode: packages
|
|
188
|
+
Registry mirror: https://registry.npmmirror.com/
|
|
152
189
|
Packages: 2
|
|
153
190
|
No-op: 1
|
|
154
191
|
Changed: 1
|
|
@@ -208,8 +245,16 @@ The package `exports` field points consumers to `dist/index.js` and `dist/index.
|
|
|
208
245
|
GitHub Actions provide three automation paths:
|
|
209
246
|
|
|
210
247
|
- `ci.yml` installs dependencies with `npm ci`, then runs lint, format check, tests, build, and package verification.
|
|
211
|
-
- `npm-publish.yml`
|
|
212
|
-
- `npm-publish.yml` also publishes stable GitHub releases tagged as `vX.Y.Z` to the `latest` dist-tag after validating the tag
|
|
248
|
+
- `npm-publish.yml` resolves a unique prerelease version from `main`, stamps both `package.json` and `package-lock.json` with `npm version --no-git-tag-version`, then publishes to the `dev` dist-tag.
|
|
249
|
+
- `npm-publish.yml` also publishes stable GitHub releases tagged as `vX.Y.Z` to the `latest` dist-tag after validating the tag format, rejecting tags older than the repository base version, and stamping the stable version the same way.
|
|
213
250
|
- `release-drafter.yml` keeps a categorized release draft using `.github/release-drafter.yml`.
|
|
214
251
|
|
|
215
|
-
Before the first publish, make sure the npm organization `hagicode` exists and grant publish access for `@hagicode/hagiscript`. For GitHub Actions releases, configure npm trusted publishing.
|
|
252
|
+
Before the first publish, make sure the npm organization or user scope `hagicode` exists on npm and grant publish access for `@hagicode/hagiscript`. For GitHub Actions releases, configure npm trusted publishing with package `@hagicode/hagiscript`, owner `HagiCode-org`, repository `hagiscript`, and workflow filename `npm-publish.yml`. Do not enter the full workflow path as the filename; leave the npm environment field empty unless the workflow job explicitly declares an environment. If the scope is missing or the workflow identity cannot create packages under it, npm returns `E404 Not Found` during the final `PUT https://registry.npmjs.org/@hagicode%2fhagiscript` publish request.
|
|
253
|
+
|
|
254
|
+
Run the publish prerequisite check before retrying a failed release:
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
npm run publish:check-prereqs
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
For local manual releases, run plain `npm publish` after logging in with an npm account that can publish under `@hagicode`.
|
package/README_cn.md
CHANGED
|
@@ -94,13 +94,14 @@ Reason: missing executable
|
|
|
94
94
|
|
|
95
95
|
### npm 全局包同步
|
|
96
96
|
|
|
97
|
-
`npm-sync` 会根据 JSON manifest
|
|
97
|
+
`npm-sync` 会根据 JSON manifest,把 HagiScript 托管 Node.js 运行时中的 npm 全局包版本同步到约束范围内。默认情况下,它会验证或安装 `~/.hagiscript/node-runtime`,并使用该运行时内的 `npm`;它不会使用或修改当前 shell `PATH` 中的 npm。已有自动化仍可继续传入 `--runtime` 使用显式运行时目录。
|
|
98
98
|
|
|
99
99
|
```bash
|
|
100
|
+
hagiscript npm-sync --manifest ./manifest.json
|
|
100
101
|
hagiscript npm-sync --runtime /opt/hagiscript/node --manifest ./manifest.json
|
|
101
102
|
```
|
|
102
103
|
|
|
103
|
-
|
|
104
|
+
兼容模式 manifest 结构:
|
|
104
105
|
|
|
105
106
|
```json
|
|
106
107
|
{
|
|
@@ -115,6 +116,32 @@ Manifest 结构:
|
|
|
115
116
|
|
|
116
117
|
必填的 `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>`。
|
|
117
118
|
|
|
119
|
+
产品托管的工具同步可使用扩展后的 `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 包选择,它们会被加入同步。
|
|
120
|
+
|
|
121
|
+
```json
|
|
122
|
+
{
|
|
123
|
+
"tools": {
|
|
124
|
+
"optionalAgentCliSyncEnabled": true,
|
|
125
|
+
"selectedOptionalAgentCliIds": ["codex", "claude-code", "fission-openspec", "opencode"],
|
|
126
|
+
"customAgentClis": [
|
|
127
|
+
{
|
|
128
|
+
"packageName": "@scope/agent-cli",
|
|
129
|
+
"version": "^1.0.0"
|
|
130
|
+
}
|
|
131
|
+
]
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
首批内置可选 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 包名和版本选择器。
|
|
137
|
+
|
|
138
|
+
简单的产品托管请求也可以直接通过 CLI 选项传入可选 CLI,而不必先写 manifest:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
hagiscript npm-sync --selected-agent-cli codex
|
|
142
|
+
hagiscript npm-sync --selected-agent-cli codex --custom-agent-cli @scope/agent-cli@^1.0.0
|
|
143
|
+
```
|
|
144
|
+
|
|
118
145
|
openspec 和 skills 工具同步示例:
|
|
119
146
|
|
|
120
147
|
```json
|
|
@@ -136,7 +163,7 @@ openspec 和 skills 工具同步示例:
|
|
|
136
163
|
输出示例:
|
|
137
164
|
|
|
138
165
|
```text
|
|
139
|
-
Manifest validated: ./manifest.json (2 packages)
|
|
166
|
+
Manifest validated: ./manifest.json (2 packages, mode=packages)
|
|
140
167
|
Runtime validated: /opt/hagiscript/node
|
|
141
168
|
node: /opt/hagiscript/node/bin/node (v22.12.0)
|
|
142
169
|
npm: /opt/hagiscript/node/bin/npm (10.9.0)
|
|
@@ -149,6 +176,7 @@ Synced: @hagicode/skills (upgrade)
|
|
|
149
176
|
npm-sync complete.
|
|
150
177
|
Runtime: /opt/hagiscript/node
|
|
151
178
|
Manifest: ./manifest.json
|
|
179
|
+
Mode: packages
|
|
152
180
|
Packages: 2
|
|
153
181
|
No-op: 1
|
|
154
182
|
Changed: 1
|
|
@@ -208,8 +236,16 @@ npm run publish:verify-release -- v0.1.0
|
|
|
208
236
|
GitHub Actions 提供三类自动化流程:
|
|
209
237
|
|
|
210
238
|
- `ci.yml` 使用 `npm ci` 安装依赖,并执行 lint、格式检查、测试、构建和包内容校验。
|
|
211
|
-
- `npm-publish.yml` 在 `main`
|
|
212
|
-
- `npm-publish.yml` 也会在非草稿、非 prerelease 的 GitHub Release 发布时,校验 `vX.Y.Z`
|
|
239
|
+
- `npm-publish.yml` 在 `main` 分支解析唯一预发布版本,用 `npm version --no-git-tag-version` 同步 `package.json` 和 `package-lock.json`,再发布到 `dev` dist-tag。
|
|
240
|
+
- `npm-publish.yml` 也会在非草稿、非 prerelease 的 GitHub Release 发布时,校验 `vX.Y.Z` 标签格式,拒绝早于仓库基础版本的标签,并用同样方式写入稳定版本再发布到 `latest` dist-tag。
|
|
213
241
|
- `release-drafter.yml` 通过 `.github/release-drafter.yml` 维护分类清晰的发布草稿。
|
|
214
242
|
|
|
215
|
-
首次发布前,需要先确保 npm
|
|
243
|
+
首次发布前,需要先确保 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`。
|
|
244
|
+
|
|
245
|
+
重试失败的发布前,先运行发布前置检查:
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
npm run publish:check-prereqs
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
本地手动发布时,先登录一个有权发布到 `@hagicode` scope 的 npm 账号,再直接执行普通 `npm publish`。
|
package/dist/cli.d.ts
CHANGED
package/dist/cli.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { realpathSync } from "node:fs";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
2
4
|
import { Command } from "commander";
|
|
3
5
|
import { createRuntimeInfo, packageVersion } from "./index.js";
|
|
4
6
|
import { registerNpmSyncCommand } from "./commands/npm-sync-commands.js";
|
|
@@ -27,7 +29,18 @@ export async function runCli(argv = process.argv) {
|
|
|
27
29
|
const program = createCli();
|
|
28
30
|
await program.parseAsync(argv);
|
|
29
31
|
}
|
|
30
|
-
|
|
32
|
+
export function isCliEntrypoint(moduleUrl = import.meta.url, argvPath = process.argv[1]) {
|
|
33
|
+
if (!argvPath) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
return realpathSync(fileURLToPath(moduleUrl)) === realpathSync(argvPath);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (isCliEntrypoint()) {
|
|
31
44
|
runCli().catch((error) => {
|
|
32
45
|
const message = error instanceof Error ? error.message : String(error);
|
|
33
46
|
process.stderr.write(`${message}\n`);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAElF,MAAM,UAAU,SAAS;IACvB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,YAAY,CAAC;SAClB,WAAW,CAAC,6CAA6C,CAAC;SAC1D,OAAO,CAAC,cAAc,EAAE,eAAe,EAAE,8BAA8B,CAAC,CAAC;IAE5E,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;QACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEL,2BAA2B,CAAC,OAAO,CAAC,CAAC;IACrC,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAEhC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;QAClB,OAAO,CAAC,UAAU,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;IAC9C,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;IAC5B,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAElF,MAAM,UAAU,SAAS;IACvB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,YAAY,CAAC;SAClB,WAAW,CAAC,6CAA6C,CAAC;SAC1D,OAAO,CAAC,cAAc,EAAE,eAAe,EAAE,8BAA8B,CAAC,CAAC;IAE5E,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;QACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEL,2BAA2B,CAAC,OAAO,CAAC,CAAC;IACrC,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAEhC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;QAClB,OAAO,CAAC,UAAU,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;IAC9C,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;IAC5B,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAC3B,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAE1B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,KAAK,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,IAAI,eAAe,EAAE,EAAE,CAAC;IACtB,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QAChC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,18 +1,46 @@
|
|
|
1
1
|
import { InvalidArgumentError } from "commander";
|
|
2
|
-
import {
|
|
2
|
+
import { mkdtemp, writeFile } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { getDefaultManagedNodeRuntimeDirectory, resolveManagedNodeRuntime } from "../runtime/node-installer.js";
|
|
6
|
+
import { NpmManifestValidationError, NpmSyncCommandError, syncNpmGlobals, validateRegistryMirror } from "../runtime/npm-sync.js";
|
|
3
7
|
export function registerNpmSyncCommand(program) {
|
|
4
8
|
program
|
|
5
9
|
.command("npm-sync")
|
|
6
|
-
.description("sync npm
|
|
7
|
-
.
|
|
8
|
-
.
|
|
10
|
+
.description("sync managed npm tools using HagiScript's Node.js runtime, or an explicit runtime for compatibility")
|
|
11
|
+
.option("--runtime <path>", "explicit Node.js runtime directory")
|
|
12
|
+
.option("--managed-runtime <path>", "HagiScript-managed runtime directory to verify or install before sync")
|
|
13
|
+
.option("--manifest <path>", "npm-sync manifest JSON file")
|
|
14
|
+
.option("--registry-mirror <url>", "npm registry mirror URL to use for this sync run")
|
|
15
|
+
.option("--selected-agent-cli <id>", "selected optional agent CLI ID for product-managed tool sync", collectValues, [])
|
|
16
|
+
.option("--custom-agent-cli <package[@version]>", "custom npm-installable agent CLI for product-managed tool sync", collectValues, [])
|
|
9
17
|
.action(async (options, command) => {
|
|
10
|
-
const
|
|
11
|
-
|
|
18
|
+
const explicitRuntime = options.runtime
|
|
19
|
+
? validatePathOption(options.runtime, "--runtime")
|
|
20
|
+
: undefined;
|
|
21
|
+
const registryMirror = validateRegistryMirror(options.registryMirror, "--registry-mirror");
|
|
22
|
+
const selectedAgentCliIds = options.selectedAgentCli ?? [];
|
|
23
|
+
const customAgentCliSelectors = options.customAgentCli ?? [];
|
|
24
|
+
const hasInlineToolSelection = selectedAgentCliIds.length > 0 || customAgentCliSelectors.length > 0;
|
|
25
|
+
const manifestPath = options.manifest
|
|
26
|
+
? validatePathOption(options.manifest, "--manifest")
|
|
27
|
+
: hasInlineToolSelection
|
|
28
|
+
? await writeInlineToolManifest(selectedAgentCliIds, customAgentCliSelectors)
|
|
29
|
+
: undefined;
|
|
30
|
+
if (!manifestPath) {
|
|
31
|
+
throw new InvalidArgumentError("--manifest is required unless --selected-agent-cli or --custom-agent-cli is provided.");
|
|
32
|
+
}
|
|
33
|
+
const managedRuntimePath = options.managedRuntime
|
|
34
|
+
? validatePathOption(options.managedRuntime, "--managed-runtime")
|
|
35
|
+
: getDefaultManagedNodeRuntimeDirectory();
|
|
12
36
|
try {
|
|
37
|
+
const runtimePath = explicitRuntime ?? (await resolveManagedNodeRuntime({
|
|
38
|
+
targetDirectory: managedRuntimePath
|
|
39
|
+
})).targetDirectory;
|
|
13
40
|
await syncNpmGlobals({
|
|
14
41
|
runtimePath,
|
|
15
42
|
manifestPath,
|
|
43
|
+
registryMirror,
|
|
16
44
|
onLog: printNpmSyncLog
|
|
17
45
|
});
|
|
18
46
|
}
|
|
@@ -21,6 +49,37 @@ export function registerNpmSyncCommand(program) {
|
|
|
21
49
|
}
|
|
22
50
|
});
|
|
23
51
|
}
|
|
52
|
+
function collectValues(value, previous) {
|
|
53
|
+
return [...previous, value];
|
|
54
|
+
}
|
|
55
|
+
async function writeInlineToolManifest(selectedAgentCliIds, customAgentCliSelectors) {
|
|
56
|
+
const directory = await mkdtemp(join(tmpdir(), "hagiscript-tool-sync-"));
|
|
57
|
+
const manifestPath = join(directory, "manifest.json");
|
|
58
|
+
await writeFile(manifestPath, JSON.stringify({
|
|
59
|
+
tools: {
|
|
60
|
+
optionalAgentCliSyncEnabled: true,
|
|
61
|
+
selectedOptionalAgentCliIds: selectedAgentCliIds,
|
|
62
|
+
customAgentClis: customAgentCliSelectors.map(parseCustomAgentCli)
|
|
63
|
+
}
|
|
64
|
+
}, null, 2));
|
|
65
|
+
return manifestPath;
|
|
66
|
+
}
|
|
67
|
+
function parseCustomAgentCli(selector) {
|
|
68
|
+
const trimmed = selector.trim();
|
|
69
|
+
const versionSeparator = trimmed.startsWith("@")
|
|
70
|
+
? trimmed.indexOf("@", 1)
|
|
71
|
+
: trimmed.indexOf("@");
|
|
72
|
+
if (versionSeparator <= 0) {
|
|
73
|
+
return { packageName: trimmed };
|
|
74
|
+
}
|
|
75
|
+
const packageName = trimmed.slice(0, versionSeparator);
|
|
76
|
+
const version = trimmed.slice(versionSeparator + 1);
|
|
77
|
+
return {
|
|
78
|
+
packageName,
|
|
79
|
+
version,
|
|
80
|
+
target: version
|
|
81
|
+
};
|
|
82
|
+
}
|
|
24
83
|
function validatePathOption(value, optionName) {
|
|
25
84
|
const normalized = value?.trim();
|
|
26
85
|
if (!normalized) {
|
|
@@ -34,7 +93,10 @@ function validatePathOption(value, optionName) {
|
|
|
34
93
|
function printNpmSyncLog(event) {
|
|
35
94
|
switch (event.type) {
|
|
36
95
|
case "manifest-loaded":
|
|
37
|
-
process.stdout.write(`Manifest validated: ${event.manifestPath} (${event.packageCount} packages)\n`);
|
|
96
|
+
process.stdout.write(`Manifest validated: ${event.manifestPath} (${event.packageCount} packages, mode=${event.syncMode})\n`);
|
|
97
|
+
if (event.registryMirror) {
|
|
98
|
+
process.stdout.write(`Registry mirror: ${event.registryMirror}\n`);
|
|
99
|
+
}
|
|
38
100
|
break;
|
|
39
101
|
case "runtime-valid":
|
|
40
102
|
process.stdout.write(`Runtime validated: ${event.runtime.targetDirectory}\n`);
|
|
@@ -45,7 +107,7 @@ function printNpmSyncLog(event) {
|
|
|
45
107
|
process.stdout.write(`Detected global packages: ${Object.keys(event.packages).sort().length}\n`);
|
|
46
108
|
break;
|
|
47
109
|
case "planned-action":
|
|
48
|
-
process.stdout.write(`Plan: ${event.action.packageName} ${event.action.action} installed=${event.action.installedVersion ?? "missing"} required=${event.action.requiredRange} selector=${event.action.selectedInstallSelector}\n`);
|
|
110
|
+
process.stdout.write(`Plan: ${event.action.packageName} ${event.action.action} installed=${event.action.installedVersion ?? "missing"} required=${event.action.requiredRange} selector=${event.action.selectedInstallSelector}${formatToolMetadata(event.action)}\n`);
|
|
49
111
|
break;
|
|
50
112
|
case "skip":
|
|
51
113
|
process.stdout.write(`Skip: ${event.action.packageName} already satisfies range\n`);
|
|
@@ -65,10 +127,20 @@ function printSummary(summary) {
|
|
|
65
127
|
process.stdout.write(`npm-sync complete.\n`);
|
|
66
128
|
process.stdout.write(`Runtime: ${summary.runtime.targetDirectory}\n`);
|
|
67
129
|
process.stdout.write(`Manifest: ${summary.manifestPath}\n`);
|
|
130
|
+
process.stdout.write(`Mode: ${summary.syncMode}\n`);
|
|
131
|
+
if (summary.registryMirror) {
|
|
132
|
+
process.stdout.write(`Registry mirror: ${summary.registryMirror}\n`);
|
|
133
|
+
}
|
|
68
134
|
process.stdout.write(`Packages: ${summary.packageCount}\n`);
|
|
69
135
|
process.stdout.write(`No-op: ${summary.noopCount}\n`);
|
|
70
136
|
process.stdout.write(`Changed: ${summary.changedCount}\n`);
|
|
71
137
|
}
|
|
138
|
+
function formatToolMetadata(action) {
|
|
139
|
+
if (!action.toolId) {
|
|
140
|
+
return "";
|
|
141
|
+
}
|
|
142
|
+
return ` tool=${action.toolId} group=${action.toolGroup ?? "unknown"}`;
|
|
143
|
+
}
|
|
72
144
|
function formatNpmSyncError(error) {
|
|
73
145
|
if (error instanceof NpmManifestValidationError) {
|
|
74
146
|
return error.message;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npm-sync-commands.js","sourceRoot":"","sources":["../../src/commands/npm-sync-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,cAAc,
|
|
1
|
+
{"version":3,"file":"npm-sync-commands.js","sourceRoot":"","sources":["../../src/commands/npm-sync-commands.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export interface HagiscriptRuntimeInfo {
|
|
|
5
5
|
status: "foundation";
|
|
6
6
|
}
|
|
7
7
|
export declare function createRuntimeInfo(): HagiscriptRuntimeInfo;
|
|
8
|
-
export { installNodeRuntime, type InstallNodeRuntimeResult } from "./runtime/node-installer.js";
|
|
8
|
+
export { getDefaultManagedNodeRuntimeDirectory, installNodeRuntime, resolveManagedNodeRuntime, type InstallNodeRuntimeResult, type ResolveManagedNodeRuntimeResult } from "./runtime/node-installer.js";
|
|
9
9
|
export { verifyNodeRuntime, type NodeRuntimeVerificationResult } from "./runtime/node-verify.js";
|
|
10
10
|
export { createNpmSyncPlan, loadNpmSyncManifest, normalizeGlobalInventory, syncNpmGlobals, validateNpmSyncManifest, type InstalledGlobalPackages, type NpmSyncActionKind, type NpmSyncActionResult, type NpmSyncManifest, type NpmSyncManifestEntry, type NpmSyncPlannedAction, type NpmSyncRuntimeMetadata, type NpmSyncSummary } from "./runtime/npm-sync.js";
|
|
11
|
+
export { buildToolSyncPackageSet, builtInToolSyncCatalog, normalizeToolSyncEntry, validateToolSyncCatalog, type CustomAgentCliToolInput, type ToolSyncCatalogEntry, type ToolSyncGroupId, type ToolSyncPackageConstraint, type ToolSyncRequirement, type ToolSyncSelection } from "./runtime/tool-sync-catalog.js";
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,8 @@ export function createRuntimeInfo() {
|
|
|
7
7
|
status: "foundation"
|
|
8
8
|
};
|
|
9
9
|
}
|
|
10
|
-
export { installNodeRuntime } from "./runtime/node-installer.js";
|
|
10
|
+
export { getDefaultManagedNodeRuntimeDirectory, installNodeRuntime, resolveManagedNodeRuntime } from "./runtime/node-installer.js";
|
|
11
11
|
export { verifyNodeRuntime } from "./runtime/node-verify.js";
|
|
12
12
|
export { createNpmSyncPlan, loadNpmSyncManifest, normalizeGlobalInventory, syncNpmGlobals, validateNpmSyncManifest } from "./runtime/npm-sync.js";
|
|
13
|
+
export { buildToolSyncPackageSet, builtInToolSyncCatalog, normalizeToolSyncEntry, validateToolSyncCatalog } from "./runtime/tool-sync-catalog.js";
|
|
13
14
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,cAAc,EAEf,MAAM,cAAc,CAAC;AAQtB,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,WAAW;QACX,OAAO,EAAE,cAAc;QACvB,MAAM,EAAE,YAAY;KACrB,CAAC;AACJ,CAAC;AAED,OAAO,EACL,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,cAAc,EAEf,MAAM,cAAc,CAAC;AAQtB,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,WAAW;QACX,OAAO,EAAE,cAAc;QACvB,MAAM,EAAE,YAAY;KACrB,CAAC;AACJ,CAAC;AAED,OAAO,EACL,qCAAqC,EACrC,kBAAkB,EAClB,yBAAyB,EAG1B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,iBAAiB,EAElB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,EACxB,cAAc,EACd,uBAAuB,EASxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EAOxB,MAAM,gCAAgC,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type DownloadProgress } from "./node-download.js";
|
|
2
|
+
import { verifyNodeRuntime } from "./node-verify.js";
|
|
2
3
|
export interface InstallNodeRuntimeOptions {
|
|
3
4
|
targetDirectory: string;
|
|
4
5
|
versionSelector?: string;
|
|
@@ -7,6 +8,16 @@ export interface InstallNodeRuntimeOptions {
|
|
|
7
8
|
verifyTimeoutMs?: number;
|
|
8
9
|
onProgress?: (progress: DownloadProgress) => void;
|
|
9
10
|
}
|
|
11
|
+
export interface ResolveManagedNodeRuntimeOptions {
|
|
12
|
+
targetDirectory?: string;
|
|
13
|
+
versionSelector?: string;
|
|
14
|
+
fetchImpl?: typeof fetch;
|
|
15
|
+
downloadTimeoutMs?: number;
|
|
16
|
+
verifyTimeoutMs?: number;
|
|
17
|
+
verifyRuntime?: typeof verifyNodeRuntime;
|
|
18
|
+
installRuntime?: typeof installNodeRuntime;
|
|
19
|
+
onProgress?: (progress: DownloadProgress) => void;
|
|
20
|
+
}
|
|
10
21
|
export interface InstallNodeRuntimeResult {
|
|
11
22
|
version: string;
|
|
12
23
|
npmVersion: string;
|
|
@@ -15,4 +26,14 @@ export interface InstallNodeRuntimeResult {
|
|
|
15
26
|
npmPath: string;
|
|
16
27
|
archiveUrl: string;
|
|
17
28
|
}
|
|
29
|
+
export interface ResolveManagedNodeRuntimeResult {
|
|
30
|
+
targetDirectory: string;
|
|
31
|
+
nodePath: string;
|
|
32
|
+
npmPath: string;
|
|
33
|
+
nodeVersion: string;
|
|
34
|
+
npmVersion: string;
|
|
35
|
+
installed: boolean;
|
|
36
|
+
}
|
|
37
|
+
export declare function getDefaultManagedNodeRuntimeDirectory(): string;
|
|
38
|
+
export declare function resolveManagedNodeRuntime(options?: ResolveManagedNodeRuntimeOptions): Promise<ResolveManagedNodeRuntimeResult>;
|
|
18
39
|
export declare function installNodeRuntime(options: InstallNodeRuntimeOptions): Promise<InstallNodeRuntimeResult>;
|
|
@@ -1,10 +1,38 @@
|
|
|
1
1
|
import { mkdtemp, rm } from "node:fs/promises";
|
|
2
2
|
import { dirname, join, resolve } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
3
4
|
import { assertTargetIsEmptyOrMissing, extractNodeArchive, moveExtractedRootToTarget } from "./node-extract.js";
|
|
4
5
|
import { downloadNodeArchive } from "./node-download.js";
|
|
5
6
|
import { fetchNodeReleaseMetadata, selectNodeArchive } from "./node-release.js";
|
|
6
7
|
import { mapNodePlatform } from "./node-platform.js";
|
|
7
8
|
import { getRuntimeExecutablePaths, verifyNodeRuntime } from "./node-verify.js";
|
|
9
|
+
export function getDefaultManagedNodeRuntimeDirectory() {
|
|
10
|
+
return join(homedir(), ".hagiscript", "node-runtime");
|
|
11
|
+
}
|
|
12
|
+
export async function resolveManagedNodeRuntime(options = {}) {
|
|
13
|
+
const targetDirectory = resolve(options.targetDirectory ?? getDefaultManagedNodeRuntimeDirectory());
|
|
14
|
+
const verifyRuntime = options.verifyRuntime ?? verifyNodeRuntime;
|
|
15
|
+
const initialVerification = await verifyRuntime(targetDirectory, {
|
|
16
|
+
timeoutMs: options.verifyTimeoutMs
|
|
17
|
+
});
|
|
18
|
+
if (initialVerification.valid) {
|
|
19
|
+
return toResolvedRuntime(initialVerification, false);
|
|
20
|
+
}
|
|
21
|
+
const installRuntime = options.installRuntime ?? installNodeRuntime;
|
|
22
|
+
await installRuntime({
|
|
23
|
+
targetDirectory,
|
|
24
|
+
versionSelector: options.versionSelector,
|
|
25
|
+
fetchImpl: options.fetchImpl,
|
|
26
|
+
downloadTimeoutMs: options.downloadTimeoutMs,
|
|
27
|
+
verifyTimeoutMs: options.verifyTimeoutMs,
|
|
28
|
+
onProgress: options.onProgress
|
|
29
|
+
});
|
|
30
|
+
const finalVerification = await verifyRuntime(targetDirectory, {
|
|
31
|
+
timeoutMs: options.verifyTimeoutMs
|
|
32
|
+
});
|
|
33
|
+
assertValidVerification(finalVerification);
|
|
34
|
+
return toResolvedRuntime(finalVerification, true);
|
|
35
|
+
}
|
|
8
36
|
export async function installNodeRuntime(options) {
|
|
9
37
|
const targetDirectory = resolve(options.targetDirectory);
|
|
10
38
|
await assertTargetIsEmptyOrMissing(targetDirectory);
|
|
@@ -43,4 +71,15 @@ function assertValidVerification(verification) {
|
|
|
43
71
|
throw new Error(`Installed Node.js runtime failed verification: ${verification.failureReason ?? "unknown failure"}`);
|
|
44
72
|
}
|
|
45
73
|
}
|
|
74
|
+
function toResolvedRuntime(verification, installed) {
|
|
75
|
+
assertValidVerification(verification);
|
|
76
|
+
return {
|
|
77
|
+
targetDirectory: verification.targetDirectory,
|
|
78
|
+
nodePath: verification.nodePath,
|
|
79
|
+
npmPath: verification.npmPath,
|
|
80
|
+
nodeVersion: verification.nodeVersion,
|
|
81
|
+
npmVersion: verification.npmVersion,
|
|
82
|
+
installed
|
|
83
|
+
};
|
|
84
|
+
}
|
|
46
85
|
//# sourceMappingURL=node-installer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-installer.js","sourceRoot":"","sources":["../../src/runtime/node-installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EACL,4BAA4B,EAC5B,kBAAkB,EAClB,yBAAyB,EAC1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAyB,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EAElB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"node-installer.js","sourceRoot":"","sources":["../../src/runtime/node-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ export declare class NpmCommandError extends Error {
|
|
|
14
14
|
export interface NpmGlobalCommandOptions {
|
|
15
15
|
timeoutMs?: number;
|
|
16
16
|
env?: NodeJS.ProcessEnv;
|
|
17
|
+
registryMirror?: string;
|
|
17
18
|
runCommand?: (command: string, args: string[], timeoutMs: number) => Promise<NpmCommandResult>;
|
|
18
19
|
}
|
|
19
20
|
export declare function listGlobalPackages(npmPath: string, options?: NpmGlobalCommandOptions): Promise<NpmCommandResult>;
|
|
@@ -10,10 +10,15 @@ export class NpmCommandError extends Error {
|
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
export async function listGlobalPackages(npmPath, options = {}) {
|
|
13
|
-
return runNpmCommand(npmPath, ["list", "-g", "--depth=0", "--json"], options);
|
|
13
|
+
return runNpmCommand(npmPath, appendRegistryMirror(["list", "-g", "--depth=0", "--json"], options), options);
|
|
14
14
|
}
|
|
15
15
|
export async function installGlobalPackage(npmPath, selector, options = {}) {
|
|
16
|
-
return runNpmCommand(npmPath, ["install", "-g", selector], options);
|
|
16
|
+
return runNpmCommand(npmPath, appendRegistryMirror(["install", "-g", selector], options), options);
|
|
17
|
+
}
|
|
18
|
+
function appendRegistryMirror(args, options) {
|
|
19
|
+
return options.registryMirror
|
|
20
|
+
? [...args, "--registry", options.registryMirror]
|
|
21
|
+
: args;
|
|
17
22
|
}
|
|
18
23
|
async function runNpmCommand(npmPath, args, options) {
|
|
19
24
|
const timeoutMs = options.timeoutMs ?? 120_000;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npm-global.js","sourceRoot":"","sources":["../../src/runtime/npm-global.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA0B,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAa1C,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAC/B,OAAO,CAA2B;IAE3C,YAAY,OAAe,EAAE,OAAiC;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"npm-global.js","sourceRoot":"","sources":["../../src/runtime/npm-global.ts"],"names":[],"mappings":"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"}
|