用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/novotnyllc/railyard --skill oracle命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Clean completed-session process residue, inspect macOS Codex app-server resources, reap exact snapshot-bound residue, or explicitly recycle one fully attested detached server.
Route one host-local software change or pull-request task through Railyard. Implementation/ship requests MUST dispatch an LFG delivery carrier before implementation or remote shipping; this coordinator never substitutes direct implementation for the LFG route. Routes through Compound Engineering workflows with Thermos review gates, React Doctor, PR babysitting, merge proof, and durable learnings., with LFG-first implementation delivery, Thermos review gates, React Doctor, PR babysitting, merge proof, and durable learnings. Use whenever the user says to implement, fix, ship, deliver, or "go do" a software change — and equally when they ask to brainstorm, design, plan, spec, or debug one: those route to the matching CE stage (ce-brainstorm, ce-plan, ce-debug) and stop at that artifact. Applies including when they name this skill directly, for a feature, bug fix, risky refactor, long-running implementation, or existing PR. Use railyard:orchestrate instead for multiple independently resumable tasks or cross-host
Comprehensive security and correctness audit of a branch's changes. Use for thermo nuclear, thermonuclear, or deep review requests, or branch/PR diff audits focused on bugs, breaking changes, security issues, devex regressions, and feature-gate leaks.
正在显示 SKILL.md
| name | oracle |
| description | Oracle second-model review: bundle prompts/files, debug, refactor, design-check. |
Oracle bundles your prompt + selected files into one “one-shot” request so another model can answer with real repo context (API or browser automation). Treat outputs as advisory: verify against the codebase + tests.
The main browser path requires a signed-in ChatGPT Pro account. Check availability efficiently and cache the answer instead of probing every activation:
${XDG_CONFIG_HOME:-$HOME/.config}/railyard/oracle-pro.json
({"available": <bool>, "checkedAt": "<ISO-8601>"}). If it exists and
checkedAt is within 7 days, trust it — available means proceed,
unavailable means say so and stop offering Oracle.gpt-5.6-sol browser session whose metadata records
resolvedLabel=GPT-5.6 Sol; verified=yes and whose pre-Answer: session
log has exactly one [browser] Thinking time: Pro control record proves
the supported browser-Pro pair; write the cache and proceed. A
gpt-5-pro browser session is not proof: Oracle 0.17.3 normalizes it to
the GPT-5.5 picker target.available: false and stop without
interacting with the login surface.After any run that changes the answer (login fixed, subscription lapsed), rewrite the cache. The cache is advisory availability state only — never credentials or account identity.
When an active caller supplies an admitted, claimed
railyard/model-routing/v1 oracle-browser review decision, use this
skill's scripts/oracle-route.mjs carrier instead of the manual bootstrap
below. It accepts only the chatgpt_current_pro channel, fixes Oracle to
local Homebrew Oracle >=0.17.3, and spawns only
--engine browser --model gpt-5.6-sol --browser-model-strategy select --browser-thinking-time pro. Key invariants, enforced by the script and its
tests rather than by prose:
ORACLE_BIN, ORACLE_MODEL, ORACLE_HOME_DIR, caller PATH,
and Homebrew overrides; it validates the executable and its ancestry before
each spawn.Answer: control region of that
session's output.log. It accepts the review only when the metadata proves
verified GPT-5.6 Sol selection and exactly one
[browser] Thinking time: Pro record; missing, duplicate, or mismatched
evidence is a named failure receipt and a nonzero route CLI exit. Never
accept model-answer text as picker or effort proof.ambiguous receipt, never a
second launch. A login/account-selection surface stops without interaction.oracle-homebrew-lifecycle transaction
(fixed steipete/tap/oracle, no elevation, zero model-usage meters); a
successful lifecycle requires a fresh review claim afterward.Routed oracle-api is unsupported_adapter in v1 and never falls back from
the browser claim. All manual commands below remain outside routed v1.
Before the first Oracle command on every activation, resolve SKILL_DIR as
the absolute directory containing this activated, installed SKILL.md (from the
path supplied by Codex or Claude Code). Do not infer it from a plugin cache or
source checkout. Then run this helper exactly once:
ORACLE_CLI="$(bash "$SKILL_DIR/scripts/ensure-oracle.sh")" || exit $?
The helper returns the validated absolute executable path. If it fails, stop
Oracle use: do not invoke a bare oracle, try another package command, or
otherwise bypass the failure. Use "$ORACLE_CLI" for every later normal Oracle
command in this activation, including help, preflight, remote-browser, and
session commands. Agents whose shell variables do not persist between tool
calls must retain the returned absolute path and substitute it literally in
later Oracle commands.
Oracle requires version 0.17.3 or newer. ORACLE_BIN is only an explicit
validation-only input override: it must be an absolute executable at that
version or newer; the helper does not replace it. Otherwise the helper prefers the canonical
steipete/tap/oracle Homebrew formula. A current selected package owner is a
no-op. If Homebrew is unavailable, cannot repair its missing or stale formula,
or cannot post-verify the selected formula, the bounded fallback is:
npm install --global --prefix "$HOME/.local" @steipete/oracle@0.17.3
A current stable ~/.local/bin/oracle avoids repeat Homebrew attempts. The
bootstrap preserves Oracle configuration, authentication, sessions, browser
profiles, cookies, and other browser state.
Run this once per host, before the first browser run. It is idempotent and fills in only keys that are ABSENT, so an explicit user value always wins:
node "$SKILL_DIR/scripts/ensure-oracle-config.mjs"
These defaults belong to this skill because they must reach every user of the plugin. A dotfile manager (chezmoi or anything else) is a personal choice, and nothing here may assume one exists — if the skill needs a setting to behave correctly, putting it there is the skill's job.
browser.headless: true is the load-bearing one. Oracle's headful "hide" is
implemented as --window-position=-32000,-32000, and macOS clamps a window
that far off-screen back toward the display, so a window appears anyway.
Headless is the only way to genuinely not show one, and it also sidesteps the
"Chrome didn't shut down correctly / restore tabs" bubble, because there is no
window to restore into. Measured: a headless one-shot returned in ~31s with no
visible window.
Do not reach for oracle serve or --browser-attach-running to get this.
Both are worse locally, on evidence:
serve --manual-login launches Chrome with no --headless and ignores
browser.headless, so it leaves a permanently visible window rather than a
transient one, and the same trivial prompt took ~1m10s through it versus ~31s
direct. Its real use is remote: one signed-in host serving machines that are
not signed in, where the window is on a machine nobody is looking at.--browser-attach-running requires Oracle's own attach metadata and rejects a
hand-launched headless Chrome; pointed at a real everyday Chrome it drives the
user's own browser, which is neither hidden nor safe to automate.Default workflow here: --engine browser with the user's preferred signed-in reasoning model. This is the “human in the loop” path: it can take ~10 minutes to ~1 hour; expect a stored session you can reattach to.
Recommended defaults:
--engine browser)${ORACLE_MODEL:-gpt-5.6-sol} with
--browser-model-strategy select --browser-thinking-time pro selects
GPT-5.6 Sol and requests the verified Pro-thinking tier--model gpt-5.6-sol --browser-thinking-time heavy--model gpt-5.6-sol --reasoning-mode pro --reasoning-effort maxOracle 0.17.3 or newer is required for this browser-Pro pair. Pro is not a
separate browser or API model slug: gpt-5.6-pro and gpt-5.6-sol-pro are
invalid. Oracle 0.17.3 exposes no browser flag that deterministically targets
an unnamed newer Pro picker label; its gpt-5-pro alias normalizes to
gpt-5.5-pro and the GPT-5.5 picker. Browser mode therefore uses
gpt-5.6-sol plus Pro thinking and requires the observed pair below; API mode
uses gpt-5.6-sol plus the Pro reasoning flags above. GPT-5.6 availability
remains account-dependent.
Before a browser run, inspect only the presence, JSON type, and boolean value of
the nested browser.manualLogin value in ~/.oracle/config.json; never print
the config, environment, or secrets. Oracle reads this nested key: a top-level
browserManualLogin value and the absence of ORACLE_* environment variables
do not override it. Oracle 0.17.0 rejects --copy-profile with manual-login
mode.
Run this read-only Node stdlib probe; it prints only the non-secret
classification browser.manualLogin=missing|true|false|invalid:
node <<'NODE'
const fs = require("node:fs");
const os = require("node:os");
const path = require("node:path");
let state = "missing";
try {
const config = JSON.parse(fs.readFileSync(path.join(os.homedir(), ".oracle", "config.json"), "utf8"));
if (!config || typeof config !== "object" || Array.isArray(config)) {
state = "invalid";
} else {
const browser = config.browser;
if (browser === undefined) {
state = "missing";
} else if (!browser || typeof browser !== "object" || Array.isArray(browser)) {
state = "invalid";
} else if (browser.manualLogin === undefined) {
state = "missing";
} else if (typeof browser.manualLogin === "boolean") {
state = String(browser.manualLogin);
} else {
state = "invalid";
}
}
} catch (error) {
state = error && error.code === "ENOENT" ? "missing" : "invalid";
}
process.stdout.write(`browser.manualLogin=${state}\n`);
NODE
true,
omit --copy-profile and use the configured manual-login profile.--copy-profile only after the user deliberately
sets nested browser.manualLogin to false in their own configuration.An unsigned-in private browser profile is an authentication state, not a bootstrap failure.
node "$SKILL_DIR/scripts/reset-browser-profile.mjs"
Oracle kills its automation Chrome rather than exiting it, so the profile keeps
exit_type: "Crashed" and every launch shows the "didn't shut down correctly /
restore tabs" bubble, which can steal focus from the automation. It also
persists window_placement, so a window once positioned offscreen stays there.
This clears both, and refuses outright while any process holds the profile —
editing Preferences under a live Chrome is the thing worth avoiding, so an
unknown answer fails closed.
Not needed with browser.headless: true (the configured default): there is no
window to place and no bubble to show. Run it when a headful run is
deliberately chosen, or after a run was interrupted.
--dry-run + --files-report when needed).Show help (once/session):
"$ORACLE_CLI" --help --verbosePreview (no tokens):
"$ORACLE_CLI" --dry-run summary -p "<task>" --file "src/**" --file "!**/*.test.*""$ORACLE_CLI" --dry-run full -p "<task>" --file "src/**"Token/cost sanity:
"$ORACLE_CLI" --dry-run summary --files-report -p "<task>" --file "src/**"Startup/perf trace:
"$ORACLE_CLI" --perf-trace --perf-trace-path /tmp/oracle-perf.json --dry-run summary -p "<task>" --file "src/**"first-output and exit.Browser run (main path; long-running is normal):
"$ORACLE_CLI" --engine browser --model "${ORACLE_MODEL:-gpt-5.6-sol}" --browser-model-strategy select --browser-thinking-time pro -p "<task>" --file "src/**"ORACLE_MODEL must resolve to gpt-5.6-sol.
After completion, accept it only when its session metadata reports
verified GPT-5.6 Sol and its own pre-Answer: output.log has exactly
one [browser] Thinking time: Pro line. Otherwise stop and report the
observed picker state; do not silently accept a downgrade or use answer
text as evidence.API Pro run (only after explicit cost consent):
"$ORACLE_CLI" --engine api --model gpt-5.6-sol --reasoning-mode pro --reasoning-effort max -p "<task>" --file "src/**"Manual paste fallback (assemble bundle, copy to clipboard):
"$ORACLE_CLI" --render --copy -p "<task>" --file "src/**"--copy is a hidden alias for --copy-markdown.--file)--file accepts files, directories, and globs. You can pass it multiple times; entries can be comma-separated.
Include:
--file "src/**" (directory glob)--file src/index.ts (literal file)--file docs --file README.md (literal directory + file)Exclude (prefix with !):
--file "src/**" --file "!src/**/*.test.ts" --file "!**/*.snap"Defaults (important behavior from the implementation):
node_modules, dist, coverage, .git, .turbo, .next, build, tmp (skipped unless you explicitly pass them as literal dirs/files)..gitignore when expanding globs.followSymbolicLinks: false).--file ".github/**").ORACLE_MAX_FILE_SIZE_BYTES or maxFileSizeBytes in ~/.oracle/config.json.--files-report (and/or --dry-run json) to spot the token hogs before spending.--perf-trace / ORACLE_PERF_TRACE=1 for startup and first-output timing. Traces redact prompts, tokens, keys, cookies, and inline cookie payloads; detached API children write a session-suffixed sidecar trace."$ORACLE_CLI" --help --verbose.api when OPENAI_API_KEY is set, otherwise browser.gpt-5.6-sol --browser-model-strategy select --browser-thinking-time pro
with the required observed-model assertion; API uses
gpt-5.6-sol --reasoning-mode pro.--engine api for Claude/Grok/Codex or multi-model runs.--browser-attachments auto|never|always (auto pastes inline up to ~60k chars then uploads).--browser-bundle-files --browser-bundle-format auto|zip to upload many files as one bundle; ZIP bundles preserve original file bytes."$ORACLE_CLI" serve --host 0.0.0.0 --port 9473 --token <secret>"$ORACLE_CLI" --engine browser --remote-host <host:port> --remote-token <secret> -p "<task>" --file "src/**"Oracle is one-shot by default, not by necessity, and re-review is the most common shape of work here. Starting a fresh session to re-examine something Oracle already has in context re-uploads the same tree, re-pays the input tokens, and throws away everything it concluded last round — the second answer is usually worse than the first for exactly that reason.
Two distinct mechanisms; they are not interchangeable:
--followup <sessionId|responseId> continues a stored session in a
later run. This is the one for "you reviewed this, here is the revision" —
the normal re-review loop. Reuse the slug you set on the first run to find
it, or oracle status to list recent sessions.
"$ORACLE_CLI" --followup <sessionId> -p "<what changed and what to re-check>"--followup-model <model> picks which model's response to continue from in
a multi-model session.--browser-follow-up <prompt> (repeatable) queues additional turns in the
SAME run, in one ChatGPT conversation. Use it when the turns are known in
advance — "review this, then propose the diff, then list the risks" — not for
reacting to what came back.
Set --slug "<3-5 words>" on every first-round consult. Without it the session
id is the only handle, and a re-review a day later has nothing memorable to
attach to.
Never re-run a prompt to "check" a detached or timed-out session. Reattach
with oracle session <slug>; a duplicate prompt is blocked without --force
precisely because re-running is almost always the wrong instinct.
oracle project-sources uploads files into a ChatGPT Project's persistent
Sources tab, so recurring consults against a stable codebase stop re-sending
the same tree every time.
"$ORACLE_CLI" project-sources list --chatgpt-url <project-url>"$ORACLE_CLI" project-sources add --chatgpt-url <project-url> --file "src/**"Point runs at the project with --chatgpt-url. This suits a long-lived repo
reviewed repeatedly; it is not a substitute for --file on a one-off consult,
and stale Sources are worse than none — refresh them when the tree moves, or
the model reasons confidently about code that no longer exists.
"$ORACLE_CLI" doctor --providers --models "${ORACLE_MODELS:-<models>}""$ORACLE_CLI" --preflight --models "${ORACLE_MODELS:-<models>}""$ORACLE_CLI" --route --model "${ORACLE_MODEL:-<model>}"--provider openai or --no-azure. This prevents exported Azure env/config from hijacking the route:
"$ORACLE_CLI" --provider openai --engine api --model "${ORACLE_MODEL:-<model>}" ...--allow-partial --write-output <path> so successful model files and the <stem>.oracle.json manifest are easy to recover:
"$ORACLE_CLI" --models "${ORACLE_MODELS:-<models>}" --allow-partial --write-output /tmp/panel.md -p "<task>"--timeout 10m is the normal user-facing API deadline; Oracle derives the HTTP transport timeout unless --http-timeout is explicitly set.OPENAI_API_KEY is invalid and the user wants a personal OpenAI key, use the agent-utilities:one-password skill` in one persistent tmux session with the user-provided item and field. Inject only into the single Oracle command; never print the key.${ORACLE_REPO:-$HOME/dev/oracle}:
pnpm -C "${ORACLE_REPO:-$HOME/dev/oracle}" run buildnode "${ORACLE_REPO:-$HOME/dev/oracle}/dist/scripts/run-cli.js" ...~/.oracle/sessions (override with ORACLE_HOME_DIR).~/.oracle/sessions/<id>/artifacts/, including transcript.md, Deep Research reports, and downloaded ChatGPT-generated images when available."$ORACLE_CLI" status --hours 72"$ORACLE_CLI" session <id> --render--slug "<3-5 words>" to keep session IDs readable.--force only when you truly want a fresh run.--dry-run conflicts with --render / --render-markdown; Ctrl-C exits foreground API runs with code 130 while browser cleanup/reattach still runs.Oracle starts with zero project knowledge. Assume the model cannot infer your stack, build tooling, conventions, or “obvious” paths. Include:
When you know this will be a long investigation, write a prompt that can stand alone later:
If you need to reproduce the same context later, re-run with the same prompt + --file … set (Oracle runs are one-shot; the model doesn’t remember prior runs).
.env, key files, auth tokens). Redact aggressively; share only what’s required.Adapted from steipete/oracle skills/oracle at
0f0bdb6a752efb2c736ec4dcaa6d3cc29743d851 (MIT).