mirror of
https://github.com/ModernRelay/omnigraph.git
synced 2026-06-18 02:24:27 +02:00
* feat(cli): --server accepts a literal URL (RFC-011 Decision 2) `resolve_server_flag` now treats a `--server` value containing `://` as a literal base URL (trailing slash trimmed; `--graph` appends `/graphs/<id>`), bypassing the operator-config `servers:` registry; a bare name still resolves through the registry. This is the replacement the upcoming `--uri http(s)://` deprecation points at, and a small ergonomic win on its own (`--server https://host` with no config entry). Token resolution for a literal-URL server falls to the legacy OMNIGRAPH_BEARER_TOKEN chain, same as a positional URL today. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * test(cli): address the parity-matrix arms with global --store/--server flags Prep for removing the positional-http→remote dispatch. The parity harness addressed both arms with a positional graph right after the verb (`omnigraph <verb> <addr> <args…>`), which only parses for top-level verbs — for nested subcommands (`schema show`, `branch list`, …) the address landed in the subcommand slot and BOTH arms failed identically, so the test passed vacuously (matching exit codes, never comparing output). Address both arms with the global flags instead — local `--store <graph>` (embedded), remote `--server <url>` (served) — appended after the verb + args, valid regardless of nesting. The previously-vacuous nested-verb parity checks now actually compare embedded vs remote (and pass — parity holds), and the remote arm no longer relies on the positional-URL dispatch that's about to be removed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat(cli)!: --as on a served write is a hard error (was a silent no-op) A served write resolves the actor server-side from the bearer token, so `--as` could never set identity there — it was silently ignored. It now errors (in the remote write factory, before any HTTP call), pointing the user at removing `--as` or writing directly with `--store`. Reads don't carry `--as`, so this is write-path only. BREAKING for any script that passed `--as` to a remote write (it was a no-op, so behavior is unchanged except the now-explicit error). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat(cli)!: a positional/--uri http(s):// URL no longer dispatches to a server Remote graphs must be addressed with `--server <url>` (or a named server / a profile binding one). A positional or `--uri` `http(s)://` URL on a data verb now errors instead of silently routing to the remote HTTP client — the scheme no longer carries transport semantics. The discriminator is `via_server`: a remote URL produced by a server scope is fine; a remote URL from a positional/`--uri` source is rejected (`reject_positional_remote` in both GraphClient factories). Storage verbs are unaffected — they already reject remote URIs through `resolve_local_graph` with the existing "direct (storage-native)" error. Migrated the gh-host keyed-credential system test to `--server <url>` (the literal URL still prefix-matches the operator server for token resolution). BREAKING: scripts addressing a server by a bare URL must switch to `--server <url>`. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat(cli)!: remove the --target flag (use --store / --profile / --server) Removes the legacy named-graph flag and threads its parameter out of the whole resolver chain. `--target` resolved a graph name through `omnigraph.yaml`'s `graphs:` map; its replacements (`--store <uri>`, `--profile <name>`, `--server <name>`) all ship. - Drops the 22 `target` clap fields + the `--cluster` exclusion that named it. - Threads `target`/`cli_target` out of `resolve_uri`/`resolve_cli_graph`/ `resolve_local_graph`/`resolve_local_uri`/`resolve_storage_uri`/ `resolve_remote_bearer_token`/`apply_server_flag`/`execute_query_lint`/ `resolve_selected_graph`/`resolve_registry_selection_for_list`/ `execute_queries_{validate,list}`, the two `GraphClient` factories, and `ScopeFlags`/`ResolvedScope`. - Keeps the shared `OmnigraphConfig::resolve_target_uri` 3-arg (server boot uses it); the CLI passes None for the explicit-target arm. The `cli.graph` default (omnigraph.yaml bare-command fallback) is unchanged — its removal belongs to the omnigraph.yaml excision. - Operator/file aliases that bind a `graph` name still work: the name is now resolved to a URI inline (a positional URI wins). - Error messages and `--graph`/`--server`/`--store` help text no longer name `--target`; the queries-list selection hint points at `cli.graph`. BREAKING. Tests updated (named-target resolution rewritten onto `cli.graph`; positional-URI tests unchanged). Full omnigraph-cli suite green (228). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * docs(cli): drop --target and positional-http addressing; --as-on-served is an error Update the user docs for the legacy data-plane addressing removals: - the CLI `--target` flag is gone — address graphs with a positional URI, `--store`, `--profile`, or `--server <name|url>`; - a positional `http(s)://` URI no longer dispatches to a server (use `--server`); - `--as` on a served write is now rejected (was a silent no-op). Touches cli/reference.md (addressing intro, capability table, error examples, scopes), cli/index.md (the remote-read example → --server), operations/maintenance + policy, and the cluster docs' data-plane load guidance. The server's own `--target` boot flag is unchanged (server.md untouched). Also fixes a pre-existing broken maintenance link in search/indexes.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(cli): --store is loudly exclusive with a positional URI / --server; test graphs→Served Address two Greptile findings on the RFC-011 slices: - Slice A (P1): `--store` combined with a positional URI silently dropped the URI (`scope.rs` did `store.or(uri)`); `--store` + `--server` errored with a misleading "positional URI" message. Now both combinations fail loudly with a declared `--store is exclusive with a positional URI and --server` error. - Slice B (P2): the `command_capability` unit test never exercised the one Data→Served refinement (`graphs`); added the assertion so deleting that guard can't pass silently. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
166 lines
6.2 KiB
Markdown
166 lines
6.2 KiB
Markdown
# CLI Guide
|
|
|
|
## Core Graph Flow
|
|
|
|
```bash
|
|
omnigraph init --schema schema.pg graph.omni
|
|
omnigraph load --data data.jsonl --mode overwrite graph.omni
|
|
omnigraph snapshot graph.omni --branch main --json
|
|
omnigraph query --uri graph.omni --query queries.gq --name get_person --params '{"name":"Alice"}'
|
|
omnigraph mutate --uri graph.omni --query queries.gq --name insert_person --params '{"name":"Mina","age":28}'
|
|
```
|
|
|
|
`omnigraph query` is the canonical read command (pairs with `POST /query`);
|
|
`omnigraph mutate` is the canonical write command (pairs with `POST /mutate`).
|
|
The previous names `omnigraph read` and `omnigraph change` keep working as
|
|
visible aliases — invocations emit a one-line deprecation warning to stderr
|
|
and otherwise behave identically. See [Deprecated names](#deprecated-names)
|
|
for the migration table.
|
|
|
|
For ad-hoc reads and mutations (REPLs, AI agents, one-off scripts), pass the
|
|
GQ source inline with `-e` / `--query-string` instead of a file path:
|
|
|
|
```bash
|
|
omnigraph query --uri graph.omni \
|
|
-e 'query find($name: String) { match { $p: Person { name: $name } } return { $p.name, $p.age } }' \
|
|
--params '{"name":"Alice"}'
|
|
|
|
omnigraph mutate --uri graph.omni \
|
|
-e 'query add($name: String, $age: I32) { insert Person { name: $name, age: $age } }' \
|
|
--params '{"name":"Inline","age":42}'
|
|
```
|
|
|
|
`-e` is mutually exclusive with `--query <path>` and `--alias <name>`; exactly
|
|
one of the three must be provided. The inline source travels through the same
|
|
parser, lint, params binding, and commit machinery as a file-based query —
|
|
only the source loader changes.
|
|
|
|
## Branching And Reviewable Data Flows
|
|
|
|
```bash
|
|
omnigraph branch create --uri graph.omni --from main feature-x
|
|
omnigraph branch list --uri graph.omni
|
|
omnigraph branch merge --uri graph.omni feature-x --into main
|
|
|
|
omnigraph load --data batch.jsonl --branch review/import-2026-04-09 --from main --mode merge graph.omni
|
|
omnigraph export graph.omni --branch main --type Person > people.jsonl
|
|
omnigraph commit list graph.omni --branch main --json
|
|
omnigraph commit show --uri graph.omni <commit-id> --json
|
|
```
|
|
|
|
## Remote Server Mode
|
|
|
|
Serve a graph:
|
|
|
|
```bash
|
|
omnigraph-server graph.omni --bind 127.0.0.1:8080
|
|
```
|
|
|
|
Read through the HTTP API:
|
|
|
|
```bash
|
|
omnigraph query \
|
|
--server http://127.0.0.1:8080 \
|
|
--query queries.gq \
|
|
--name get_person \
|
|
--params '{"name":"Alice"}'
|
|
```
|
|
|
|
A server is addressed with `--server` (a name from `~/.omnigraph/config.yaml` or a
|
|
literal URL); a positional `http(s)://` URI is rejected. If the server requires
|
|
auth, set its bearer token and `omnigraph login <server>` (or
|
|
`OMNIGRAPH_BEARER_TOKEN`).
|
|
|
|
## Multi-graph servers (v0.6.0+)
|
|
|
|
Against a multi-graph server (started with `--config omnigraph.yaml` referencing a non-empty `graphs:` map), use `omnigraph graphs list` to enumerate the registered graphs. The server must configure bearer tokens and `server.policy.file` with a rule that allows `graph_list`; `/graphs` is closed by default even when the server runs with `--unauthenticated`.
|
|
|
|
```bash
|
|
OMNIGRAPH_BEARER_TOKEN=admin-token \
|
|
omnigraph graphs list --uri http://server.example.com --json
|
|
```
|
|
|
|
For config-driven clients, set the remote graph's `bearer_token_env` to an environment variable containing a token whose actor is authorized by `server.policy.file`.
|
|
|
|
`list` rejects local URI targets — it's for remote multi-graph servers only.
|
|
|
|
Runtime add/remove is **not** in v0.6.0. To add a graph, stop the server, add a `graphs.<id>` entry to `omnigraph.yaml`, then restart. To remove, stop the server, delete the entry, restart.
|
|
|
|
Per-graph URLs: hit a graph's cluster route from any subcommand by pointing `--uri` at it:
|
|
|
|
```bash
|
|
omnigraph read --uri http://server.example.com/graphs/beta --query q.gq ...
|
|
```
|
|
|
|
## Runs, Policy, And Diagnostics
|
|
|
|
```bash
|
|
omnigraph lint --query queries.gq --schema schema.pg --json
|
|
omnigraph check --query queries.gq graph.omni --json
|
|
|
|
omnigraph schema plan --schema next.pg graph.omni --json
|
|
omnigraph schema apply --schema next.pg graph.omni --json
|
|
omnigraph policy validate --config omnigraph.yaml
|
|
omnigraph policy test --config omnigraph.yaml
|
|
omnigraph policy explain --config omnigraph.yaml --actor act-alice --action read --branch main
|
|
|
|
omnigraph commit list graph.omni --json
|
|
omnigraph commit show --uri graph.omni <commit-id> --json
|
|
```
|
|
|
|
(Mutations and loads publish atomically; the commit graph (`omnigraph commit list`) is the audit surface.)
|
|
|
|
`query lint` and `query check` are the same command surface. In v1, graph-backed
|
|
lint uses local or `s3://` graph URIs; HTTP targets are only supported when you
|
|
also pass `--schema`.
|
|
|
|
## Config
|
|
|
|
`omnigraph.yaml` lets the CLI and server share named graphs, defaults, and
|
|
query roots:
|
|
|
|
```yaml
|
|
graphs:
|
|
local:
|
|
uri: demo.omni
|
|
dev:
|
|
uri: http://127.0.0.1:8080
|
|
bearer_token_env: OMNIGRAPH_BEARER_TOKEN
|
|
|
|
cli:
|
|
graph: local
|
|
branch: main
|
|
|
|
query:
|
|
roots:
|
|
- queries
|
|
- .
|
|
```
|
|
|
|
The config file can also define:
|
|
|
|
- server bind defaults
|
|
- auth env files
|
|
- query aliases for common read and change commands
|
|
- `policy.file` for Cedar authorization rules
|
|
|
|
When policy is enabled, `schema apply` is authorized through the
|
|
`schema_apply` action and is typically limited to admins on protected `main`.
|
|
|
|
## Deprecated names
|
|
|
|
The CLI was renamed to align with the HTTP server's canonical endpoint
|
|
names (`POST /query`, `POST /mutate`) and the `query` keyword in the GQ
|
|
language. The previous spellings keep working forever; invocations emit a
|
|
one-line warning to stderr and otherwise behave identically.
|
|
|
|
| Old (deprecated) | New (canonical) | Migration |
|
|
|--------------------------|---------------------|----------------------------------------------------------|
|
|
| `omnigraph read` | `omnigraph query` | Same flags and behavior. `read` is a visible clap alias. |
|
|
| `omnigraph change` | `omnigraph mutate` | Same flags and behavior. `change` is a visible clap alias. |
|
|
| `omnigraph query lint` | `omnigraph lint` | Same flags. The argv-level shim rewrites `query lint` to `lint`. |
|
|
| `omnigraph query check` | `omnigraph check` | `check` is a visible alias of `omnigraph lint`. |
|
|
|
|
The `command:` field in `aliases.<name>` in `omnigraph.yaml` accepts both
|
|
`read` / `change` (legacy) and `query` / `mutate` (canonical); the two
|
|
spellings are interchangeable on the wire via serde aliases.
|