@hagicode/hagiscript 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +215 -0
  2. package/README_cn.md +215 -0
  3. package/dist/cli.d.ts +4 -0
  4. package/dist/cli.js +37 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/node-runtime-commands.d.ts +2 -0
  7. package/dist/commands/node-runtime-commands.js +88 -0
  8. package/dist/commands/node-runtime-commands.js.map +1 -0
  9. package/dist/commands/npm-sync-commands.d.ts +2 -0
  10. package/dist/commands/npm-sync-commands.js +92 -0
  11. package/dist/commands/npm-sync-commands.js.map +1 -0
  12. package/dist/index.d.ts +10 -0
  13. package/dist/index.js +13 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/runtime/node-download.d.ts +13 -0
  16. package/dist/runtime/node-download.js +78 -0
  17. package/dist/runtime/node-download.js.map +1 -0
  18. package/dist/runtime/node-extract.d.ts +6 -0
  19. package/dist/runtime/node-extract.js +155 -0
  20. package/dist/runtime/node-extract.js.map +1 -0
  21. package/dist/runtime/node-installer.d.ts +18 -0
  22. package/dist/runtime/node-installer.js +46 -0
  23. package/dist/runtime/node-installer.js.map +1 -0
  24. package/dist/runtime/node-platform.d.ts +14 -0
  25. package/dist/runtime/node-platform.js +41 -0
  26. package/dist/runtime/node-platform.js.map +1 -0
  27. package/dist/runtime/node-release.d.ts +28 -0
  28. package/dist/runtime/node-release.js +146 -0
  29. package/dist/runtime/node-release.js.map +1 -0
  30. package/dist/runtime/node-verify.d.ts +20 -0
  31. package/dist/runtime/node-verify.js +66 -0
  32. package/dist/runtime/node-verify.js.map +1 -0
  33. package/dist/runtime/npm-global.d.ts +20 -0
  34. package/dist/runtime/npm-global.js +53 -0
  35. package/dist/runtime/npm-global.js.map +1 -0
  36. package/dist/runtime/npm-sync.d.ts +94 -0
  37. package/dist/runtime/npm-sync.js +290 -0
  38. package/dist/runtime/npm-sync.js.map +1 -0
  39. package/dist/version.d.ts +7 -0
  40. package/dist/version.js +9 -0
  41. package/dist/version.js.map +1 -0
  42. package/package.json +71 -0
