zyrk 0.6.7 → 0.6.9

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
@@ -104,8 +104,10 @@ Offline installs use locked verified sources and fail if an input is missing.
104
104
  Manifest, lock, and projection changes are journaled for process-crash recovery;
105
105
  a failed resolution, verification, or build-policy check keeps the prior graph.
106
106
 
107
- Dependency install scripts and implicit `binding.gyp` builds require explicit
108
- approval. Review first, trust the selected sources, then install:
107
+ Dependency `preinstall`, `install`, and `postinstall` scripts (plus implicit
108
+ `binding.gyp` builds) are supported and run during `zyrk install` after you
109
+ approve the exact reviewed candidates. Unreviewed package code stays blocked.
110
+ Review first, trust the selected sources, then install:
109
111
 
110
112
  ```bash
111
113
  zyrk approve-builds # inspect exact sources and commands; executes no package code
@@ -125,6 +127,18 @@ hooks never run automatically. A project can request runtime writable packages
125
127
  with `"zyrk": { "mutablePackages": ["package-name"] }`; this also uses a complete
126
128
  private graph.
127
129
 
130
+ ### Run project scripts
131
+
132
+ Use `zyrk run <script>` or the package-manager shortcut `zyrk <script>`; both
133
+ use the same project-script policy, installed-generation checks, and local
134
+ binary path. Arguments after `--` are passed to the script:
135
+
136
+ ```bash
137
+ zyrk dev
138
+ zyrk test -- --watch
139
+ zyrk run build
140
+ ```
141
+
128
142
  Default registry and authentication settings are loaded from user/project
129
143
  `.npmrc` for installation, dependency edits, `dlx`, and `create`. Environment
130
144
  token placeholders are supported. Credentials are restricted to their configured
@@ -136,7 +150,10 @@ registry; private names never fall back to a public endpoint. Disabled TLS
136
150
  verification is rejected before lookup. Git sources and non-workspace local sources remain unsupported;
137
151
  they fail explicitly. Optional dependencies incompatible with the selected platform
138
152
  are omitted; missing packages, integrity failures, and other optional failures
139
- remain errors. Locks retain exact platform-qualified optional variants; each machine
153
+ remain errors. Platform-specific optional packages that do not match this machine
154
+ are summarized once after installation; these are normal variants for packages
155
+ supporting multiple operating systems and CPUs. Locks retain exact
156
+ platform-qualified optional variants; each machine
140
157
  selects its compatible local closure without rewriting the lock or recording store
141
158
  paths. Older platform-pruned locks need an intentional non-frozen refresh; incomplete
142
159
  npm locks must be freshly resolved before portable adoption. macOS, Windows, and
package/VERSION CHANGED
@@ -1 +1 @@
1
- v0.6.7
1
+ v0.6.9
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AA4BA,OAAO,EAAe,SAAS,EAAe,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,OAAO,EAAoB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAExE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAM3C,OAAO,EAAqC,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAEhF,eAAO,MAAM,uBAAuB,IAAI,CAAC;AA6DzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAyBhD;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AA6EF;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,GACnD,SAAS,CAgDX;AAmBD,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,cAAc,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,MAAM,EAAE;QAAE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAC1C,MAAM,EAAE;QAAE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC3D,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;CACxC,CAAC;AAEF,gFAAgF;AAChF,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA8bpE"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAe,SAAS,EAAe,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,OAAO,EAAoB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAExE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAM3C,OAAO,EAAqC,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAEhF,eAAO,MAAM,uBAAuB,IAAI,CAAC;AA6DzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA0BhD;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AA6EF;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,GACnD,SAAS,CAgDX;AAmBD,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,cAAc,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,MAAM,EAAE;QAAE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAC1C,MAAM,EAAE;QAAE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC3D,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;CACxC,CAAC;AAEF,gFAAgF;AAChF,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA+epE"}
package/dist/cli/main.js CHANGED
@@ -12,6 +12,7 @@ import { sanitizeDiagnostic, redactSecrets } from "../log.js";
12
12
  import { installProject } from "../install/run.js";
13
13
  import { installRegistry } from "../install/registry.js";
14
14
  import { readFileSync } from "node:fs";
15
+ import { readFile } from "node:fs/promises";
15
16
  import * as path from "node:path";
16
17
  import { fileURLToPath } from "node:url";
17
18
  import { runCreate, starterSpecFor } from "../dlx/create.js";
@@ -22,7 +23,7 @@ import { runStoreCommand } from "../commands/store.js";
22
23
  import { exitCodeFor, ZyrkError, toZyrkError } from "../errors.js";
23
24
  export { ZyrkError };
24
25
  import { DEFAULT_REGISTRY, RegistryClient } from "../fetch/registry.js";
25
- import { resolveStoreRoot } from "../config/paths.js";
26
+ import { findProjectBoundary, resolveStoreRoot } from "../config/paths.js";
26
27
  import { Store } from "../store/layout.js";
27
28
  import { delegateToNpm, delegatedHelpLines, isDelegatedCommand, } from "./npm-delegate.js";
28
29
  import { isGlobalInstallRequest, parseArgs } from "./parse.js";
@@ -89,6 +90,7 @@ export function helpText(version) {
89
90
  `zyrk v${version} — one verified store per user, shared across projects through links.`,
90
91
  "",
91
92
  "Usage: zyrk <command> [args] [--json]",
93
+ " zyrk <script> [args] (shortcut for zyrk run <script> [args])",
92
94
  "",
93
95
  "Dependency commands:",
94
96
  ];
@@ -602,6 +604,48 @@ export async function runCli(options) {
602
604
  return emit(fail(toZyrkError(error, `zyrk ${parsed.command} failed.`), parsed));
603
605
  }
604
606
  }
607
+ // Package scripts are accepted as ergonomic aliases for `zyrk run <name>`.
608
+ // Route through the same project runner so policy, generation leases,
609
+ // local-bin PATH and lifecycle environment stay identical.
610
+ if (!parsed.help &&
611
+ !parsed.version &&
612
+ parsed.command !== undefined &&
613
+ !KNOWN_COMMANDS.has(parsed.command) &&
614
+ parsed.argsBeforeCommand.length === 0) {
615
+ const cwd = options.cwd ?? process.cwd();
616
+ const boundary = await findProjectBoundary(cwd);
617
+ if (boundary) {
618
+ let declared = false;
619
+ try {
620
+ const manifest = JSON.parse(await readFile(path.join(boundary, "package.json"), "utf8"));
621
+ if (manifest.scripts !== null &&
622
+ typeof manifest.scripts === "object" &&
623
+ !Array.isArray(manifest.scripts) &&
624
+ typeof manifest.scripts[parsed.command] === "string")
625
+ declared = true;
626
+ }
627
+ catch {
628
+ // Preserve the normal unknown-command diagnostic when no valid
629
+ // project script can be identified.
630
+ }
631
+ if (declared) {
632
+ try {
633
+ return await runProjectCommand({
634
+ command: "run",
635
+ args: [parsed.command, ...parsed.commandArgs],
636
+ cwd,
637
+ env: options.env,
638
+ stdout: options.stdout,
639
+ stderr: options.stderr,
640
+ json: parsed.json,
641
+ });
642
+ }
643
+ catch (error) {
644
+ return emit(fail(toZyrkError(error, `zyrk ${parsed.command} failed.`), parsed));
645
+ }
646
+ }
647
+ }
648
+ }
605
649
  return emit(dispatch(parsed, { version, env: options.env }));
606
650
  }
607
651
  async function defaultTools(env, version, cwd = process.cwd()) {
@@ -1,5 +1,9 @@
1
1
  import { type RuntimePlatform, type FinalizedGraph } from "../resolve/resolver.ts";
2
2
  import type { WorkspaceGraph } from "./workspace-graph.ts";
3
+ /** Summarize expected platform filtering without emitting one warning per variant. */
4
+ export declare function platformOmissionSummary(omissions: readonly {
5
+ name: string;
6
+ }[]): string | undefined;
3
7
  export declare function selectPlatformGraph(graph: FinalizedGraph, optionalRoots: ReadonlySet<string>, platform?: RuntimePlatform): FinalizedGraph;
4
8
  export declare function selectWorkspacePlatform(graph: WorkspaceGraph, platform?: RuntimePlatform, omitDev?: boolean): WorkspaceGraph;
5
9
  //# sourceMappingURL=platform.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/install/platform.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAuG3D,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,cAAc,EACrB,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,EAClC,QAAQ,kBAAoB,GAC3B,cAAc,CAqBhB;AACD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,cAAc,EACrB,QAAQ,kBAAoB,EAC5B,OAAO,UAAQ,GACd,cAAc,CA+BhB"}
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/install/platform.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,sFAAsF;AACtF,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GACrC,MAAM,GAAG,SAAS,CAQpB;AAsGD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,cAAc,EACrB,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,EAClC,QAAQ,kBAAoB,GAC3B,cAAc,CAqBhB;AACD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,cAAc,EACrB,QAAQ,kBAAoB,EAC5B,OAAO,UAAQ,GACd,cAAc,CA+BhB"}
@@ -3,6 +3,17 @@ import { satisfies } from "semver";
3
3
  import { ZyrkError } from "../errors.js";
4
4
  import { currentPlatform, } from "../resolve/resolver.js";
5
5
  import { lockMismatch } from "./lock.js";
6
+ /** Summarize expected platform filtering without emitting one warning per variant. */
7
+ export function platformOmissionSummary(omissions) {
8
+ if (omissions.length === 0)
9
+ return undefined;
10
+ const packages = new Set(omissions.map((item) => item.name));
11
+ const entries = omissions.length;
12
+ const variants = packages.size;
13
+ const entryLabel = `${entries} platform-specific optional ${entries === 1 ? "dependency" : "dependencies"}`;
14
+ const packageLabel = `${variants} ${variants === 1 ? "package variant" : "package variants"}`;
15
+ return `Skipped ${entryLabel} across ${packageLabel}; this is expected when selecting dependencies for the current platform.`;
16
+ }
6
17
  function compatible(node, platform) {
7
18
  return ([
8
19
  [node.platform?.os, platform.os],
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/install/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/install/run.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAK9D,OAAO,EAOL,KAAK,cAAc,EACpB,MAAM,cAAc,CAAC;AAYtB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AA+B3C,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EACD,UAAU,GACV,WAAW,GACX,UAAU,GACV,WAAW,GACX,UAAU,GACV,SAAS,GACT,UAAU,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,aAAa,GAAG,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;QAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AACF,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACxC,aAAa,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC1C,WAAW,CAAC,EAAE;QACZ,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH,CAAC;AACF,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EACL,OAAO,GACP,uBAAuB,GACvB,eAAe,GACf,SAAS,GACT,cAAc,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;CAC3B,CAAC;AA4GF,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAuyBxB"}
@@ -1,5 +1,5 @@
1
1
  import { sourceProgress, reportLinked } from "./progress.js";
2
- import { selectPlatformGraph } from "./platform.js";
2
+ import { platformOmissionSummary, selectPlatformGraph } from "./platform.js";
3
3
  import { findWorkspaceRoot } from "./workspaces.js";
4
4
  import { assertSupportedSourcePayload } from "./source-policy.js";
5
5
  import { prepareRepair } from "./repair.js";
@@ -420,7 +420,10 @@ export async function installProject(options) {
420
420
  name: "package.json",
421
421
  contents: `${JSON.stringify(manifest, null, 2)}\n`,
422
422
  });
423
- const warnings = (activeResolution.omissions ?? []).map((item) => `${item.name}: omitted optional dependency incompatible with the selected platform.`);
423
+ const warnings = [];
424
+ const omissionSummary = platformOmissionSummary(activeResolution.omissions ?? []);
425
+ if (omissionSummary)
426
+ warnings.push(omissionSummary);
424
427
  for (const stage of ["preinstall", "install", "postinstall"])
425
428
  if (manifest.scripts?.[stage])
426
429
  warnings.push(`Root ${stage} hook was not run; invoke it explicitly after installation.`);
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-install.d.ts","sourceRoot":"","sources":["../../src/install/workspace-install.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAuH9D,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAqrBxB"}
1
+ {"version":3,"file":"workspace-install.d.ts","sourceRoot":"","sources":["../../src/install/workspace-install.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAuH9D,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAqrBxB"}
@@ -1,5 +1,5 @@
1
1
  import { sourceProgress, reportLinked } from "./progress.js";
2
- import { selectWorkspacePlatform } from "./platform.js";
2
+ import { platformOmissionSummary, selectWorkspacePlatform, } from "./platform.js";
3
3
  /** Multi-importer live workspace installation with one publication journal. */
4
4
  import { chmod, copyFile, lstat, mkdir, readFile, realpath, rename, rm, symlink, } from "node:fs/promises";
5
5
  import { constants } from "node:fs";
@@ -191,7 +191,10 @@ export async function installWorkspaceProject(options) {
191
191
  ? await readFile(path.join(root, "package-lock.json"), "utf8")
192
192
  : JSON.stringify(doc, null, 2) + "\n";
193
193
  graph = selectWorkspacePlatform(graph, options.platform, options.omitDev);
194
- const warnings = graph.omissions.map((o) => `${o.name}: omitted incompatible optional workspace dependency.`);
194
+ const warnings = [];
195
+ const omissionSummary = platformOmissionSummary(graph.omissions);
196
+ if (omissionSummary)
197
+ warnings.push(omissionSummary);
195
198
  for (const importer of project.importers)
196
199
  for (const stage of ["preinstall", "install", "postinstall"])
197
200
  if (importer.manifest.scripts?.[stage])
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zyrk",
3
- "version": "0.6.7",
3
+ "version": "0.6.9",
4
4
  "description": "Storage-efficient Node package manager: one verified store per user, shared across projects through links.",
5
5
  "license": "MIT",
6
6
  "type": "module",