@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 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 an explicit Node.js runtime with a JSON manifest. It always uses the `npm` executable resolved from `--runtime`; it does not use or mutate npm from the ambient shell `PATH`.
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
- Manifest schema:
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` publishes a unique prerelease version to the `dev` dist-tag from `main`.
212
- - `npm-publish.yml` also publishes stable GitHub releases tagged as `vX.Y.Z` to the `latest` dist-tag after validating the tag against `package.json`.
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. For local manual releases, run plain `npm publish`.
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,把指定 Node.js 运行时中的 npm 全局包版本同步到约束范围内。它始终使用 `--runtime` 解析出的 `npm` 可执行文件,不会使用或修改当前 shell `PATH` 中的 npm
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
- Manifest 结构:
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` 分支发布唯一预发布版本到 `dev` dist-tag。
212
- - `npm-publish.yml` 也会在非草稿、非 prerelease 的 GitHub Release 发布时,校验 `vX.Y.Z` 标签并发布到 `latest` dist-tag。
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 组织 `hagicode` 已存在,并且 `@hagicode/hagiscript` 已授权当前发布主体。GitHub Actions 发布时再配置 trusted publishing;本地手动发布时直接执行普通 `npm publish` 即可。
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
@@ -2,3 +2,4 @@
2
2
  import { Command } from "commander";
3
3
  export declare function createCli(): Command;
4
4
  export declare function runCli(argv?: string[]): Promise<void>;
5
+ export declare function isCliEntrypoint(moduleUrl?: string, argvPath?: string): boolean;
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
- if (import.meta.url === `file://${process.argv[1]}`) {
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,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,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
+ {"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 { NpmManifestValidationError, NpmSyncCommandError, syncNpmGlobals } from "../runtime/npm-sync.js";
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 global packages in an explicit Node.js runtime")
7
- .requiredOption("--runtime <path>", "target Node.js runtime directory")
8
- .requiredOption("--manifest <path>", "npm-sync manifest JSON file")
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 runtimePath = validatePathOption(options.runtime, "--runtime");
11
- const manifestPath = validatePathOption(options.manifest, "--manifest");
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":"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"}
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,EAEnB,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"}
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;AAoB1B,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAkC;IAElC,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACzD,MAAM,4BAA4B,CAAC,eAAe,CAAC,CAAC;IAEpD,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,iBAAiB,CAC/B,QAAQ,EACR,OAAO,CAAC,eAAe,EACvB,eAAe,EAAE,CAClB,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,OAAO,CAC/B,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,mBAAmB,CAAC,CACpD,CAAC;IACF,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAExD,IAAI,CAAC;QACH,MAAM,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE;YAClD,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,SAAS,EAAE,OAAO,CAAC,iBAAiB;YACpC,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAC5C,WAAW,EACX,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,EAC5B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAClC,CAAC;QACF,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAAC,aAAa,EAAE;YAC1D,SAAS,EAAE,OAAO,CAAC,eAAe;SACnC,CAAC,CAAC;QACH,uBAAuB,CAAC,YAAY,CAAC,CAAC;QAEtC,MAAM,yBAAyB,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,yBAAyB,CAAC,eAAe,CAAC,CAAC;QAC9D,OAAO;YACL,OAAO,EAAE,YAAY,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO;YACpD,UAAU,EAAE,YAAY,CAAC,UAAU,IAAI,SAAS;YAChD,eAAe;YACf,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,UAAU,EAAE,OAAO,CAAC,GAAG;SACxB,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAC3D,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAC9B,YAA2C;IAO3C,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,kDAAkD,YAAY,CAAC,aAAa,IAAI,iBAAiB,EAAE,CACpG,CAAC;IACJ,CAAC;AACH,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;AAYD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAe,EACf,UAAmC,EAAE;IAErC,OAAO,aAAa,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAe,EACf,QAAgB,EAChB,UAAmC,EAAE;IAErC,OAAO,aAAa,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,OAAe,EACf,IAAc,EACd,OAAgC;IAEhC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU;QAC/B,CAAC,CAAC,OAAO,CAAC,UAAU;QACpB,CAAC,CAAC,CAAC,OAAe,EAAE,WAAqB,EAAE,gBAAwB,EAAE,EAAE,CACnE,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAE1E,OAAO,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,OAAe,EACf,IAAc,EACd,SAAiB,EACjB,GAAuB;IAEvB,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE;YAC5D,OAAO,EAAE,SAAS;YAClB,WAAW,EAAE,IAAI;YACjB,GAAG;YACH,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;SAC5B,CAAC,CAAC;QAEH,OAAO;YACL,OAAO;YACP,IAAI;YACJ,MAAM;YACN,MAAM;SACP,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,KAA0B,CAAC;QAC7C,MAAM,MAAM,GAAG,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,MAAM,MAAM,GAAG,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAE5E,MAAM,IAAI,eAAe,CACvB,uBAAuB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAClD;YACE,OAAO;YACP,IAAI;YACJ,MAAM;YACN,MAAM;YACN,QAAQ,EAAE,SAAS,CAAC,IAAI;SACzB,CACF,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"npm-global.js","sourceRoot":"","sources":["../../src/runtime/npm-global.ts"],"names":[],"mappings":"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"}