@@ -0,0 +1,20 @@
1
+ export interface RuntimeExecutablePaths {
2
+ nodePath: string;
3
+ npmPath: string;
4
+ }
5
+ export interface NodeRuntimeVerificationResult {
6
+ valid: boolean;
7
+ targetDirectory: string;
8
+ nodeVersion?: string;
9
+ npmVersion?: string;
10
+ nodePath?: string;
11
+ npmPath?: string;
12
+ failureReason?: string;
13
+ }
14
+ export interface VerifyNodeRuntimeOptions {
15
+ platform?: NodeJS.Platform;
16
+ timeoutMs?: number;
17
+ runCommand?: (command: string, args: string[], timeoutMs: number) => Promise<string>;
18
+ }
19
+ export declare function verifyNodeRuntime(targetDirectory: string, options?: VerifyNodeRuntimeOptions): Promise<NodeRuntimeVerificationResult>;
20
+ export declare function getRuntimeExecutablePaths(targetDirectory: string, platform?: NodeJS.Platform): RuntimeExecutablePaths;
@@ -0,0 +1,66 @@
1
+ import { access } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { constants } from "node:fs";
4
+ import { execFile } from "node:child_process";
5
+ import { promisify } from "node:util";
6
+ const execFileAsync = promisify(execFile);
7
+ export async function verifyNodeRuntime(targetDirectory, options = {}) {
8
+ const timeoutMs = options.timeoutMs ?? 15_000;
9
+ const runCommand = options.runCommand ?? runVersionCommand;
10
+ const paths = getRuntimeExecutablePaths(targetDirectory, options.platform);
11
+ try {
12
+ await access(paths.nodePath, constants.X_OK);
13
+ await access(paths.npmPath, constants.X_OK);
14
+ const [nodeVersion, npmVersion] = await Promise.all([
15
+ runCommand(paths.nodePath, ["--version"], timeoutMs),
16
+ runCommand(paths.npmPath, ["--version"], timeoutMs)
17
+ ]);
18
+ return {
19
+ valid: true,
20
+ targetDirectory,
21
+ nodeVersion: nodeVersion.trim(),
22
+ npmVersion: npmVersion.trim(),
23
+ nodePath: paths.nodePath,
24
+ npmPath: paths.npmPath
25
+ };
26
+ }
27
+ catch (error) {
28
+ return {
29
+ valid: false,
30
+ targetDirectory,
31
+ nodePath: paths.nodePath,
32
+ npmPath: paths.npmPath,
33
+ failureReason: error instanceof Error ? error.message : String(error)
34
+ };
35
+ }
36
+ }
37
+ export function getRuntimeExecutablePaths(targetDirectory, platform = process.platform) {
38
+ if (platform === "win32") {
39
+ return {
40
+ nodePath: join(targetDirectory, "node.exe"),
41
+ npmPath: join(targetDirectory, "npm.cmd")
42
+ };
43
+ }
44
+ return {
45
+ nodePath: join(targetDirectory, "bin", "node"),
46
+ npmPath: join(targetDirectory, "bin", "npm")
47
+ };
48
+ }
49
+ async function runVersionCommand(command, args, timeoutMs) {
50
+ try {
51
+ const { stdout } = await execFileAsync(command, args, {
52
+ timeout: timeoutMs,
53
+ windowsHide: true,
54
+ maxBuffer: 1024 * 1024
55
+ });
56
+ return stdout;
57
+ }
58
+ catch (error) {
59
+ const execError = error;
60
+ const stderr = typeof execError.stderr === "string" ? execError.stderr.trim() : "";
61
+ throw new Error(stderr.length > 0
62
+ ? stderr
63
+ : `Command failed: ${command} ${args.join(" ")}`);
64
+ }
65
+ }
66
+ //# sourceMappingURL=node-verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-verify.js","sourceRoot":"","sources":["../../src/runtime/node-verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface NpmCommandResult {
2
+ command: string;
3
+ args: string[];
4
+ stdout: string;
5
+ stderr: string;
6
+ }
7
+ export interface NpmCommandFailureContext extends NpmCommandResult {
8
+ exitCode?: string | number | null;
9
+ }
10
+ export declare class NpmCommandError extends Error {
11
+ readonly context: NpmCommandFailureContext;
12
+ constructor(message: string, context: NpmCommandFailureContext);
13
+ }
14
+ export interface NpmGlobalCommandOptions {
15
+ timeoutMs?: number;
16
+ env?: NodeJS.ProcessEnv;
17
+ runCommand?: (command: string, args: string[], timeoutMs: number) => Promise<NpmCommandResult>;
18
+ }
19
+ export declare function listGlobalPackages(npmPath: string, options?: NpmGlobalCommandOptions): Promise<NpmCommandResult>;
20
+ export declare function installGlobalPackage(npmPath: string, selector: string, options?: NpmGlobalCommandOptions): Promise<NpmCommandResult>;
@@ -0,0 +1,53 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ const execFileAsync = promisify(execFile);
4
+ export class NpmCommandError extends Error {
5
+ context;
6
+ constructor(message, context) {
7
+ super(message);
8
+ this.name = "NpmCommandError";
9
+ this.context = context;
10
+ }
11
+ }
12
+ export async function listGlobalPackages(npmPath, options = {}) {
13
+ return runNpmCommand(npmPath, ["list", "-g", "--depth=0", "--json"], options);
14
+ }
15
+ export async function installGlobalPackage(npmPath, selector, options = {}) {
16
+ return runNpmCommand(npmPath, ["install", "-g", selector], options);
17
+ }
18
+ async function runNpmCommand(npmPath, args, options) {
19
+ const timeoutMs = options.timeoutMs ?? 120_000;
20
+ const runner = options.runCommand
21
+ ? options.runCommand
22
+ : (command, commandArgs, commandTimeoutMs) => execNpmCommand(command, commandArgs, commandTimeoutMs, options.env);
23
+ return runner(npmPath, args, timeoutMs);
24
+ }
25
+ async function execNpmCommand(command, args, timeoutMs, env) {
26
+ try {
27
+ const { stdout, stderr } = await execFileAsync(command, args, {
28
+ timeout: timeoutMs,
29
+ windowsHide: true,
30
+ env,
31
+ maxBuffer: 10 * 1024 * 1024
32
+ });
33
+ return {
34
+ command,
35
+ args,
36
+ stdout,
37
+ stderr
38
+ };
39
+ }
40
+ catch (error) {
41
+ const execError = error;
42
+ const stdout = typeof execError.stdout === "string" ? execError.stdout : "";
43
+ const stderr = typeof execError.stderr === "string" ? execError.stderr : "";
44
+ throw new NpmCommandError(`npm command failed: ${command} ${args.join(" ")}`, {
45
+ command,
46
+ args,
47
+ stdout,
48
+ stderr,
49
+ exitCode: execError.code
50
+ });
51
+ }
52
+ }
53
+ //# sourceMappingURL=npm-global.js.map
@@ -0,0 +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"}
@@ -0,0 +1,94 @@
1
+ import { NpmCommandError, type NpmGlobalCommandOptions } from "./npm-global.js";
2
+ import { verifyNodeRuntime } from "./node-verify.js";
3
+ export interface NpmSyncManifestEntry {
4
+ version: string;
5
+ target?: string;
6
+ }
7
+ export interface NpmSyncManifest {
8
+ packages: Record<string, NpmSyncManifestEntry>;
9
+ }
10
+ export type InstalledGlobalPackages = Record<string, string>;
11
+ export type NpmSyncActionKind = "noop" | "install" | "upgrade" | "downgrade" | "sync";
12
+ export interface NpmSyncPlannedAction {
13
+ packageName: string;
14
+ requiredRange: string;
15
+ targetSelector: string;
16
+ selectedInstallSelector: string;
17
+ installedVersion?: string;
18
+ action: NpmSyncActionKind;
19
+ }
20
+ export interface NpmSyncActionResult extends NpmSyncPlannedAction {
21
+ changed: boolean;
22
+ command?: string;
23
+ args?: string[];
24
+ stdout?: string;
25
+ stderr?: string;
26
+ }
27
+ export interface NpmSyncRuntimeMetadata {
28
+ targetDirectory: string;
29
+ nodePath: string;
30
+ npmPath: string;
31
+ nodeVersion: string;
32
+ npmVersion: string;
33
+ }
34
+ export interface NpmSyncSummary {
35
+ runtime: NpmSyncRuntimeMetadata;
36
+ manifestPath: string;
37
+ packageCount: number;
38
+ noopCount: number;
39
+ changedCount: number;
40
+ actions: NpmSyncActionResult[];
41
+ }
42
+ export interface NpmSyncOptions {
43
+ runtimePath: string;
44
+ manifestPath: string;
45
+ npmOptions?: NpmGlobalCommandOptions;
46
+ verifyRuntime?: typeof verifyNodeRuntime;
47
+ onLog?: (event: NpmSyncLogEvent) => void;
48
+ }
49
+ export type NpmSyncLogEvent = {
50
+ type: "manifest-loaded";
51
+ manifestPath: string;
52
+ packageCount: number;
53
+ } | {
54
+ type: "runtime-valid";
55
+ runtime: NpmSyncRuntimeMetadata;
56
+ } | {
57
+ type: "inventory";
58
+ packages: InstalledGlobalPackages;
59
+ } | {
60
+ type: "planned-action";
61
+ action: NpmSyncPlannedAction;
62
+ } | {
63
+ type: "skip";
64
+ action: NpmSyncPlannedAction;
65
+ } | {
66
+ type: "install-start";
67
+ action: NpmSyncPlannedAction;
68
+ } | {
69
+ type: "install-complete";
70
+ action: NpmSyncActionResult;
71
+ } | {
72
+ type: "summary";
73
+ summary: NpmSyncSummary;
74
+ };
75
+ export declare class NpmSyncError extends Error {
76
+ constructor(message: string);
77
+ }
78
+ export declare class NpmManifestValidationError extends NpmSyncError {
79
+ readonly errors: string[];
80
+ constructor(errors: string[]);
81
+ }
82
+ export declare class NpmSyncCommandError extends NpmSyncError {
83
+ readonly packageName?: string;
84
+ readonly command: string;
85
+ readonly args: string[];
86
+ readonly stdout: string;
87
+ readonly stderr: string;
88
+ constructor(message: string, error: NpmCommandError, packageName?: string);
89
+ }
90
+ export declare function loadNpmSyncManifest(manifestPath: string): Promise<NpmSyncManifest>;
91
+ export declare function validateNpmSyncManifest(value: unknown): NpmSyncManifest;
92
+ export declare function normalizeGlobalInventory(stdout: string): InstalledGlobalPackages;
93
+ export declare function createNpmSyncPlan(manifest: NpmSyncManifest, installed: InstalledGlobalPackages): NpmSyncPlannedAction[];
94
+ export declare function syncNpmGlobals(options: NpmSyncOptions): Promise<NpmSyncSummary>;
@@ -0,0 +1,290 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { basename } from "node:path";
3
+ import semver from "semver";
4
+ import { installGlobalPackage, listGlobalPackages, NpmCommandError } from "./npm-global.js";
5
+ import { verifyNodeRuntime } from "./node-verify.js";
6
+ export class NpmSyncError extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = "NpmSyncError";
10
+ }
11
+ }
12
+ export class NpmManifestValidationError extends NpmSyncError {
13
+ errors;
14
+ constructor(errors) {
15
+ super(`Manifest validation failed: ${errors.join("; ")}`);
16
+ this.name = "NpmManifestValidationError";
17
+ this.errors = errors;
18
+ }
19
+ }
20
+ export class NpmSyncCommandError extends NpmSyncError {
21
+ packageName;
22
+ command;
23
+ args;
24
+ stdout;
25
+ stderr;
26
+ constructor(message, error, packageName) {
27
+ super(message);
28
+ this.name = "NpmSyncCommandError";
29
+ this.packageName = packageName;
30
+ this.command = error.context.command;
31
+ this.args = error.context.args;
32
+ this.stdout = error.context.stdout;
33
+ this.stderr = error.context.stderr;
34
+ }
35
+ }
36
+ export async function loadNpmSyncManifest(manifestPath) {
37
+ let parsed;
38
+ try {
39
+ parsed = JSON.parse(await readFile(manifestPath, "utf8"));
40
+ }
41
+ catch (error) {
42
+ const message = error instanceof Error ? error.message : String(error);
43
+ throw new NpmSyncError(`Failed to read manifest ${manifestPath}: ${message}`);
44
+ }
45
+ return validateNpmSyncManifest(parsed);
46
+ }
47
+ export function validateNpmSyncManifest(value) {
48
+ const errors = [];
49
+ if (!isRecord(value)) {
50
+ throw new NpmManifestValidationError(["manifest must be a JSON object"]);
51
+ }
52
+ if (!isRecord(value.packages) || Array.isArray(value.packages)) {
53
+ throw new NpmManifestValidationError([
54
+ "manifest must contain a top-level packages object"
55
+ ]);
56
+ }
57
+ const packages = {};
58
+ for (const [packageName, entry] of Object.entries(value.packages)) {
59
+ if (!isValidPackageName(packageName)) {
60
+ errors.push(`invalid package name: ${packageName}`);
61
+ continue;
62
+ }
63
+ if (!isRecord(entry) || Array.isArray(entry)) {
64
+ errors.push(`${packageName} must be an object with a version range`);
65
+ continue;
66
+ }
67
+ const version = entry.version;
68
+ if (typeof version !== "string" || version.trim().length === 0) {
69
+ errors.push(`${packageName}.version must be a non-empty semver range`);
70
+ continue;
71
+ }
72
+ const normalizedRange = version.trim();
73
+ if (!semver.validRange(normalizedRange)) {
74
+ errors.push(`${packageName}.version is not a valid semver range: ${version}`);
75
+ continue;
76
+ }
77
+ const target = entry.target;
78
+ if (target !== undefined) {
79
+ if (typeof target !== "string" || target.trim().length === 0) {
80
+ errors.push(`${packageName}.target must be a non-empty npm selector`);
81
+ continue;
82
+ }
83
+ packages[packageName] = {
84
+ version: normalizedRange,
85
+ target: target.trim()
86
+ };
87
+ continue;
88
+ }
89
+ packages[packageName] = { version: normalizedRange };
90
+ }
91
+ if (errors.length > 0) {
92
+ throw new NpmManifestValidationError(errors);
93
+ }
94
+ return { packages };
95
+ }
96
+ export function normalizeGlobalInventory(stdout) {
97
+ let parsed;
98
+ try {
99
+ parsed = JSON.parse(stdout);
100
+ }
101
+ catch (error) {
102
+ const message = error instanceof Error ? error.message : String(error);
103
+ throw new NpmSyncError(`Failed to parse npm inventory JSON: ${message}`);
104
+ }
105
+ if (!isRecord(parsed) || !isRecord(parsed.dependencies)) {
106
+ return {};
107
+ }
108
+ const installed = {};
109
+ for (const [packageName, dependency] of Object.entries(parsed.dependencies)) {
110
+ if (!isRecord(dependency) || typeof dependency.version !== "string") {
111
+ continue;
112
+ }
113
+ installed[packageName] = dependency.version;
114
+ }
115
+ return installed;
116
+ }
117
+ export function createNpmSyncPlan(manifest, installed) {
118
+ return Object.entries(manifest.packages)
119
+ .sort(([left], [right]) => left.localeCompare(right))
120
+ .map(([packageName, entry]) => {
121
+ const installedVersion = installed[packageName];
122
+ const targetSelector = entry.target ?? entry.version;
123
+ const selectedInstallSelector = `${packageName}@${targetSelector}`;
124
+ if (!installedVersion) {
125
+ return {
126
+ packageName,
127
+ requiredRange: entry.version,
128
+ targetSelector,
129
+ selectedInstallSelector,
130
+ action: "install"
131
+ };
132
+ }
133
+ if (semver.satisfies(installedVersion, entry.version, {
134
+ includePrerelease: true
135
+ })) {
136
+ return {
137
+ packageName,
138
+ requiredRange: entry.version,
139
+ targetSelector,
140
+ selectedInstallSelector,
141
+ installedVersion,
142
+ action: "noop"
143
+ };
144
+ }
145
+ return {
146
+ packageName,
147
+ requiredRange: entry.version,
148
+ targetSelector,
149
+ selectedInstallSelector,
150
+ installedVersion,
151
+ action: classifyOutOfRangeVersion(installedVersion, entry.version)
152
+ };
153
+ });
154
+ }
155
+ export async function syncNpmGlobals(options) {
156
+ const manifest = await loadNpmSyncManifest(options.manifestPath);
157
+ options.onLog?.({
158
+ type: "manifest-loaded",
159
+ manifestPath: options.manifestPath,
160
+ packageCount: Object.keys(manifest.packages).length
161
+ });
162
+ const verifyRuntime = options.verifyRuntime ?? verifyNodeRuntime;
163
+ const runtimeResult = await verifyRuntime(options.runtimePath);
164
+ if (!runtimeResult.valid ||
165
+ !runtimeResult.nodePath ||
166
+ !runtimeResult.npmPath) {
167
+ throw new NpmSyncError(`Invalid Node.js runtime ${options.runtimePath}: ${runtimeResult.failureReason ?? "node/npm validation failed"}`);
168
+ }
169
+ const runtime = {
170
+ targetDirectory: runtimeResult.targetDirectory,
171
+ nodePath: runtimeResult.nodePath,
172
+ npmPath: runtimeResult.npmPath,
173
+ nodeVersion: runtimeResult.nodeVersion ?? "unknown",
174
+ npmVersion: runtimeResult.npmVersion ?? "unknown"
175
+ };
176
+ options.onLog?.({ type: "runtime-valid", runtime });
177
+ const npmOptions = {
178
+ ...options.npmOptions,
179
+ env: createRuntimeNpmEnv(runtime.targetDirectory, options.npmOptions?.env)
180
+ };
181
+ let inventoryResult;
182
+ try {
183
+ inventoryResult = await listGlobalPackages(runtime.npmPath, npmOptions);
184
+ }
185
+ catch (error) {
186
+ if (error instanceof NpmCommandError) {
187
+ throw new NpmSyncCommandError("Failed to list npm global packages", error);
188
+ }
189
+ throw error;
190
+ }
191
+ const installed = normalizeGlobalInventory(inventoryResult.stdout);
192
+ options.onLog?.({ type: "inventory", packages: installed });
193
+ const plan = createNpmSyncPlan(manifest, installed);
194
+ const actions = [];
195
+ for (const action of plan) {
196
+ options.onLog?.({ type: "planned-action", action });
197
+ if (action.action === "noop") {
198
+ const result = { ...action, changed: false };
199
+ actions.push(result);
200
+ options.onLog?.({ type: "skip", action });
201
+ continue;
202
+ }
203
+ options.onLog?.({ type: "install-start", action });
204
+ try {
205
+ const installResult = await installGlobalPackage(runtime.npmPath, action.selectedInstallSelector, npmOptions);
206
+ const result = {
207
+ ...action,
208
+ changed: true,
209
+ command: installResult.command,
210
+ args: installResult.args,
211
+ stdout: installResult.stdout,
212
+ stderr: installResult.stderr
213
+ };
214
+ actions.push(result);
215
+ options.onLog?.({ type: "install-complete", action: result });
216
+ }
217
+ catch (error) {
218
+ if (error instanceof NpmCommandError) {
219
+ throw new NpmSyncCommandError(`Failed to sync package ${action.packageName}`, error, action.packageName);
220
+ }
221
+ throw error;
222
+ }
223
+ }
224
+ const summary = {
225
+ runtime,
226
+ manifestPath: options.manifestPath,
227
+ packageCount: plan.length,
228
+ noopCount: actions.filter((action) => !action.changed).length,
229
+ changedCount: actions.filter((action) => action.changed).length,
230
+ actions
231
+ };
232
+ options.onLog?.({ type: "summary", summary });
233
+ return summary;
234
+ }
235
+ function createRuntimeNpmEnv(runtimePath, baseEnv = process.env) {
236
+ const env = { ...baseEnv };
237
+ delete env.PREFIX;
238
+ delete env.npm_config_prefix;
239
+ delete env.NPM_CONFIG_GLOBALCONFIG;
240
+ delete env.npm_config_globalconfig;
241
+ delete env.NPM_CONFIG_USERCONFIG;
242
+ delete env.npm_config_userconfig;
243
+ return {
244
+ ...env,
245
+ NPM_CONFIG_PREFIX: runtimePath,
246
+ npm_config_fund: "false",
247
+ npm_config_audit: "false"
248
+ };
249
+ }
250
+ function classifyOutOfRangeVersion(installedVersion, range) {
251
+ const minimum = semver.minVersion(range);
252
+ if (minimum && semver.lt(installedVersion, minimum)) {
253
+ return "upgrade";
254
+ }
255
+ if (isAboveAllowedRange(installedVersion, range)) {
256
+ return "downgrade";
257
+ }
258
+ return "sync";
259
+ }
260
+ function isAboveAllowedRange(version, range) {
261
+ const parsed = new semver.Range(range, { includePrerelease: true });
262
+ return parsed.set.every((comparators) => comparators.some((comparator) => (comparator.operator === "<" || comparator.operator === "<=") &&
263
+ semver.gt(version, comparator.semver.version)));
264
+ }
265
+ function isValidPackageName(packageName) {
266
+ if (packageName.trim() !== packageName || packageName.length === 0) {
267
+ return false;
268
+ }
269
+ if (packageName.includes("\\") || packageName.includes("/../")) {
270
+ return false;
271
+ }
272
+ if (packageName.startsWith("@")) {
273
+ const parts = packageName.split("/");
274
+ return (parts.length === 2 &&
275
+ parts[0].startsWith("@") &&
276
+ isValidPackageNamePart(parts[0].slice(1)) &&
277
+ isValidPackageNamePart(parts[1]));
278
+ }
279
+ return !packageName.includes("/") && isValidPackageNamePart(packageName);
280
+ }
281
+ function isValidPackageNamePart(value) {
282
+ return (value.length > 0 &&
283
+ value === basename(value) &&
284
+ !value.startsWith(".") &&
285
+ !/[\s@]/u.test(value));
286
+ }
287
+ function isRecord(value) {
288
+ return typeof value === "object" && value !== null;
289
+ }
290
+ //# sourceMappingURL=npm-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-sync.js","sourceRoot":"","sources":["../../src/runtime/npm-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const packageName = "@hagicode/hagiscript";
2
+ export declare const packageVersion = "0.1.0";
3
+ export interface PackageMetadata {
4
+ name: string;
5
+ version: string;
6
+ }
7
+ export declare function getPackageMetadata(): PackageMetadata;
@@ -0,0 +1,9 @@
1
+ export const packageName = "@hagicode/hagiscript";
2
+ export const packageVersion = "0.1.0";
3
+ export function getPackageMetadata() {
4
+ return {
5
+ name: packageName,
6
+ version: packageVersion
7
+ };
8
+ }
9
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,sBAAsB,CAAC;AAClD,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAOtC,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,cAAc;KACxB,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "@hagicode/hagiscript",
3
+ "version": "0.1.0",
4
+ "description": "Scoped npm package foundation for Hagiscript language tooling.",
5
+ "homepage": "https://github.com/HagiCode-org/hagiscript#readme",
6
+ "bugs": {
7
+ "url": "https://github.com/HagiCode-org/hagiscript/issues"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/HagiCode-org/hagiscript.git"
12
+ },
13
+ "type": "module",
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "default": "./dist/index.js"
18
+ },
19
+ "./package.json": "./package.json"
20
+ },
21
+ "bin": {
22
+ "hagiscript": "dist/cli.js"
23
+ },
24
+ "files": [
25
+ "dist",
26
+ "README.md",
27
+ "README_cn.md"
28
+ ],
29
+ "scripts": {
30
+ "build": "tsc -p tsconfig.json",
31
+ "clean": "rm -rf dist .vitest-temp .tmp coverage",
32
+ "dev": "tsx src/cli.ts",
33
+ "format": "prettier --write .",
34
+ "format:check": "prettier --check .",
35
+ "lint": "eslint .",
36
+ "integration:installed-runtime": "node scripts/integration-installed-runtime.mjs",
37
+ "pack:check": "node scripts/verify-package.mjs",
38
+ "publish:prepare-dev-version": "node scripts/prepare-dev-version.mjs",
39
+ "publish:verify-release": "node scripts/verify-release-version.mjs",
40
+ "test": "vitest run",
41
+ "test:watch": "vitest"
42
+ },
43
+ "keywords": [
44
+ "hagiscript",
45
+ "scripting",
46
+ "language",
47
+ "cli"
48
+ ],
49
+ "engines": {
50
+ "node": ">=20"
51
+ },
52
+ "publishConfig": {
53
+ "access": "public",
54
+ "registry": "https://registry.npmjs.org/"
55
+ },
56
+ "dependencies": {
57
+ "commander": "^14.0.1",
58
+ "semver": "^7.7.4"
59
+ },
60
+ "devDependencies": {
61
+ "@eslint/js": "^9.38.0",
62
+ "@types/node": "^24.5.2",
63
+ "@types/semver": "^7.7.1",
64
+ "eslint": "^9.38.0",
65
+ "prettier": "^3.6.2",
66
+ "tsx": "^4.20.6",
67
+ "typescript": "^5.9.3",
68
+ "typescript-eslint": "^8.46.2",
69
+ "vitest": "^3.2.4"
70
+ }
71
+ }