/**
* `harn version` ported to .harn — see harn#2301 (W1).
*
* Build-time constants come from env vars set by the dispatch shim in
* crates/harn-cli/src/lib.rs's `Command::Version` arm: HARN_BUILD_NAME,
* HARN_BUILD_VERSION, HARN_BUILD_DESCRIPTION, and HARN_BUILD_REVISION.
* The shim reads package metadata and the optional revision embedded by the
* build script, never from the caller's runtime environment or checkout.
*
* The banner and JSON envelope shapes are pinned by
* crates/harn-cli/tests/harn_cli_e2e/version_dispatch.rs.
*/
fn render_banner(version: string) -> string {
return "\n ╱▔▔╲\n ╱ ╲ harn v" + version
+ "\n │ ◆ │ the agent harness language\n │ │\n ╰──╯╱\n ╱╱\n"
}
fn render_json(
name: string,
version: string,
description: string,
source_revision: string?,
) -> string {
// Adding an optional field does not bump VERSION_SCHEMA_VERSION.
const env = {
schemaVersion: 1,
ok: true,
data: {
name: name,
version: version,
description: description,
source_revision: source_revision,
},
error: nil,
warnings: [],
}
return json_stringify_pretty(env)
}
fn main(harness: Harness) {
const json_mode = harness.env.get_or("HARN_OUTPUT_JSON", "0") == "1"
const version = harness.env.get_or("HARN_BUILD_VERSION", "unknown")
if json_mode {
const name = harness.env.get_or("HARN_BUILD_NAME", "harn-cli")
const description = harness.env.get_or("HARN_BUILD_DESCRIPTION", "")
const raw_revision = trim(harness.env.get_or("HARN_BUILD_REVISION", ""))
const source_revision: string? = if raw_revision == "" {
nil
} else {
raw_revision
}
harness.stdio.println(render_json(name, version, description, source_revision))
} else {
harness.stdio.println(render_banner(version))
}
}