工具与 JSON
stage-0 编译器只提供一个可执行文件 bin/sprig,由 scripts/build.sh 生成。 没有守护进程或语言服务器。VS Code 预览插件 提供高亮、CLI 诊断、运行和生成 Java 查看。
命令
check <file.spr> [--json] [--syntax-only] parse and type-check
run <file.spr> [--json] [--keep] [--stacktrace] [-- a b] compile and execute on the JVM
test [PATH] [--filter TEXT] [--json] 运行普通项目测试程序
build <file.spr> [-d dir] [--emit-java-only] [--json] emit Java sources + .class files
help [topic] [--json] 带版本的语言参考
capabilities [--json] 已实现能力清单
api <Java.Class> [--member NAME] [--classpath JAR] [--json] 查询 JVM 签名
wrap <Java.Class> --out FILE.spr [--member NAME] [--force] [--json] 生成可编辑的 Sprig wrapper
doctor [--classpath JAR] [--json] 环境检查
explain <SPR-CODE> [--json] 结构化诊断说明
codes [--json] list every diagnostic code
versioncheck、build、run、api、wrap、doctor 可重复使用 --classpath 指定本地 JAR 或目录,并采用同一解析路径;不自动下载依赖。比如用 sprig api java.time.LocalDate --json 查询实际 JDK 签名。
已发布的 v0.5.0-beta.1 SDK 包含上方命令,包括 test、wrap、run --stacktrace 和 schema-4 便携锁。Sprig 仍处于实验性 Beta;确切能力以发行资产和安装 SDK 的 sprig capabilities --json 为准。
check在代码生成之前停止;--syntax-only更早,只做词法、缩进与解析。run支持在--之后传递程序参数,--keep用于保留生成的中间文件。未捕获的 运行时错误使用稳定诊断码(SPR-RUNTIME-ERROR/SPR-RUNTIME-EXCEPTION), 携带包装后的消息与源码范围;--stacktrace额外输出原始 JVM 堆栈用于调试。build把生成的 Java 与.class写入-d(默认sprig-build);检查失败时不会 留下 class 文件。test将tests/**/*.spr作为独立 JVM 程序运行,并按同名.expect.toml核对tests/compile_fail/的诊断码;详见测试契约(英文)。wrap从真实 classpath 生成可编辑的 Sprig source:默认不覆盖已有文件,写出前 先在同一 classpath 下检查,--json报告生成/跳过成员与稳定原因。 见 wrapper 生成器(英文) 与 Fabric / JVM 框架集成。explain与codes对应诊断码(英文)。
JSON 结果
加 --json 后,stdout 恰好包含一个 JSON 文档,即使程序本身运行失败也是如此。 programOutput 保存程序输出,diagnostics 保存结构化错误。
成功运行:
{
"schemaVersion": 1,
"toolVersion": "sprig-compiler 0.5.0-beta.1",
"command": "run",
"exitCode": 0,
"programOutput": "Hello, Ada!\n",
"environment": {"classpath": []},
"diagnostics": []
}失败的检查(此处缩短了路径;实际 uri 是 file: URI):
{
"schemaVersion": 1,
"toolVersion": "sprig-compiler 0.5.0-beta.1",
"command": "check",
"exitCode": 1,
"environment": {"classpath": []},
"diagnostics": [
{
"code": "SPR-MATCH-NONEXHAUSTIVE",
"phase": "FLOW",
"severity": "error",
"uri": "file:///project/tests/semantics/missing_case.spr",
"range": {
"start": { "line": 4, "character": 4 },
"end": { "line": 6, "character": 29 }
},
"message": "Missing case: Expr.Add",
"hint": "Add 'case Expr.Add:' (there is no default case)",
"related": [],
"suggestedEdits": []
}
]
}位置从 0 开始计数。CLI 参数与工具错误使用退出码 2,源码和运行时失败通常使用 1。run 会原样转发程序进程状态,因此程序显式退出也可能返回 2 或其他值; 非零状态且没有 JVM 异常诊断时会报告 SPR-PROGRAM-EXIT,并在 JSON 的 data.programExitCode 中记录程序状态。诊断 code 用于区分工具失败与程序退出。
尚未提供的工具
以下能力都是提案,尚未实现:
- LSP / IDE 语言服务器、
- 发布或模块仓库、
- 增量检查。
历史Agent 工具协议(英文,提案) 还包含未来接口。当前能力以 sprig capabilities --json 为准;api 边界见 JVM 互操作(英文)。
面向 agent 的工作流
- 在
run之前,sprig check --json是最便宜的可靠门槛:解析、解析名称、类型检查, 不生成也不执行代码。 - 诊断带有稳定码、阶段(
LEX、SYNTAX、NAME、TYPE、FLOW、JVM、RUNTIME)、 范围,并且常常带有指出下一步修复的hint。 run --json把程序输出与诊断分开,程序失败时仍能得到可解析的结果。- 仓库的质量门槛是有意设计的,见 AI 辅助开发声明(英文)。
sprig build file.spr --emit-java-only -d generated --json 完成静态检查后写出 Java,不调用 javac。JSON 包含 javaSources、mainClass 和 javacInvoked=false。通过显式 import "@std/files.spr" as files 使用 SDK 内置标准包。Windows 仍为实验性预览。
Canonical formatting
Use sprig fmt file.spr or sprig fmt --check . --json. Formatting is comment-preserving, deterministic and configless, with no aggressive wrapping. See formatter contract. Other commands never rewrite source.
