omk CLI reference
omk exposes a workflow CLI for knowledge artifacts. Top-level commands cover the full loop: init (initialize an omk project) · install (install the official omk Agent Skill) · list (managed skills & evidence status) · promote (accept a version on evidence) · rollback (revoke a promotion) · doctor (LLM health audit) · eval (offline A/B) · observe (online trace) · evolve (auto-iterate a skill) · sample (generate or fill test cases) · studio (local web UI for reports & analysis).
omk init
omk init [dir]Flags:
--lang <value> Output language zh|en. Priority: CLI > OMK_LANG env > zh.For full descriptions: omk init --help.
Initializes an omk project in the target directory: knowledge artifacts to measure (today skills/<name>/SKILL.md) plus their eval samples (eval-samples.json) — the per-directory workspace that omk eval / doctor / evolve / observe / list all operate on. Like a git repo, you have one per measurement target (the sample set is the measurement context, so it travels with the artifact, not globally). The managed registry (install / list / promote, optionally global) is a separate layer init does not touch. The two starter skill variants + three sample cases are just the default A/B template.
omk install
omk install omk-agent-skill # built-in official omk Agent Skill (onboarding)
omk install omk-agent-skill --to all
omk install ./skills/review # register + distribute a local skill (writes a managed record)
omk install git:main:skills/review # install from a ref of the current repo (SHA is immutable, a branch drifts)
omk install ./skills/review --dest ~/.my-agent/skillsFlags:
--dest <value> Custom skill root; a skill installs into <dir>/<name> (the built-in omk-agent-skill into <dir>/omk).
--dry-run Print install targets without writing files.
--force Overwrite an existing skill at the target location.
--git-ref <value> Remote git ref (branch / tag / SHA), default HEAD. Only with --git-url.
--git-url <value> Remote git repository URL (https / ssh / git@host:path). When set, the positional arg is the in-repo skill path (spec).
--kind <skill|prompt|agent|workflow>Kind of the user artifact (aligns with Artifact.kind). Optional: inferred from SKILL.md; only skill is supported today.
--lang <value> Output language zh|en. Priority: CLI > OMK_LANG env > zh.
--to <value> Install target: auto (default, detected local targets) / codex / claude / all.For full descriptions: omk install --help.
Installs a knowledge input (skill) and distributes it to local supported coding-agent targets. Three sources: the built-in id omk-agent-skill (onboarding for the official omk Agent Skill), a local skill path (a directory or a .md), and git:<ref>:<spec> (a skill at a ref of the current repo). A registry / marketplace (resolving package names against a registry) is a non-goal.
Installing your own skill (local path or git source) also writes a managed record to .omk/managed/<id>.json — the entry point of the "management" pillar, so evidence travels with the artifact through doctor / eval / promote. The git: source is the most reproducible: a SHA is immutable and content-addressed (anyone can re-fetch and verify), while a branch gives real drift semantics.
The default auto target writes only to detected targets omk explicitly supports: Codex/AGENTS when ~/.codex or ~/.agents exists, and Claude Code when ~/.claude exists. Use --to all to force every target omk currently knows, or --dest for a custom skill root.
omk list
omk list # managed skills in the current project (.omk/managed)
omk list --global # globally managed skills (~/.oh-my-knowledge/managed)
omk list --json # machine-readable output with full comparability markersFlags:
--global Show the global managed dir (~/.oh-my-knowledge/managed) instead of project .omk/managed
--json Output JSON (with full comparability markers) for scripts
--lang <value> Output language zh|en. Priority: CLI > OMK_LANG env > zh.For full descriptions: omk list --help.
Lists managed skills with their evidence status, not just files: lifecycle state, the latest verdict bound to the current content, current/total evidence count, and source. The lifecycle is derived at read time — installed (no valid evidence), measurable (eval evidence bound to the current content fingerprint), promoted (current content has a human acceptance decision), stale (source content drifted off its evidence). Because the fingerprint covers a directory-skill's whole tree (SKILL.md + references/), editing any asset flips the skill to stale. --json emits a versioned envelope { schemaVersion, rows } (rows with current valid evidence carry a comparability marker — cliVersion, optionally judgePromptHash / debiasMode) so scripts can detect shape changes. See evidence-gated management.
omk promote
omk promote review # accept the current version if its evidence passes the gate
omk promote review --accept-cautious # also accept a CAUTIOUS verdict
omk promote review --force --reason "manually reviewed" # override the gate, recorded as a human decisionFlags:
--accept-cautious also accept CAUTIOUS (default PROGRESS only)
--actor <value> decision actor (defaults to git config user.name)
--force override forceable gate blocks and force-promote, recorded as a human override (still refused with no current evidence or changed source hash)
--global operate on the global managed dir instead of project .omk/managed
--json output JSON (versioned envelope) for scripts
--kind <value> artifact kind (only skill today)
--lang <value> Output language zh|en. Priority: CLI > OMK_LANG env > zh.
--reason <value> reason for the promotion / override (stored on the decision)For full descriptions: omk promote --help.
Accepts a managed skill's current version as promoted, gated on its evidence, and appends a human decision (with an evidence pointer) to the record. The gate resolves against the latest current evidence (contentHash matching the record): the source must not be drifted/unreachable, current evidence must exist (no evidence ⇒ blocked, and --force cannot conjure one), the evidence's judgePromptHash (if present) must still be a current judge-prompt template, and the verdict must be PROGRESS (or CAUTIOUS with --accept-cautious). --force must be paired with a non-empty --reason and can only override source-unreachable / incomparable / verdict blocks; it still refuses missing current evidence or a reachable source whose content hash changed, because the decision would keep pointing at the old managed baseline. Re-promoting an already-promoted current version is an idempotent no-op. promote is the write-side counterpart to omk list. See evidence-gated management.
omk rollback
omk rollback review # revoke the current version's promoted acceptance
omk rollback review --reason "regression found in prod" # roll back and record a reasonFlags:
--actor <value> decision actor (defaults to git config user.name)
--global operate on the global managed dir instead of project .omk/managed
--json output JSON (versioned envelope) for scripts
--kind <value> artifact kind (only skill today)
--lang <value> Output language zh|en. Priority: CLI > OMK_LANG env > zh.
--reason <value> reason for the rollback (stored on the decision)For full descriptions: omk rollback --help.
Rolls back a managed skill's current promoted acceptance — the inverse of omk promote. Because decisions are an append-only event stream, rollback appends a rollback decision rather than deleting the promote; the lifecycle is then derived from the latest promote/rollback decision for the current content, so the state derives back to measurable — or stays stale if the source has since drifted off the baseline, since rollback does not probe the source. rollback is content-anchored and needs no gate (de-escalation is always safe): it operates purely on the record's promote/rollback history for record.contentHash. Rolling back a version that isn't promoted exits non-zero (nothing to roll back); rolling back an already-rolled-back version is an idempotent no-op; and promote → rollback → promote restores promoted (latest wins). See evidence-gated management.
omk doctor
omk doctor # audit current dir / ./skills
omk doctor skills/v1.md # audit one skill file
omk doctor skills/ --json > r.json # JSON for CI / external tools
omk doctor --gate; echo $? # silent gate; exit 1 on fatal failures, warnings do not block
omk doctor --repeat 1 # single quick pass (no sampling/merge, cheapest)
omk doctor --static-only # static checks only: no LLM, no samples — structural + body-depsFlags:
--concurrency <value> Concurrency across the repeated passes. Default = --repeat (full parallel; passes are independent, cuts wall-clock). Set 1 for serial. Cost unchanged; only raises peak concurrency (lower it if rate-limited).
--dimensions <value> Custom dimensions config file (YAML), appended after builtin 7. Each is either promptSection (LLM audit) or endpoint (POST skill snapshot to your service). Note: endpoint sends the full SKILL.md + sub-files to that URL — only enable for trusted configs/URLs.
--effort <value> LLM reasoning effort: low / medium / high / xhigh / max.
--executor <value> Executor name, default claude. Pass a test fixture path to use in tests.
--fix Interactive fix: use LLM agent to fix skill issues reported by doctor.
--gate Silent mode: only emit stderr summary on fail. Exit code carries the signal.
--global Write to global ~/.oh-my-knowledge/doctors instead of project .omk/doctors
--json JSON output to stdout, for CI / external script consumption.
--lang <value> Output language zh|en. Priority: CLI > OMK_LANG env > zh.
--model <value> LLM model name, default sonnet.
--output-dir <value> Report output dir, default project-level .omk/doctors (--global for global).
--repeat <value> Health-check repeat count (self-consistency). Default 2: runs 2 passes in parallel, unions findings, merges same root cause via an LLM pass, tags k/N support. Set 1 for a single quick pass (no sampling/merge, cheapest).
--static-only Static checks only (no LLM, no samples.json): readability / frontmatter / existence of scripts·CLI·files·env referenced in the skill body. For CI without LLM creds / offline.
--timeout <value> Single-session LLM timeout sec, default 600 (10 min).For full descriptions: omk doctor --help.
By default doctor runs static rules first (skill readability, frontmatter, body dependencies), then the LLM health audit. A single LLM session emits per-dimension grades, findings, and suggestions for the 7 builtin dimensions; results are sorted fail→warn→pass→skipped with errors first within each dim. Dimensions are extensible — call registerHealthDimension in your own code and the new section is folded into the same LLM call's prompt and report (order = registration order). To browse a visual report, run omk studio and pick the latest run.
Custom dimensions via --dimensions <yaml>: each entry is either an LLM dimension (promptSection — folded into the health LLM call) or an endpoint dimension (endpoint — doctor POSTs the skill snapshot to your service and maps the response). The two are mutually exclusive per dimension. Endpoint dimensions are "online" checks (run alongside the LLM audit), letting you do deep checks that prompts can't express — e.g. calling an external security-audit service.
dimensions:
# LLM dimension
- id: tone-check
displayName: Tone check
severity: warn
promptSection: Check that the skill copy is polite and unambiguous.
# endpoint dimension
- id: deep-security-audit
displayName: Deep security audit
severity: fatal
endpoint: https://my-service.com/audit # POST here
headers: { Authorization: "Bearer xxx" } # optional auth headers
params: { env: production } # optional, passed through verbatim
includeFiles: true # optional (default true): bundle references/scripts
maxFileBytes: 204800 # optional: per-file byte cap (default 200KB; larger files truncated)
maxTotalBytes: 2097152 # optional: total files byte cap (default 2MB; collection stops beyond)
allowPrivateHost: false # optional: allow private/loopback endpoint (default false — refused to prevent SSRF)Request body (doctor → endpoint): { dimensionId, params, skill: { name, content, skillRoot, ref, files } } — files is a relative-path → content map of the skill's sub-files (text only; each file is truncated at maxFileBytes, default 200KB, and the whole files payload is capped at maxTotalBytes, default 2MB — both overridable per dimension). Response (endpoint → doctor): { status: "pass"|"warn"|"fail", message: string, hint?: string, detail?: object }. Any network error / non-2xx / protocol violation maps to a fail so problems surface instead of silently passing. Response fields are size-bounded before landing in the report (long message / hint truncated; oversized detail replaced with { truncated: true, preview }).
Endpoint URL validation: only http / https schemes are accepted, and endpoints pointing at private/loopback hosts — localhost, *.local, ::1, 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16 (including cloud metadata 169.254.169.254) — are refused by default: doctor sends the full skill snapshot to the endpoint and echoes its response into the report, which would otherwise make it an SSRF vector. Set allowPrivateHost: true on a dimension to opt in for a trusted internal service. This is a literal hostname check (defense-in-depth) — no DNS resolution is performed, so a public domain resolving to a private IP (DNS rebinding) is out of scope.
Sampling & consensus: by default omk doctor runs the audit --repeat 2 times in parallel, takes the union of findings, and merges same-root-cause findings (across differing wording) via one extra LLM clustering pass, tagging each finding with k/n support (how many of the n passes reported it). This makes repeated runs converge instead of surfacing a different subset each time. Set --repeat 1 for a single quick pass; raise it for a deeper, more stable audit. --concurrency throttles the parallelism (default = --repeat).
Static-only checks (--static-only): runs only the same static lint rules included in default doctor with zero LLM calls and without loading samples.json — skill readability, frontmatter validity, and whether scripts / CLIs / files / env vars referenced in the skill body exist. Useful for CI nodes without claude / codex, or offline debugging. The samples-contract check is intentionally excluded (it needs samples.json); it stays as omk eval's pre-evaluation gate, alongside the same dependency check enriched there with the samples' declared requires.
omk eval
omk eval --control baseline --treatment my-skill # single-skill necessity test (baseline = reserved "no skill" variant)
omk eval --control code-review-v1 --treatment code-review-v2 # multi-variant A/B
omk eval --config eval.yaml
omk eval --batch
omk eval gold compare <report-id> --gold-dir gold-datasetRuns the offline evaluation, applies the verdict gate, persists the report, and returns a ship/no-ship exit code. Bootstrap CI is enabled by default on this workflow.
Flags:
--batch Batch mode: baseline vs each skill
--bootstrap Add bootstrap CI
--bootstrap-samples <value> Bootstrap resamples, default 1000
--budget-per-sample-ms <value> Per-sample time cap ms (must be > 0; omit for no cap)
--budget-per-sample-usd <value> Per-sample budget cap USD (must be > 0; omit for no cap)
--budget-usd <value> Total budget cap USD (must be > 0; omit for no cap)
--concurrency <value> Concurrency, default 1
--config <value> eval.yaml path
--control <value> Control variant expr (artifact identity only)
--control-cwd <value> Runtime context dir for control
--dry-run Plan only, no real exec
--effort <value> Executor LLM reasoning effort low/medium/high/xhigh/max (default low; reports across efforts not strictly comparable).
--executor <value> Executor: claude / claude-sdk / codex / codex-sdk / openai-api / gemini / custom (default claude).
--global Write report to global ~/.oh-my-knowledge/reports instead of project .omk/
--gold-dir <value> Gold dataset dir
--holdout-ratio <value> Holdout fraction 0-1 (e.g. 0.3); splits a holdout subset, compares train/holdout composite to flag overfitting
--judge-models <value> Judge config: executor:model[,...]. e.g. claude:haiku or claude:opus,openai-api:gpt-4o (≥ 2 = ensemble). Default <executor>:haiku.
--judge-repeat <value> Judge each dim N times
--lang <value> Output language zh|en. Priority: CLI > OMK_LANG env > zh.
--layered-stats Emit layered stats
--mcp-config <value> MCP config path
--model <value> Evaluated model
--no-cache Skip executor cache
--no-debias-length Disable length-debias (default on)
--no-diagnostic Disable diagnostic LLM call (on by default; emits "what went wrong + how to fix" advice for failed samples).
--no-evidence Do not append this run as evidence to managed records (auto-written for installed skills by default).
--no-gate Disable verdict gate
--no-judge Skip LLM judge
--no-serve Do not start report server
--no-strict-baseline Disable baseline isolation
--output-dir <value> Report output dir (default project .omk/reports)
--repeat <value> Repeat each sample N times
--report-only Produce the report and print verdict, but always exit 0 (no CI gate).
--resume <value> Resume a previous failed run
--retry <value> Per-sample retry count
--samples <value> Samples path. Defaults to project-level eval-samples.json (also .yaml/.yml); single-treatment runs can auto-discover <skill>/.omk/.
--skill-dir <value> Skill dir, default skills
--skip-connectivity Skip LLM connectivity preflight
--skip-doctor Escape hatch: skip the doctor health-check gate (on by default). Use when sandbox mocks supply deps; caller owns garbage-in risk.
--strict-baseline Force baseline isolation (default true)
--threshold <value> Verdict threshold, default 3.5
--timeout <value> Per-sample timeout sec, default 600
--treatment <value> Treatment variants, comma-separated (artifact identity only)
--treatment-cwd <value> Runtime context dirs for treatments, comma-separated, index-aligned with --treatment (blank = none)
--trivial-diff <value> Trivial diff tolerance; 0 disables tolerance
--verbose Verbose loggingFor full descriptions: omk eval --help.
The HTML report has two tabs:
- 📊 Score view — the verdict-driven A/B comparison (fact / behavior / judge layers, bootstrap CI, length-debias).
- ✅ Functional view — each sample as a unit test: design (prompt / rubric / mocks / environment) + execution trace + assertion results + actionable diagnostic. Diagnostic emits root cause (skill_doc_unclear / llm_misread / sample_design / tripwire_intentional / ...), workflow checks (rubric step ✓/✗ with evidence), and failure-mode tags (工作流跳步 / 硬编码值 / 幻觉输出 / 工具误用 / 环境拦截 / 误读约束 / 其他). For the sandbox-mock semantics behind
mocks/environment/tripwire/mocksStrict, see sample-design-spec.md §三.
omk observe
omk observe ships two workflows: the default skill-health report, and the observe inbox (ingest / inbox / show) for human review.
A. Skill-health report (default)
omk observe ~/.claude/projects/-Users-you-Documents-my-project
omk observe ~/.claude/projects/my-project --last 7d
omk observe ~/.claude/projects/my-project --from 2026-04-01T00:00:00Z --to 2026-04-15T23:59:59Z
omk observe ~/.claude/projects/my-project --skills audit,polish
omk observe ~/.claude/projects/my-project --kb /path/to/projectFlags:
--feedback Feed production-health observations back to managed skills of the same name (--no-feedback to disable)
--from <value> Start time ISO, overrides --last
--global Write to global ~/.oh-my-knowledge/observe-health instead of project .omk/observe-health
--kb <value> KB root, enables KB-aware analysis
--lang <value> Output language zh|en. Priority: CLI > OMK_LANG env > zh.
--last <value> Time window (7d / 24h / 30m)
--output-dir <value> Health report output dir, default project-level .omk/observe-health (--global for global)
--skills <value> Filter to specific skills, comma-separated
--to <value> End time ISOFor full descriptions: omk observe --help.
Turns real Claude Code session traces into skill-health reports: knowledge usage, gap signals, execution stability, tokens, and latency. This is production observation, not production scoring.
B. observe inbox: reviewer loop
Parses, aggregates, and de-noises real session traces into a per-observation list a human can review. The whole pipeline is local-only and LLM-free.
# 1. Parse traces, aggregate signals, write to .omk/observe-inbox/
omk observe ingest ~/.claude/projects/my-project
omk observe ingest ~/.claude/projects/my-project --output-dir ./custom-dir
# 2. Read the inbox (default: top 20, sorted by severity / confidence / lastSeen)
omk observe inbox
omk observe inbox --limit 50
omk observe inbox --skill audit # filter by skill
omk observe inbox --by-skill # rollup view (one row per skill)
omk observe inbox --explore 10 # sample 10 long-tail items from medium/low
omk observe inbox --explore 10 --include-noise # explicitly include the noise bucket
omk observe inbox --llm-enhanced-review # run LLM enhanced chain review explicitly
omk observe inbox --json # JSON output for automation
# 3. Inspect a single observation with its event triplet (surrounding messages)
omk observe show <inbox_id>Every observation carries:
confidenceandattributionConfidence— signal credibility plus skill-attribution credibility, displayed side by sideseverityReasonCode— stable structured reason code for the assigned severity; human-readable reasons are generated by CLI / studio renderingmessageWindow— 3 messages before / trigger / 3 messages after, plusresolutionAfter(whether the agent recovered)evidence.{messageIndex,messageUuid,toolUseId}— anchors for round-tripping back to the original jsonl
Supported trace formats: Claude Code session JSONL (.jsonl), OpenClaw session JSONL (.jsonl), and markdown conversation logs (.log).
omk evolve
omk evolve <skill> # multi-round auto-iteration on a skill
omk evolve skills/foo.md --rounds 10 --target 4.5Flags:
--auto-fix-samples Fix the skill, then fix samples, then evaluate the combined candidate
--concurrency <value> Eval concurrency, default 1
--edit-budget <value> Max fraction of skill lines a round may change (default 0.2). Over-budget candidates are rejected before evaluation, saving eval cost
--effort <value> Reasoning effort: low/medium/high/xhigh/max
--executor <value> Executor name, default claude
--holdout-ratio <value> Holdout fraction for the accept decision (0..1, default 0=off). When > 0, candidates are accepted on holdout score and weak samples come only from train — guards against train-on-test
--improve-mode <agent|rewrite> Improvement strategy (default: agent)
--improve-model <value> LLM that rewrites the skill, default sonnet
--judge-models <value> Judge model (single judge required), executor:model format. Default claude:haiku
--lang <value> Output language zh|en. Priority: CLI > OMK_LANG env > zh.
--model <value> Evaluated LLM, default sonnet. Also used as the sample-generation model when no samples exist.
--no-diagnostic Disable diagnostic LLM call
--no-edit-budget Disable the edit budget (allow arbitrarily large single-round edits)
--no-reject-memory Disable rejected-edit memory (do not feed rejected edits back into the next prompt)
--no-significance-gate Disable the significance accept gate, reverting to point-estimate accept (default: gate on — accept only statistically significant gains)
--reuse-latest-eval Reuse the latest comparable eval report as round-0
--rounds <value> Max iteration rounds, default 5
--sample-fix-max-attempts <value>Max auto-fix attempts per sample (default: 2)
--samples <value> Samples file, default eval-samples.json
--significance-alpha <value> Significance level for the accept gate diff CI (default 0.05 = 95% CI)
--skip-connectivity Skip LLM connectivity preflight
--skip-doctor Skip doctor gate (escape hatch; user takes garbage-in risk)
--snapshot-only Produce candidates only, do not write back to source: the winner stays in evolve/<skillName>.r{N}.md for you to pick and then omk promote. By default a managed skill is written back and evidence is recorded (measurable).
--stop-on-assertions-pass Stop early when normal samples pass assertions
--target <value> Target composite score; stop when reached. If omitted, runs all rounds.
--test-ratio <value> Locked test fraction (0..1, default 0=off); requires --holdout-ratio. Never used for selection; read once at the end for an unbiased generalization score
--timeout <value> Per-sample timeout sec, default 600For full descriptions: omk evolve --help.
Auto-iterates a skill through repeated eval → judge → rewrite loops until it hits --target or exhausts --rounds. Cost scales with rounds × samples × variants; a typical run takes minutes to tens of minutes. Original skill files are versioned under skills/evolve/*.r0.md.
omk evolve is a one-shot loop: it runs the doctor gate before each round by default (--skip-doctor to bypass), and if the target skill has no eval samples yet, it auto-generates a batch first (equivalent to running omk sample) before evolving. So for a brand-new skill, omk evolve skills/foo.md alone walks the full "doctor → generate samples → self-iterate" path. Existing samples are used as-is, never regenerated.
On a managed skill (registered via omk install), a successful evolve also feeds the management layer: it records the winner as evidence and re-baselines the record to the new content, so omk list shows the skill measurable instead of stale. Advancing it to promoted stays a separate human omk promote call (evolve's statistical accept-gate is not a production-acceptance decision). --snapshot-only skips the source write entirely — the winner stays under evolve/ for you to inspect and apply, and the managed record is left untouched.
omk sample
omk sample <skill> # generate or fill eval-samples test cases for one skill
omk sample --batch # generate for skills missing eval-samplesFlags:
--append Append newly generated samples to the existing samples file (colliding sample_id auto-suffixed, original json/yaml shape kept). Single-skill mode only; not supported with --batch / --from-traces / --fix. Without it, an existing file errors out. Often paired with --focus.
--batch Batch mode: scan --skill-dir, generate samples for any skill missing them.
--count <value> Number of samples to generate. Defaults to LLM auto-selection by skill type.
--executor <value> Executor name, default claude (same as omk eval / doctor / evolve). When using another executor like codex, also pass a --model it recognizes.
--fix Fix mode: auto-fix sample_design failures using the latest eval report.
--focus <value> Generation focus (NL hint). Steers LLM toward certain sample types.
--from-traces from-traces mode: recycle observe-inbox failure signals into draft regression samples (provenance: production-trace) for review.
--lang <value> Output language zh|en. Priority: CLI > OMK_LANG env > zh.
--model <value> Generation LLM model name, default sonnet.
--no-mock Skip mock generation; all tool calls execute for real during eval.
--observations-dir <value> Observe inbox dir (from-traces mode), default project .omk/observe-inbox.
--reports-dir <value> Reports dir (fix mode), default ~/.oh-my-knowledge/reports.
--skill <value> Only draft from observe-inbox signals for the specified skill (from-traces mode only).
--skill-dir <value> Skill root dir, default skills. Used by batch mode.
--treatment <value> Treatment name (fix mode), defaults to skill-path inference.For full descriptions: omk sample --help.
One-shot generation. Auto-stamps provenance on generated cases. Generated assertions use English, numbers, or code tokens so they compare cleanly across bilingual outputs.
omk studio
omk studio
omk studio --port 7799
omk studio --host 0.0.0.0 # LAN access (default: 127.0.0.1)
omk studio --reports-dir ~/.oh-my-knowledge/reports
omk studio --observations-dir .omk/observe-inbox # observe inbox data directory
omk studio --no-openFlags:
--analyses-dir <value> Observe-health reports dir (optional, default project .omk/observe-health, falls back to global)
--dev Dev mode: child process with hot reload
--doctors-dir <value> Doctor reports dir (optional, default project .omk/doctors, falls back to global)
--global View only global reports / observe-health / doctors / observe-inbox dirs (~/.oh-my-knowledge/*) instead of machine-wide / project-first; does not affect managed
--host <value> Listen host, default localhost. Use 0.0.0.0 to expose to LAN
--lang <value> Output language zh|en. Priority: CLI > OMK_LANG env > zh.
--no-open Do not auto-open browser
--observations-dir <value> Observe-inbox data dir (optional, default .omk/observe-inbox)
--port <value> Listen port, default 7799. Pass 0 for OS-assigned
--reports-dir <value> View only this reports dir (optional; default aggregates machine-wide: current project + global + other projects via index)For full descriptions: omk studio --help.
Starts the local knowledge workbench for browsing reports and observation analyses. Verdict, sample diffs, regressions, saturation curves, and per-sample drill-downs all live in the studio UI — there is no CLI export / analysis subcommand. For CI gates, use omk eval's exit code (0 on PROGRESS, non-zero otherwise) or jq over the report JSON.
Studio is skill-centric — the list page (/) shows skill cards with health band / 0-100 reference score / open-issue count / trend; the detail page (/skills/<name>) puts a prioritized issue checklist on the left (skill issues / sample issues / tool advisories), and a chart.js health trend plus three compact stage cards (doctor / eval / observe) on the right, with modals for deeper drill-down. The legacy run list moved to /runs. Visit /observe-inbox for the observe inbox dashboard: per-skill rollup view, reviewer action list, observability funnel, and a per-observation detail panel with the event triplet (surrounding messages).