e7738de6d2
CI / Deep Native Runtime Cases (1/6) (push) Has been skipped
CI / Native Preflight (push) Failing after 1s
CI / Native Runtime Cases (1/2) (push) Failing after 0s
CI / Native Runtime Cases (2/2) (push) Failing after 1s
CI / Native Metadata Reports (push) Failing after 0s
CI / Native Direct Backend Artifacts (push) Failing after 0s
CI / Native Sanitizer Smoke (push) Failing after 1s
CI / Command Contract Snapshots (push) Failing after 1s
CI / Deep Conformance Suite (push) Has been skipped
CI / Graph Build Perf (push) Failing after 1s
CI / Deep Native Preflight (push) Has been skipped
CI / Deep Native Runtime Cases (2/6) (push) Has been skipped
CI / Deep Native Runtime Cases (3/6) (push) Has been skipped
CI / Conformance Suite (push) Failing after 1s
CI / Workspace Checks (push) Failing after 0s
CI / Deep Native Runtime Cases (5/6) (push) Has been skipped
CI / Deep Native Runtime Cases (6/6) (push) Has been skipped
CI / Deep Native Runtime Cases (4/6) (push) Has been skipped
CI / Deep Graph Build Perf (push) Has been skipped
291 lines
7.4 KiB
Markdown
291 lines
7.4 KiB
Markdown
## Use Commands By Workflow
|
||
|
||
The Zerolang CLI is organized around graph-first agent work. Humans ask for a task;
|
||
agents inspect and patch the graph; projections are exported only for review or
|
||
manual edits.
|
||
|
||
Most commands default to the current directory:
|
||
|
||
```sh
|
||
zero status
|
||
zero query
|
||
zero patch --op help
|
||
zero check
|
||
zero run -- <args>
|
||
```
|
||
|
||
Pass an explicit graph input or package when you are outside the project:
|
||
|
||
```sh
|
||
zero check examples/hello.graph
|
||
zero query examples/crm-api
|
||
zero run examples/json-api-router.graph -- $'GET /health\n\n'
|
||
```
|
||
|
||
## Create A Project
|
||
|
||
Use `zero init` for all project creation.
|
||
|
||
```sh
|
||
zero init
|
||
zero init --template cli crm-tool
|
||
zero init --manifest toml --format binary --template package api-server
|
||
```
|
||
|
||
If no path is given, `zero init` creates the package in the current directory.
|
||
For `.` or an omitted path, the package name comes from the directory name.
|
||
|
||
```json-render
|
||
{
|
||
"messages": [
|
||
{
|
||
"role": "user",
|
||
"text": "start a cli here"
|
||
},
|
||
{
|
||
"role": "assistant",
|
||
"text": "I’ll initialize this directory and add the starting CLI shape."
|
||
},
|
||
{
|
||
"role": "tools",
|
||
"calls": [
|
||
{
|
||
"command": "zero init --template cli",
|
||
"output": "graph project init ok\nwrote: ./zero.toml\nwrote: ./zero.graph"
|
||
},
|
||
{
|
||
"command": "zero patch --op 'addMain'",
|
||
"output": "program graph patch ok"
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
## Inspect Before Editing
|
||
|
||
Agents should query for the exact thing they need instead of dumping the whole
|
||
program.
|
||
|
||
```sh
|
||
zero status
|
||
zero query --fn main
|
||
zero query --find customer
|
||
zero query --refs handle
|
||
zero query --calls write
|
||
zero inspect --json
|
||
zero size --json
|
||
zero mem --json
|
||
```
|
||
|
||
Use plain text first. Use `--json` when a tool needs exact fields such as node
|
||
ids, graph hashes, `interfaceFingerprints`, `targetToolchains`,
|
||
`usedStdlibHelpers`, `memoryBudgets`, or `releaseTargetContract`.
|
||
|
||
## Patch The Graph
|
||
|
||
Patch commands are checked graph edits:
|
||
|
||
```sh
|
||
zero patch --op 'addFunction name="add" ret="i32"'
|
||
zero patch --op 'addParam fn="add" name="x" type="i32"'
|
||
zero patch --op 'addParam fn="add" name="y" type="i32"'
|
||
zero patch --op 'addReturnBinary fn="add" name="+" left="x" right="y" type="i32"'
|
||
```
|
||
|
||
For larger edits, use a patch file under `/tmp`:
|
||
|
||
```text
|
||
zero-program-graph-patch v1
|
||
expect graphHash "graph:a7f7e6899a73f3b4"
|
||
replaceFunctionBody main
|
||
check world.out.write "hello\n"
|
||
end
|
||
```
|
||
|
||
Dry-run a repository graph patch without writing:
|
||
|
||
```sh
|
||
zero patch --check-only /tmp/main.patch
|
||
zero patch --dry-run --json /tmp/main.patch
|
||
```
|
||
|
||
Apply it:
|
||
|
||
```sh
|
||
zero patch /tmp/main.patch
|
||
```
|
||
|
||
To replace one function body without patch syntax, pass only the new body rows
|
||
(exactly what `zero view --fn <name>` prints between the signature braces).
|
||
`--body-file -` reads them from stdin, so a heredoc does the whole edit in one
|
||
call:
|
||
|
||
```sh
|
||
zero patch --replace-fn main --body-file - <<'EOF'
|
||
check world.out.write("hello agent\n")
|
||
EOF
|
||
```
|
||
|
||
A file path works as the alternative:
|
||
|
||
```sh
|
||
zero patch --replace-fn main --body-file /tmp/main.body
|
||
```
|
||
|
||
To change a few characters inside a function without retyping the body,
|
||
`--replace-in-fn` replaces one unique literal occurrence of `--old` in the
|
||
function's canonical body text (what `zero view --fn <name>` prints) with
|
||
`--new`, then revalidates exactly like `--replace-fn`:
|
||
|
||
```sh
|
||
zero patch --replace-in-fn main --old 'limit + 1' --new 'limit + 2'
|
||
```
|
||
|
||
A missing or non-unique `--old` fails with the occurrence count. Inline
|
||
`--old`/`--new` accept `\n` escapes for multi-line text; `--old-file` and
|
||
`--new-file <file|->` read the text from a file or stdin.
|
||
|
||
The patch step validates graph shape and repository metadata. A stale graph
|
||
hash, missing required edge, sparse ordered child group, or invalid row body
|
||
fails before the package store is updated.
|
||
|
||
## Validate Only What You Need
|
||
|
||
Do not run every command after every patch. `zero patch` already reports whether
|
||
the edit applied. Run the next command that proves the user-visible behavior.
|
||
|
||
```sh
|
||
zero check
|
||
zero test
|
||
zero test --json --filter add
|
||
zero run -- add 40 2
|
||
```
|
||
|
||
Use `zero check --json` when an editor, CI job, or agent needs stable
|
||
diagnostic fields. Test JSON includes `expectedFailures`, `fixtures`,
|
||
`snapshotKey`, and per-test results.
|
||
|
||
## Run And Build
|
||
|
||
Use `zero run` for local behavior:
|
||
|
||
```sh
|
||
zero run -- help
|
||
zero run examples/hello.graph
|
||
```
|
||
|
||
Use `zero build` for artifacts:
|
||
|
||
```sh
|
||
zero build --emit exe --target linux-musl-x64 --out .zero/out/app
|
||
zero build --emit obj --target darwin-arm64 examples/direct-call-add.graph --out .zero/out/add.o
|
||
zero build --emit llvm-ir examples/hello.graph --out .zero/out/hello.ll
|
||
```
|
||
|
||
Build JSON reports profile and target readiness:
|
||
|
||
```sh
|
||
zero build --json --profile tiny --target linux-musl-x64 examples/hello.graph --out .zero/out/hello
|
||
```
|
||
|
||
Important fields include `profileSemantics`, `profileBudget`,
|
||
`releaseTargetContract`, `targetToolchains`, `compileTime`, and repeat-build
|
||
hash policy data for artifact determinism.
|
||
|
||
## Review Projections
|
||
|
||
Projection commands are for humans:
|
||
|
||
```sh
|
||
zero export
|
||
zero verify-projection
|
||
zero import
|
||
zero diff
|
||
zero view
|
||
```
|
||
|
||
Use `zero export` when a human wants the current `.0` projection. Use
|
||
`zero import` after a human intentionally edits projection text. Use
|
||
`zero verify-projection` to catch drift without writing.
|
||
|
||
```json-render
|
||
{
|
||
"messages": [
|
||
{
|
||
"role": "user",
|
||
"text": "show me the projection before we keep going"
|
||
},
|
||
{
|
||
"role": "assistant",
|
||
"text": "I’ll export the current projection and verify it matches the graph."
|
||
},
|
||
{
|
||
"role": "tools",
|
||
"calls": [
|
||
{
|
||
"command": "zero export",
|
||
"output": "repository graph export ok\nwrote: ./src/main.0"
|
||
},
|
||
{
|
||
"command": "zero verify-projection",
|
||
"output": "repository graph verify-projection ok"
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
## Diagnose And Repair
|
||
|
||
```sh
|
||
zero explain NAM003
|
||
zero fix --plan --json
|
||
zero doctor
|
||
zero dev --json
|
||
zero dev --json --trace
|
||
```
|
||
|
||
`zero dev --json` is the editor-facing snapshot. It includes diagnostics,
|
||
document symbols, hover data, completions, definition targets, and
|
||
`interfaceFingerprints`.
|
||
|
||
## Command Groups
|
||
|
||
| Workflow | Commands |
|
||
| --- | --- |
|
||
| create | `init` |
|
||
| inspect | `status`, `query`, `inspect`, `size`, `mem`, `doc`, `source-map` |
|
||
| edit graph | `patch`, `reconcile`, `merge` |
|
||
| validate | `check`, `test`, `verify-projection`, `validate`, `roundtrip` |
|
||
| run/build | `run`, `build`, `targets`, `abi` |
|
||
| projection review | `export`, `import`, `view`, `diff`, `fmt`, `tokens`, `parse` |
|
||
| support | `skills`, `explain`, `fix`, `doctor`, `clean`, `dev`, `time` |
|
||
|
||
## Input Forms
|
||
|
||
| Input | Meaning |
|
||
| --- | --- |
|
||
| `project/` | A package directory. Normal package commands compile from `zero.graph`. |
|
||
| `zero.toml` | Preferred package manifest. Takes precedence over `zero.json` for directory inputs. |
|
||
| `zero.json` | Compatibility manifest. Prefer `zero.toml` for new packages. |
|
||
| `file.graph` | Binary or text graph store/artifact. |
|
||
| `file.0` | Human-readable projection for formatting, import/export, and review workflows. It is not the normal compiler input. |
|
||
|
||
## JSON Rule
|
||
|
||
Humans and interactive agents should start with concise text output. Use JSON
|
||
when a program needs exact structured data:
|
||
|
||
```sh
|
||
zero check --json
|
||
zero test --json
|
||
zero inspect --json
|
||
zero size --json
|
||
zero doctor --json
|
||
```
|
||
|
||
JSON is a contract for tools, not the default reading experience for humans.
|