omnigraph/docs/user
aaltshuler a819ab500e feat(cli): keyed credentials — servers:, the token chain, login/logout (RFC-007 PR 2)
The operator config gains servers: (name -> url; never a token). A remote
command whose URL prefix-matches an operator server resolves its bearer
token through the keyed chain first — OMNIGRAPH_TOKEN_<NAME> env, then the
[<name>] section of ~/.omnigraph/credentials (created 0600 via temp+rename,
#139 finding 7; group/world-readable files refused loudly) — falling
through to the legacy chain unchanged. URL keying makes §D5 rule 3
structural: a token is only ever sent to the server it is keyed to.
Longest-prefix matching with a path-boundary check (http://h:8080 never
matches http://h:8080-evil). Inserting the keyed hop above the legacy chain
is safe by construction — no existing setup can have servers: defined.

omnigraph login <name> stores/rotates one section (token from --token or
one stdin line — the pipe flow keeps secrets out of shell history);
omnigraph logout removes it, idempotently; logging in before declaring the
server warns instead of failing (the gh model).

Coverage: URL-match/no-substring-trap, credentials round-trip preserving
sibling sections, 0600 write + over-permissive refusal, env-name mapping;
the legacy resolve test is now hermetic against a real ~/.omnigraph and
asserts byte-identical legacy behavior with no servers defined; one
spawned-binary e2e walks the whole lifecycle against an authed server:
refusal -> wrong-token login (stdin) -> rotate (--token) -> authorized read
-> env-beats-file -> non-matching-URL negative -> logout revokes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 21:24:51 +03:00
..
audit.md docs(cli): the two config surfaces + the operator file reference 2026-06-11 20:32:04 +03:00
branches-commits.md fix: optimize publishes compaction; recovery roll-back converges manifest (#141) 2026-06-08 02:50:12 +03:00
changes.md docs: split user and developer docs (#93) 2026-05-15 03:45:22 +03:00
cli-reference.md feat(cli): keyed credentials — servers:, the token chain, login/logout (RFC-007 PR 2) 2026-06-11 21:24:51 +03:00
cli.md feat(cli)!: unified load command; deprecate ingest as an alias 2026-06-11 04:18:00 +03:00
cluster-config.md feat(cluster): the storage: root — state, catalog, and graph roots relocatable 2026-06-11 14:28:04 +03:00
cluster.md test(cluster,server): gated object-storage cluster e2e + CI wiring + docs 2026-06-11 15:56:40 +03:00
constants.md feat(engine): indexed graph traversal (#149) 2026-06-09 18:09:13 +02:00
deployment.md test(cluster,server): gated object-storage cluster e2e + CI wiring + docs 2026-06-11 15:56:40 +03:00
embeddings.md Rename repo terminology to graph (#118) 2026-05-24 16:46:00 +01:00
errors.md docs: rename runs.md/runs.rs → writes and repoint all references (#131) 2026-05-30 23:20:56 +02:00
index.md docs(cluster): operator how-to guide for deploying and managing clusters 2026-06-10 22:10:19 +03:00
indexes.md feat(engine): indexed graph traversal (#149) 2026-06-09 18:09:13 +02:00
install.md Add Windows release binaries (#127) 2026-05-30 14:23:40 +02:00
maintenance.md fix(maintenance): route uncovered drift through repair (#156) 2026-06-09 14:42:54 +02:00
policy.md feat(cli)!: unified load command; deprecate ingest as an alias 2026-06-11 04:18:00 +03:00
query-language.md (feat) convert engine call sites to &dyn TableStorage; demote legacy TableStore methods to pub(crate) (#86) 2026-06-09 23:03:08 +02:00
schema-language.md schema: HTTP allow_data_loss exposure + e2e drop coverage (MR-694 follow-up) (#107) 2026-05-19 01:56:46 +03:00
schema-lint.md docs: split user and developer docs (#93) 2026-05-15 03:45:22 +03:00
server.md test(cluster,server): gated object-storage cluster e2e + CI wiring + docs 2026-06-11 15:56:40 +03:00
storage.md fix: optimize publishes compaction; recovery roll-back converges manifest (#141) 2026-06-08 02:50:12 +03:00
transactions.md docs: drop ./ path prefixes; document query discovery 2026-06-11 01:33:30 +03:00