fx <command> --help describes every flag the running executable accepts,
including the global ones, and ends with an AGENT USAGE block that restates
the output and error contract. This guide covers what the help cannot: how to
read the results.
An unknown --workspace value never selects a different default. When a host truncates a large response, use
--fields on a read-only query to retrieve the required facts. If you capture full
output, keep it within the task's authorized directory: shell redirection writes a
file even when the fx command is read-only.
Workflow report views
The four workflow reports (init, sync, doctor, release check) default to compact
JSON. output_mode: summary and omitted describe the view; omitted counts are
not pagination. All warning/failure rows and exact pending command vectors remain.
--details returns the full application result; explicit --fields projects it.
Explicit report projection applies in every format: JSON/NDJSON emit one object;
human output emits selected key/value pairs. Dotted paths retain flat keys and
array alignment. Only JSON is summarized: without explicit fields, human output
keeps its own view and NDJSON carries the complete result.
Fact-query projections still apply per item and retain collection metadata. Error envelopes are never
projected or compacted.
For init/sync/doctor, preparation contains state (planned, ready, incomplete),
next, scope, completed, blockers, warnings, unchecked, next_actions and resume.
next.kind is review, complete, act or handoff. Agent next_actions exclude
personal actions (actor: user) and the conditional resume; use resume only
after the prerequisites change.
Initialization summaries retain selected repository, guide and Skill outcomes,
along with setup results, so callers can verify effects without extra discovery.
The setup stage retains completed outcomes in summary mode so callers do not
repeat local side effects while another step needs human input.
Only required blockers prevent readiness. A blocker may carry cause (credential,
permission, network) and waits_on, the blocker it waited on unchecked; resolve
that one first. Actions contain actor, id, description,
argv, cwd and requires_approval, with optional env coordinates for the
current configuration/home and Agent selection. Preserve these values and use
the returned exact executable. Credentials are never included.
Init and sync also identify preview/apply through operation. Ready exits 0;
incomplete preparation exits 12. Fatal failures keep their category exit codes
and partial stdout. init --resume --workspace <name> uses the managed source and
retains existing selection and work.
self info.bundled_skill_version identifies the instructions shipped with the
running executable. skill status reports embedded_version, installation
versions and activation: unverified. Installation cannot establish native host
activation. Load the bundled task guide when the task needs it.
SKILL_WRITE_DENIED keeps denied filesystem paths and partial stage evidence.
Check access before repeating writes. To continue local repository/guide work,
use sync --only repos,docs --no-refresh-manifest in the affected workspace.
This does not claim the skipped Skill stage is ready or authorize trust changes.
Shapes of the answering commands
workspace list/show resolves registry facts without requiring a valid manifest.
Rows include root/source, selection and health. self info still reports global
installation facts when the selected workspace is degraded. Use explicit
workspace relocate, rebind or unregister plans to change identity or end
management; these preserve business checkouts and respect owned-resource cleanup.
repo select / env select replace a personal collection. --all removes its
explicit scope and follows future shared entries; --none stores an empty set.
pick/unpick add or remove individual names. Selection output reports modes
and next steps; repository selection is separate from downloading via sync.
status keeps {items, has_more} and adds workspace/root/selection context,
with stray_entries naming root entries that nothing accounts for.
Items preserve dirty as tracked changes and add uncommitted for tracked or
untracked work. Human output includes untracked counts; --dirty filters on all
uncommitted work. Empty results distinguish no declarations, no selected repos
and no matching uncommitted work.
Init accepts --repos / --no-repos before cloning. Its preview distinguishes
actual registration from planned effects and states whether source contents
were inspected; uninspected remote contents are not a validated selection.
registered means registration currently exists, including a successful retry.
Profile import merges registrations by name, retains unmentioned workspaces and refuses root/source identity changes. Its registration plan and quoted next steps identify missing manifest preparation. Use workspace lifecycle commands for relocation, rebinding and removal rather than editing an export to remove names.
fx can <capability|tool> [--env <env>] — one record:
| Field | Meaning |
|---|---|
status |
ready, missing_tool, outdated_tool, disabled_tool, unconfigured, no_access, not_covered, unknown |
tool |
the companion tool the provider needs, or null when none is required; provider and env identify the target |
handoff |
pending preparation or human interaction: summary, user_steps[] (id, kind, title, optional instructions, open, command, expects.path, check), command, alternatives |
unfinished |
present when a check gave no answer (its tool did not start, or it outlived its deadline): id, code, message for each. It says nothing about the target either way |
alternatives |
commands that answer part of the question without the tool; for not_covered, the reason comes first |
A step's check says why it is pending. result: failed carries the detail its
tool gave and, when the bundled recipe can read it, a cause: credential
(authentication was not established), permission (it answered no) or network
(a connection could not be completed). The step's instructions and open then
already say what resolves that cause. result: blocked names in by the step it
waits on; act on that one first. A missing cause means the reason is not
established, which is not evidence against a sign-in: most checks declare no causes.
Read detail and the step's own guidance. A missing check comes from an older fx
or a check that did not run; fx doctor --tool <tool> [--env <env>] shows the tool's
message.
When a tool was inspected, execution contains its canonical tool, configured binary, nullable
binary_path and version, and the workspace cwd. Use this executable instead
of resolving the name again in another shell. Checked provider entry/coordinate
commands and direct handoff vectors use that path. Manifest shell templates stay
verbatim; --no-check does not bind or verify a tool. Recheck after changing an
installation. A ready tool does not establish permission for every API operation.
A bound provider without a companion tool has no installation or login check;
ready means preparation is complete, not that every repository query will succeed.
When a tool has multiple viable platform bindings, can returns
CAN_AMBIGUOUS rather than choosing by declaration order. Select a capability
and environment, or inspect repository platforms through where.
fx can without a target — items[], one per capability a manifest binds, and per
platform instance for an environment-scoped one:
| Field | Meaning |
|---|---|
capability, scope |
the name can accepts; a workspace one is asked as fx can <capability>, an environment one needs --env <env> |
platform |
the platform instance, as where --platform names it; null for a workspace-scoped capability or when nothing is bound |
provider, tool |
what serves it in this workspace; provider: null means the manifest binds nothing, tool: null that no companion tool is resolved |
desc |
what the capability is for |
The list reads bindings only and takes no --env: it says who would answer, and
asking about one capability says whether they can.
fx where <repo> [--env <env>] [--platform <name>] [--no-check] [--probe] — items[], one per platform and environment:
| Field | Meaning |
|---|---|
status |
located or not_covered (the environment has no such platform, or the repository is deliberately uncovered) |
ready |
the fx can status for this platform's tool in this environment; null under --no-check |
handoff, unfinished |
as in fx can, when ready is not ready |
command |
a shell line to show the person or run yourself once ready says so; null when not covered |
url |
the page behind it, when the provider knows one |
confidence |
verified, derived, unverified, not_covered, not_found — the weakest declared |
notes |
caveats from the manifest, most specific first |
vars |
the merged variables, for composing another query |
outcome, suggested_confidence |
with --probe (needs --env): what the platform said, read-only, and the confidence to record |
located means the manifest resolved a coordinate, not that the repository runs
there; an undeclared confidence reads derived. where checks readiness against
the service unless --no-check is given, and --no-check does not turn off an
explicit --probe. Pass --platform to keep one platform's check from waiting on
another's. A not_covered row states what the manifest covers: its first note is the
reason, and a note of the environment may follow.
fx member show <query> — items[] of people: id, display, email, status, mentor, leader, accounts (per system), matched_by, via. For author attribution, pass --system <system> and require exactly one account match. Keep ambiguous identity candidates separate. List and show return mentor and leader as explicit person IDs or null; neither is inferred from business roles, other people or date filters.
Use --area <id> and optionally --scenario <id> for a business context. Keep memberships, responsible_teams, and assignments separate. Read each edge's source and status. A confirmed function without a team leaves team classification uncovered. Multiple confirmed teams are valid. candidate, multiple_candidates, not_configured, and not_covered do not confirm a team. Date filters evaluate declared intervals only.
fx member list --team <id> --function <id> --area <id> requires a single matching assignment. Without business scope, either kind of relationship may match. Keep collective all separate from named people.
fx member selectors [--kind area|scenario|team|function] returns vocabulary rows
with kind, canonical id, display name and nullable parent area. Results contain
no people. A name supplied as an area that exactly identifies a scenario/team/function
returns the corresponding explicit queries instead of an unrelated fuzzy area.
fx repo show <repo> — the resolved entry, disk state and URLs, plus owners: [] when the members document names nobody, null when the workspace has no members document at all, else items of area, lead, scenario, devLead, roles, every person as {id, name, email} (name and email null when the id is not in the document, all included); contact is the project's contact. Its next_steps use the canonical repository name and explicit workspace to select an unpicked repository and synchronize missing shared checkouts; inspection itself never changes selection or downloads files.
ownership_evidence is an additional scope-aware projection. It carries as_of,
basis: current_members_document, historical_snapshot: false, coverage,
items and has_more: false. Each item retains the repository-linked area/scenario,
context, named people, responsibility teams and collective assignments. A person's
status, mentor and leader remain explicit current facts. --as-of YYYY-MM-DD
filters declared relationship intervals, defaulting to today in UTC; it does not
reconstruct old membership documents. not_configured means no members document,
not_covered means no linked scope, and a checked scope can still say
no_relationships. Do not expand collective all or infer an assignee from Git
authors. A team workflow selects an owner from applicable responsibility evidence.
fx repo version <repo> reads pinned version history for any known repository,
even one excluded from the release checklist. version_evidence carries
requested_ref, resolved_sha, declaration, last_change, coverage,
commits_read, termination, next_sha and structured failures.
declaration is {file, field, package_name, value}. last_change identifies the
commit, committer time, old/new values, history_mode: first_parent and whether
this is a field change or actual root declaration. A dependency edit is not a
version-field change. Source path, field and package identity stay fixed during
the walk; renamed files, shallow/missing parents and exhausted budgets remain
incomplete. next_sha describes a stop point, not an automatic resume mechanism.
The optional baseline_evidence pins both refs and compares their declarations
and complete commit range. evidence_complete covers both requested facets.
Use the command's help for ref, path, baseline and history-budget options.
Automatic declaration discovery skips dependency-only files such as
requirements.txt. A present but unreadable supported source remains incomplete;
only the documented Gradle fallback selects adjacent gradle.properties.
Maven versions must be literals or one project property resolved to a literal.
Composite, nested or unresolved expressions retain
VERSION_DECLARATION_UNREADABLE; they are not concrete versions.
Diagnostic reports
Login and doctor reject unknown explicit tool/environment selectors before setup
or repair (TOOL_UNKNOWN / ENV_NOT_FOUND). login --list reports conflicting
expanded setup identities as step_conflict notices; executing that plan fails
with SETUP_PLAN_CONFLICT. Inspect the provider recipes rather than retrying the
same ambiguous setup. Doctor marks its missing verification as incomplete.
fx doctor returns preparation, diagnostic coverage (complete or incomplete),
summary {ok, warn, fail} and findings[]. The preparation verdict owns task completion;
optional host activation can remain unverified. An incomplete verdict exits 12.
fx release check returns ok, complete, evidence_complete, summary and findings and exits zero when its
checklist was produced. Findings carry group, id, level, coverage, message, fix and
handoff; caught query errors also carry a structured failure with recovery, retained
in compact JSON. Full results also carry evidence. Incomplete checks are not passes:
RELEASE_INCOMPLETE means no confirmed failure but missing evidence, and a known
failure can also have incomplete coverage. Human output groups identical unavailable
causes separately from confirmed problems; --details expands all repository checks.
A missing error-tracker project is incomplete coverage and must be corrected or
explicitly marked not covered; never substitute an organization-wide query. repos[] says what each release would ship,
in summaries too. For can, inspect its capability status.
Doctor groups are repos, root, tools, login, agents, manifest, self,
hooks, mcp and rules. root lists entries at the workspace root that nothing
accounts for; they warn without affecting preparation. manifest:docs checks derived guides;
manifest:upstream checks source updates; self:version checks published CLI
updates. A development build needs no update; an unavailable registry produces
a warning, with a handoff when configuration is missing.
Doctor also returns repairs, empty without --fix. Summary JSON omits successful
repair rows; use --details to inspect all attempts. Each attempt is
{group, status: planned|completed|failed, failure?}. Failed attempts retain
structured recovery errors before post-repair findings are collected.
completed means the repair ran, not that the subsequent check passed.
fx release check covers repositories selected by manifest release policy; fx release is its
compatibility name. It is read-only: it never merges, tags, publishes or deploys.
Use --help for selection, absolute/relative error windows and optional version
history, historical baseline and version-path overrides. Override keys must name
selected repositories; use a separate invocation for multiple packages in one repo.
Each repos[] entry includes name, source, target, version_file, unmerged,
note and unanswered, plus range, version_evidence, baseline_evidence and
facet_coverage. source
and target are the branch heads {branch, sha, date, message, version}; version is
what the selected root VERSION or package metadata declares at that commit, null
when unknown. target is null for a repository releasing from one branch, and both are null
when the code host was not asked or did not answer, which the findings explain.
unmerged is {commits, authors}: how many people's commits the source has that the
target lacks, and how many people wrote them; null when not compared. To read those
commits, ask the code host's own CLI for the range from target.sha to source.sha;
fx repo show <repo> gives where the repository lives on the host. unanswered[] lists
each question to the code host that failed as {field, reason, error}, where error
retains structured recovery and field is the
value left null (version_file, source.commit, source.version, target.commit,
target.version, unmerged); a null without an entry means the repository declares
none.
version_evidence uses the standalone version contract above. baseline_evidence
is {baseline, head, commits, coverage, failures}. The default JSON summary replaces
the commit array with commits_count and an omitted count; --details or explicit
--fields retains the full array. Failures remain visible. Each snapshot has
requested_ref, resolved_sha and declaration. Its commits include bots and
merges since the caller's baseline, independently of unmerged. A version-field
change, tag or source declaration does not establish an artifact build, publication
or deployment. fx does not infer a next minor version.
facet_coverage distinguishes checked, incomplete, not_requested and
not_applicable for declaration, version_history, baseline and errors.
Error findings also retain a top-level failures array in summary output, with
structured error codes, retryability and recovery steps. Detailed error candidates
keep the latest metadata observation per ID; a resolved/ignored detail can follow
an unresolved list result and is excluded from the fresh-issue verdict.
evidence_complete additionally covers requested facts and unanswered questions;
it does not redefine ok or check coverage complete. The report's observed_at
is one command-start timestamp. Absolute ranges normalize to UTC and use
[start,end); relative policies share this observation time but can use different
durations. The top-level range is null when per-repository ranges differ.
Evidence is grouped by check:
| Group | Evidence |
|---|---|
merge |
source, target, ahead[], behind[], filtered, unknown[] directions; commits have sha, author {id, name}, date, message |
deps |
file, offending[] {name, version, section, runtime} |
ci |
builds[] {side, env, branch, path, number, status, started_at, url, commit, head, current}; null path means no declared job |
errors |
query_context, env, slug, since, capped, undated, legacy fresh issues[], and complete candidate metadata in error_evidence |
CI current compares the commit the build checked out, commit, with the branch head
head when the platform names it. A null commit (Jenkins before jenkins-cli 0.12.0)
falls back to comparing the build's start time with the head commit's time, which is a
freshness heuristic, not revision verification; use the companion's build details then
when the task requires an exact commit match.
The full report's merge/dependency/issue evidence is available with --details.
Every errors finding includes evidence.query_context, even when authentication
or collection fails or the check is not applicable. It is
{repository, environment, range, observed_at, source}; source is
{platform, provider, coordinate_fingerprint} or null for an unavailable or
explicitly uncovered coordinate. The fingerprint preserves the provider's query
identity before authentication without exposing arbitrary vars.
Sentry query fingerprints identify the configured endpoint, organization and
project selector, so repository aliases for one project retain the same source
identity. Repository and environment are bound separately in query_context.
Other tracker providers may supply their own query fingerprint; without it, the
full canonical coordinate fingerprint is retained conservatively.
For an audited retry, match the repository, environment, normalized range and non-null source identity before superseding an earlier failure; keep both observation times. A different server, organization, project or period is another query. Each attempt remains separate and is not an atomic remote snapshot.
error_evidence retains every collected candidate returned by an unresolved
query and active in the range, including older issues. It carries items, range, observed_at,
pages_read, has_more, optional next, coverage, failures and
truncation_reason. Inspect these before treating a query as complete. fx follows
pagination internally; there is no public cursor-resume flag. Keep the same
absolute bounds when retrying or investigating a continuation with the companion.
Lifetime first-seen comes from issue detail; lifetime_first_seen and
first_seen_scope never use window/list dates as a fallback. Missing details
remain unknown. list_first_seen has unknown scope and window_first_seen stays
separate. count_scope: unknown prevents treating counts as newly occurring
events. status_scope: current describes each item's actual status_observed_at,
not state at the historical window; the aggregate status time is null. Assignee
is read metadata, not a selected or newly assigned owner. The legacy verdict
counts lifetime first appearances only; old regressions require separate review.
Uncovered explicit repositories yield REPO_NOT_COVERED, unmatched tags
TAG_NOT_FOUND, unknown environments ENV_NOT_FOUND, and an empty checklist
CHECKLIST_EMPTY. --since accepts windows such as 14d, 48h or 2w;
invalid windows yield BAD_SINCE. Mixing relative and absolute bounds, missing a
bound or invalid timezone-qualified timestamps yields BAD_TIME_RANGE.
Missing platform responses/jobs, undated
issues and builds that cannot be dated against the branch head warn rather
than prove readiness. Closing notices distinguish RELEASE_FAILURES for confirmed
failures, RELEASE_INCOMPLETE for missing check coverage without confirmed failures,
and RELEASE_OK for complete checks without failures. Inspect evidence_complete
separately for requested repository facts.
Update notices
MANIFEST_OUTDATED suggests fx sync; FX_OUTDATED suggests updating fx and
refreshing installed Skill copies. These notices do not change the command result.
Skill management, self-update, completion and lifecycle dispatch skip these checks.
Checks are cached for a day (fx) or an hour (manifest), run with two-second upstream
deadlines and stay silent on failure. Local cache access and bounded npm Registry discovery are outside that
deadline. FX_UPDATE_CHECK=0, update_check: false or --quiet disables them;
doctor then marks those checks as not checked. A failure before configuration is
loaded performs no update check.
self info exposes the effective registry and registry_source. Runtime order
is optional FX_REGISTRY, npm's package-scope setting, then npm's default setting.
Discovery uses global mode, honoring user/global config and NPM_CONFIG_USERCONFIG
while excluding project npmrc. Invalid chosen settings remain unresolved; internal
packages never fall back to a public Registry, while the public package falls back
to npmjs. Historical tarball URLs are not used to guess Registry APIs. Metadata
authentication is delegated to npm; the private FX_REGISTRY_TOKEN override applies
only with an explicit FX_REGISTRY, never to an inferred target. Self-update pins
only the fx package scope, preserving npm's default route for other dependencies.
Initialization and synchronization
fx sync — items[] of repository rows (exceptions only in summary JSON), then summary and stages (services, docs, skills, hooks, mcp, tools) in the same envelope. Failed repository rows keep the display error and a
failure object with category, code, message, hint, next_steps,
retryable and optional handoff. Use that recovery data to decide what to
retry; the other rows may already have succeeded. Exit zero can accompany
partial results: inspect summary.failed, summary.unreadable and stage counts.
Interrupted Skill stages retain item status and disk observed values in
stage_details.skills; package failures retain tool_install, including completed,
failed and not-started rows. code: null is not success. A package row with
phase: version and code: 0 completed installation before verification failed.
Inspect these records before retrying; cancellation stops execution.
stage_details adds document files, Skill links/fx/tools, and tool-check,
hook and MCP items where those stages ran. Rules rows are nested under
stage_details.docs.rules.items. Skill tool rows retain exit code, a concise
note, and the companion's structured failure when supplied. code: null
means no exit result is available; consult item status and ran where supplied.
A dry run executes no command, but an interrupted process may also lack an exit result.
stages holds the counts; stage_details holds the rows behind them.
fx init nests this result under sync; its written field confirms local
registration work, not complete synchronization or readiness.
Document writes use a captured file snapshot. DOCS_WRITE_CONFLICT preserves a
concurrent edit or unsafe path; inspect the path and retry from its current content.
Each document row has action (the plan) and result (planned, done, skipped,
failed, not_started). On failure, read files from partial stdout, or
stage_details.docs.files inside sync and sync.stage_details.docs.files inside init. Completed file rows remain in the
failure summary. Retry the same document operation after resolving the blocker;
unchanged files are skipped. Approved foreign replacements move the original
object to a unique sibling .fx-backup[-N] before a guarded write.
fx manifest render --check — exit 11 (DOCS_STALE) when the manifest repository's AGENTS.md regions differ from the manifest.
fx hook list — items[] with agent, action, activation, path, context and handoff,
plus workspace/root, the effective enabled setting, and dated observations.
activation: unverified means native trust/execution has not been established;
a matching projection alone is not readiness. An observation whose code is
HOOK_PHASE_UNREPORTED names a background phase that never answered, so its
absence of findings is unknown rather than clean; run its command to find out.
LOGIN_UNCHECKED likewise says every login check that did not pass was not asked or
gave no answer in the background run's time, the incomplete coverage fx doctor
reports; it asks for no sign-in. fx hook enable [--dry-run]
enables this workspace and projects selected hosts. fx hook disable [--dry-run]
disables it and removes owned entries. Global hooks / FX_HOOKS gates all
workspaces; local hooks.enabled gates one. agent unpick remains global and
adds per-workspace hook cleanup results. Lifecycle dispatch is an internal,
fail-open host entry and is not a command to run for ordinary diagnostics.
Source contributions and recording
fx source push <paths...> --issue <id> --title <title> [--message] [--new] [--pr <id|url>] [--dry-run] returns one record with workspace, action, files,
branch, base/tree/commit identities, target, target_branch, planned message/title,
pull_request, findings, validated, written, fetched and retired operation IDs.
Nullable fields are explicit. create, update, resume, associate, unchanged,
recover, needs-fetch and cancelled are distinct actions. A preview does not
write Git objects, refs or journals. --pr must resolve to the current repository
and recorded source/target branches; an arbitrary URL is never used as a request
destination. Private manifest addresses are permitted, credentials/personnel content
are rejected, and only selected whole files enter validation and the commit.
fx manifest record-probe <repo> --env <env> --platform <platform> returns a
recording record instead of a list. where --probe --record is a compatibility entry:
action (preview, recorded, unchanged, skipped), file, scope, path,
before/after confidence, note, row, written and handoff.
The row retains the normal where/probe fields and includes probe_template. Dry-run
sets after to null; only a real definite probe can set verified or not_found.
Stale documents, aliases/anchors or conflicting writes are refused.
MCP
mcp list returns {items, has_more, orphaned}. mcp show <name> returns one
resource with symbolic bindings, projections and readiness. can mcp:<name>
optionally accepts --agent <id>; MCP resources are workspace-scoped, so --env
is not applicable. Use sync --only mcp for projection and doctor for repair.
Standalone companion Skill
skill path uses the collection envelope. Each row has an optional agent, path,
status (installed, not_installed, foreign), version (nullable) and
version_state (matching, older, newer, unknown, missing). skill status
returns embedded_version, activation: unverified and installs, which holds the
same rows. Neither command needs a workspace.
Install/uninstall detect agents in the selected scope by default; --agent
accepts repeated or comma-separated IDs. Path/status list all known agents unless
narrowed. Project detection uses native markers; user detection also recognizes
agent executables on PATH. --project selects cwd; --dir selects an independent
directory and cannot be combined with --agent or --project.
Explicit install refreshes recognized copies to the bundled version, including
same-version repair or replacing a newer copy. Init/sync never downgrade newer
copies. Foreign replacements require confirmation and backup. Uninstall removes
recognized copies after confirmation (--yes for noninteractive execution), keeps
foreign paths and leaves agent selection unchanged; later sync can reinstall a copy.
skill install/update/uninstall return collection rows with action, status,
version and target fields; update's action is refresh for an older copy and
skip for every other target. Status is planned for previews; execution distinguishes
installed, removed, not_installed, foreign, skipped, failed and
not_started. On interruption, stdout retains the partial collection with each
row's observed state and failure envelope; stderr preserves the original error.
SKILL_FLAGS, SKILL_AGENT and SKILL_NO_AGENT are usage errors.
SKILL_SOURCE_PROTECTED rejects writes through shared manifest paths;
SKILL_BUSY and SKILL_TARGET_CHANGED require inspecting/retrying the target.
skill show is an explicit raw-text exception to structured stdout: it always
prints the bundled SKILL.md. It makes no network check and emits no discovery hint.
Installation audit and inventory
fx tool history [tool] returns {items, has_more: false, scope: "global"} across FX_HOME. Each
checkpoint has id, at, event (started, installed, finished), operation
(init, install, update), nullable workspace, name, binary, via, spec,
redacted vector, nullable code, version_after, binary_path, failure_code.
New checkpoints also carry installation_origin and binary_path_before; legacy
records can lack them and never establish original ownership.
Checkpoints share an operation ID. code: 0 describes the package manager; a
null version does not prove readiness. Raw process output is absent.
fx tool inventory uses the same collection envelope. Rows include name, via,
spec, binary, current binary_path, recorded version_after, last_operation,
last_recorded_at, installation_origin, recorded, installed_by, required_by, unknown_workspaces, state
and nullable uninstall_hint. States are required, unused, unknown,
unverified, not_on_path, changed, unscoped, external. Unrecorded known
executables have null manager/package/version/operation fields; inspection does
not adopt them. installed_by identifies successful operations, not original
ownership. Only confirmed fx-origin unused rows have a removal
hint; it is never an executable approval. Sync exposes these rows in
stage_details.tools.installations and counts stages.tools.unused.
Service preparation
Explicit init/sync includes stages.services and stage_details.services.items.
Each item has id, tool, nullable env, status, detail and optional public
changes, structured failure, next_steps. Status is configured, unchanged,
planned, blocked or failed; plan problems remain separate. Public configuration
success never establishes personal authentication. sync --only services selects
this stage, and --dry-run does not write configuration or trust.
Family companion setup uses config set-context without automatically adding
--activate or --overwrite; the first-context default is owned by the companion.
Inspect CONFIG_CONTEXT_CONFLICT differences and the overwrite preview before
changing existing settings. Session-backed OpenObserve contexts require a new
context to change their URL/scheme; login uses auth login --browser.
Sentry accepts public workspace URL/org defaults and names the instance with
--url; it never copies existing credentials into shared configuration.
These bundled service commands need no trust approval. Vectors the team's
tools.yaml patch authors do, and a changed one requires new exact-command trust.
Readiness and recovery
LOGIN_REQUIRED and non-ready can/where answers enter this flow.
login --format json includes items, has_more, summary and problems;
--list includes plan problems even with --quiet. If a step needs human input
or a later step throws, read the partial result on stdout as well as the error
on stderr. Results distinguish handoff, blocked, failed and not_started;
completed steps remain visible. After a sign-in, the same tool's earlier failed rows
are checked again and blocked ones whose prerequisite now passes are attempted. A
row passing on recheck is verified with a detail naming the sign-in; one still
failing keeps its result and adds recheck (after, detail, optional code).
Handoff rows include the required action, and service preparation rows retain
available failure and next_steps fields.
After resolving the blocker, repeat the same invocation: setup verifies current
state before rerunning actions. Parse stdout on a nonzero exit whenever it is
present. self update also captures installer output so its stdout remains
parseable; inspect the returned installer code, and skill_refresh for the new
installation's refresh of this Skill. tool install/update rows add skill:
installed, planned, failed, not_started (an earlier Skill command could not
start; the error's partial result keeps these rows), blocked (awaiting approval) or
none.
Retain the original task, repository/environment and readiness query while repairing prerequisites. Authorization already given in this session persists; perform covered local work without asking again. Readiness and a printed handoff never authorize external writes, permission changes or credential creation. Cluster/Rancher restrictions apply throughout setup too.
If fx itself cannot run, follow the root guide's pre-Skill bootstrap and the
manifest source README. Inspect the executable/package identity, runtime and
PATH before reinstalling. A verified local node <checkout>/bin/fx.js entry
can stand in for every fx command below. Do not use fx self update to
recover an executable that cannot start.
- Diagnose the selected prerequisite. Read status,
handoff.summary,user_stepswith each step'scheck,unfinishedand alternatives. Usefx doctor --tool <tool>andfx login <tool> --env <env> --dry-run --no-inputfor current checks;--listshows recipes without verifying them. Omit--envfor an unscoped tool. Load the relevant companion Skill for provider-specific setup and diagnostics. A failed auth check alone does not identify the root cause. - Complete authorized local preparation. For
missing_tool, use the returned install/update command, preview it with--dry-run, and inspect the manager/package/registry before executing. Checkran,code,errorandversion_after; exit zero or a null version is not proof of readiness. Fix a confirmed PATH/runtime issue before reinstalling. For pending setup, inspect recipes vialogin --listand preview checks; preserve working configuration. Akind: runstep can still open a browser or change remote credentials: classify its actual effects using the companion Skill. Runfx login <tool> [--env <env>] --skip-manual --no-input --yesonly when all selected run effects are authorized and every patch-supplied run/check vector is already trusted or explicitly approved.--yesalso trusts those vectors; it is not just a prompt suppressor. If only part is authorized, use the companion's supported scoped operation, keeping the same trust boundary. Inspectfailed,blocked,skippedrows and setup problems. Bundledphase: preparesteps, such as reusing an existing login, run infx loginwithout--yeseven with--no-input, as they do in init and sync. - Hand off only the human part. Prepare supported local configuration and
start an authorized login flow when useful; leave QR/device/browser consent,
obtaining access and new vector approval to the person. For manual/file
steps, use
title,instructions,open,commandandexpects.pathwhen present. The file path is a destination, not permission to fetch or create credentials. Ask concisely what they must do, where, why, and name the check you will run afterward. Never request tokens in chat. Continue independent authorized work while waiting; do not claim the dependent task is complete. - Verify and resume. Once local input changes or the person finishes,
re-run the same scoped
can/wherequery. Login checks before acting and skips already-valid steps; do not reinstall/reinitialize successful setup. Onready, automatically continue the original task through the companion Skill. On the same unchanged failure, diagnose the specific provider error or report a concrete blocker and the missing input. Do not loop logins or ask for the same authorization again.
| Evidence | Next decision |
|---|---|
INSTALLER_UNAVAILABLE, missing runtime or manager |
Read tool docs/local installation guidance, inspect PATH and available managers, perform authorized local install; ask only for unavailable source or required machine access. |
Registry/package unavailable, install error or network failure |
Check the reported registry/package and connectivity; package publication is not guaranteed. Use a documented local source when available. Retry only after a relevant change or a bounded provider-directed wait. |
unconfigured, failed configuration/auth check |
Read handoff.user_steps[].check first. A recognized permission or network cause does not call for a sign-in. Few checks declare causes, so a missing cause is not evidence against a sign-in: keep diagnosing from detail, the tool's own error, the step's guidance and scoped doctor details, neither signing in automatically nor ruling out a sign-in the evidence supports. Initialize only missing configuration. |
no_access from fx |
This means the environment is outside personal selection, not a remote permission verdict. Select it only within task scope; remote missing scope/forbidden requires the appropriate access decision. |
not_covered, CAPABILITY_UNBOUND, unresolved recipe/coordinate |
Inspect manifest providers/validation and maintain confirmed shared facts within scope. Do not substitute another environment or repeatedly ask for login. |
TOOL_UNDECLARED |
The capability is bound and its provider is known; the tools document does not declare the companion the provider runs. Propose that declaration; do not rebind the capability or install the tool first. |
unknown, parse error or unexpected failure |
With unfinished, a check gave no answer: for TOOL_MISSING repair the tool, for PROCESS_TIMEOUT repeat the scoped query or the returned doctor command, and hand nobody a sign-in for either. Otherwise inspect focused diagnostics and the companion Skill; preserve uncertainty, redact sensitive output, and report an actionable blocker if evidence cannot resolve it. |
Concurrent manifest edits
manifest repo-set rechecks the captured document under a file lease before
replacing it. If another writer changed it, the path is not a regular file, or
its directory is a symbolic link, MANIFEST_EDIT_CONFLICT preserves the existing
content. Inspect the real source path and retry with --dry-run; do not remove
locks or overwrite another edit. An identical edit reports written: false.
Existing logins and canonical contexts
Updated family companions provide auth reuse --dry-run and auth reuse for
associating a verified existing identity with the manifest's named context. Init
and every explicit fx sync invoke this native preparation automatically before
personal authentication; do not run it by hand inside a workspace.
It never copies secrets or changes a populated destination identity. Multiple
identities require --from-context after native config contexts discovery.
Keep the final auth check: unavailable or unchanged does not establish login.
Treat keychain/network/scope failures as their own recovery, not a login request.
Bitbucket Git transport
With a companion providing bitbucket-cli git --help, init/sync and Git remote
reads use its existing login over HTTPS, including SSH URLs without SSH keys.
The companion owns all credentials; never extract tokens into fx or rewrite shared
manifests just to bypass SSH. Select a bootstrap account with BITBUCKET_CONTEXT;
workspace Git uses the provider's context. Check actual reading with
bitbucket-cli git -- ls-remote <clone-url>. API readiness alone is not proof of
Git access. Old/missing companions keep ordinary Git; rejected tokens do not fall
back. Push needs separate write permission. Recursive submodules are unsupported.