CLI 使用指南
nudo CLI 是在 .js、.mjs、.ts 文件上运行类型推断的主要方式。可通 过全局安装或 npx 使用:
npm install -g @nudojs/cli
# or
pnpm add -g @nudojs/cli
nudo infer
从单个文件推断类型——也可以一次推断目录下的全部推断目标。带 @nudo:case 指令的函数使用指令;其余函数也会被分析(全程序推断)——观察到的调用合成为 call@L 用例,没有任何调用证据的函数则产出 entry@L 用例,参数默认为 unknown。
nudo infer <file-or-directory>
目标可以是 .js、.mjs 或 .ts 文件(TypeScript 类型标注在 parser 层剥除,按 JS 语义推断),也可以是目录——目录会递归收集推断目标文件(.js/.mjs/.ts,排除 .d.ts),每个文件各自运行一次分析。--json 仅支持单文件。
给定 lib/:
// lib/slug.js
export function slugify(title) {
return title.toLowerCase().replace(/ /g, "-");
}
console.log(slugify("Hello World"));
// lib/note.ts
export function note(text) {
return "note: " + text;
}
nudo infer lib/
输出——每个函数一个区块,文件按扫描顺序出现:
=== note ===
entry@L1: (unknown) => unknown
# no call sites found; parameters default to unknown
=== slugify ===
call@L4: ("Hello World") => string
slugify 从顶层调用得到 call@L4 用例— —toLowerCase() 折叠为字面量,.replace(...) 再拓宽为 string,因此结果为 string。当一个被分析文件从另一个文件导入函数时,被导入函数的用例会出现在 --- <路径> (imported) --- 区块中。
选项
| 选项 | 描述 |
|---|---|
--dts | 在源文件旁生成 .d.ts 声明文件 |
--loc | 在输出中显示源码位置(file:line:column) |
--json | 以结构化 JSON 输出结果——仅支持单文件(示例见 CLI 参考) |
--callsites <paths...> | 从使用处文件(测试、示例、应用)挖掘真实参数形状并合成用例——参见调用点发现 |
--emit-cases [mode] | 仅调试——把合成的用例写回源文件,成为 @nudo:case 指令——参见固化 case 指令 |
--dry-run | 搭配 --emit-cases:打印 unified diff 而不写盘 |
--exit-on-diff | 搭配 --dry-run:diff 非空时以退出码 1 结束 |
示例
给定 math.js:
export function subtract(a, b) {
return a - b;
}
subtract(5, 3);
subtract(1, 10);
基本推断(调用点优先):
nudo infer math.js
输出:
=== subtract ===
call@L6: (5, 3) => 2
call@L7: (1, 10) => -9
Observed: 2 | -9
每一行 call@L… 是一条观测到的调用点事实。Observed: 合并结果(有基类型时按吸收律化简;纯字面量并集保留每个字面量)。可选的 @nudo:case 见证打印为 debug "name": …——仅调试 / nudo test。
生成 TypeScript 声明文件:
nudo infer math.js --dts
这会在源文件旁创建 math.d.ts,包含推断出的函数签名。
显示源码位置:
nudo infer src/math.js --loc
输出包含位置信息:
=== subtract (src/math.js:1:0) ===
call@L6: (5, 3) => 2
call@L7: (1, 10) => -9
Observed: 2 | -9
无指令的函数
没有 @nudo:case 指令的函数同样会根据其使用方式推断。没有记录到调用时,参数默认为 unknown,用例命名为 entry@<行号>:
// src/plain.js
export function add(a, b) {
return a + b;
}
nudo infer src/plain.js
=== add ===
entry@L1: (unknown, unknown) => number | string
# no call sites found; parameters default to unknown
当被分析的文件调用某个导入函数时,每次观察到的调用都会合成为一个带真实参数形状的 call@<行号> 用例:
// src/main.js
import { add } from "./plain.js";
console.log(add(2, 3));
console.log(add("2", "3"));
nudo infer src/main.js
--- src/plain.js (imported) ---
=== add ===
call@L3: (2, 3) => 5
call@L4: ("2", "3") => "23"
Observed: 5 | "23"
要从独立的使用处文件(测试、示例、应用)挖掘参数形状,请用 --callsites 传入——参见调用点发现。
固化 case 指令
--emit-cases 是