@legioncodeinc/honeycomb 0.1.0 → 0.1.5
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/.claude-plugin/marketplace.json +18 -18
- package/.claude-plugin/plugin.json +1 -1
- package/LICENSE +661 -661
- package/README.md +268 -268
- package/assets/logos/honeycomb-memory-cluster.svg +17 -17
- package/assets/readme.md +117 -117
- package/assets/styles.css +11 -11
- package/assets/tokens/base.css +76 -76
- package/assets/tokens/colors.css +111 -111
- package/assets/tokens/fonts.css +32 -32
- package/assets/tokens/spacing.css +48 -48
- package/assets/tokens/typography.css +38 -38
- package/bundle/cli.js +9 -4
- package/daemon/index.js +33 -5
- package/embeddings/embed-daemon.js +1 -1
- package/harnesses/claude-code/.claude-plugin/plugin.json +1 -1
- package/harnesses/claude-code/bundle/capture.js +0 -0
- package/harnesses/claude-code/bundle/index.js +0 -0
- package/harnesses/claude-code/bundle/pre-tool-use.js +0 -0
- package/harnesses/claude-code/bundle/session-end.js +0 -0
- package/harnesses/claude-code/bundle/session-start.js +0 -0
- package/harnesses/claude-code/hooks/hooks.json +86 -86
- package/harnesses/codex/bundle/capture.js +0 -0
- package/harnesses/codex/bundle/index.js +0 -0
- package/harnesses/codex/bundle/pre-tool-use.js +0 -0
- package/harnesses/codex/bundle/session-start.js +0 -0
- package/harnesses/codex/package.json +1 -1
- package/harnesses/cursor/bundle/capture.js +0 -0
- package/harnesses/cursor/bundle/index.js +0 -0
- package/harnesses/cursor/bundle/pre-tool-use.js +0 -0
- package/harnesses/cursor/bundle/session-end.js +0 -0
- package/harnesses/cursor/bundle/session-start.js +0 -0
- package/harnesses/hermes/bundle/index.js +0 -0
- package/harnesses/openclaw/dist/index.js +1 -1
- package/harnesses/openclaw/openclaw.plugin.json +1 -1
- package/harnesses/openclaw/package.json +1 -1
- package/harnesses/pi/bundle/index.js +0 -0
- package/mcp/bundle/server.js +1 -1
- package/package.json +141 -137
- package/scripts/ensure-embed-deps.mjs +67 -67
- package/scripts/ensure-tree-sitter.mjs +89 -89
|
@@ -1,67 +1,67 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// PRD-025 Wave 2 (D-2 / D-3 / AC-1 / AC-7) — first-run embedding-deps heal.
|
|
3
|
-
//
|
|
4
|
-
// Mirrors scripts/ensure-tree-sitter.mjs: a fast, NON-FATAL sanity check run from
|
|
5
|
-
// the `postinstall` hook. It HEALS NOTHING heavy and DOWNLOADS NOTHING here — the
|
|
6
|
-
// ~600 MB model is acquired LATER, lazily, on the daemon's first warmup (D-2: the
|
|
7
|
-
// model is acquired at first run, NEVER packed into the npm tarball; D-3: the
|
|
8
|
-
// download is background-warm and never blocks login or the first recall). This
|
|
9
|
-
// script only REPORTS whether the optional inference stack
|
|
10
|
-
// (`@huggingface/transformers`) resolved, so a consumer sees one clear line at
|
|
11
|
-
// install time instead of an opaque failure when the daemon later tries to warm.
|
|
12
|
-
//
|
|
13
|
-
// Why it stays in the `files` allowlist + `postinstall`: parity with
|
|
14
|
-
// ensure-tree-sitter (the install hook references it by path), and a deterministic,
|
|
15
|
-
// non-fatal install experience. It ALWAYS exits 0 (unless strict CI mode) — an
|
|
16
|
-
// end-user `npm i` must NEVER hard-break because the optional embed stack is absent;
|
|
17
|
-
// embeddings simply stay OFF until the deps are present (the BM25 lexical fallback
|
|
18
|
-
// has no quality cliff — PRD-025 D-4).
|
|
19
|
-
|
|
20
|
-
import { createRequire } from "node:module";
|
|
21
|
-
|
|
22
|
-
const ROOT = process.cwd();
|
|
23
|
-
const require = createRequire(`${ROOT}/`);
|
|
24
|
-
|
|
25
|
-
// Recursion guard for nested npm calls (parity with ensure-tree-sitter).
|
|
26
|
-
if (process.env.ENSURE_EMBED_RUNNING) process.exit(0);
|
|
27
|
-
|
|
28
|
-
// The opt-OUT (PRD-025 D-1): an explicit `HONEYCOMB_EMBEDDINGS=false`/`0` means the
|
|
29
|
-
// user does not want embeddings — say so and exit cleanly, never probing.
|
|
30
|
-
const raw = (process.env.HONEYCOMB_EMBEDDINGS ?? "").trim().toLowerCase();
|
|
31
|
-
if (raw === "false" || raw === "0") {
|
|
32
|
-
console.error(
|
|
33
|
-
"[ensure-embed-deps] HONEYCOMB_EMBEDDINGS opt-out set — embeddings disabled, recall is lexical-only. Skipping.",
|
|
34
|
-
);
|
|
35
|
-
process.exit(0);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// The optional inference stack. It is an `optionalDependency` (~600 MB with its
|
|
39
|
-
// native ONNX runtime), so a slimmed / offline / `--no-optional` install legitimately
|
|
40
|
-
// lacks it. Resolve-only: we do NOT import it (importing would load native bindings
|
|
41
|
-
// at install time — exactly what we avoid; the daemon loads it lazily on warmup).
|
|
42
|
-
let present = true;
|
|
43
|
-
try {
|
|
44
|
-
require.resolve("@huggingface/transformers");
|
|
45
|
-
} catch {
|
|
46
|
-
present = false;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
if (present) {
|
|
50
|
-
console.error(
|
|
51
|
-
"[ensure-embed-deps] OK — @huggingface/transformers present. The nomic-embed-text-v1.5 model " +
|
|
52
|
-
"(~600 MB) downloads + caches on first daemon warmup (one time), then reuses the cached dir.",
|
|
53
|
-
);
|
|
54
|
-
process.exit(0);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// Absent: this is the COMMON, non-error case for a lean install. Embeddings stay OFF
|
|
58
|
-
// and recall is the BM25/ILIKE lexical fallback (no quality cliff — D-4). In strict CI
|
|
59
|
-
// mode a missing optional stack can be made a hard signal; otherwise it is informational.
|
|
60
|
-
const strict = process.env.HONEYCOMB_STRICT_POSTINSTALL === "1";
|
|
61
|
-
console.error(
|
|
62
|
-
"[ensure-embed-deps] @huggingface/transformers not installed — semantic recall is OFF; recall " +
|
|
63
|
-
"falls back to lexical (BM25/ILIKE), which is fine. To enable semantic recall, install the " +
|
|
64
|
-
"optional embedding deps (`npm i @huggingface/transformers`) and restart the daemon." +
|
|
65
|
-
(strict ? " (strict mode — failing this install)" : " (non-fatal)"),
|
|
66
|
-
);
|
|
67
|
-
process.exit(strict ? 1 : 0);
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// PRD-025 Wave 2 (D-2 / D-3 / AC-1 / AC-7) — first-run embedding-deps heal.
|
|
3
|
+
//
|
|
4
|
+
// Mirrors scripts/ensure-tree-sitter.mjs: a fast, NON-FATAL sanity check run from
|
|
5
|
+
// the `postinstall` hook. It HEALS NOTHING heavy and DOWNLOADS NOTHING here — the
|
|
6
|
+
// ~600 MB model is acquired LATER, lazily, on the daemon's first warmup (D-2: the
|
|
7
|
+
// model is acquired at first run, NEVER packed into the npm tarball; D-3: the
|
|
8
|
+
// download is background-warm and never blocks login or the first recall). This
|
|
9
|
+
// script only REPORTS whether the optional inference stack
|
|
10
|
+
// (`@huggingface/transformers`) resolved, so a consumer sees one clear line at
|
|
11
|
+
// install time instead of an opaque failure when the daemon later tries to warm.
|
|
12
|
+
//
|
|
13
|
+
// Why it stays in the `files` allowlist + `postinstall`: parity with
|
|
14
|
+
// ensure-tree-sitter (the install hook references it by path), and a deterministic,
|
|
15
|
+
// non-fatal install experience. It ALWAYS exits 0 (unless strict CI mode) — an
|
|
16
|
+
// end-user `npm i` must NEVER hard-break because the optional embed stack is absent;
|
|
17
|
+
// embeddings simply stay OFF until the deps are present (the BM25 lexical fallback
|
|
18
|
+
// has no quality cliff — PRD-025 D-4).
|
|
19
|
+
|
|
20
|
+
import { createRequire } from "node:module";
|
|
21
|
+
|
|
22
|
+
const ROOT = process.cwd();
|
|
23
|
+
const require = createRequire(`${ROOT}/`);
|
|
24
|
+
|
|
25
|
+
// Recursion guard for nested npm calls (parity with ensure-tree-sitter).
|
|
26
|
+
if (process.env.ENSURE_EMBED_RUNNING) process.exit(0);
|
|
27
|
+
|
|
28
|
+
// The opt-OUT (PRD-025 D-1): an explicit `HONEYCOMB_EMBEDDINGS=false`/`0` means the
|
|
29
|
+
// user does not want embeddings — say so and exit cleanly, never probing.
|
|
30
|
+
const raw = (process.env.HONEYCOMB_EMBEDDINGS ?? "").trim().toLowerCase();
|
|
31
|
+
if (raw === "false" || raw === "0") {
|
|
32
|
+
console.error(
|
|
33
|
+
"[ensure-embed-deps] HONEYCOMB_EMBEDDINGS opt-out set — embeddings disabled, recall is lexical-only. Skipping.",
|
|
34
|
+
);
|
|
35
|
+
process.exit(0);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// The optional inference stack. It is an `optionalDependency` (~600 MB with its
|
|
39
|
+
// native ONNX runtime), so a slimmed / offline / `--no-optional` install legitimately
|
|
40
|
+
// lacks it. Resolve-only: we do NOT import it (importing would load native bindings
|
|
41
|
+
// at install time — exactly what we avoid; the daemon loads it lazily on warmup).
|
|
42
|
+
let present = true;
|
|
43
|
+
try {
|
|
44
|
+
require.resolve("@huggingface/transformers");
|
|
45
|
+
} catch {
|
|
46
|
+
present = false;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (present) {
|
|
50
|
+
console.error(
|
|
51
|
+
"[ensure-embed-deps] OK — @huggingface/transformers present. The nomic-embed-text-v1.5 model " +
|
|
52
|
+
"(~600 MB) downloads + caches on first daemon warmup (one time), then reuses the cached dir.",
|
|
53
|
+
);
|
|
54
|
+
process.exit(0);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Absent: this is the COMMON, non-error case for a lean install. Embeddings stay OFF
|
|
58
|
+
// and recall is the BM25/ILIKE lexical fallback (no quality cliff — D-4). In strict CI
|
|
59
|
+
// mode a missing optional stack can be made a hard signal; otherwise it is informational.
|
|
60
|
+
const strict = process.env.HONEYCOMB_STRICT_POSTINSTALL === "1";
|
|
61
|
+
console.error(
|
|
62
|
+
"[ensure-embed-deps] @huggingface/transformers not installed — semantic recall is OFF; recall " +
|
|
63
|
+
"falls back to lexical (BM25/ILIKE), which is fine. To enable semantic recall, install the " +
|
|
64
|
+
"optional embedding deps (`npm i @huggingface/transformers`) and restart the daemon." +
|
|
65
|
+
(strict ? " (strict mode — failing this install)" : " (non-fatal)"),
|
|
66
|
+
);
|
|
67
|
+
process.exit(strict ? 1 : 0);
|
|
@@ -1,89 +1,89 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// Confirms the tree-sitter WASM parser stack is present and loadable after install
|
|
3
|
-
// (PRD-014 codebase graph, D-1). This script HEALS NOTHING and COMPILES NOTHING:
|
|
4
|
-
// the parser is `web-tree-sitter` (a WASM/emscripten runtime) + `tree-sitter-wasms`
|
|
5
|
-
// (prebuilt `.wasm` grammars), so there is no native binding to build, no node-gyp,
|
|
6
|
-
// no C/C++ toolchain, and no per-platform/per-ABI compile. That is the whole point
|
|
7
|
-
// of choosing WASM over native `tree-sitter` + `tree-sitter-<lang>`: the install is
|
|
8
|
-
// deterministic and identical across the CI matrix (ubuntu Node 22/24 + windows-smoke),
|
|
9
|
-
// with no postinstall compile that could break Windows or linux-arm64.
|
|
10
|
-
//
|
|
11
|
-
// Why this file still exists (and stays in the `files` allowlist + `postinstall`):
|
|
12
|
-
// 1. Backwards-compatible name — the build script + CI reference `rebuild:native`
|
|
13
|
-
// and `postinstall` by this path; keeping it avoids churn in those surfaces.
|
|
14
|
-
// 2. A fast, non-fatal SANITY check: if a consumer's install dropped a grammar
|
|
15
|
-
// `.wasm` (a partial extract, a pruned `node_modules`), we say so clearly
|
|
16
|
-
// rather than letting the daemon fail later with an opaque WASM load error.
|
|
17
|
-
//
|
|
18
|
-
// It ALWAYS exits 0 (unless explicitly run in strict CI mode and a grammar is
|
|
19
|
-
// genuinely missing): an end-user consumer must never get a hard install break from
|
|
20
|
-
// this hook.
|
|
21
|
-
import { existsSync } from "node:fs";
|
|
22
|
-
import { createRequire } from "node:module";
|
|
23
|
-
|
|
24
|
-
const ROOT = process.cwd();
|
|
25
|
-
const require = createRequire(`${ROOT}/`);
|
|
26
|
-
|
|
27
|
-
// Recursion guard for nested npm calls (kept for parity with prior behaviour).
|
|
28
|
-
if (process.env.ENSURE_TS_RUNNING) process.exit(0);
|
|
29
|
-
|
|
30
|
-
// The nine PRD-014 languages map to these grammar `.wasm` files (TS routes both
|
|
31
|
-
// `tree-sitter-typescript` and `tree-sitter-tsx`). Located by resolving the
|
|
32
|
-
// `tree-sitter-wasms` package and reading its `out/` directory — the SAME anchor
|
|
33
|
-
// the runtime extractor uses (`src/daemon/runtime/codebase/extract.ts`).
|
|
34
|
-
const GRAMMARS = [
|
|
35
|
-
"tree-sitter-typescript",
|
|
36
|
-
"tree-sitter-tsx",
|
|
37
|
-
"tree-sitter-javascript",
|
|
38
|
-
"tree-sitter-python",
|
|
39
|
-
"tree-sitter-go",
|
|
40
|
-
"tree-sitter-rust",
|
|
41
|
-
"tree-sitter-java",
|
|
42
|
-
"tree-sitter-ruby",
|
|
43
|
-
"tree-sitter-c",
|
|
44
|
-
"tree-sitter-cpp",
|
|
45
|
-
];
|
|
46
|
-
|
|
47
|
-
// Greenfield / not-yet-installed short-circuit: if the parser deps are not present
|
|
48
|
-
// (a checkout before `npm install`, or a slimmed environment), there is nothing to
|
|
49
|
-
// check. Log and exit 0 so `npm install` / `npm run rebuild:native` never breaks.
|
|
50
|
-
let wasmDir;
|
|
51
|
-
try {
|
|
52
|
-
wasmDir = require.resolve("tree-sitter-wasms/package.json").replace(/package\.json$/, "out/");
|
|
53
|
-
} catch {
|
|
54
|
-
console.error(
|
|
55
|
-
"[ensure-tree-sitter] web-tree-sitter / tree-sitter-wasms not installed yet — nothing to check. Skipping.",
|
|
56
|
-
);
|
|
57
|
-
process.exit(0);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Confirm the web-tree-sitter runtime resolves too (it carries its own
|
|
61
|
-
// `tree-sitter.wasm` emscripten runtime loaded at parse time).
|
|
62
|
-
let runtimeOk = true;
|
|
63
|
-
try {
|
|
64
|
-
require.resolve("web-tree-sitter");
|
|
65
|
-
} catch {
|
|
66
|
-
runtimeOk = false;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const missing = GRAMMARS.filter((g) => !existsSync(`${wasmDir}${g}.wasm`));
|
|
70
|
-
|
|
71
|
-
if (runtimeOk && missing.length === 0) {
|
|
72
|
-
console.error(
|
|
73
|
-
`[ensure-tree-sitter] OK — web-tree-sitter runtime + ${GRAMMARS.length} WASM grammars present (no native build needed).`,
|
|
74
|
-
);
|
|
75
|
-
process.exit(0);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// Something is missing. In strict CI mode (HONEYCOMB_STRICT_POSTINSTALL=1) this is a
|
|
79
|
-
// hard failure so a partial install surfaces as a red check; otherwise it is a
|
|
80
|
-
// non-fatal warning so an end-user install never breaks.
|
|
81
|
-
const strict = process.env.HONEYCOMB_STRICT_POSTINSTALL === "1";
|
|
82
|
-
console.error(
|
|
83
|
-
"[ensure-tree-sitter] WARNING: tree-sitter WASM stack incomplete — " +
|
|
84
|
-
(runtimeOk ? "" : "web-tree-sitter runtime not resolvable; ") +
|
|
85
|
-
(missing.length ? `missing grammars: ${missing.join(", ")}. ` : "") +
|
|
86
|
-
"Re-run `npm install` to restore the parser deps." +
|
|
87
|
-
(strict ? " (strict mode — failing this install)" : " (non-fatal)"),
|
|
88
|
-
);
|
|
89
|
-
process.exit(strict ? 1 : 0);
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Confirms the tree-sitter WASM parser stack is present and loadable after install
|
|
3
|
+
// (PRD-014 codebase graph, D-1). This script HEALS NOTHING and COMPILES NOTHING:
|
|
4
|
+
// the parser is `web-tree-sitter` (a WASM/emscripten runtime) + `tree-sitter-wasms`
|
|
5
|
+
// (prebuilt `.wasm` grammars), so there is no native binding to build, no node-gyp,
|
|
6
|
+
// no C/C++ toolchain, and no per-platform/per-ABI compile. That is the whole point
|
|
7
|
+
// of choosing WASM over native `tree-sitter` + `tree-sitter-<lang>`: the install is
|
|
8
|
+
// deterministic and identical across the CI matrix (ubuntu Node 22/24 + windows-smoke),
|
|
9
|
+
// with no postinstall compile that could break Windows or linux-arm64.
|
|
10
|
+
//
|
|
11
|
+
// Why this file still exists (and stays in the `files` allowlist + `postinstall`):
|
|
12
|
+
// 1. Backwards-compatible name — the build script + CI reference `rebuild:native`
|
|
13
|
+
// and `postinstall` by this path; keeping it avoids churn in those surfaces.
|
|
14
|
+
// 2. A fast, non-fatal SANITY check: if a consumer's install dropped a grammar
|
|
15
|
+
// `.wasm` (a partial extract, a pruned `node_modules`), we say so clearly
|
|
16
|
+
// rather than letting the daemon fail later with an opaque WASM load error.
|
|
17
|
+
//
|
|
18
|
+
// It ALWAYS exits 0 (unless explicitly run in strict CI mode and a grammar is
|
|
19
|
+
// genuinely missing): an end-user consumer must never get a hard install break from
|
|
20
|
+
// this hook.
|
|
21
|
+
import { existsSync } from "node:fs";
|
|
22
|
+
import { createRequire } from "node:module";
|
|
23
|
+
|
|
24
|
+
const ROOT = process.cwd();
|
|
25
|
+
const require = createRequire(`${ROOT}/`);
|
|
26
|
+
|
|
27
|
+
// Recursion guard for nested npm calls (kept for parity with prior behaviour).
|
|
28
|
+
if (process.env.ENSURE_TS_RUNNING) process.exit(0);
|
|
29
|
+
|
|
30
|
+
// The nine PRD-014 languages map to these grammar `.wasm` files (TS routes both
|
|
31
|
+
// `tree-sitter-typescript` and `tree-sitter-tsx`). Located by resolving the
|
|
32
|
+
// `tree-sitter-wasms` package and reading its `out/` directory — the SAME anchor
|
|
33
|
+
// the runtime extractor uses (`src/daemon/runtime/codebase/extract.ts`).
|
|
34
|
+
const GRAMMARS = [
|
|
35
|
+
"tree-sitter-typescript",
|
|
36
|
+
"tree-sitter-tsx",
|
|
37
|
+
"tree-sitter-javascript",
|
|
38
|
+
"tree-sitter-python",
|
|
39
|
+
"tree-sitter-go",
|
|
40
|
+
"tree-sitter-rust",
|
|
41
|
+
"tree-sitter-java",
|
|
42
|
+
"tree-sitter-ruby",
|
|
43
|
+
"tree-sitter-c",
|
|
44
|
+
"tree-sitter-cpp",
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
// Greenfield / not-yet-installed short-circuit: if the parser deps are not present
|
|
48
|
+
// (a checkout before `npm install`, or a slimmed environment), there is nothing to
|
|
49
|
+
// check. Log and exit 0 so `npm install` / `npm run rebuild:native` never breaks.
|
|
50
|
+
let wasmDir;
|
|
51
|
+
try {
|
|
52
|
+
wasmDir = require.resolve("tree-sitter-wasms/package.json").replace(/package\.json$/, "out/");
|
|
53
|
+
} catch {
|
|
54
|
+
console.error(
|
|
55
|
+
"[ensure-tree-sitter] web-tree-sitter / tree-sitter-wasms not installed yet — nothing to check. Skipping.",
|
|
56
|
+
);
|
|
57
|
+
process.exit(0);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Confirm the web-tree-sitter runtime resolves too (it carries its own
|
|
61
|
+
// `tree-sitter.wasm` emscripten runtime loaded at parse time).
|
|
62
|
+
let runtimeOk = true;
|
|
63
|
+
try {
|
|
64
|
+
require.resolve("web-tree-sitter");
|
|
65
|
+
} catch {
|
|
66
|
+
runtimeOk = false;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const missing = GRAMMARS.filter((g) => !existsSync(`${wasmDir}${g}.wasm`));
|
|
70
|
+
|
|
71
|
+
if (runtimeOk && missing.length === 0) {
|
|
72
|
+
console.error(
|
|
73
|
+
`[ensure-tree-sitter] OK — web-tree-sitter runtime + ${GRAMMARS.length} WASM grammars present (no native build needed).`,
|
|
74
|
+
);
|
|
75
|
+
process.exit(0);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Something is missing. In strict CI mode (HONEYCOMB_STRICT_POSTINSTALL=1) this is a
|
|
79
|
+
// hard failure so a partial install surfaces as a red check; otherwise it is a
|
|
80
|
+
// non-fatal warning so an end-user install never breaks.
|
|
81
|
+
const strict = process.env.HONEYCOMB_STRICT_POSTINSTALL === "1";
|
|
82
|
+
console.error(
|
|
83
|
+
"[ensure-tree-sitter] WARNING: tree-sitter WASM stack incomplete — " +
|
|
84
|
+
(runtimeOk ? "" : "web-tree-sitter runtime not resolvable; ") +
|
|
85
|
+
(missing.length ? `missing grammars: ${missing.join(", ")}. ` : "") +
|
|
86
|
+
"Re-run `npm install` to restore the parser deps." +
|
|
87
|
+
(strict ? " (strict mode — failing this install)" : " (non-fatal)"),
|
|
88
|
+
);
|
|
89
|
+
process.exit(strict ? 1 : 0);
|