@arcis/node 1.4.4 → 1.5.1
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/LICENSE +21 -0
- package/README.md +36 -6
- package/dist/astro/index.js +6141 -0
- package/dist/astro/index.js.map +1 -0
- package/dist/astro/index.mjs +6136 -0
- package/dist/astro/index.mjs.map +1 -0
- package/dist/bun/index.js +6195 -0
- package/dist/bun/index.js.map +1 -0
- package/dist/bun/index.mjs +6189 -0
- package/dist/bun/index.mjs.map +1 -0
- package/dist/core/constants.d.ts +3 -2
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/index.js +4 -3
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +4 -3
- package/dist/core/index.mjs.map +1 -1
- package/dist/core/types.d.ts +32 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/fastify/index.js +6160 -0
- package/dist/fastify/index.js.map +1 -0
- package/dist/fastify/index.mjs +6155 -0
- package/dist/fastify/index.mjs.map +1 -0
- package/dist/guards.d.ts +156 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/hono/index.js +6159 -0
- package/dist/hono/index.js.map +1 -0
- package/dist/hono/index.mjs +6154 -0
- package/dist/hono/index.mjs.map +1 -0
- package/dist/index.d.ts +23 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7126 -178
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7088 -179
- package/dist/index.mjs.map +1 -1
- package/dist/koa/index.js +6158 -0
- package/dist/koa/index.js.map +1 -0
- package/dist/koa/index.mjs +6153 -0
- package/dist/koa/index.mjs.map +1 -0
- package/dist/logging/index.js.map +1 -1
- package/dist/logging/index.mjs.map +1 -1
- package/dist/logging/redactor.d.ts.map +1 -1
- package/dist/middleware/astro.d.ts +64 -0
- package/dist/middleware/astro.d.ts.map +1 -0
- package/dist/middleware/bot-detection.d.ts.map +1 -1
- package/dist/middleware/bun.d.ts +75 -0
- package/dist/middleware/bun.d.ts.map +1 -0
- package/dist/middleware/csrf.d.ts.map +1 -1
- package/dist/middleware/error-handler.d.ts.map +1 -1
- package/dist/middleware/fastify.d.ts +89 -0
- package/dist/middleware/fastify.d.ts.map +1 -0
- package/dist/middleware/graphql.d.ts +35 -0
- package/dist/middleware/graphql.d.ts.map +1 -0
- package/dist/middleware/hono.d.ts +63 -0
- package/dist/middleware/hono.d.ts.map +1 -0
- package/dist/middleware/index.d.ts +12 -0
- package/dist/middleware/index.d.ts.map +1 -1
- package/dist/middleware/index.js +6469 -119
- package/dist/middleware/index.js.map +1 -1
- package/dist/middleware/index.mjs +6459 -120
- package/dist/middleware/index.mjs.map +1 -1
- package/dist/middleware/koa.d.ts +84 -0
- package/dist/middleware/koa.d.ts.map +1 -0
- package/dist/middleware/main.d.ts +0 -30
- package/dist/middleware/main.d.ts.map +1 -1
- package/dist/middleware/mass-assign.d.ts +81 -0
- package/dist/middleware/mass-assign.d.ts.map +1 -0
- package/dist/middleware/method-allowlist.d.ts +66 -0
- package/dist/middleware/method-allowlist.d.ts.map +1 -0
- package/dist/middleware/nestjs.d.ts +62 -0
- package/dist/middleware/nestjs.d.ts.map +1 -0
- package/dist/middleware/nextjs.d.ts +102 -0
- package/dist/middleware/nextjs.d.ts.map +1 -0
- package/dist/middleware/nuxt.d.ts +61 -0
- package/dist/middleware/nuxt.d.ts.map +1 -0
- package/dist/middleware/overload.d.ts +92 -0
- package/dist/middleware/overload.d.ts.map +1 -0
- package/dist/middleware/protect.d.ts +91 -0
- package/dist/middleware/protect.d.ts.map +1 -0
- package/dist/middleware/rate-limit-sliding.d.ts.map +1 -1
- package/dist/middleware/rate-limit-token.d.ts.map +1 -1
- package/dist/middleware/rate-limit.d.ts.map +1 -1
- package/dist/middleware/response-splitting.d.ts +83 -0
- package/dist/middleware/response-splitting.d.ts.map +1 -0
- package/dist/middleware/sveltekit.d.ts +68 -0
- package/dist/middleware/sveltekit.d.ts.map +1 -0
- package/dist/middleware/token-budget.d.ts +75 -0
- package/dist/middleware/token-budget.d.ts.map +1 -0
- package/dist/nestjs/index.js +1724 -0
- package/dist/nestjs/index.js.map +1 -0
- package/dist/nestjs/index.mjs +1717 -0
- package/dist/nestjs/index.mjs.map +1 -0
- package/dist/nextjs/index.js +6184 -0
- package/dist/nextjs/index.js.map +1 -0
- package/dist/nextjs/index.mjs +6178 -0
- package/dist/nextjs/index.mjs.map +1 -0
- package/dist/nuxt/index.js +6141 -0
- package/dist/nuxt/index.js.map +1 -0
- package/dist/nuxt/index.mjs +6136 -0
- package/dist/nuxt/index.mjs.map +1 -0
- package/dist/sanitizers/encode.d.ts.map +1 -1
- package/dist/sanitizers/graphql.d.ts +72 -0
- package/dist/sanitizers/graphql.d.ts.map +1 -0
- package/dist/sanitizers/headers.d.ts +18 -0
- package/dist/sanitizers/headers.d.ts.map +1 -1
- package/dist/sanitizers/index.d.ts +4 -1
- package/dist/sanitizers/index.d.ts.map +1 -1
- package/dist/sanitizers/index.js +140 -66
- package/dist/sanitizers/index.js.map +1 -1
- package/dist/sanitizers/index.mjs +135 -67
- package/dist/sanitizers/index.mjs.map +1 -1
- package/dist/sanitizers/prompt-injection.d.ts +62 -0
- package/dist/sanitizers/prompt-injection.d.ts.map +1 -0
- package/dist/sanitizers/sanitize.d.ts +1 -1
- package/dist/sanitizers/sanitize.d.ts.map +1 -1
- package/dist/sanitizers/xpath.d.ts +37 -0
- package/dist/sanitizers/xpath.d.ts.map +1 -0
- package/dist/stores/index.js +4 -4
- package/dist/stores/index.js.map +1 -1
- package/dist/stores/index.mjs +4 -4
- package/dist/stores/index.mjs.map +1 -1
- package/dist/stores/redis.d.ts +7 -1
- package/dist/stores/redis.d.ts.map +1 -1
- package/dist/sveltekit/index.js +6142 -0
- package/dist/sveltekit/index.js.map +1 -0
- package/dist/sveltekit/index.mjs +6137 -0
- package/dist/sveltekit/index.mjs.map +1 -0
- package/dist/validation/index.d.ts +2 -0
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +137 -12
- package/dist/validation/index.js.map +1 -1
- package/dist/validation/index.mjs +116 -13
- package/dist/validation/index.mjs.map +1 -1
- package/dist/validation/redirect.d.ts.map +1 -1
- package/dist/validation/schema.d.ts.map +1 -1
- package/dist/validation/url-async.d.ts +137 -0
- package/dist/validation/url-async.d.ts.map +1 -0
- package/package.json +57 -12
- package/scripts/postinstall.cjs +26 -0
- package/dist/cli/arcis.d.ts +0 -23
- package/dist/cli/arcis.d.ts.map +0 -1
- package/dist/cli/arcis.js +0 -312
- package/dist/cli/arcis.js.map +0 -1
- package/dist/cli/arcis.mjs +0 -309
- package/dist/cli/arcis.mjs.map +0 -1
package/dist/cli/arcis.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/arcis.ts"],"names":["fileURLToPath","dirname","readFileSync","resolve","spawnSync","cur","lat"],"mappings":"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","file":"arcis.js","sourcesContent":["#!/usr/bin/env node\n/**\n * @arcis/node — `arcis` CLI dispatcher.\n *\n * Surface (mirrors the Python CLI's discovery layer):\n *\n * arcis → catalog\n * arcis --list → catalog with examples\n * arcis --help / -h → catalog + run-cmd hint\n * arcis --version / -V\n * arcis update [--apply] [--check]\n * arcis scan / audit / sca → forward to Python `arcis` if on PATH,\n * else print install hint\n *\n * Why we delegate scan/audit/sca to Python rather than re-implementing:\n * the threat database, audit rules, and attack-payload catalog are\n * Python-side data files. Maintaining two copies means drift; one\n * canonical CLI + a thin Node forwarder is simpler. The Node binary\n * exists primarily so users who installed `@arcis/node` from npm get\n * the same `arcis update` / discovery UX as Python users.\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n// ── ANSI helpers ─────────────────────────────────────────────────────\n\nconst USE_COLOR =\n !process.env.NO_COLOR && process.stdout.isTTY === true;\n\nfunction c(text: string, ...codes: string[]): string {\n if (!USE_COLOR) return text;\n return codes.join(\"\") + text + \"\\x1b[0m\";\n}\n\nconst BOLD = \"\\x1b[1m\";\nconst DIM = \"\\x1b[2m\";\nconst GREEN = \"\\x1b[32m\";\nconst YELLOW = \"\\x1b[33m\";\nconst CYAN = \"\\x1b[36m\";\nconst RED = \"\\x1b[31m\";\n\n// ── Version + npm registry helpers ───────────────────────────────────\n\nfunction getInstalledVersion(): string {\n // Read the package.json that ships with this build so we report the\n // actual installed version, not whatever was hardcoded.\n try {\n const here = fileURLToPath(import.meta.url);\n // Walk up to find the package root (contains package.json).\n let dir = dirname(here);\n for (let i = 0; i < 6; i++) {\n try {\n const raw = readFileSync(resolve(dir, \"package.json\"), \"utf-8\");\n const pkg = JSON.parse(raw) as { name?: string; version?: string };\n if (pkg.name === \"@arcis/node\" && pkg.version) {\n return pkg.version;\n }\n } catch {\n // climb\n }\n const parent = resolve(dir, \"..\");\n if (parent === dir) break;\n dir = parent;\n }\n } catch {\n // ignore\n }\n return \"?\";\n}\n\ninterface NpmRegistryResponse {\n \"dist-tags\"?: { latest?: string };\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 5_000);\n try {\n const resp = await fetch(\"https://registry.npmjs.org/@arcis/node\", {\n headers: { Accept: \"application/json\" },\n signal: controller.signal,\n });\n if (!resp.ok) return null;\n const data = (await resp.json()) as NpmRegistryResponse;\n return data[\"dist-tags\"]?.latest ?? null;\n } finally {\n clearTimeout(timer);\n }\n } catch {\n return null;\n }\n}\n\nfunction parseVersion(v: string): number[] | null {\n const parts = v.split(\".\");\n const out: number[] = [];\n for (const p of parts) {\n if (!/^\\d+$/.test(p)) return null;\n out.push(Number(p));\n }\n return out;\n}\n\nfunction versionCompare(a: number[], b: number[]): number {\n const len = Math.max(a.length, b.length);\n for (let i = 0; i < len; i++) {\n const x = a[i] ?? 0;\n const y = b[i] ?? 0;\n if (x < y) return -1;\n if (x > y) return 1;\n }\n return 0;\n}\n\n// ── Python forwarder ─────────────────────────────────────────────────\n\nfunction hasPythonArcis(): boolean {\n // Check both `arcis` (Windows: arcis.exe) and `python -m arcis.cli` so\n // users who have the Python package installed but not on PATH still work.\n const probes: Array<{ cmd: string; args: string[] }> = [\n { cmd: \"arcis\", args: [\"--version\"] },\n { cmd: \"python\", args: [\"-m\", \"arcis.cli\", \"--version\"] },\n { cmd: \"python3\", args: [\"-m\", \"arcis.cli\", \"--version\"] },\n ];\n for (const p of probes) {\n try {\n const result = spawnSync(p.cmd, p.args, {\n stdio: [\"ignore\", \"ignore\", \"ignore\"],\n timeout: 3000,\n shell: process.platform === \"win32\",\n });\n if (result.status === 0) return true;\n } catch {\n // try next\n }\n }\n return false;\n}\n\nfunction forwardToPython(args: string[]): never {\n // Try `arcis` first, fall back to `python -m arcis.cli`. Mirror exit\n // code so CI scripts using the Node CLI get the same behavior they'd\n // get from the Python CLI.\n const candidates: Array<{ cmd: string; args: string[] }> = [\n { cmd: \"arcis\", args },\n { cmd: \"python\", args: [\"-m\", \"arcis.cli\", ...args] },\n { cmd: \"python3\", args: [\"-m\", \"arcis.cli\", ...args] },\n ];\n for (const cand of candidates) {\n const result = spawnSync(cand.cmd, cand.args, {\n stdio: \"inherit\",\n shell: process.platform === \"win32\",\n });\n if (result.error) continue;\n process.exit(result.status ?? 0);\n }\n console.error(\n c(\"arcis: could not invoke the Python CLI. Install with:\", RED, BOLD),\n );\n console.error(\" pip install arcis\");\n process.exit(127);\n}\n\n// ── Catalog ──────────────────────────────────────────────────────────\n\nfunction printCatalog(verbose: boolean): void {\n const ver = getInstalledVersion();\n console.log();\n console.log(` ${c(\"Arcis\", BOLD, CYAN)} ${c(`v${ver}`, DIM)} ${c(\"(node)\", DIM)}`);\n console.log(c(\" Zero-dep security middleware + scanners.\", DIM));\n console.log();\n console.log(c(\" Commands\", BOLD));\n const rows: Array<[string, string, string]> = [\n [\n \"scan\",\n \"Send live attack payloads to a running app.\",\n \"arcis scan http://localhost:8000 --route POST:/echo --field q\",\n ],\n [\n \"audit\",\n \"Static-analyse Python / JS / TS source for unsafe patterns.\",\n \"arcis audit .\",\n ],\n [\n \"sca\",\n \"Match installed dependencies against the supply-chain threat DB.\",\n \"arcis sca .\",\n ],\n [\"update\", \"Check npm for a newer @arcis/node release.\", \"arcis update --apply\"],\n ];\n for (const [name, desc, example] of rows) {\n console.log(` ${c(name.padEnd(8), BOLD, GREEN)} ${desc}`);\n if (verbose) {\n console.log(` ${c(example, DIM)}`);\n }\n }\n console.log();\n console.log(c(\" Discovery\", BOLD));\n console.log(` ${c(\"--list\", BOLD, CYAN).padEnd(24)} Show this catalog (verbose).`);\n console.log(\n ` ${c(\"<cmd> --help\", BOLD, CYAN).padEnd(24)} Show full flags for that command.`,\n );\n console.log();\n console.log(c(\" Note\", BOLD));\n console.log(\n ` scan/audit/sca delegate to the Python CLI (canonical impl).`,\n );\n console.log(` Install once with: ${c(\"pip install arcis\", GREEN)}`);\n console.log();\n}\n\n// ── Update command ───────────────────────────────────────────────────\n\nasync function updateCommand(args: string[]): Promise<void> {\n // Note: this function uses `process.exitCode = N; return;` rather than\n // `process.exit(N)` because the fetch() call leaves an internal undici\n // handle open momentarily on Windows, and process.exit() during that\n // window throws a libuv assertion on stderr. exitCode + return lets\n // Node drain handles cleanly before exit.\n const apply = args.includes(\"--apply\");\n const check = args.includes(\"--check\");\n const yes = args.includes(\"--yes\") || args.includes(\"-y\");\n\n const current = getInstalledVersion();\n const latest = await fetchLatestVersion();\n\n if (check) {\n if (latest === null) {\n console.error(\"arcis: could not reach npm to check for updates\");\n process.exitCode = 2;\n return;\n }\n const cur = parseVersion(current);\n const lat = parseVersion(latest);\n if (!cur || !lat || versionCompare(cur, lat) >= 0) {\n console.log(`@arcis/node ${current} is up-to-date`);\n process.exitCode = 0;\n return;\n }\n console.error(`@arcis/node ${current} is outdated; latest is ${latest}`);\n process.exitCode = 1;\n return;\n }\n\n console.log();\n console.log(c(\" @arcis/node update check\", BOLD, CYAN));\n console.log(c(\" Source: https://registry.npmjs.org/@arcis/node\", DIM));\n console.log();\n\n if (latest === null) {\n console.log(` Installed @arcis/node ${current}`);\n console.log(\n ` Latest ${c(\"? unreachable\", YELLOW)} ${c(\"(network error or npm down)\", DIM)}`,\n );\n console.log();\n console.log(c(\" Try again later, or run 'npm view @arcis/node version' directly.\", DIM));\n console.log();\n process.exitCode = 2;\n return;\n }\n\n const cur = parseVersion(current);\n const lat = parseVersion(latest);\n if (!cur || !lat) {\n console.log(\n ` Installed @arcis/node ${current} ${c(\"(pre-release or unparseable)\", DIM)}`,\n );\n console.log(` Latest @arcis/node ${latest}`);\n console.log();\n console.log(c(\" Skipping comparison — manually decide.\", DIM));\n console.log();\n process.exitCode = 0;\n return;\n }\n\n if (versionCompare(cur, lat) >= 0) {\n console.log(` Installed @arcis/node ${current}`);\n console.log(` Latest @arcis/node ${latest}`);\n console.log();\n console.log(c(\" You are on the latest version.\", BOLD, GREEN));\n console.log();\n process.exitCode = 0;\n return;\n }\n\n console.log(` Installed @arcis/node ${current}`);\n console.log(\n ` Latest ${c(`@arcis/node ${latest}`, BOLD)} ${c(\"(update available)\", YELLOW)}`,\n );\n console.log();\n console.log(c(\" Run to upgrade\", BOLD));\n console.log(` ${c(\"npm install @arcis/node@latest\", GREEN)}`);\n console.log();\n\n if (!apply) {\n console.log(c(\" Or rerun: 'arcis update --apply' to upgrade in place.\", DIM));\n console.log();\n process.exitCode = 1;\n return;\n }\n\n if (!yes && process.stdin.isTTY) {\n process.stdout.write(\"Upgrade now? [y/N] \");\n const response = await new Promise<string>((res) => {\n process.stdin.once(\"data\", (chunk: Buffer) => res(chunk.toString().trim().toLowerCase()));\n });\n if (!response.startsWith(\"y\")) {\n process.exitCode = 1;\n return;\n }\n }\n\n const npmCmd = process.platform === \"win32\" ? \"npm.cmd\" : \"npm\";\n console.log(` $ ${npmCmd} install @arcis/node@latest`);\n const result = spawnSync(npmCmd, [\"install\", \"@arcis/node@latest\"], {\n stdio: \"inherit\",\n });\n process.exitCode = result.status ?? 1;\n}\n\n// ── Main ─────────────────────────────────────────────────────────────\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n\n if (args.length === 0) {\n printCatalog(false);\n process.exit(0);\n }\n\n const arg0 = args[0];\n\n if (arg0 === \"--list\" || arg0 === \"-l\") {\n printCatalog(true);\n process.exit(0);\n }\n\n if (arg0 === \"-h\" || arg0 === \"--help\") {\n printCatalog(false);\n console.log(c(\" Run 'arcis <command> --help' for full flags.\", DIM));\n console.log();\n process.exit(0);\n }\n\n if (arg0 === \"-V\" || arg0 === \"--version\") {\n console.log(getInstalledVersion());\n process.exit(0);\n }\n\n if (arg0 === \"update\") {\n await updateCommand(args.slice(1));\n return;\n }\n\n if (arg0 === \"scan\" || arg0 === \"audit\" || arg0 === \"sca\") {\n if (!hasPythonArcis()) {\n console.error(\n c(\n `arcis: '${arg0}' is implemented by the Python CLI. Install with:`,\n YELLOW,\n BOLD,\n ),\n );\n console.error(\" pip install arcis\");\n console.error();\n console.error(c(\"Why: scan/audit/sca rely on Python's threat-DB and rule data.\", DIM));\n console.error(\n c(\n \"@arcis/node implements the middleware + dashboard upload — see the docs.\",\n DIM,\n ),\n );\n process.exit(127);\n }\n forwardToPython(args);\n return;\n }\n\n console.error(`arcis: unknown command '${arg0}'`);\n console.error(\"Run 'arcis --list' for available commands.\");\n process.exit(1);\n}\n\nmain().catch((err) => {\n console.error(c(`arcis: unexpected error: ${err}`, RED));\n process.exit(1);\n});\n"]}
|
package/dist/cli/arcis.mjs
DELETED
|
@@ -1,309 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { spawnSync } from 'child_process';
|
|
3
|
-
import { readFileSync } from 'fs';
|
|
4
|
-
import { dirname, resolve } from 'path';
|
|
5
|
-
import { fileURLToPath } from 'url';
|
|
6
|
-
|
|
7
|
-
var USE_COLOR = !process.env.NO_COLOR && process.stdout.isTTY === true;
|
|
8
|
-
function c(text, ...codes) {
|
|
9
|
-
if (!USE_COLOR) return text;
|
|
10
|
-
return codes.join("") + text + "\x1B[0m";
|
|
11
|
-
}
|
|
12
|
-
var BOLD = "\x1B[1m";
|
|
13
|
-
var DIM = "\x1B[2m";
|
|
14
|
-
var GREEN = "\x1B[32m";
|
|
15
|
-
var YELLOW = "\x1B[33m";
|
|
16
|
-
var CYAN = "\x1B[36m";
|
|
17
|
-
var RED = "\x1B[31m";
|
|
18
|
-
function getInstalledVersion() {
|
|
19
|
-
try {
|
|
20
|
-
const here = fileURLToPath(import.meta.url);
|
|
21
|
-
let dir = dirname(here);
|
|
22
|
-
for (let i = 0; i < 6; i++) {
|
|
23
|
-
try {
|
|
24
|
-
const raw = readFileSync(resolve(dir, "package.json"), "utf-8");
|
|
25
|
-
const pkg = JSON.parse(raw);
|
|
26
|
-
if (pkg.name === "@arcis/node" && pkg.version) {
|
|
27
|
-
return pkg.version;
|
|
28
|
-
}
|
|
29
|
-
} catch {
|
|
30
|
-
}
|
|
31
|
-
const parent = resolve(dir, "..");
|
|
32
|
-
if (parent === dir) break;
|
|
33
|
-
dir = parent;
|
|
34
|
-
}
|
|
35
|
-
} catch {
|
|
36
|
-
}
|
|
37
|
-
return "?";
|
|
38
|
-
}
|
|
39
|
-
async function fetchLatestVersion() {
|
|
40
|
-
try {
|
|
41
|
-
const controller = new AbortController();
|
|
42
|
-
const timer = setTimeout(() => controller.abort(), 5e3);
|
|
43
|
-
try {
|
|
44
|
-
const resp = await fetch("https://registry.npmjs.org/@arcis/node", {
|
|
45
|
-
headers: { Accept: "application/json" },
|
|
46
|
-
signal: controller.signal
|
|
47
|
-
});
|
|
48
|
-
if (!resp.ok) return null;
|
|
49
|
-
const data = await resp.json();
|
|
50
|
-
return data["dist-tags"]?.latest ?? null;
|
|
51
|
-
} finally {
|
|
52
|
-
clearTimeout(timer);
|
|
53
|
-
}
|
|
54
|
-
} catch {
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
function parseVersion(v) {
|
|
59
|
-
const parts = v.split(".");
|
|
60
|
-
const out = [];
|
|
61
|
-
for (const p of parts) {
|
|
62
|
-
if (!/^\d+$/.test(p)) return null;
|
|
63
|
-
out.push(Number(p));
|
|
64
|
-
}
|
|
65
|
-
return out;
|
|
66
|
-
}
|
|
67
|
-
function versionCompare(a, b) {
|
|
68
|
-
const len = Math.max(a.length, b.length);
|
|
69
|
-
for (let i = 0; i < len; i++) {
|
|
70
|
-
const x = a[i] ?? 0;
|
|
71
|
-
const y = b[i] ?? 0;
|
|
72
|
-
if (x < y) return -1;
|
|
73
|
-
if (x > y) return 1;
|
|
74
|
-
}
|
|
75
|
-
return 0;
|
|
76
|
-
}
|
|
77
|
-
function hasPythonArcis() {
|
|
78
|
-
const probes = [
|
|
79
|
-
{ cmd: "arcis", args: ["--version"] },
|
|
80
|
-
{ cmd: "python", args: ["-m", "arcis.cli", "--version"] },
|
|
81
|
-
{ cmd: "python3", args: ["-m", "arcis.cli", "--version"] }
|
|
82
|
-
];
|
|
83
|
-
for (const p of probes) {
|
|
84
|
-
try {
|
|
85
|
-
const result = spawnSync(p.cmd, p.args, {
|
|
86
|
-
stdio: ["ignore", "ignore", "ignore"],
|
|
87
|
-
timeout: 3e3,
|
|
88
|
-
shell: process.platform === "win32"
|
|
89
|
-
});
|
|
90
|
-
if (result.status === 0) return true;
|
|
91
|
-
} catch {
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
return false;
|
|
95
|
-
}
|
|
96
|
-
function forwardToPython(args) {
|
|
97
|
-
const candidates = [
|
|
98
|
-
{ cmd: "arcis", args },
|
|
99
|
-
{ cmd: "python", args: ["-m", "arcis.cli", ...args] },
|
|
100
|
-
{ cmd: "python3", args: ["-m", "arcis.cli", ...args] }
|
|
101
|
-
];
|
|
102
|
-
for (const cand of candidates) {
|
|
103
|
-
const result = spawnSync(cand.cmd, cand.args, {
|
|
104
|
-
stdio: "inherit",
|
|
105
|
-
shell: process.platform === "win32"
|
|
106
|
-
});
|
|
107
|
-
if (result.error) continue;
|
|
108
|
-
process.exit(result.status ?? 0);
|
|
109
|
-
}
|
|
110
|
-
console.error(
|
|
111
|
-
c("arcis: could not invoke the Python CLI. Install with:", RED, BOLD)
|
|
112
|
-
);
|
|
113
|
-
console.error(" pip install arcis");
|
|
114
|
-
process.exit(127);
|
|
115
|
-
}
|
|
116
|
-
function printCatalog(verbose) {
|
|
117
|
-
const ver = getInstalledVersion();
|
|
118
|
-
console.log();
|
|
119
|
-
console.log(` ${c("Arcis", BOLD, CYAN)} ${c(`v${ver}`, DIM)} ${c("(node)", DIM)}`);
|
|
120
|
-
console.log(c(" Zero-dep security middleware + scanners.", DIM));
|
|
121
|
-
console.log();
|
|
122
|
-
console.log(c(" Commands", BOLD));
|
|
123
|
-
const rows = [
|
|
124
|
-
[
|
|
125
|
-
"scan",
|
|
126
|
-
"Send live attack payloads to a running app.",
|
|
127
|
-
"arcis scan http://localhost:8000 --route POST:/echo --field q"
|
|
128
|
-
],
|
|
129
|
-
[
|
|
130
|
-
"audit",
|
|
131
|
-
"Static-analyse Python / JS / TS source for unsafe patterns.",
|
|
132
|
-
"arcis audit ."
|
|
133
|
-
],
|
|
134
|
-
[
|
|
135
|
-
"sca",
|
|
136
|
-
"Match installed dependencies against the supply-chain threat DB.",
|
|
137
|
-
"arcis sca ."
|
|
138
|
-
],
|
|
139
|
-
["update", "Check npm for a newer @arcis/node release.", "arcis update --apply"]
|
|
140
|
-
];
|
|
141
|
-
for (const [name, desc, example] of rows) {
|
|
142
|
-
console.log(` ${c(name.padEnd(8), BOLD, GREEN)} ${desc}`);
|
|
143
|
-
if (verbose) {
|
|
144
|
-
console.log(` ${c(example, DIM)}`);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
console.log();
|
|
148
|
-
console.log(c(" Discovery", BOLD));
|
|
149
|
-
console.log(` ${c("--list", BOLD, CYAN).padEnd(24)} Show this catalog (verbose).`);
|
|
150
|
-
console.log(
|
|
151
|
-
` ${c("<cmd> --help", BOLD, CYAN).padEnd(24)} Show full flags for that command.`
|
|
152
|
-
);
|
|
153
|
-
console.log();
|
|
154
|
-
console.log(c(" Note", BOLD));
|
|
155
|
-
console.log(
|
|
156
|
-
` scan/audit/sca delegate to the Python CLI (canonical impl).`
|
|
157
|
-
);
|
|
158
|
-
console.log(` Install once with: ${c("pip install arcis", GREEN)}`);
|
|
159
|
-
console.log();
|
|
160
|
-
}
|
|
161
|
-
async function updateCommand(args) {
|
|
162
|
-
const apply = args.includes("--apply");
|
|
163
|
-
const check = args.includes("--check");
|
|
164
|
-
const yes = args.includes("--yes") || args.includes("-y");
|
|
165
|
-
const current = getInstalledVersion();
|
|
166
|
-
const latest = await fetchLatestVersion();
|
|
167
|
-
if (check) {
|
|
168
|
-
if (latest === null) {
|
|
169
|
-
console.error("arcis: could not reach npm to check for updates");
|
|
170
|
-
process.exitCode = 2;
|
|
171
|
-
return;
|
|
172
|
-
}
|
|
173
|
-
const cur2 = parseVersion(current);
|
|
174
|
-
const lat2 = parseVersion(latest);
|
|
175
|
-
if (!cur2 || !lat2 || versionCompare(cur2, lat2) >= 0) {
|
|
176
|
-
console.log(`@arcis/node ${current} is up-to-date`);
|
|
177
|
-
process.exitCode = 0;
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
console.error(`@arcis/node ${current} is outdated; latest is ${latest}`);
|
|
181
|
-
process.exitCode = 1;
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
|
-
console.log();
|
|
185
|
-
console.log(c(" @arcis/node update check", BOLD, CYAN));
|
|
186
|
-
console.log(c(" Source: https://registry.npmjs.org/@arcis/node", DIM));
|
|
187
|
-
console.log();
|
|
188
|
-
if (latest === null) {
|
|
189
|
-
console.log(` Installed @arcis/node ${current}`);
|
|
190
|
-
console.log(
|
|
191
|
-
` Latest ${c("? unreachable", YELLOW)} ${c("(network error or npm down)", DIM)}`
|
|
192
|
-
);
|
|
193
|
-
console.log();
|
|
194
|
-
console.log(c(" Try again later, or run 'npm view @arcis/node version' directly.", DIM));
|
|
195
|
-
console.log();
|
|
196
|
-
process.exitCode = 2;
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
const cur = parseVersion(current);
|
|
200
|
-
const lat = parseVersion(latest);
|
|
201
|
-
if (!cur || !lat) {
|
|
202
|
-
console.log(
|
|
203
|
-
` Installed @arcis/node ${current} ${c("(pre-release or unparseable)", DIM)}`
|
|
204
|
-
);
|
|
205
|
-
console.log(` Latest @arcis/node ${latest}`);
|
|
206
|
-
console.log();
|
|
207
|
-
console.log(c(" Skipping comparison \u2014 manually decide.", DIM));
|
|
208
|
-
console.log();
|
|
209
|
-
process.exitCode = 0;
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
if (versionCompare(cur, lat) >= 0) {
|
|
213
|
-
console.log(` Installed @arcis/node ${current}`);
|
|
214
|
-
console.log(` Latest @arcis/node ${latest}`);
|
|
215
|
-
console.log();
|
|
216
|
-
console.log(c(" You are on the latest version.", BOLD, GREEN));
|
|
217
|
-
console.log();
|
|
218
|
-
process.exitCode = 0;
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
|
-
console.log(` Installed @arcis/node ${current}`);
|
|
222
|
-
console.log(
|
|
223
|
-
` Latest ${c(`@arcis/node ${latest}`, BOLD)} ${c("(update available)", YELLOW)}`
|
|
224
|
-
);
|
|
225
|
-
console.log();
|
|
226
|
-
console.log(c(" Run to upgrade", BOLD));
|
|
227
|
-
console.log(` ${c("npm install @arcis/node@latest", GREEN)}`);
|
|
228
|
-
console.log();
|
|
229
|
-
if (!apply) {
|
|
230
|
-
console.log(c(" Or rerun: 'arcis update --apply' to upgrade in place.", DIM));
|
|
231
|
-
console.log();
|
|
232
|
-
process.exitCode = 1;
|
|
233
|
-
return;
|
|
234
|
-
}
|
|
235
|
-
if (!yes && process.stdin.isTTY) {
|
|
236
|
-
process.stdout.write("Upgrade now? [y/N] ");
|
|
237
|
-
const response = await new Promise((res) => {
|
|
238
|
-
process.stdin.once("data", (chunk) => res(chunk.toString().trim().toLowerCase()));
|
|
239
|
-
});
|
|
240
|
-
if (!response.startsWith("y")) {
|
|
241
|
-
process.exitCode = 1;
|
|
242
|
-
return;
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
const npmCmd = process.platform === "win32" ? "npm.cmd" : "npm";
|
|
246
|
-
console.log(` $ ${npmCmd} install @arcis/node@latest`);
|
|
247
|
-
const result = spawnSync(npmCmd, ["install", "@arcis/node@latest"], {
|
|
248
|
-
stdio: "inherit"
|
|
249
|
-
});
|
|
250
|
-
process.exitCode = result.status ?? 1;
|
|
251
|
-
}
|
|
252
|
-
async function main() {
|
|
253
|
-
const args = process.argv.slice(2);
|
|
254
|
-
if (args.length === 0) {
|
|
255
|
-
printCatalog(false);
|
|
256
|
-
process.exit(0);
|
|
257
|
-
}
|
|
258
|
-
const arg0 = args[0];
|
|
259
|
-
if (arg0 === "--list" || arg0 === "-l") {
|
|
260
|
-
printCatalog(true);
|
|
261
|
-
process.exit(0);
|
|
262
|
-
}
|
|
263
|
-
if (arg0 === "-h" || arg0 === "--help") {
|
|
264
|
-
printCatalog(false);
|
|
265
|
-
console.log(c(" Run 'arcis <command> --help' for full flags.", DIM));
|
|
266
|
-
console.log();
|
|
267
|
-
process.exit(0);
|
|
268
|
-
}
|
|
269
|
-
if (arg0 === "-V" || arg0 === "--version") {
|
|
270
|
-
console.log(getInstalledVersion());
|
|
271
|
-
process.exit(0);
|
|
272
|
-
}
|
|
273
|
-
if (arg0 === "update") {
|
|
274
|
-
await updateCommand(args.slice(1));
|
|
275
|
-
return;
|
|
276
|
-
}
|
|
277
|
-
if (arg0 === "scan" || arg0 === "audit" || arg0 === "sca") {
|
|
278
|
-
if (!hasPythonArcis()) {
|
|
279
|
-
console.error(
|
|
280
|
-
c(
|
|
281
|
-
`arcis: '${arg0}' is implemented by the Python CLI. Install with:`,
|
|
282
|
-
YELLOW,
|
|
283
|
-
BOLD
|
|
284
|
-
)
|
|
285
|
-
);
|
|
286
|
-
console.error(" pip install arcis");
|
|
287
|
-
console.error();
|
|
288
|
-
console.error(c("Why: scan/audit/sca rely on Python's threat-DB and rule data.", DIM));
|
|
289
|
-
console.error(
|
|
290
|
-
c(
|
|
291
|
-
"@arcis/node implements the middleware + dashboard upload \u2014 see the docs.",
|
|
292
|
-
DIM
|
|
293
|
-
)
|
|
294
|
-
);
|
|
295
|
-
process.exit(127);
|
|
296
|
-
}
|
|
297
|
-
forwardToPython(args);
|
|
298
|
-
return;
|
|
299
|
-
}
|
|
300
|
-
console.error(`arcis: unknown command '${arg0}'`);
|
|
301
|
-
console.error("Run 'arcis --list' for available commands.");
|
|
302
|
-
process.exit(1);
|
|
303
|
-
}
|
|
304
|
-
main().catch((err) => {
|
|
305
|
-
console.error(c(`arcis: unexpected error: ${err}`, RED));
|
|
306
|
-
process.exit(1);
|
|
307
|
-
});
|
|
308
|
-
//# sourceMappingURL=arcis.mjs.map
|
|
309
|
-
//# sourceMappingURL=arcis.mjs.map
|
package/dist/cli/arcis.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/arcis.ts"],"names":["cur","lat"],"mappings":"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","file":"arcis.mjs","sourcesContent":["#!/usr/bin/env node\n/**\n * @arcis/node — `arcis` CLI dispatcher.\n *\n * Surface (mirrors the Python CLI's discovery layer):\n *\n * arcis → catalog\n * arcis --list → catalog with examples\n * arcis --help / -h → catalog + run-cmd hint\n * arcis --version / -V\n * arcis update [--apply] [--check]\n * arcis scan / audit / sca → forward to Python `arcis` if on PATH,\n * else print install hint\n *\n * Why we delegate scan/audit/sca to Python rather than re-implementing:\n * the threat database, audit rules, and attack-payload catalog are\n * Python-side data files. Maintaining two copies means drift; one\n * canonical CLI + a thin Node forwarder is simpler. The Node binary\n * exists primarily so users who installed `@arcis/node` from npm get\n * the same `arcis update` / discovery UX as Python users.\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n// ── ANSI helpers ─────────────────────────────────────────────────────\n\nconst USE_COLOR =\n !process.env.NO_COLOR && process.stdout.isTTY === true;\n\nfunction c(text: string, ...codes: string[]): string {\n if (!USE_COLOR) return text;\n return codes.join(\"\") + text + \"\\x1b[0m\";\n}\n\nconst BOLD = \"\\x1b[1m\";\nconst DIM = \"\\x1b[2m\";\nconst GREEN = \"\\x1b[32m\";\nconst YELLOW = \"\\x1b[33m\";\nconst CYAN = \"\\x1b[36m\";\nconst RED = \"\\x1b[31m\";\n\n// ── Version + npm registry helpers ───────────────────────────────────\n\nfunction getInstalledVersion(): string {\n // Read the package.json that ships with this build so we report the\n // actual installed version, not whatever was hardcoded.\n try {\n const here = fileURLToPath(import.meta.url);\n // Walk up to find the package root (contains package.json).\n let dir = dirname(here);\n for (let i = 0; i < 6; i++) {\n try {\n const raw = readFileSync(resolve(dir, \"package.json\"), \"utf-8\");\n const pkg = JSON.parse(raw) as { name?: string; version?: string };\n if (pkg.name === \"@arcis/node\" && pkg.version) {\n return pkg.version;\n }\n } catch {\n // climb\n }\n const parent = resolve(dir, \"..\");\n if (parent === dir) break;\n dir = parent;\n }\n } catch {\n // ignore\n }\n return \"?\";\n}\n\ninterface NpmRegistryResponse {\n \"dist-tags\"?: { latest?: string };\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 5_000);\n try {\n const resp = await fetch(\"https://registry.npmjs.org/@arcis/node\", {\n headers: { Accept: \"application/json\" },\n signal: controller.signal,\n });\n if (!resp.ok) return null;\n const data = (await resp.json()) as NpmRegistryResponse;\n return data[\"dist-tags\"]?.latest ?? null;\n } finally {\n clearTimeout(timer);\n }\n } catch {\n return null;\n }\n}\n\nfunction parseVersion(v: string): number[] | null {\n const parts = v.split(\".\");\n const out: number[] = [];\n for (const p of parts) {\n if (!/^\\d+$/.test(p)) return null;\n out.push(Number(p));\n }\n return out;\n}\n\nfunction versionCompare(a: number[], b: number[]): number {\n const len = Math.max(a.length, b.length);\n for (let i = 0; i < len; i++) {\n const x = a[i] ?? 0;\n const y = b[i] ?? 0;\n if (x < y) return -1;\n if (x > y) return 1;\n }\n return 0;\n}\n\n// ── Python forwarder ─────────────────────────────────────────────────\n\nfunction hasPythonArcis(): boolean {\n // Check both `arcis` (Windows: arcis.exe) and `python -m arcis.cli` so\n // users who have the Python package installed but not on PATH still work.\n const probes: Array<{ cmd: string; args: string[] }> = [\n { cmd: \"arcis\", args: [\"--version\"] },\n { cmd: \"python\", args: [\"-m\", \"arcis.cli\", \"--version\"] },\n { cmd: \"python3\", args: [\"-m\", \"arcis.cli\", \"--version\"] },\n ];\n for (const p of probes) {\n try {\n const result = spawnSync(p.cmd, p.args, {\n stdio: [\"ignore\", \"ignore\", \"ignore\"],\n timeout: 3000,\n shell: process.platform === \"win32\",\n });\n if (result.status === 0) return true;\n } catch {\n // try next\n }\n }\n return false;\n}\n\nfunction forwardToPython(args: string[]): never {\n // Try `arcis` first, fall back to `python -m arcis.cli`. Mirror exit\n // code so CI scripts using the Node CLI get the same behavior they'd\n // get from the Python CLI.\n const candidates: Array<{ cmd: string; args: string[] }> = [\n { cmd: \"arcis\", args },\n { cmd: \"python\", args: [\"-m\", \"arcis.cli\", ...args] },\n { cmd: \"python3\", args: [\"-m\", \"arcis.cli\", ...args] },\n ];\n for (const cand of candidates) {\n const result = spawnSync(cand.cmd, cand.args, {\n stdio: \"inherit\",\n shell: process.platform === \"win32\",\n });\n if (result.error) continue;\n process.exit(result.status ?? 0);\n }\n console.error(\n c(\"arcis: could not invoke the Python CLI. Install with:\", RED, BOLD),\n );\n console.error(\" pip install arcis\");\n process.exit(127);\n}\n\n// ── Catalog ──────────────────────────────────────────────────────────\n\nfunction printCatalog(verbose: boolean): void {\n const ver = getInstalledVersion();\n console.log();\n console.log(` ${c(\"Arcis\", BOLD, CYAN)} ${c(`v${ver}`, DIM)} ${c(\"(node)\", DIM)}`);\n console.log(c(\" Zero-dep security middleware + scanners.\", DIM));\n console.log();\n console.log(c(\" Commands\", BOLD));\n const rows: Array<[string, string, string]> = [\n [\n \"scan\",\n \"Send live attack payloads to a running app.\",\n \"arcis scan http://localhost:8000 --route POST:/echo --field q\",\n ],\n [\n \"audit\",\n \"Static-analyse Python / JS / TS source for unsafe patterns.\",\n \"arcis audit .\",\n ],\n [\n \"sca\",\n \"Match installed dependencies against the supply-chain threat DB.\",\n \"arcis sca .\",\n ],\n [\"update\", \"Check npm for a newer @arcis/node release.\", \"arcis update --apply\"],\n ];\n for (const [name, desc, example] of rows) {\n console.log(` ${c(name.padEnd(8), BOLD, GREEN)} ${desc}`);\n if (verbose) {\n console.log(` ${c(example, DIM)}`);\n }\n }\n console.log();\n console.log(c(\" Discovery\", BOLD));\n console.log(` ${c(\"--list\", BOLD, CYAN).padEnd(24)} Show this catalog (verbose).`);\n console.log(\n ` ${c(\"<cmd> --help\", BOLD, CYAN).padEnd(24)} Show full flags for that command.`,\n );\n console.log();\n console.log(c(\" Note\", BOLD));\n console.log(\n ` scan/audit/sca delegate to the Python CLI (canonical impl).`,\n );\n console.log(` Install once with: ${c(\"pip install arcis\", GREEN)}`);\n console.log();\n}\n\n// ── Update command ───────────────────────────────────────────────────\n\nasync function updateCommand(args: string[]): Promise<void> {\n // Note: this function uses `process.exitCode = N; return;` rather than\n // `process.exit(N)` because the fetch() call leaves an internal undici\n // handle open momentarily on Windows, and process.exit() during that\n // window throws a libuv assertion on stderr. exitCode + return lets\n // Node drain handles cleanly before exit.\n const apply = args.includes(\"--apply\");\n const check = args.includes(\"--check\");\n const yes = args.includes(\"--yes\") || args.includes(\"-y\");\n\n const current = getInstalledVersion();\n const latest = await fetchLatestVersion();\n\n if (check) {\n if (latest === null) {\n console.error(\"arcis: could not reach npm to check for updates\");\n process.exitCode = 2;\n return;\n }\n const cur = parseVersion(current);\n const lat = parseVersion(latest);\n if (!cur || !lat || versionCompare(cur, lat) >= 0) {\n console.log(`@arcis/node ${current} is up-to-date`);\n process.exitCode = 0;\n return;\n }\n console.error(`@arcis/node ${current} is outdated; latest is ${latest}`);\n process.exitCode = 1;\n return;\n }\n\n console.log();\n console.log(c(\" @arcis/node update check\", BOLD, CYAN));\n console.log(c(\" Source: https://registry.npmjs.org/@arcis/node\", DIM));\n console.log();\n\n if (latest === null) {\n console.log(` Installed @arcis/node ${current}`);\n console.log(\n ` Latest ${c(\"? unreachable\", YELLOW)} ${c(\"(network error or npm down)\", DIM)}`,\n );\n console.log();\n console.log(c(\" Try again later, or run 'npm view @arcis/node version' directly.\", DIM));\n console.log();\n process.exitCode = 2;\n return;\n }\n\n const cur = parseVersion(current);\n const lat = parseVersion(latest);\n if (!cur || !lat) {\n console.log(\n ` Installed @arcis/node ${current} ${c(\"(pre-release or unparseable)\", DIM)}`,\n );\n console.log(` Latest @arcis/node ${latest}`);\n console.log();\n console.log(c(\" Skipping comparison — manually decide.\", DIM));\n console.log();\n process.exitCode = 0;\n return;\n }\n\n if (versionCompare(cur, lat) >= 0) {\n console.log(` Installed @arcis/node ${current}`);\n console.log(` Latest @arcis/node ${latest}`);\n console.log();\n console.log(c(\" You are on the latest version.\", BOLD, GREEN));\n console.log();\n process.exitCode = 0;\n return;\n }\n\n console.log(` Installed @arcis/node ${current}`);\n console.log(\n ` Latest ${c(`@arcis/node ${latest}`, BOLD)} ${c(\"(update available)\", YELLOW)}`,\n );\n console.log();\n console.log(c(\" Run to upgrade\", BOLD));\n console.log(` ${c(\"npm install @arcis/node@latest\", GREEN)}`);\n console.log();\n\n if (!apply) {\n console.log(c(\" Or rerun: 'arcis update --apply' to upgrade in place.\", DIM));\n console.log();\n process.exitCode = 1;\n return;\n }\n\n if (!yes && process.stdin.isTTY) {\n process.stdout.write(\"Upgrade now? [y/N] \");\n const response = await new Promise<string>((res) => {\n process.stdin.once(\"data\", (chunk: Buffer) => res(chunk.toString().trim().toLowerCase()));\n });\n if (!response.startsWith(\"y\")) {\n process.exitCode = 1;\n return;\n }\n }\n\n const npmCmd = process.platform === \"win32\" ? \"npm.cmd\" : \"npm\";\n console.log(` $ ${npmCmd} install @arcis/node@latest`);\n const result = spawnSync(npmCmd, [\"install\", \"@arcis/node@latest\"], {\n stdio: \"inherit\",\n });\n process.exitCode = result.status ?? 1;\n}\n\n// ── Main ─────────────────────────────────────────────────────────────\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n\n if (args.length === 0) {\n printCatalog(false);\n process.exit(0);\n }\n\n const arg0 = args[0];\n\n if (arg0 === \"--list\" || arg0 === \"-l\") {\n printCatalog(true);\n process.exit(0);\n }\n\n if (arg0 === \"-h\" || arg0 === \"--help\") {\n printCatalog(false);\n console.log(c(\" Run 'arcis <command> --help' for full flags.\", DIM));\n console.log();\n process.exit(0);\n }\n\n if (arg0 === \"-V\" || arg0 === \"--version\") {\n console.log(getInstalledVersion());\n process.exit(0);\n }\n\n if (arg0 === \"update\") {\n await updateCommand(args.slice(1));\n return;\n }\n\n if (arg0 === \"scan\" || arg0 === \"audit\" || arg0 === \"sca\") {\n if (!hasPythonArcis()) {\n console.error(\n c(\n `arcis: '${arg0}' is implemented by the Python CLI. Install with:`,\n YELLOW,\n BOLD,\n ),\n );\n console.error(\" pip install arcis\");\n console.error();\n console.error(c(\"Why: scan/audit/sca rely on Python's threat-DB and rule data.\", DIM));\n console.error(\n c(\n \"@arcis/node implements the middleware + dashboard upload — see the docs.\",\n DIM,\n ),\n );\n process.exit(127);\n }\n forwardToPython(args);\n return;\n }\n\n console.error(`arcis: unknown command '${arg0}'`);\n console.error(\"Run 'arcis --list' for available commands.\");\n process.exit(1);\n}\n\nmain().catch((err) => {\n console.error(c(`arcis: unexpected error: ${err}`, RED));\n process.exit(1);\n});\n"]}
|