Help us shape the future of Go! Take the 2026 Go Developer Survey

cli

package
v0.2.0-alpha Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 21, 2026 License: MIT Imports: 81 Imported by: 0

Documentation

Index

Constants

View Source
const (
	CheckStatusPass = doctor.StatusPass
	CheckStatusWarn = doctor.StatusWarn
	CheckStatusFail = doctor.StatusFail
)
View Source
const (
	ReviewResumeSchema   = "gentle-ai.review-resume/v1"
	ReviewBundleSchema   = "gentle-ai.review-bundle-result/v1"
	ReviewValidateSchema = "gentle-ai.review-gate-result/v1"
)
View Source
const OpenCodeBackgroundSubagentsEnv = "GENTLE_AI_OPENCODE_BACKGROUND_SUBAGENTS"
View Source
const PiBackgroundSubagentsEnv = "GENTLE_AI_PI_BACKGROUND_SUBAGENTS"

PiBackgroundSubagentsEnv is the environment source for the managed Pi background-subagent preference. It mirrors the OpenCode contract; there is no launcher or activation plumbing behind it because the primitive is the already-installed pi-subagents extension reading a projected policy file.

View Source
const PiConfigHomeEnv = "GENTLE_PI_CONFIG_HOME"

PiConfigHomeEnv overrides gentle-pi's config base directory (default ~/.pi), matching gentle-pi's own configuration precedent.

View Source
const PiExcludePackagesEnv = "GENTLE_AI_PI_EXCLUDE_PACKAGES"

PiExcludePackagesEnv lists managed Pi package sources the install must not run `pi install` for (comma-separated). A non-empty --pi-exclude-package flag wins over it; the value is never persisted.

View Source
const ReviewAssessmentSchema = "gentle-ai.review-assessment/v1"

ReviewAssessmentSchema is the typed envelope gentle-ai review assess prints with --json. It is a read-only projection of the same candidate risk assessment START uses to choose lenses (reviewtransaction.AssessSnapshotRisk), so a host can gate delegated verification on it before deciding whether to start a review at all, with or without receipt-driven development enabled (issue #4295).

View Source
const ReviewAssessmentSchemaID = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/assess.schema.json"
View Source
const ReviewInspectAuthoritySchema = "gentle-ai.review-authority-inspection/v1"
View Source
const ReviewIntegrationCapabilitiesSchema = "gentle-ai.review-integration.capabilities/v1.5"
View Source
const ReviewIntegrationCapabilitiesSchemaID = "https://gentle-ai.dev/contracts/review-integration/v1/schemas/capabilities-v1.5.schema.json"
View Source
const ReviewIntegrationCapabilitiesSchemaIDV1 = "https://gentle-ai.dev/contracts/review-integration/v1/schemas/capabilities.schema.json"
View Source
const ReviewIntegrationCapabilitiesSchemaIDV11 = "https://gentle-ai.dev/contracts/review-integration/v1/schemas/capabilities-v1.1.schema.json"
View Source
const ReviewIntegrationCapabilitiesSchemaIDV12 = "https://gentle-ai.dev/contracts/review-integration/v1/schemas/capabilities-v1.2.schema.json"
View Source
const ReviewIntegrationCapabilitiesSchemaIDV13 = "https://gentle-ai.dev/contracts/review-integration/v1/schemas/capabilities-v1.3.schema.json"
View Source
const ReviewIntegrationCapabilitiesSchemaIDV14 = "https://gentle-ai.dev/contracts/review-integration/v1/schemas/capabilities-v1.4.schema.json"
View Source
const ReviewIntegrationCapabilitiesSchemaIDV2 = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/capabilities.schema.json"
View Source
const ReviewIntegrationCapabilitiesSchemaIDV21 = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/capabilities-v2.1.schema.json"
View Source
const ReviewIntegrationCapabilitiesSchemaIDV22 = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/capabilities-v2.2.schema.json"
View Source
const ReviewIntegrationCapabilitiesSchemaIDV23 = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/capabilities-v2.3.schema.json"
View Source
const ReviewIntegrationCapabilitiesSchemaIDV24 = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/capabilities-v2.4.schema.json"
View Source
const ReviewIntegrationCapabilitiesSchemaIDV25 = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/capabilities-v2.5.schema.json"
View Source
const ReviewIntegrationCapabilitiesSchemaIDV26 = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/capabilities-v2.6.schema.json"
View Source
const ReviewIntegrationCapabilitiesSchemaV1 = "gentle-ai.review-integration.capabilities/v1"
View Source
const ReviewIntegrationCapabilitiesSchemaV11 = "gentle-ai.review-integration.capabilities/v1.1"
View Source
const ReviewIntegrationCapabilitiesSchemaV12 = "gentle-ai.review-integration.capabilities/v1.2"
View Source
const ReviewIntegrationCapabilitiesSchemaV13 = "gentle-ai.review-integration.capabilities/v1.3"
View Source
const ReviewIntegrationCapabilitiesSchemaV14 = "gentle-ai.review-integration.capabilities/v1.4"
View Source
const ReviewIntegrationCapabilitiesSchemaV2 = "gentle-ai.review-integration.capabilities/v2"
View Source
const ReviewIntegrationCapabilitiesSchemaV21 = "gentle-ai.review-integration.capabilities/v2.1"
View Source
const ReviewIntegrationCapabilitiesSchemaV22 = "gentle-ai.review-integration.capabilities/v2.2"
View Source
const ReviewIntegrationCapabilitiesSchemaV23 = "gentle-ai.review-integration.capabilities/v2.3"
View Source
const ReviewIntegrationCapabilitiesSchemaV24 = "gentle-ai.review-integration.capabilities/v2.4"
View Source
const ReviewIntegrationCapabilitiesSchemaV25 = "gentle-ai.review-integration.capabilities/v2.5"
View Source
const ReviewIntegrationCapabilitiesSchemaV26 = "gentle-ai.review-integration.capabilities/v2.6"
View Source
const ReviewIntegrationConsentSchema = "gentle-ai.review-integration.consent/v1"
View Source
const ReviewIntegrationConsentSchemaID = "https://gentle-ai.dev/contracts/review-integration/v1/schemas/consent.schema.json"
View Source
const ReviewIntegrationConsentSchemaIDV2 = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/consent.schema.json"
View Source
const ReviewIntegrationConsentSchemaIDV3 = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/consent-v3.schema.json"
View Source
const ReviewIntegrationConsentSchemaV2 = "gentle-ai.review-integration.consent/v2"
View Source
const ReviewIntegrationConsentSchemaV3 = "gentle-ai.review-integration.consent/v3"
View Source
const ReviewIntegrationContractV1 = "gentle-ai.review-integration/v1"
View Source
const ReviewIntegrationContractV2 = "gentle-ai.review-integration/v2"
View Source
const ReviewIntegrationFailureSchema = "gentle-ai.review-integration.failure/v1"
View Source
const ReviewIntegrationFailureSchemaID = "https://gentle-ai.dev/contracts/review-integration/v1/schemas/failure.schema.json"
View Source
const ReviewIntegrationFailureSchemaIDV2 = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/failure.schema.json"
View Source
const ReviewIntegrationFailureSchemaV2 = "gentle-ai.review-integration.failure/v2"
View Source
const ReviewIntegrationOperationSchema = "gentle-ai.review-integration.operation/v1"
View Source
const ReviewIntegrationOperationSchemaID = "https://gentle-ai.dev/contracts/review-integration/v1/schemas/operation.schema.json"
View Source
const ReviewIntegrationOperationSchemaIDV2 = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/operation.schema.json"
View Source
const ReviewIntegrationOperationSchemaV2 = "gentle-ai.review-integration.operation/v2"
View Source
const ReviewIntegrationOperationValidate = "review.validate"
View Source
const ReviewIntegrationProjectionSchema = "gentle-ai.review-integration.projection/v1"
View Source
const ReviewIntegrationProjectionSchemaID = "https://gentle-ai.dev/contracts/review-integration/v1/schemas/projection.schema.json"
View Source
const ReviewIntegrationRepairSchema = "gentle-ai.review-integration.repair/v1"
View Source
const ReviewIntegrationRepairSchemaID = "https://gentle-ai.dev/contracts/review-integration/v1/schemas/repair.schema.json"
View Source
const ReviewIntegrationRepairSchemaIDV2 = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/repair.schema.json"
View Source
const ReviewIntegrationRepairSchemaV2 = "gentle-ai.review-integration.repair/v2"
View Source
const ReviewIntegrationStartSchema = ReviewIntegrationStartSchemaV4
View Source
const ReviewIntegrationStartSchemaID = ReviewIntegrationStartSchemaIDV4
View Source
const ReviewIntegrationStartSchemaIDV1 = "https://gentle-ai.dev/contracts/review-integration/v1/schemas/start.schema.json"
View Source
const ReviewIntegrationStartSchemaIDV2 = "https://gentle-ai.dev/contracts/review-integration/v1/schemas/start-v2.schema.json"
View Source
const ReviewIntegrationStartSchemaIDV3 = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/start.schema.json"
View Source
const ReviewIntegrationStartSchemaIDV4 = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/start-v4.schema.json"
View Source
const ReviewIntegrationStartSchemaV1 = "gentle-ai.review-integration.start/v1"
View Source
const ReviewIntegrationStartSchemaV2 = "gentle-ai.review-integration.start/v2"
View Source
const ReviewIntegrationStartSchemaV3 = "gentle-ai.review-integration.start/v3"
View Source
const ReviewIntegrationStartSchemaV4 = "gentle-ai.review-integration.start/v4"
View Source
const ReviewIntegrationStatusSchema = ReviewIntegrationStatusSchemaV9
View Source
const ReviewIntegrationStatusSchemaID = ReviewIntegrationStatusSchemaIDV9
View Source
const ReviewIntegrationStatusSchemaIDV1 = "https://gentle-ai.dev/contracts/review-integration/v1/schemas/status.schema.json"
View Source
const ReviewIntegrationStatusSchemaIDV2 = "https://gentle-ai.dev/contracts/review-integration/v1/schemas/status-v2.schema.json"
View Source
const ReviewIntegrationStatusSchemaIDV3 = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/status.schema.json"
View Source
const ReviewIntegrationStatusSchemaIDV4 = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/status-v4.schema.json"
View Source
const ReviewIntegrationStatusSchemaIDV5 = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/status-v5.schema.json"
View Source
const ReviewIntegrationStatusSchemaIDV6 = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/status-v6.schema.json"
View Source
const ReviewIntegrationStatusSchemaIDV7 = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/status-v7.schema.json"
View Source
const ReviewIntegrationStatusSchemaIDV8 = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/status-v8.schema.json"
View Source
const ReviewIntegrationStatusSchemaIDV9 = "https://gentle-ai.dev/contracts/review-integration/v2/schemas/status-v9.schema.json"
View Source
const ReviewIntegrationStatusSchemaV1 = "gentle-ai.review-integration.status/v1"
View Source
const ReviewIntegrationStatusSchemaV2 = "gentle-ai.review-integration.status/v2"
View Source
const ReviewIntegrationStatusSchemaV3 = "gentle-ai.review-integration.status/v3"
View Source
const ReviewIntegrationStatusSchemaV4 = "gentle-ai.review-integration.status/v4"
View Source
const ReviewIntegrationStatusSchemaV5 = "gentle-ai.review-integration.status/v5"
View Source
const ReviewIntegrationStatusSchemaV6 = "gentle-ai.review-integration.status/v6"
View Source
const ReviewIntegrationStatusSchemaV7 = "gentle-ai.review-integration.status/v7"
View Source
const ReviewIntegrationStatusSchemaV8 = "gentle-ai.review-integration.status/v8"
View Source
const ReviewIntegrationStatusSchemaV9 = "gentle-ai.review-integration.status/v9"
View Source
const ReviewModeSchema = "gentle-ai.review-mode/v1"

ReviewModeSchema identifies the user-facing kill-switch projection.

View Source
const ReviewResultReopenSchema = "gentle-ai.review-result-reopen-result/v1"
View Source
const ReviewStartConsentDeclinedThisCandidate = "declined_this_candidate"

ReviewStartConsentDeclinedThisCandidate reports that the user answered the one-time consent question with "Not now, just this once": this candidate was not reviewed, nothing was persisted, and the next candidate asks again. The token mirrors the snake_case delivery vocabulary (receipt_governed, unmanaged) so agents can distinguish this outcome from every other start.

View Source
const ReviewStoreResetSchema = "gentle-ai.review-store-reset-result/v1"

ReviewStoreResetSchema identifies the user-facing store reset projection.

View Source
const TelemetryStatusSchema = telemetry.StatusSchema

TelemetryStatusSchema identifies the `teicos telemetry status|enable|disable` projection (gentle-ai.telemetry-status/v1).

View Source
const TelemetryStdinReadLimit = telemetry.MaxPayloadBytes + 1

TelemetryStdinReadLimit caps how many bytes `telemetry send` will read from its own stdin: one more than the contract's payload ceiling, so an oversized or runaway stream is refused rather than read without bound.

View Source
const TelemetryTriggerSchema = "gentle-ai.telemetry-trigger/v1"

TelemetryTriggerSchema identifies `teicos telemetry trigger`'s answer (gentle-ai.telemetry-trigger/v1).

Variables

View Source
var (

	// AppVersion is the teicos version that will be written into backup manifests.
	// It is set by app.go before any CLI operation so that every backup created during
	// an install or sync records which version of gentle-ai made it.
	// Default "dev" matches the ldflags default in app.Version.
	AppVersion = "dev"
)

Functions

func BuildSyncSelection

func BuildSyncSelection(flags SyncFlags, agentIDs []model.AgentID) model.Selection

BuildSyncSelection builds a model.Selection for the sync command.

Default sync scope: Engram, Context7, GGA, Skills, Persona. Excluded by default: Permissions, Theme (no markers; managed via JSON overlays where user customization cannot be safely diff-merged). Permissions and Theme can be opted-in via flags.

Persona is included because its content lives between <!-- gentle-ai:persona --> markers — that block is harness-managed and must propagate embedded-asset changes across versions. Content outside the markers (user-authored sections) is preserved by InjectMarkdownSection.

This is the reusable managed-asset sync contract. A future `upgrade --sync` flow can call this function to get the same managed-only selection semantics.

func DiscoverAgents

func DiscoverAgents(homeDir string) []model.AgentID

DiscoverAgents returns the agent IDs to sync. Persisted selections are authoritative, including an explicitly configured empty selection. Missing or incidental state falls back to filesystem discovery; unreadable state fails closed so sync cannot inject into unselected agent configuration.

When --agents is provided explicitly, callers should pass those IDs directly instead of calling DiscoverAgents.

func ExecuteTUIInstallRecordingCodexServiceTier

func ExecuteTUIInstallRecordingCodexServiceTier(homeDir string, selection model.Selection, resolved planner.ResolvedPlan, profile system.PlatformProfile, background model.OpenCodeBackgroundIntent, piBackground model.PiBackgroundIntent, onProgress pipeline.ProgressFunc, consent ...*OpenCodeSDKConsent) (pipeline.ExecutionResult, *pipeline.Orchestrator, *string)

ExecuteTUIInstallRecordingCodexServiceTier runs a TUI install and returns its orchestrator plus the service tier engram left in Codex's config.toml (nil = not written), for state to record.

func NewShellInstallModel

func NewShellInstallModel(cancel context.CancelFunc) tea.Model

NewShellInstallModel creates a selector for embedding in an existing program. It never starts an installer worker; confirmation quits the selector so its owner can restore the terminal before executing ShellInstallArguments.

func PrintInstallHelp

func PrintInstallHelp(w io.Writer)

func PrintSyncHelp

func PrintSyncHelp(w io.Writer)

func RenderDryRun

func RenderDryRun(result InstallResult) string

func RenderInstallManualActions

func RenderInstallManualActions(result InstallResult) string

RenderInstallManualActions renders non-fatal completion actions after the normal verification report so CLI users receive the same drift guidance.

func RenderSyncReport

func RenderSyncReport(result SyncResult) string

RenderSyncReport renders a human-readable summary of a sync execution.

Unlike verify.RenderReport (which shows verification check statuses), this function reports the managed sync actions that were executed — matching the spec requirement to surface "what was done" rather than "what was checked".

No-op cases:

  • No agents were discovered or specified (NoOp=true, Agents empty).
  • All managed assets were already current (NoOp=true, FilesChanged=0).

func RenderUninstallOpenCodePluginReport

func RenderUninstallOpenCodePluginReport(result opencodeplugin.UninstallResult) string

RenderUninstallOpenCodePluginReport renders a human-readable report of what the 4-layer engine touched.

func RenderUninstallReport

func RenderUninstallReport(result componentuninstall.Result) string

func ResolveAgentConfigDir

func ResolveAgentConfigDir(scope InstallScope, homeDir, workspaceDir string) string

ResolveAgentConfigDir returns the directory to use as the agent config root. When scope is ScopeWorkspace, workspaceDir is returned; otherwise homeDir is used. Both homeDir and workspaceDir must be non-empty absolute paths.

func ResolveInstallProfile

func ResolveInstallProfile(detection system.DetectionResult) system.PlatformProfile

ResolveInstallProfile returns the platform profile from detection, defaulting to darwin/brew.

func RestoreManagedBackup

func RestoreManagedBackup(manifest backup.Manifest) error

RestoreManagedBackup keeps generic restore defaults unchanged. A managed standalone restore may also use the current validated Codex home when an entry belongs there. Authority comes from the environment, never the manifest; RestoreService still enforces containment and symlink-escape checks.

func RestorePersistedSelection

func RestorePersistedSelection(selection *model.Selection, persisted state.InstallState, flags SyncFlags)

func ReviewModeStatus

func ReviewModeStatus(ctx context.Context, repo string) (reviewtransaction.RDDModeStatus, error)

reviewModeStatus is strictly read-only: it never creates user state and never creates repository state. ReviewModeStatus resolves the persisted review-mode sources without mutating them.

func ReviewOperationFlagSurface

func ReviewOperationFlagSurface(verb string) (map[string]bool, bool)

ReviewOperationFlagSurface returns the set of flag names the negotiated review operation owning the given CLI verb declares in reviewIntegrationOperationRegistry, or found=false when no negotiated row with a declared flag surface owns that verb. The registry is the single policy source for the negotiated route (see its own comment), so a documented invocation of a negotiated verb can be checked against the exact flags negotiated routing recognises without re-deriving them.

func RunCodeGraph

func RunCodeGraph(args []string, stdout io.Writer) error

RunCodeGraph exposes the safe, Gentle-AI-owned initialization boundary used by generated agent guidance. It intentionally accepts no raw CodeGraph args.

func RunDoctor

func RunDoctor(ctx context.Context, w io.Writer) error

RunDoctor runs all ecosystem health checks and renders a report to w.

func RunRestore

func RunRestore(args []string, stdout io.Writer) error

RunRestore is the top-level entry point for `gentle-ai restore [args]`. It reads backups from the real home directory and uses the default restore function.

func RunRestoreWithFn

func RunRestoreWithFn(args []string, restorer RestoreFunc, stdout io.Writer) error

RunRestoreWithFn is the testable variant of RunRestore. It uses the provided RestoreFunc and reads backups from the HOME environment variable (set by tests).

func RunRestoreWithFnAndInput

func RunRestoreWithFnAndInput(args []string, restorer RestoreFunc, stdout io.Writer, stdin io.Reader) error

RunRestoreWithFnAndInput is the fully injectable variant used in tests that need to simulate stdin input (e.g. testing confirmation prompts).

func RunReview

func RunReview(args []string, stdout io.Writer) error

func RunReviewAbandon

func RunReviewAbandon(args []string, stdout io.Writer) error

func RunReviewAcknowledgeApproved

func RunReviewAcknowledgeApproved(args []string, stdout io.Writer) error

func RunReviewAssess

func RunReviewAssess(args []string, stdout io.Writer) error

RunReviewAssess is the read-only `gentle-ai review assess` command. It builds the exact same candidate review start would (current changes, or a named --base-ref comparison), runs the shared risk assessment, and prints it: no authority, no lineage, no store mutation, and no lock beyond an ordinary read. It works identically whether or not receipt-driven development is enabled, so a host can gate delegated verification on the result before ever calling review start (issue #4295).

When the candidate cannot be built or assessed, this command fails closed: every returned error names a runnable `gentle-ai review assess ...` continuation (or an unambiguous %w propagation of the underlying native failure). Hosts that cannot resolve the named continuation should treat the failure exactly as they would treat a "high" result.

func RunReviewBundleExport

func RunReviewBundleExport(args []string, stdout io.Writer) error

func RunReviewBundleImport

func RunReviewBundleImport(args []string, stdout io.Writer) error

func RunReviewCapabilities

func RunReviewCapabilities(args []string, stdout io.Writer) error

func RunReviewCaptureCorrectionPlan

func RunReviewCaptureCorrectionPlan(args []string, stdout io.Writer) error

RunReviewCaptureCorrectionPlan records the one immutable, positive correction forecast before the user edits. It is the only public event that advances a correction_required authority into an open bounded correction.

func RunReviewCaptureRefuter

func RunReviewCaptureRefuter(args []string, stdout io.Writer) error

RunReviewCaptureRefuter materializes or executes the one transaction-wide provider refuter batch. --materialize prints the Go-materialized opaque prompt raw; --execute runs a fresh Go-owned locked-down pi process on that exact request and admits its raw bytes, so adversarial provenance mirrors the compiled claude/codex path; admission and canonicalization stay in Go.

func RunReviewCaptureResult

func RunReviewCaptureResult(args []string, stdout io.Writer) error

RunReviewCaptureResult validates or captures one result bound to review authority.

func RunReviewCaptureUnachievable

func RunReviewCaptureUnachievable(args []string, stdout io.Writer) error

RunReviewCaptureUnachievable persists one bound declaration that a selected lens slot cannot be completed under current conditions, or -- with --withdraw=true -- retracts that exact declaration (issue #3442's resilience gap: a host that mistook a transient failure, such as a host relay transport bound, for a deterministic one had no way back into the same lineage). Both forms bind to the exact lineage, revision, target, and SubjectHash the negotiated collect transition already offered for that slot (rendered as its `subject-hash` argument), exactly like every other capture verb -- so a host cannot skip a lens or fabricate a result, only report that the one slot it was actually asked to fill could not be filled, or take that report back. Declaring stops a restarted STATUS negotiation from re-offering the slot (a typed, named stop instead); withdrawing makes STATUS re-offer it again.

func RunReviewCaptureValidation

func RunReviewCaptureValidation(args []string, stdout io.Writer) error

RunReviewCaptureValidation materializes or captures the correction-bound provider targeted-validator result, binding the frozen validation request hash in both modes so the verdict can never drift to another correction.

func RunReviewInspectAuthority

func RunReviewInspectAuthority(args []string, stdout io.Writer) error

func RunReviewInspectCandidate

func RunReviewInspectCandidate(args []string, stdout io.Writer) error

RunReviewInspectCandidate exposes only provider-bound immutable candidate inspection; callers supply no repository path, tree, or literal path.

func RunReviewInvalidate

func RunReviewInvalidate(args []string, stdout io.Writer) error

func RunReviewLensContext

func RunReviewLensContext(args []string, stdout io.Writer) error

RunReviewLensContext emits the finished reviewer lens context for one selected lens: the provider-authored binding, the provider-authored capture context, and the materialized immutable candidate evidence, budget already applied and refusals already resolved.

It takes the two opaque tokens the collect transition already carries and nothing else. The repository context handle is a digest that commits to the lineage, target identity, revision, and repository identity, so those four values are recovered from the handle rather than relayed; the selected order is recovered from the lens. There is nothing left for a caller to assemble, and therefore nothing for it to author incorrectly.

The command consumes no correction budget, no reviewer invocation, and no authority revision. Its only write is an append-only audit note recording that the provider produced this lens context and by which mechanism, so running it again with the same mechanism converges rather than conflicting.

func RunReviewMode

func RunReviewMode(args []string, stdout io.Writer) error

RunReviewMode is the user-controlled receipt-driven-development switch. Receipt-driven development is opt-out: with no source expressing an opinion it resolves to on without persisting a user decision. The global mode lives in uncommitted user state; the clone-local override lives under this clone's Git common directory and can only disable. Any off wins, status never mutates, and enabling applies to future candidates only.

func RunReviewOpenCodeTransport

func RunReviewOpenCodeTransport(args []string, stdout io.Writer) error

func RunReviewReclaim

func RunReviewReclaim(args []string, stdout io.Writer) error

func RunReviewRecover

func RunReviewRecover(args []string, stdout io.Writer) error

func RunReviewReopenResults

func RunReviewReopenResults(args []string, stdout io.Writer) error

RunReviewReopenResults exposes the only path returning an uncorrected validating or correction-required authority to reviewing. Native detection covers reviewer slots that were historically accepted without provider admission or whose own evidence proves that repository inspection was unavailable; --quarantine-lens additionally lets a maintainer override named admitted slots when the reviewers' input, not the candidate, was wrong. The overridden bytes are preserved in quarantine and the audit record names each authorized lens.

func RunReviewResume

func RunReviewResume(args []string, stdout io.Writer) error

func RunReviewSchema

func RunReviewSchema(args []string, stdout io.Writer) error

func RunReviewStart

func RunReviewStart(args []string, stdout io.Writer) error

func RunReviewStep

func RunReviewStep(args []string, stdout io.Writer) error

func RunReviewStopHook

func RunReviewStopHook(args []string, stdout io.Writer) error

RunReviewStopHook is the `gentle-ai review stop-hook` entry point. Claude Code runs it as both a SessionStart and a Stop hook. On SessionStart it records the repository's current unreviewed-candidate identity (if any) as this session's baseline, with zero output. On Stop it prints one reminder, only when receipt-driven development is enabled and the repository holds a candidate the session did not start with, that routes the agent through the selectorless STATUS preflight before it reports completion. Every other case -- including an unrecognized hook_event_name -- is silent (exit 0, no output), and this command never starts a review itself.

func RunReviewStoreReset

func RunReviewStoreReset(args []string, stdout io.Writer) error

RunReviewStoreReset removes this clone's accumulated review lineage state.

It is user-initiated only, in the same sense `review mode disable` is: it carries no negotiated contract row, so no adapter can reach it on the machine route, and nothing in the product invokes it. A human types it or picks it in the TUI, or it does not happen.

Preview is the default and removal needs --confirm. That asymmetry is deliberate. The operation is irreversible and clone-wide, so the bare invocation -- the one that gets typed from memory, pasted out of a chat log, or recalled from shell history -- has to be the one that only looks. Costing the user a second invocation is a much smaller price than the first mistake.

func RunReviewValidateNonDeciding

func RunReviewValidateNonDeciding(args []string, stdout io.Writer) error

RunReviewValidateNonDeciding is the shipped legacy review-validate route. It retains legacy syntax only far enough to identify the repository and gate; it never reads a receipt, authority, candidate, or gate evidence. The retained RunReviewValidate evaluator below remains available for internal historical coverage that explicitly exercises the old gate algebra.

func RunShell

func RunShell(args []string, stdout io.Writer) (resultErr error)

Dedicated early route, deliberately independent of the generic installer, profile detector, self-update, gate and ordinary Gentle AI startup TUI.

func RunTelemetry

func RunTelemetry(args []string, stdout io.Writer) error

RunTelemetry implements `teicos telemetry status|enable|disable|preview` plus the hidden `telemetry send` subcommand that SpawnDetachedSend launches in the background (payload arrives on its stdin, never a file path, so there is never a path for it to remove). status, enable, disable, and preview never send anything themselves.

func RunUninstall

func RunUninstall(args []string, stdout io.Writer) (componentuninstall.Result, error)

func RunUninstallOpenCodePlugin

func RunUninstallOpenCodePlugin(args []string, stdout io.Writer) (opencodeplugin.UninstallResult, error)

RunUninstallOpenCodePlugin is the CLI entry point for the sub-command. Prompts for confirmation unless flags.Yes, then calls opencodeplugin.Uninstall. Writes a report to stdout on success or surfaces the error.

func RunUninstallWithSelection

func RunUninstallWithSelection(homeDir, workspaceDir string, agentIDs []model.AgentID, componentIDs []model.ComponentID) (componentuninstall.Result, error)

func RunUninstallWithSelectionAndEngramScope

func RunUninstallWithSelectionAndEngramScope(homeDir, workspaceDir string, agentIDs []model.AgentID, componentIDs []model.ComponentID, engramScope model.EngramUninstallScope) (componentuninstall.Result, error)

func SetCommandOutputStreaming

func SetCommandOutputStreaming(enabled bool) func()

SetCommandOutputStreaming toggles whether command stdout/stderr is streamed directly to the terminal. It returns a restore function.

func SetGlobalReviewMode

func SetGlobalReviewMode(ctx context.Context, repo string, enabled bool) (reviewtransaction.RDDModeStatus, error)

SetGlobalReviewMode changes only the global review-mode source and returns the resolved status for the requested repository.

func ShellInstallArguments

func ShellInstallArguments(selection ShellInstallSelection) []string

ShellInstallArguments preserves the backend's existing entry protocol. Unconfirmed and cancelled selectors have no executable argument vector.

func SplitPrintedCommandWords

func SplitPrintedCommandWords(line string) ([]string, error)

SplitPrintedCommandWords splits one printed command line into the argv a POSIX shell would hand the product.

It understands exactly the quoting reviewTransitionShellWord emits and nothing more: POSIX single quotes, and a backslash escape for the one character single quotes cannot contain (an embedded quote renders as '\”). Anything else, such as an unterminated quote or a trailing escape, is a line that would not run as printed, and saying so is the point.

This is the same grammar bench's splitPrintedCommandWords enforces for envelope-printed commands (issue #1865). It lives here, beside the emitter it inverts, because the bench module cannot import the product module's internals; the two implementations must stay in step with reviewTransitionShellWord and with each other.

func TelemetryTrigger

func TelemetryTrigger(homeDir string)

TelemetryTrigger is what install, update, and sync call at the end of a successful run. It reads the just-persisted install selection back from state (so the reported agents/components always match what is actually on disk, regardless of which in-memory selection the caller built along the way) and hands it to telemetry.Opportunistic. It never returns an error and never panics: telemetry is best-effort and must never affect the caller's own exit code or output.

Types

type CheckResult

type CheckResult = doctor.Result

type CheckStatus

type CheckStatus = doctor.Status

type DoctorReport

type DoctorReport = doctor.Report

type InstallChannel

type InstallChannel string
const (
	ChannelStable InstallChannel = "stable"
	ChannelBeta   InstallChannel = "beta"
)

func ResolveInstallChannel

func ResolveInstallChannel(flagValue string) (InstallChannel, error)

func (InstallChannel) IsBeta

func (c InstallChannel) IsBeta() bool

type InstallFlags

type InstallFlags struct {
	Agents     []string
	Components []string
	Skills     []string
	Persona    string
	Preset     string
	SDDMode    string
	Scope      string
	Channel    string
	DryRun     bool

	OpenCodeBackgroundSubagents    string
	OpenCodeBackgroundSubagentsSet bool

	PiBackgroundSubagents    string
	PiBackgroundSubagentsSet bool

	PiExcludePackages []string

	ClaudeOrchestratorModules bool
}

func ParseInstallFlags

func ParseInstallFlags(args []string) (InstallFlags, error)

type InstallInput

type InstallInput struct {
	Selection model.Selection
	Scope     InstallScope
	Channel   InstallChannel
	DryRun    bool

	// ClaudeOrchestratorModules opts a global install that selects Claude into
	// the user-global module pilot (#5256).
	ClaudeOrchestratorModules bool
}

func NormalizeInstallFlags

func NormalizeInstallFlags(flags InstallFlags, detection system.DetectionResult) (InstallInput, error)

type InstallResult

type InstallResult struct {
	Selection     model.Selection
	Resolved      planner.ResolvedPlan
	Review        planner.ReviewPayload
	Plan          pipeline.StagePlan
	Execution     pipeline.ExecutionResult
	Verify        verify.Report
	Dependencies  system.DependencyReport
	PiCodeGraph   *communitytool.PiCodeGraphResult
	ManualActions []string
	DryRun        bool

	Background              OpenCodeBackgroundResolution
	BackgroundPolicyEnabled bool

	PiBackground PiBackgroundResolution

	// PiExcludedPackages are managed Pi sources skipped by `pi install`.
	PiExcludedPackages []string
}

func RunPreparedInstall

func RunPreparedInstall(prepared PreparedInstall, detection system.DetectionResult) (InstallResult, error)

RunPreparedInstall executes a plan returned by PrepareInstall.

type InstallScope

type InstallScope string

InstallScope controls where agent-scoped config files (system prompts, skills/, agents/, etc.) are written. ScopeGlobal writes to the user's global config root for each selected agent. ScopeWorkspace writes to the current workspace config root for each selected agent.

const (
	// ScopeGlobal writes to the global agent config dir (default, backward-compatible).
	ScopeGlobal InstallScope = "global"
	// ScopeWorkspace writes to the current workspace config root for each selected agent.
	ScopeWorkspace InstallScope = "workspace"
)

func ResolveInstallScope

func ResolveInstallScope(flagValue string) (InstallScope, error)

ResolveInstallScope resolves the install scope from the flag value and env var. Priority: explicit flag > env var > default (global). An empty flagValue means the flag was not set.

type OpenCodeBackgroundResolution

type OpenCodeBackgroundResolution struct {
	Intent      model.OpenCodeBackgroundIntent
	Effective   model.OpenCodeBackgroundIntent
	Persist     model.OpenCodeBackgroundIntent
	NeedsPrompt bool
	Activation  opencodeactivation.ActivationReport
	// contains filtered or unexported fields
}

OpenCodeBackgroundResolution separates the winning intent from the concrete runtime outcome. Persist is non-empty only for a newly supplied on/off choice; prior state is consulted by auto but is never republished here.

func ResolveOpenCodeBackground

func ResolveOpenCodeBackground(input OpenCodeBackgroundResolveInput) (OpenCodeBackgroundResolution, error)

ResolveOpenCodeBackground applies CLI > non-empty env > prior managed state > auto. Auto consults prior on/off state; only implicit unresolved auto prompts interactively, while explicit auto stays auto without enabling.

func ResolveOpenCodeBackgroundInteractive

func ResolveOpenCodeBackgroundInteractive(prior model.OpenCodeBackgroundIntent) (OpenCodeBackgroundResolution, error)

ResolveOpenCodeBackgroundInteractive resolves the TUI's environment and persisted sources with interactive auto behavior. CLI flags are absent from the TUI flow, so a missing prior and missing environment decision is the only case that requests the TUI choice screen.

type OpenCodeBackgroundResolveInput

type OpenCodeBackgroundResolveInput struct {
	CLISet       bool
	CLIValue     model.OpenCodeBackgroundIntent
	EnvSet       bool
	EnvValue     string
	PriorManaged model.OpenCodeBackgroundIntent
	Interactive  bool
}

OpenCodeBackgroundResolveInput contains already-discovered sources. The resolver is pure so loading state and reading the process environment remain caller responsibilities in the activation child.

type OpenCodeSDKConsent

type OpenCodeSDKConsent struct {
	ConfigDir  string
	Manager    string
	Dependency string
	// contains filtered or unexported fields
}

OpenCodeSDKConsent describes one reviewed package-manager mutation, not a persisted preference. Only the TUI's separate confirmation supplies it.

func OpenCodeSDKInstallProposal

func OpenCodeSDKInstallProposal(homeDir string) (*OpenCodeSDKConsent, error)

OpenCodeSDKInstallProposal returns nil when no SDK operation is needed. A conflicting or unavailable package manager is never guessed.

type PartialSyncError

type PartialSyncError struct {
	Skipped []SyncSkippedAgent
}

PartialSyncError reports a sync that applied every other selected agent but skipped some. The result returned with it is complete for the applied part.

func (*PartialSyncError) Error

func (e *PartialSyncError) Error() string

type PiBackgroundResolution

type PiBackgroundResolution struct {
	Intent      model.PiBackgroundIntent
	Effective   model.PiBackgroundIntent
	Persist     model.PiBackgroundIntent
	NeedsPrompt bool
	// contains filtered or unexported fields
}

PiBackgroundResolution separates the winning intent from the concrete runtime outcome. Persist is non-empty only for a newly supplied on/off choice; prior state is consulted by auto but is never republished here.

func ResolvePiBackground

func ResolvePiBackground(input PiBackgroundResolveInput) (PiBackgroundResolution, error)

ResolvePiBackground applies CLI > non-empty env > prior managed state > auto. Auto consults prior on/off state; only implicit unresolved auto prompts interactively, while explicit auto stays auto without enabling. Unresolved non-interactive auto resolves to off.

func ResolvePiBackgroundInteractive

func ResolvePiBackgroundInteractive(prior model.PiBackgroundIntent) (PiBackgroundResolution, error)

ResolvePiBackgroundInteractive resolves the TUI's environment and persisted sources with interactive auto behavior. CLI flags are absent from the TUI flow, so a missing prior and missing environment decision is the only case that requests the TUI choice screen.

type PiBackgroundResolveInput

type PiBackgroundResolveInput struct {
	CLISet       bool
	CLIValue     model.PiBackgroundIntent
	EnvSet       bool
	EnvValue     string
	PriorManaged model.PiBackgroundIntent
	Interactive  bool
}

PiBackgroundResolveInput contains already-discovered sources. The resolver is pure so loading state and reading the process environment remain caller responsibilities.

type PreparedInstall

type PreparedInstall struct {
	// contains filtered or unexported fields
}

PreparedInstall is a validated install plan, ready for execution after app preflight. Its fields stay private so dispatch reuses the exact parsed and resolved input.

func PrepareInstall

func PrepareInstall(args []string, detection system.DetectionResult) (PreparedInstall, error)

PrepareInstall resolves and validates without reading or writing install state.

type RestoreFunc

type RestoreFunc func(manifest backup.Manifest) error

RestoreFunc is the function signature for restoring a backup from its manifest. It matches app.tuiRestore and backup.RestoreService.Restore signatures.

type ReviewAbandonResult

type ReviewAbandonResult struct {
	Operation string                                 `json:"operation"`
	Record    reviewtransaction.CompactReclaimRecord `json:"record"`
}

type ReviewActionBinding

type ReviewActionBinding struct {
	LineageID      string `json:"lineage_id"`
	Revision       string `json:"revision"`
	TargetIdentity string `json:"target_identity"`
}

ReviewActionBinding is a proof reference, not an authorization template. It is emitted only for a natively eligible maintainer-authorized recovery.

type ReviewActionEligibility

type ReviewActionEligibility struct {
	AllowedActions   []ReviewEligibleAction  `json:"allowed_actions"`
	ForbiddenActions []ReviewForbiddenAction `json:"forbidden_actions"`
}

ReviewActionEligibility remains an additive compatibility detail for older consumers. A negotiated next_transition is the sole routing authority.

func (ReviewActionEligibility) Validate

func (eligibility ReviewActionEligibility) Validate(status ReviewTargetStatusResult) error

type ReviewAssessmentCandidate

type ReviewAssessmentCandidate struct {
	Kind     string `json:"kind"`
	BaseRef  string `json:"base_ref,omitempty"`
	Consumed bool   `json:"consumed"`
}

ReviewAssessmentCandidate names the exact candidate the assessment was computed over, so a caller can tell a current-changes candidate from a named base comparison without re-deriving it. Consumed reports whether this exact candidate's terminal review authority was already acknowledged -- the same evidence STATUS itself consults (reviewtransaction.CompactTargetConsumed) before ever offering a fresh START for the identical identity -- so a host never re-derives review_due from a tier that a burned lineage has already settled.

type ReviewAssessmentNextTransition

type ReviewAssessmentNextTransition struct {
	Operation string                     `json:"operation"`
	Command   string                     `json:"command"`
	Arguments []ReviewTransitionArgument `json:"arguments"`
}

ReviewAssessmentNextTransition is the exact, literally runnable `gentle-ai review status ... --next-transition` preflight continuation for a review_due=true candidate, rendered with the same ReviewTransitionArgument rows and builder conventions review_next_transition.go uses for every other negotiated continuation this product emits. Command is "gentle-ai " plus every argument's token joined by single spaces, so a caller never hand-assembles the invocation from prose (issue: orchestrators skipped the RDD preflight after a slice closed because the ODD rule was prose only).

type ReviewAssessmentReason

type ReviewAssessmentReason struct {
	Code   string `json:"code"`
	Path   string `json:"path,omitempty"`
	Detail string `json:"detail,omitempty"`
}

ReviewAssessmentReason is the public projection of one reviewtransaction.RiskReason: the same evidence code and path START already carries in its own risk_reasons, plus an optional human-readable detail for the signal or mode-change evidence a bare code does not spell out.

type ReviewAssessmentResult

type ReviewAssessmentResult struct {
	Schema          string                          `json:"schema"`
	Risk            string                          `json:"risk"`
	Reasons         []ReviewAssessmentReason        `json:"reasons"`
	ChangedPaths    int                             `json:"changed_paths"`
	ChangedLines    int                             `json:"changed_lines"`
	Candidate       ReviewAssessmentCandidate       `json:"candidate"`
	ReviewDue       bool                            `json:"review_due"`
	ReviewDueReason string                          `json:"review_due_reason"`
	NextTransition  *ReviewAssessmentNextTransition `json:"next_transition,omitempty"`
}

ReviewAssessmentResult is the complete gentle-ai.review-assessment/v1 envelope. Risk is the public vocabulary: "passive" is exactly the tier reviewtransaction.RiskLow names -- the same zero-lens, structural-readback tier START selects for it -- and "medium"/"high" are unchanged so this projection can never disagree with START's own classification of the same candidate. ReviewDue and ReviewDueReason turn that tier into the one consequence orchestrators actually need (issue: the ~400-line ODD slice rule was prose only, and it was skipped in practice); NextTransition is the literal preflight command to run when ReviewDue is true, and is absent otherwise.

type ReviewBundleResult

type ReviewBundleResult struct {
	Schema          string `json:"schema"`
	Operation       string `json:"operation"`
	LineageID       string `json:"lineage_id"`
	BundleDigest    string `json:"bundle_digest"`
	StoreRevision   string `json:"store_revision"`
	GenesisRevision string `json:"genesis_revision"`
	ChainIdentity   string `json:"chain_identity"`
	BundlePath      string `json:"bundle_path,omitempty"`
}

type ReviewCapabilitiesBootstrap

type ReviewCapabilitiesBootstrap struct {
	Command                string                             `json:"command"`
	TargetSelectorVariants []ReviewCapabilitiesTargetSelector `json:"target_selector_variants"`
	RequiredFeature        string                             `json:"required_feature"`
	UnsupportedOutcome     string                             `json:"unsupported_outcome"`
	ParentOnly             bool                               `json:"parent_only"`
}

ReviewCapabilitiesBootstrap is optional capability metadata. Consumers that do not understand it retain the existing v1 capability surface.

type ReviewCapabilitiesBuild

type ReviewCapabilitiesBuild struct {
	ID            string `json:"id"`
	GoVersion     string `json:"go_version"`
	ModuleVersion string `json:"module_version"`
	VCS           string `json:"vcs"`
	VCSRevision   string `json:"vcs_revision"`
	VCSTime       string `json:"vcs_time"`
	VCSModified   string `json:"vcs_modified"`
}

type ReviewCapabilitiesCompatibility

type ReviewCapabilitiesCompatibility struct {
	MinimumProtocolMajor int                            `json:"minimum_protocol_major"`
	MaximumProtocolMajor int                            `json:"maximum_protocol_major"`
	AdditiveMinorPolicy  string                         `json:"additive_minor_policy"`
	UnknownMandatory     string                         `json:"unknown_mandatory"`
	UnknownOptional      string                         `json:"unknown_optional"`
	Modes                []string                       `json:"modes"`
	LegacyWindow         ReviewCapabilitiesLegacyWindow `json:"legacy_window"`
}

type ReviewCapabilitiesExecutable

type ReviewCapabilitiesExecutable struct {
	SHA256       string `json:"sha256"`
	Evidence     string `json:"evidence"`
	Verification string `json:"verification"`
}

type ReviewCapabilitiesFeatures

type ReviewCapabilitiesFeatures struct {
	Mandatory []ReviewCapabilityFeature `json:"mandatory"`
	Optional  []ReviewCapabilityFeature `json:"optional"`
}

type ReviewCapabilitiesLegacyWindow

type ReviewCapabilitiesLegacyWindow struct {
	Mode                         string `json:"mode"`
	State                        string `json:"state"`
	ReadOnly                     bool   `json:"read_only"`
	DeprecationStarted           bool   `json:"deprecation_started"`
	Removal                      string `json:"removal"`
	MinimumCompatibilityReleases int    `json:"minimum_compatibility_releases"`
}

type ReviewCapabilitiesPackage

type ReviewCapabilitiesPackage struct {
	Name           string `json:"name"`
	Version        string `json:"version"`
	ReleaseChannel string `json:"release_channel"`
}

type ReviewCapabilitiesProtocol

type ReviewCapabilitiesProtocol struct {
	Major int `json:"major"`
	Minor int `json:"minor"`
}

type ReviewCapabilitiesResult

type ReviewCapabilitiesResult struct {
	Schema        string                          `json:"schema"`
	Contract      string                          `json:"contract"`
	Protocol      ReviewCapabilitiesProtocol      `json:"protocol"`
	Package       ReviewCapabilitiesPackage       `json:"package"`
	Build         ReviewCapabilitiesBuild         `json:"build"`
	Executable    ReviewCapabilitiesExecutable    `json:"executable"`
	Operations    []string                        `json:"operations"`
	Gates         []string                        `json:"gates"`
	Projections   []string                        `json:"projections"`
	Schemas       []string                        `json:"schemas"`
	Features      ReviewCapabilitiesFeatures      `json:"features"`
	Bootstrap     *ReviewCapabilitiesBootstrap    `json:"bootstrap,omitempty"`
	Compatibility ReviewCapabilitiesCompatibility `json:"compatibility"`
}

func (ReviewCapabilitiesResult) Validate

func (result ReviewCapabilitiesResult) Validate() error

type ReviewCapabilitiesTargetSelector

type ReviewCapabilitiesTargetSelector struct {
	TargetType string   `json:"target_type"`
	Arguments  []string `json:"arguments"`
}

type ReviewCapabilityFeature

type ReviewCapabilityFeature struct {
	Name      string   `json:"name"`
	Supported bool     `json:"supported"`
	Requires  []string `json:"requires"`
}

type ReviewEligibleAction

type ReviewEligibleAction struct {
	Action         string                                `json:"action"`
	ReasonCode     string                                `json:"reason_code"`
	RequiredInputs []string                              `json:"required_inputs"`
	Disposition    reviewtransaction.RecoveryDisposition `json:"disposition,omitempty"`
	Binding        *ReviewActionBinding                  `json:"binding,omitempty"`
}

type ReviewFacadeLensBinding

type ReviewFacadeLensBinding struct {
	Lens  string `json:"lens"`
	Order int    `json:"order"`
	// FindingIDPrefix is the prefix admission requires for explicit finding
	// IDs bound to this lens. It follows the lens, not the selection order:
	// high-risk START selects review-resilience at order 1, but its explicit
	// IDs must still carry R4-.
	FindingIDPrefix string `json:"finding_id_prefix"`
}

ReviewFacadeLensBinding pairs one selected lens with its frozen zero-based order so orchestrators build capture bindings exclusively from START output.

type ReviewFacadeStartResult

type ReviewFacadeStartResult struct {
	Operation        string                       `json:"operation"`
	Action           string                       `json:"action"`
	LensesRequired   bool                         `json:"lenses_required"`
	LineageID        string                       `json:"lineage_id"`
	State            reviewtransaction.State      `json:"state"`
	RiskLevel        reviewtransaction.RiskLevel  `json:"risk_level"`
	SelectedLenses   []string                     `json:"selected_lenses"`
	LensBindings     []ReviewFacadeLensBinding    `json:"lens_bindings"`
	Projection       reviewtransaction.Projection `json:"projection"`
	TargetMode       reviewtransaction.TargetKind `json:"target_mode,omitempty"`
	TargetIdentity   string                       `json:"target_identity,omitempty"`
	BaseTree         string                       `json:"base_tree,omitempty"`
	CandidateTree    string                       `json:"candidate_tree,omitempty"`
	ChangedFiles     int                          `json:"changed_files"`
	ChangedLines     int                          `json:"changed_lines"`
	CorrectionBudget int                          `json:"correction_budget"`
	// RiskEvidence carries the same human phrases the interactive consent
	// prompt speaks for the frozen candidate, so a headless consumer can relay
	// WHY the tier escalated. Absent when no evidence drove an escalation.
	RiskEvidence []string `json:"risk_evidence,omitempty"`
	// Hint is a purely informational recovery pointer; it never changes START
	// behavior and is absent outside its one scoped case.
	Hint string `json:"hint,omitempty"`
	// Consent reports a user consent choice as a typed outcome instead of an
	// error, in the same additive omitted-by-default spirit as RiskEvidence,
	// Hint, and the gate result's Delivery: every start that already shipped
	// keeps its exact field set, and only a candidate the user declined
	// carries the extra token. A decline is a reported choice, never a veto.
	Consent string `json:"consent,omitempty"`
	// Acknowledgement is present only for a v2 zero-lens approved START. It
	// carries the exact continuation that burns the pending compact authority.
	Acknowledgement *ReviewTransitionExecution `json:"acknowledgement,omitempty"`
	// Trace is present only when --trace was explicitly requested for this
	// START (#1854). The authority mutation above always represents what
	// actually committed; Trace separately reports whether the requested
	// diagnostic entry was also persisted, never the other way around.
	Trace *ReviewTraceOutcome `json:"trace,omitempty"`
}

type ReviewForbiddenAction

type ReviewForbiddenAction struct {
	Action     string `json:"action"`
	ReasonCode string `json:"reason_code"`
}

type ReviewForecast

type ReviewForecast struct {
	Horizon ReviewForecastHorizon `json:"horizon"`
	Steps   []ReviewForecastItem  `json:"steps"`
}

type ReviewForecastHorizon

type ReviewForecastHorizon string
const (
	ForecastHorizonPartial  ReviewForecastHorizon = "partial"
	ForecastHorizonTerminal ReviewForecastHorizon = "terminal"
)

type ReviewForecastItem

type ReviewForecastItem struct {
	Step        int    `json:"step"`
	Kind        string `json:"kind"`
	ReasonCode  string `json:"reason_code"`
	Description string `json:"description"`
}

type ReviewGateDeniedError

type ReviewGateDeniedError struct {
	Result reviewtransaction.GateResult
	// Reason is the exact reason the JSON gate-result envelope publishes for
	// this denial. It is carried here so the human surface renders the same
	// specific statement the machine surface already had, instead of throwing
	// it away and substituting a placeholder.
	Reason  string
	Context reviewtransaction.GateContext
	Cause   error
}

func (ReviewGateDeniedError) Error

func (err ReviewGateDeniedError) Error() string

Error renders the human-surface denial. It always names a continuation: every branch below derives it from the SAME source the negotiated gate_scope_changed/gate_escalated/gate_invalidated envelope already uses (reviewGateAction, and for scope-changed the frozen GateScopeChangeDiagnostics.RecoveryOperation/RecoveryRequiredInputs) so the wording can never drift from the routing knowledge the JSON envelope carries. When no derivable continuation exists, it states the exact Reason the same envelope publishes instead of inventing a command -- and only when there is no reason either does it fall back to the terminal precondition.

Nothing rendered here may be a dotted operation identifier. Those are wire tokens for the negotiated contract; an operator who types one gets nothing, so every command named here goes through reviewRunnableCommand.

func (ReviewGateDeniedError) Unwrap

func (err ReviewGateDeniedError) Unwrap() error

type ReviewInspectAuthorityResult

type ReviewInspectAuthorityResult struct {
	Schema           string                                             `json:"schema"`
	Operation        string                                             `json:"operation"`
	RepositoryRoot   string                                             `json:"repository_root"`
	Complete         bool                                               `json:"complete"`
	Valid            bool                                               `json:"valid"`
	Totals           reviewtransaction.CompactRecoveryInspectionTotals  `json:"totals"`
	Edges            []reviewtransaction.CompactRecoveryEdgeInspection  `json:"edges"`
	EntryDiagnostics []reviewtransaction.CompactRecoveryEntryDiagnostic `json:"entry_diagnostics"`
	// SanctionedExits names, per invalid edge, the operation that would accept
	// it right now. It is reported beside the edges rather than inside them
	// because the edge shape is the binding identity batch reconciliation
	// re-derives and compares, while this is derived against the live store.
	SanctionedExits []reviewtransaction.CompactRecoverySanctionedExit `json:"sanctioned_exits"`
}

type ReviewIntegrationConsentChoice

type ReviewIntegrationConsentChoice = consentenvelope.Choice

ReviewIntegrationConsentChoice is one allowed answer: its token, the human label the interactive prompt uses, what choosing it does, and the exact runnable follow-up invocation scoped to this candidate. It is an alias of the shared consent-envelope core's Choice (#2554): the JSON field names are shipped contract bytes, pinned byte-for-byte by TestReviewConsentEnvelopeSerializedBytesUnchanged.

type ReviewIntegrationConsentOffPath

type ReviewIntegrationConsentOffPath = consentenvelope.OffPath

ReviewIntegrationConsentOffPath names the documented permanent-disable command that is deliberately not part of the choice set. Alias of the shared core's OffPath under the same byte pin.

type ReviewIntegrationConsentResult

type ReviewIntegrationConsentResult struct {
	Schema    string `json:"schema"`
	Contract  string `json:"contract"`
	Operation string `json:"operation"`
	Action    string `json:"action"`
	Agent     string `json:"agent,omitempty"`
	// Blocking marks this envelope as a decision the caller must relay before
	// any review work starts; nothing has been persisted.
	Blocking       bool                             `json:"blocking"`
	TargetIdentity string                           `json:"target_identity"`
	Projection     reviewtransaction.Projection     `json:"projection"`
	RiskLevel      reviewtransaction.RiskLevel      `json:"risk_level"`
	ChangedFiles   int                              `json:"changed_files"`
	ChangedLines   int                              `json:"changed_lines"`
	Headline       string                           `json:"headline"`
	Reason         string                           `json:"reason"`
	Value          string                           `json:"value"`
	RiskEvidence   []string                         `json:"risk_evidence"`
	Choices        []ReviewIntegrationConsentChoice `json:"choices"`
	// OffPath documents the permanent disable outside the choice set, exactly
	// as the interactive prompt does: a decline is deliberately not the kill
	// switch, and turning reviews off for good must cost more than answering
	// a relayed question in a hurry.
	OffPath ReviewIntegrationConsentOffPath `json:"off_path"`
}

ReviewIntegrationConsentResult is the typed per-candidate consent question a relay-declared negotiated START answers with instead of proceeding. It is a blocking decision envelope in the sense of the orchestrator contract's Lossless Blocking Prompts rule: it carries WHY input is required (the same human phrases the interactive question speaks), the COMPLETE choice set, and the EXACT runnable way to answer, scoped to the one frozen candidate.

It exists only behind the --consent relay declaration. A caller that declares nothing never sees this shape, which is what keeps every already shipped negotiated flow byte-for-byte unchanged.

func (ReviewIntegrationConsentResult) Validate

func (result ReviewIntegrationConsentResult) Validate() error

type ReviewIntegrationFailure

type ReviewIntegrationFailure struct {
	Schema                 string                          `json:"schema"`
	Contract               string                          `json:"contract"`
	Operation              string                          `json:"operation"`
	Phase                  string                          `json:"phase"`
	Code                   string                          `json:"code"`
	Message                string                          `json:"message"`
	MutationOutcome        ReviewMutationOutcome           `json:"mutation_outcome"`
	AuthorityApplicability string                          `json:"authority_applicability"`
	RetrySafe              bool                            `json:"retry_safe"`
	Replayability          reviewtransaction.Replayability `json:"replayability"`
	LineageID              string                          `json:"lineage_id,omitempty"`
	// TargetIdentity binds an operation failure to the frozen candidate whose
	// retained lineage the caller must query with STATUS. It is optional for
	// unrelated historical failure classes.
	TargetIdentity   string   `json:"target_identity,omitempty"`
	RequestDigest    string   `json:"request_digest,omitempty"`
	ProgressIdentity string   `json:"progress_identity,omitempty"`
	RequiredInputs   []string `json:"required_inputs"`
	NextAction       string   `json:"next_action"`
	CauseCategory    string   `json:"cause_category,omitempty"`
	// Cause is additive: the scrubbed, bounded native cause for a typed failure
	// branch that has a safe diagnostic to publish.
	Cause   string                           `json:"cause,omitempty"`
	Context *ReviewIntegrationFailureContext `json:"context,omitempty"`
	// Continuation is the one candidate-preserving runnable follow-up a
	// managed_assets_outdated refusal can offer (#3299, #4170): the exact
	// `teicos sync` invocation that reconciles the recorded digest. It is
	// additive and, on THIS envelope, only ever set for that one refusal code;
	// the release continuation the type also carries travels on a STATUS stop,
	// never here.
	Continuation *ReviewStopContinuation `json:"continuation,omitempty"`
}

func (ReviewIntegrationFailure) Validate

func (failure ReviewIntegrationFailure) Validate() error

type ReviewIntegrationFailureContext

type ReviewIntegrationFailureContext struct {
	ScopeChange *ReviewIntegrationScopeChange `json:"scope_change,omitempty"`
	// TargetDrift is the additive #4494 stale-target evidence: the negotiated
	// components beside their live rebuild, with the differing component
	// names. Exactly one of the two context variants is ever set.
	TargetDrift *ReviewIntegrationTargetDrift `json:"target_drift,omitempty"`
}

type ReviewIntegrationFailureError

type ReviewIntegrationFailureError struct {
	Failure ReviewIntegrationFailure
	// contains filtered or unexported fields
}

func (*ReviewIntegrationFailureError) Error

func (*ReviewIntegrationFailureError) Unwrap

func (err *ReviewIntegrationFailureError) Unwrap() error

type ReviewIntegrationNegotiatedComponents

type ReviewIntegrationNegotiatedComponents struct {
	Kind          string `json:"kind"`
	Projection    string `json:"projection"`
	BaseTree      string `json:"base_tree,omitempty"`
	CandidateTree string `json:"candidate_tree"`
	PathsDigest   string `json:"paths_digest"`
}

ReviewIntegrationNegotiatedComponents are the five identity components a negotiated continuation carries. base_tree is optional: an unborn HEAD current-changes candidate has no base tree, and absence means exactly that, never an omission.

type ReviewIntegrationOperationResult

type ReviewIntegrationOperationResult struct {
	Schema    string          `json:"schema"`
	Contract  string          `json:"contract"`
	Operation string          `json:"operation"`
	Result    json.RawMessage `json:"result"`
}

func (ReviewIntegrationOperationResult) Validate

func (result ReviewIntegrationOperationResult) Validate() error

type ReviewIntegrationScopeChange

type ReviewIntegrationScopeChange struct {
	Expected               ReviewIntegrationScopeTarget `json:"expected"`
	Actual                 ReviewIntegrationScopeTarget `json:"actual"`
	DifferingPathCount     int                          `json:"differing_path_count"`
	DifferingPathsDigest   string                       `json:"differing_paths_digest"`
	PredecessorLineageID   string                       `json:"predecessor_lineage_id"`
	PredecessorRevision    string                       `json:"predecessor_revision"`
	RecoveryOperation      string                       `json:"recovery_operation"`
	RecoveryRequiredInputs []string                     `json:"recovery_required_inputs"`
}

type ReviewIntegrationScopeTarget

type ReviewIntegrationScopeTarget struct {
	CandidateTree string `json:"candidate_tree"`
	PathsDigest   string `json:"paths_digest"`
}

type ReviewIntegrationStartResult

type ReviewIntegrationStartResult struct {
	Schema              string                                        `json:"schema"`
	Contract            string                                        `json:"contract"`
	Operation           string                                        `json:"operation"`
	Action              string                                        `json:"action"`
	LensesRequired      bool                                          `json:"lenses_required"`
	LineageID           string                                        `json:"lineage_id"`
	State               reviewtransaction.State                       `json:"state"`
	RiskLevel           reviewtransaction.RiskLevel                   `json:"risk_level"`
	SelectedLenses      []string                                      `json:"selected_lenses"`
	Projection          reviewtransaction.Projection                  `json:"projection"`
	TargetMode          reviewtransaction.TargetKind                  `json:"target_mode,omitempty"`
	TargetIdentity      string                                        `json:"target_identity,omitempty"`
	BaseTree            string                                        `json:"base_tree,omitempty"`
	CandidateTree       string                                        `json:"candidate_tree,omitempty"`
	ChangedFiles        int                                           `json:"changed_files"`
	ChangedLines        int                                           `json:"changed_lines"`
	CorrectionBudget    int                                           `json:"correction_budget"`
	RiskReasons         []reviewtransaction.RiskReason                `json:"risk_reasons"`
	ArtifactSubjects    []reviewtransaction.ArtifactSubject           `json:"artifact_subjects"`
	CandidateDiff       *reviewtransaction.FrozenCandidateDiff        `json:"candidate_diff,omitempty"`
	ChangedPathManifest *[]reviewtransaction.ChangedPathManifestEntry `json:"changed_path_manifest,omitempty"`
	RepositoryContext   *ReviewRepositoryContextReference             `json:"repository_context,omitempty"`
	Acknowledgement     *ReviewTransitionExecution                    `json:"acknowledgement,omitempty"`
	NextTransition      *ReviewNextTransition                         `json:"next_transition,omitempty"`
	// Trace mirrors ReviewFacadeStartResult.Trace (#1854). It is carried
	// only on the current (non-legacy-transport) envelope, the same gating
	// Acknowledgement and NextTransition already use, so the frozen v1
	// legacy-transport wire shape (start-v2.schema.json) never gains a field.
	Trace *ReviewTraceOutcome `json:"trace,omitempty"`
}

ReviewIntegrationStartResult is the explicitly negotiated START response. The legacy ReviewFacadeStartResult remains byte- and schema-compatible.

func (ReviewIntegrationStartResult) Validate

func (result ReviewIntegrationStartResult) Validate() error

type ReviewIntegrationTargetDrift

type ReviewIntegrationTargetDrift struct {
	Expected            ReviewIntegrationNegotiatedComponents `json:"expected"`
	Actual              ReviewIntegrationNegotiatedComponents `json:"actual"`
	DifferingComponents []string                              `json:"differing_components"`
}

ReviewIntegrationTargetDrift decomposes one stale-target refusal into the truthful cause: which components of the negotiated candidate evidence no longer describe the live workspace (the moved class), or that every component matches while the identity hash alone drifted (the derivation defect class, #2700/#4353/#4412).

type ReviewInvalidateResult

type ReviewInvalidateResult struct {
	Operation     string                  `json:"operation"`
	LineageID     string                  `json:"lineage_id"`
	State         reviewtransaction.State `json:"state"`
	StoreRevision string                  `json:"store_revision"`
}

type ReviewModeResult

type ReviewModeResult struct {
	Schema    string                          `json:"schema"`
	Operation string                          `json:"operation"`
	Scope     string                          `json:"scope"`
	Status    reviewtransaction.RDDModeStatus `json:"status"`
}

ReviewModeResult reports what the command did and the resulting effective mode with both of its sources. It carries no review outcome.

type ReviewModeUnreadableError

type ReviewModeUnreadableError struct {
	Scopes []ReviewModeUnreadableScope
	Cause  error
}

ReviewModeUnreadableError reports a kill-switch record that exists but cannot be read as a mode. Failing closed is deliberate and stays exactly as it was: an unintelligible switch is not a disabled switch, so it resolves to managed and every start and mutation still refuses. What the refusal has to carry is the file holding the value and the command that overwrites it, both of which the product already knows and neither of which it used to say.

func (*ReviewModeUnreadableError) Error

func (err *ReviewModeUnreadableError) Error() string

func (*ReviewModeUnreadableError) Unwrap

func (err *ReviewModeUnreadableError) Unwrap() error

type ReviewModeUnreadableScope

type ReviewModeUnreadableScope struct {
	Scope string
	Path  string
	Repo  string
}

ReviewModeUnreadableScope names one kill-switch source whose persisted value cannot be read as a mode, the file that holds it, and the repository that file belongs to.

type ReviewMutationOutcome

type ReviewMutationOutcome string
const (
	ReviewMutationNotStarted ReviewMutationOutcome = "not_started"
	ReviewMutationUnknown    ReviewMutationOutcome = "unknown"
	ReviewMutationCommitted  ReviewMutationOutcome = "committed"
)

type ReviewNextTransition

type ReviewNextTransition struct {
	Kind              string                                   `json:"kind"`
	ReasonCode        string                                   `json:"reason_code"`
	Execute           *ReviewTransitionExecution               `json:"execute,omitempty"`
	Collect           *ReviewTransitionCollection              `json:"collect,omitempty"`
	CorrectionRequest *reviewtransaction.CorrectionPlanRequest `json:"correction_request,omitempty"`
	Continuation      *ReviewStopContinuation                  `json:"continuation,omitempty"`
	// UnachievableLensSlots is a pointer-to-slice, exactly like
	// ReviewTransitionExecution.SelectorArguments, so ReviewNextTransition
	// stays a comparable struct (== / != against a zero value) for the
	// existing state-table test's "omitted" check.
	UnachievableLensSlots *[]ReviewUnachievableLensSlot `json:"unachievable_lens_slots,omitempty"`
}

ReviewNextTransition is the sole negotiated routing decision. Its execute form is complete, its collect form identifies one externally supplied input, and its stop form otherwise contains no command-shaped data. Two deliberate exceptions exist: the managed_assets_outdated stop is itself the candidate-preserving continuation (#3299, #4170), so Continuation is additive and set only there; and UnachievableLensSlots (issue #3442): a bare stop with no recoverable binding would strand a restarted orchestrator that lost the pre-stop collect offer carrying the declared slot's SubjectHash, with no native route back to the exact `--request-hash` its own withdraw needs.

func (ReviewNextTransition) Validate

func (transition ReviewNextTransition) Validate() error

type ReviewProviderTask

type ReviewProviderTask struct {
	Agent  string `json:"agent"`
	Role   string `json:"role"`
	Prompt string `json:"prompt"`
}

ReviewProviderTask is a Go-issued host task. OpenCode relays its opaque prompt and final bytes through one live child process; Go owns admission.

type ReviewReceiptDiscoveryError

type ReviewReceiptDiscoveryError struct {
	Kind       ReviewReceiptDiscoveryKind
	Category   string
	Candidates []string
	Context    *reviewtransaction.GateContext
	// Detail preserves the exact typed cause of a deterministic mismatch so
	// the denial states what is actually true instead of a generic projection.
	Detail string
	// DeterministicallyStaleOnly is meaningful only when Kind ==
	// ReviewReceiptAmbiguous. It records the ambiguity's COMPOSITION: true
	// only when every lineage contributing to it classified into a
	// deterministically-typed stale bucket (scope-changed, delivery-shape, or
	// target-resolution) rather than an undecidable one (assessment-unknown
	// or scope-diagnostics-unavailable) or a genuinely competing exact match
	// (len(exact) > 1, which never sets this field). organic-dx Phase 3c: the
	// gate asks exactly one question -- does an approved receipt cover
	// exactly these candidate bytes? A stale receipt must INFORM, never
	// DECIDE. When this field is true, discovery has proven no candidate
	// governs, so the residual ambiguity is only about which stale lineage to
	// name in diagnostics -- it never has a delivery consequence, in either
	// mode. A false value (the default) means the gate genuinely cannot pick
	// -- present-tense competing authority, or an assessment that could not
	// even be completed.
	//
	// That false value keeps failing closed while reviews are ON, where
	// answering requires naming one governing receipt. It no longer decides
	// whether the gate BLOCKS while reviews are off: a switched-off system has
	// no implications, and declining to govern requires choosing nothing. What
	// it decides there is whether the reported disabled/unmanaged result must
	// additionally SAY the gate could not decide -- see
	// reviewDiscoveryLeftTheGateUndecided.
	//
	// A bool field was chosen over a distinct ReviewReceiptDiscoveryKind
	// because Kind is wire-facing (JSON "code", docs continuation table,
	// Phase 4's narration registry); splitting it would ripple through all
	// three surfaces for a distinction that has no separate wire behavior of
	// its own -- it only feeds one internal classification decision. This
	// field is package-internal bookkeeping, never serialized.
	DeterministicallyStaleOnly bool
}

func (*ReviewReceiptDiscoveryError) Error

func (err *ReviewReceiptDiscoveryError) Error() string

type ReviewReceiptDiscoveryKind

type ReviewReceiptDiscoveryKind string
const (
	ReviewReceiptMissing      ReviewReceiptDiscoveryKind = "receipt_missing"
	ReviewReceiptUnrelated    ReviewReceiptDiscoveryKind = "receipt_unrelated"
	ReviewReceiptScopeChanged ReviewReceiptDiscoveryKind = "receipt_scope_changed"
	ReviewReceiptAmbiguous    ReviewReceiptDiscoveryKind = "receipt_ambiguous"
	ReviewAuthorityCorrupted  ReviewReceiptDiscoveryKind = "authority_corrupted"
	// ReviewReceiptTargetUnresolvable names a deterministic target-resolution
	// failure (issue-1832): the repository has no upstream to derive a
	// publication boundary from. It is not authority damage, so it shares the
	// unmanaged-while-disabled classification with a missing, scope-changed,
	// or unrelated receipt.
	ReviewReceiptTargetUnresolvable ReviewReceiptDiscoveryKind = "target_unresolvable"
	// ReviewGateRemoteFetchRequired (issue #3342) names the one assessment
	// failure class the local repository resolves by itself: every unknown
	// assessment failed because the advertised publication tip is not in the
	// local object store. The authority store is healthy; `git fetch
	// <remote>` followed by the identical gate resolves it. The gate stays
	// denied (fail-closed), but the denial is retry-safe, never maintainer
	// escalation.
	ReviewGateRemoteFetchRequired ReviewReceiptDiscoveryKind = "remote_fetch_required"
	// ReviewAuthorityInventoryBusy (issue #3342) names transient shared-store
	// coordination instead of damage: the shared compact store lock is held
	// by a live concurrent review operation, a store read lost a bounded lock
	// wait, or the lock file carries readable interrupted-holder residue. The
	// gate stays denied (fail-closed), but the denial names the lock, its
	// recorded holder, and the retry continuation, never maintainer
	// escalation for a condition that clears itself.
	ReviewAuthorityInventoryBusy ReviewReceiptDiscoveryKind = "inventory_busy"
	// ReviewAuthorityLockUnverifiable names shared store-lock residue whose
	// recorded holder is neither flock-held nor verifiably dead on this
	// host; no event terminates a retry, so it is NOT retry-safe.
	ReviewAuthorityLockUnverifiable ReviewReceiptDiscoveryKind = "lock_holder_unverifiable"
)

type ReviewReclaimResult

type ReviewReclaimResult struct {
	Operation string                                 `json:"operation"`
	Record    reviewtransaction.CompactReclaimRecord `json:"record"`
}

type ReviewRecoverResult

type ReviewRecoverResult struct {
	Operation      string                                      `json:"operation"`
	LineageID      string                                      `json:"lineage_id"`
	State          reviewtransaction.State                     `json:"state"`
	StoreRevision  string                                      `json:"store_revision"`
	Projection     reviewtransaction.Projection                `json:"projection"`
	TargetIdentity string                                      `json:"target_identity"`
	Recovery       reviewtransaction.CompactRecoveryProvenance `json:"recovery"`
}

type ReviewRepairDispositionExecution

type ReviewRepairDispositionExecution struct {
	Schema                     string `json:"schema"`
	Status                     string `json:"status"`
	LineageID                  string `json:"lineage_id"`
	PlanDigest                 string `json:"plan_digest"`
	AuthorityInventoryRevision string `json:"authority_inventory_revision"`
	AnomalyClass               string `json:"anomaly_class"`
	AuthorizationSHA256        string `json:"authorization_sha256"`
}

ReviewRepairDispositionExecution is the safe, path-free projection of a committed leaf authority disposition quarantine (mirrors reviewtransaction.AuthorityDispositionProof; never carries SourcePath or QuarantinePath).

type ReviewRepairDispositionProviderInputs

type ReviewRepairDispositionProviderInputs struct {
	PlanDigest                 string `json:"plan_digest"`
	AuthorityInventoryRevision string `json:"authority_inventory_revision"`
	SeedLineageID              string `json:"seed_lineage_id,omitempty"`
	SeedExpectedRevision       string `json:"seed_expected_revision,omitempty"`
}

ReviewRepairDispositionProviderInputs is the plan-bound preflight output for Slice S3's leaf authority disposition wiring (tasks.md 3.1): the plan digest and the authority inventory revision it is bound to, plus (Wave 6) the seed's own lineage_id/expected_revision — nothing a maintainer could not already derive read-only through reviewtransaction.DeriveAuthorityDispositionPlanAtRepo (plan.SeedSet[0] / plan.ExpectedRevisions[plan.SeedSet[0]]), and nothing that changes if the maintainer supplies no authorization. The seed identity is additive here (Wave 6): the negotiated `review status --next-transition` route's execute{review.repair} transition needs a concrete lineage/revision binding, matching every other "review.repair" execute transition's shape (rdd-closure-disposition-execution / "Reachable Through the Negotiated Transition Route").

type ReviewRepairMode

type ReviewRepairMode string
const (
	ReviewRepairModePreflight ReviewRepairMode = "preflight"
	ReviewRepairModeExecute   ReviewRepairMode = "execute"
)

type ReviewRepairProviderInputs

type ReviewRepairProviderInputs struct {
	Class               reviewtransaction.AuthorityRepairClass       `json:"class"`
	LineageID           string                                       `json:"lineage_id"`
	ExpectedRevision    string                                       `json:"expected_revision"`
	Cause               reviewtransaction.AuthorityRepairCause       `json:"cause"`
	Disposition         reviewtransaction.AuthorityRepairDisposition `json:"disposition"`
	RepositoryBinding   string                                       `json:"repository_binding"`
	AuthorizationSchema string                                       `json:"authorization_schema"`
}

type ReviewRepairResult

type ReviewRepairResult struct {
	Schema     string                                      `json:"schema"`
	Contract   string                                      `json:"contract"`
	Operation  string                                      `json:"operation"`
	Mode       ReviewRepairMode                            `json:"mode"`
	Assessment reviewtransaction.AuthorityRepairAssessment `json:"assessment"`
	// Continuation is populated only for a truncated preflight, and is then
	// exactly reviewRepairTruncatedContinuation.
	Continuation              string                                                `json:"continuation,omitempty"`
	ProviderInputs            *ReviewRepairProviderInputs                           `json:"provider_inputs,omitempty"`
	RequiredInputs            []string                                              `json:"required_inputs"`
	Execution                 *reviewtransaction.ClassifiedAuthorityRepairExecution `json:"execution,omitempty"`
	DispositionProviderInputs *ReviewRepairDispositionProviderInputs                `json:"disposition_provider_inputs,omitempty"`
	DispositionSelectors      []reviewtransaction.AuthorityDispositionSelector      `json:"disposition_selectors,omitempty"`
	DispositionExecution      *ReviewRepairDispositionExecution                     `json:"disposition_execution,omitempty"`
}

func (ReviewRepairResult) Validate

func (result ReviewRepairResult) Validate() error

type ReviewRepositoryContextReference

type ReviewRepositoryContextReference struct {
	Capability     string `json:"capability"`
	Handle         string `json:"handle"`
	Revision       string `json:"revision"`
	TargetIdentity string `json:"target_identity"`
}

ReviewRepositoryContextReference is the path-free provider context that a capture transition can carry across process cwd boundaries.

type ReviewResultReopenResult

type ReviewResultReopenResult struct {
	Schema    string                                       `json:"schema"`
	Operation string                                       `json:"operation"`
	Prepared  bool                                         `json:"prepared"`
	Plan      *reviewtransaction.CompactResultReopenPlan   `json:"plan,omitempty"`
	Record    *reviewtransaction.CompactResultReopenRecord `json:"record,omitempty"`
}

type ReviewResumeResult

type ReviewResumeResult struct {
	Schema          string                        `json:"schema"`
	Operation       string                        `json:"operation"`
	Target          reviewtransaction.Snapshot    `json:"target"`
	Transaction     reviewtransaction.Transaction `json:"transaction"`
	StoreAuthority  string                        `json:"store_authority"`
	StoreRevision   string                        `json:"store_revision"`
	GenesisRevision string                        `json:"genesis_revision"`
	ChainIdentity   string                        `json:"chain_identity"`
}

type ReviewStopContinuation

type ReviewStopContinuation struct {
	Operation   string   `json:"operation"`
	Command     string   `json:"command"`
	Agent       string   `json:"agent,omitempty"`
	StaleAssets []string `json:"stale_assets,omitempty"`
	Detail      string   `json:"detail,omitempty"`
}

ReviewStopContinuation names the one literally runnable follow-up a stop that has one can carry, so no caller has to recover it from prose. Two operations use it: `sync`, which resolves a managed_assets_outdated refusal without abandoning the frozen candidate, and `abandon`, the release a correction_context_budget_exceeded stop requires. Command is the runnable command line, bound to the same runtime agent the blocked operation was asked for. When this process can identify its executable, the token is anchored to that binary (#4434). The final bare `gentle-ai` compatibility fallback is not an exact executable identity and may resolve through PATH. StaleAssets carries the stale recorded digest when it is known. Detail is set only where the command is a preparatory step rather than the whole operation, and then it says plainly what running it produces.

type ReviewStoreResetResult

type ReviewStoreResetResult struct {
	Schema    string                             `json:"schema"`
	Operation string                             `json:"operation"`
	Report    reviewtransaction.StoreResetReport `json:"report"`
}

ReviewStoreResetResult is the command's machine-readable output.

type ReviewTargetStatusAuthority

type ReviewTargetStatusAuthority struct {
	Version              reviewtransaction.AuthorityVersion `json:"version"`
	LineageID            string                             `json:"lineage_id"`
	State                reviewtransaction.State            `json:"state"`
	Generation           int                                `json:"generation"`
	Revision             string                             `json:"revision"`
	CapturePhaseRevision string                             `json:"-"`
}

type ReviewTargetStatusFrozen

type ReviewTargetStatusFrozen struct {
	Tier                 reviewtransaction.RiskLevel `json:"tier"`
	OriginalChangedLines int                         `json:"original_changed_lines"`
	CorrectionBudget     int                         `json:"correction_budget"`
	// ChangedPathManifestSHA256 is the digest of the frozen candidate's
	// changed-path manifest, re-derived from the repository at STATUS time.
	// Per-lens capture inputs carry no manifest any more, so each subject's
	// digest is bound to this one value instead of to an inlined copy.
	ChangedPathManifestSHA256 string `json:"changed_path_manifest_sha256,omitempty"`
}

type ReviewTargetStatusProjection

type ReviewTargetStatusProjection struct {
	Schema                  string                       `json:"schema"`
	Kind                    reviewtransaction.TargetKind `json:"kind"`
	Projection              reviewtransaction.Projection `json:"projection"`
	BaseTree                string                       `json:"base_tree"`
	InitialReviewTree       string                       `json:"initial_review_tree"`
	CurrentCandidateTree    string                       `json:"current_candidate_tree"`
	PathsDigest             string                       `json:"paths_digest"`
	Paths                   []string                     `json:"paths"`
	IntendedUntracked       []string                     `json:"intended_untracked"`
	IntendedUntrackedProof  string                       `json:"intended_untracked_proof"`
	InitialSnapshotIdentity string                       `json:"initial_snapshot_identity"`
	CurrentSnapshotIdentity string                       `json:"current_snapshot_identity"`
}

func (ReviewTargetStatusProjection) Validate

func (projection ReviewTargetStatusProjection) Validate() error

type ReviewTargetStatusResult

type ReviewTargetStatusResult struct {
	Schema        string                                `json:"schema"`
	Contract      string                                `json:"contract"`
	Operation     string                                `json:"operation"`
	Applicability reviewtransaction.TargetApplicability `json:"applicability"`
	Authority     *ReviewTargetStatusAuthority          `json:"authority,omitempty"`
	Action        reviewtransaction.TargetStatusAction  `json:"action"`
	// ActionDisposition names the provider recovery class accepted by the
	// selected action. Recovery remains target-scoped and independent from
	// terminal capture closure.
	ActionDisposition       reviewtransaction.RecoveryDisposition `json:"action_disposition,omitempty"`
	Replayability           reviewtransaction.Replayability       `json:"replayability"`
	Frozen                  *ReviewTargetStatusFrozen             `json:"frozen,omitempty"`
	TargetIdentity          string                                `json:"target_identity"`
	AuthorityTargetIdentity string                                `json:"authority_target_identity,omitempty"`
	Projection              ReviewTargetStatusProjection          `json:"projection"`
	// EligibleUntrackedInventory is the canonical digest
	// intendedUntrackedScopeForTarget already computes over the live
	// workspace's eligible untracked population, published unconditionally
	// on every projection that inspects untracked files (issue #4040): a
	// refusal that names this STATUS as its recovery route always yields a
	// usable value. The `staged` projection does not inspect untracked
	// files, so it leaves this at its zero value and `omitempty` drops the
	// key entirely — absence means "not applicable", not "checked, found
	// none". This is a top-level fact about what the live workspace could
	// have included; it lives outside Projection (a record of the frozen
	// candidate) because ReviewTargetStatusProjection serializes through the
	// shared, multi-version projection.schema.json.
	EligibleUntrackedInventory string                                      `json:"eligible_untracked_inventory,omitempty"`
	Repair                     reviewtransaction.AuthorityRepairAssessment `json:"repair"`
	// Disposition is Wave 6's negotiated-route provider preview (rdd-closure-
	// disposition-execution / "Reachable Through the Negotiated Transition
	// Route"): populated only when Repair is not eligible but a closed
	// closure disposition plan derives and admits. It carries the same two
	// fields `review repair --preflight` already publishes for this route
	// (ReviewRepairDispositionProviderInputs) — nothing a maintainer could
	// not already derive read-only, and nothing that changes without a real
	// authorization.
	Disposition       *ReviewRepairDispositionProviderInputs       `json:"disposition,omitempty"`
	Candidates        []string                                     `json:"candidates"`
	Eligibility       *ReviewActionEligibility                     `json:"eligibility,omitempty"`
	Forecast          *ReviewForecast                              `json:"forecast,omitempty"`
	NextTransition    *ReviewNextTransition                        `json:"next_transition,omitempty"`
	Escalation        *reviewtransaction.CompactEscalationEvidence `json:"escalation,omitempty"`
	RepositoryContext *ReviewRepositoryContextReference            `json:"repository_context,omitempty"`
	ValidationRequest *reviewtransaction.TargetedValidationRequest `json:"validation_request,omitempty"`
	// contains filtered or unexported fields
}

func (ReviewTargetStatusResult) Validate

func (result ReviewTargetStatusResult) Validate() error

type ReviewTraceOutcome

type ReviewTraceOutcome struct {
	// RequestedPath is a redacted identity of the --trace value, the same
	// way this surface avoids ever publishing a raw filesystem path.
	RequestedPath string `json:"requested_path,omitempty"`
	Persisted     bool   `json:"persisted"`
	// ErrorClass distinguishes mkdir/open/write/fsync/close failures; empty
	// when Persisted is true.
	ErrorClass        string `json:"error_class,omitempty"`
	CommittedRevision string `json:"committed_revision,omitempty"`
	// EventIdentity lets a caller confirm a later retry describes the same
	// event, without trusting free-form text.
	EventIdentity string `json:"event_identity,omitempty"`
	// Retry is present only when Persisted is false.
	Retry string `json:"retry,omitempty"`
}

ReviewTraceOutcome reports what happened to an explicitly requested --trace diagnostic entry after its authority mutation already committed (issue #1854). It is absent entirely unless --trace was requested, and its presence or content never changes whether the mutation itself committed.

type ReviewTransitionArgument

type ReviewTransitionArgument struct {
	Name  string `json:"name"`
	Value string `json:"value"`
	// Token is the exact, literally executable argv token for this argument
	// (e.g. "--captured-results=true"). It is populated wherever the argument
	// really is argv: on ReviewTransitionExecution.Arguments, on the
	// Arguments of a ReviewTransitionInput whose CaptureOperation names an
	// operation this product performs (see reviewNativeCaptureVerb), and on
	// the SelectorArguments of a reviewing START status continuation, whose
	// rows are byte-identical copies of already-tokenized argument rows
	// (issue #3894). It stays empty on Preconditions, which are assertions
	// rather than argv, on the normalized selector echoes older transitions
	// carry, and on the Arguments of an "external.*" capture operation,
	// which are values to hand to whoever performs it somewhere this product
	// does not run. Name/Value stay byte-identical so existing consumers of
	// those two fields never move.
	Token string `json:"token,omitempty"`
}

type ReviewTransitionArtifact

type ReviewTransitionArtifact struct {
	Schema            string                                      `json:"schema"`
	Capability        string                                      `json:"capability"`
	SHA256            string                                      `json:"sha256"`
	LineageID         string                                      `json:"lineage_id"`
	TargetIdentity    string                                      `json:"target_identity"`
	Lens              string                                      `json:"lens"`
	SelectedOrder     int                                         `json:"selected_order"`
	SubjectHash       string                                      `json:"subject_hash"`
	AdmissionDecision reviewtransaction.ArtifactAdmissionDecision `json:"admission_decision"`
}

ReviewTransitionArtifact deliberately excludes the provider-owned path. The native closure path discovers immutable captured bytes itself.

type ReviewTransitionBinding

type ReviewTransitionBinding struct {
	LineageID         string `json:"lineage_id,omitempty"`
	Revision          string `json:"revision,omitempty"`
	TargetIdentity    string `json:"target_identity"`
	RepositoryContext string `json:"repository_context,omitempty"`
	// RepositoryRoot is rendered as the --cwd token beside the repository
	// context and never serialized into the binding object. The context handle
	// is a digest over this repository and the binding above, so the capture
	// command has to be told which repository to verify it against.
	RepositoryRoot string `json:"-"`
}

type ReviewTransitionCollection

type ReviewTransitionCollection struct {
	Inputs []ReviewTransitionInput `json:"inputs"`
}

type ReviewTransitionExecution

type ReviewTransitionExecution struct {
	Operation string `json:"operation"`
	// Command is the complete, literally runnable command line for this
	// transition, e.g. "gentle-ai review start --contract=... --target=...".
	// Operation alone is a dotted logical name, so a caller had to already know
	// that "review.start" means "gentle-ai review start" before it could run
	// anything. Operation, Arguments and their Tokens stay byte-identical, so
	// existing consumers never move.
	Command           string                      `json:"command,omitempty"`
	Arguments         []ReviewTransitionArgument  `json:"arguments"`
	SelectorArguments *[]ReviewTransitionArgument `json:"selector_arguments,omitempty"`
	Preconditions     []ReviewTransitionArgument  `json:"preconditions"`
	Binding           ReviewTransitionBinding     `json:"binding"`
	Artifacts         []ReviewTransitionArtifact  `json:"artifacts,omitempty"`
}

type ReviewTransitionInput

type ReviewTransitionInput struct {
	Name                string                                        `json:"name"`
	Schema              string                                        `json:"schema"`
	CaptureOperation    string                                        `json:"capture_operation"`
	Arguments           []ReviewTransitionArgument                    `json:"arguments"`
	ProviderTask        *ReviewProviderTask                           `json:"provider_task,omitempty"`
	Submission          *ReviewTransitionSubmission                   `json:"submission,omitempty"`
	ArtifactSubject     *reviewtransaction.ArtifactSubject            `json:"artifact_subject,omitempty"`
	CandidateDiff       *reviewtransaction.FrozenCandidateDiff        `json:"candidate_diff,omitempty"`
	BaseTree            string                                        `json:"base_tree,omitempty"`
	CandidateTree       string                                        `json:"candidate_tree,omitempty"`
	ChangedPathManifest *[]reviewtransaction.ChangedPathManifestEntry `json:"changed_path_manifest,omitempty"`
	ValidationRequest   *reviewtransaction.TargetedValidationRequest  `json:"validation_request,omitempty"`
}

type ReviewTransitionSubmission

type ReviewTransitionSubmission struct {
	OperationToken string                            `json:"operation_token"`
	ArgumentTokens []string                          `json:"argument_tokens"`
	Value          *ReviewTransitionSubmissionValue  `json:"value,omitempty"`
	Values         []ReviewTransitionSubmissionValue `json:"values,omitempty"`
}

ReviewTransitionSubmission is the provider-owned argv template. Consumers substitute only the declared Value or Values slots.

func (ReviewTransitionSubmission) Validate

func (submission ReviewTransitionSubmission) Validate() error

type ReviewTransitionSubmissionValue

type ReviewTransitionSubmissionValue struct {
	Slot                 string   `json:"slot"`
	Domain               string   `json:"domain"`
	Schema               string   `json:"schema,omitempty"`
	Minimum              int      `json:"minimum,omitempty"`
	Maximum              int      `json:"maximum,omitempty"`
	AllowedValues        []string `json:"allowed_values,omitempty"`
	SubstitutionLocation int      `json:"substitution_location"`
}

type ReviewUnachievableLensSlot

type ReviewUnachievableLensSlot struct {
	Lens          string                         `json:"lens"`
	SelectedOrder int                            `json:"selected_order"`
	SubjectHash   string                         `json:"subject_hash"`
	Reason        string                         `json:"reason"`
	Detail        string                         `json:"detail,omitempty"`
	Withdraw      ReviewUnachievableLensWithdraw `json:"withdraw"`
}

ReviewUnachievableLensSlot names one selected lens slot a host declared unachievable, carrying the exact command a restarted orchestrator needs to retract that declaration -- even one that never saw, or has since lost, the original collect offer that carried this SubjectHash -- so the withdraw binding is always recoverable from the stop itself.

type ReviewUnachievableLensWithdraw

type ReviewUnachievableLensWithdraw struct {
	Operation string                     `json:"operation"`
	Command   string                     `json:"command"`
	Arguments []ReviewTransitionArgument `json:"arguments"`
	Binding   ReviewTransitionBinding    `json:"binding"`
}

ReviewUnachievableLensWithdraw is the complete, literally runnable `review capture-unachievable ... --withdraw=true` command for one declared slot. It deliberately does not reuse ReviewTransitionExecution: that type's Preconditions field has no omitempty and always renders (even as an empty list), and its shipped v2 schema enumerates only the handful of operations (start/status/recover/repair/validate) that already carry preconditions and selector semantics this withdraw command has neither of. A narrower, self-contained shape keeps this addition decoupled from that broader, tightly pinned contract.

type ReviewValidateResult

type ReviewValidateResult struct {
	Schema  string                        `json:"schema"`
	Result  reviewtransaction.GateResult  `json:"result"`
	Allowed bool                          `json:"allowed"`
	Action  string                        `json:"action"`
	Reason  string                        `json:"reason"`
	Context reviewtransaction.GateContext `json:"context"`
	// Delivery names what governs delivery when the answer is not the receipt
	// itself. It is an additive, omitted-by-default extension of
	// gentle-ai.review-gate-result/v1: every projection that already shipped
	// keeps its exact field set, and only a candidate that is unmanaged by the
	// user's own choice carries the extra token. It never carries an approval.
	Delivery reviewtransaction.RDDDelivery `json:"delivery,omitempty"`
	// Relation and Next are Wave 5 (Gate Cutover) Slice 3's additive wire
	// projection of NativeGateEvaluation's own new fields (gate.go): omitted
	// by default, so every existing consumer's exact field set is unchanged,
	// and populated only where attachGateVerdictRelation (compact_gate.go)
	// could classify the denial this slice -- currently the "changed"
	// relation only (see that function's own doc comment for why the rest
	// is not wired yet).
	Relation reviewtransaction.CandidateRelation `json:"relation,omitempty"`
	Next     *reviewtransaction.GateNextStep     `json:"next,omitempty"`
}

type ReviewerResultPayloadError

type ReviewerResultPayloadError struct {
	Code    string
	Message string
}

ReviewerResultPayloadError is returned when a raw reviewer result payload is structurally invalid before JSON decoding is attempted. Code is machine-readable: "empty_result" for empty/whitespace-only payloads and "nested_envelope" for payloads that still contain an XML task envelope.

func (*ReviewerResultPayloadError) Error

type ShellInstallSelection

type ShellInstallSelection struct {
	Request   shellinstaller.UserInstallRequest
	Confirmed bool
}

ShellInstallSelection is the reviewed request, not execution authority. The worker still validates the physical selection and its confirmation.

func ShellInstallOutcome

func ShellInstallOutcome(model tea.Model) (ShellInstallSelection, error)

ShellInstallOutcome reads the final selector without performing installation.

type SyncFlags

type SyncFlags struct {
	Agents             []string
	Skills             []string
	SDDMode            string
	StrictTDD          bool
	IncludePermissions bool
	IncludeTheme       bool
	Scope              string
	DryRun             bool

	OpenCodeBackgroundSubagents    string
	OpenCodeBackgroundSubagentsSet bool

	PiBackgroundSubagents    string
	PiBackgroundSubagentsSet bool
	// contains filtered or unexported fields
}

SyncFlags holds parsed CLI flags for the sync command.

func ParseSyncFlags

func ParseSyncFlags(args []string) (SyncFlags, error)

ParseSyncFlags parses the CLI arguments for the sync subcommand.

type SyncResult

type SyncResult struct {
	Agents    []model.AgentID
	Selection model.Selection
	Plan      pipeline.StagePlan
	Execution pipeline.ExecutionResult
	Verify    verify.Report
	DryRun    bool
	// NoOp is true when no managed asset changes were needed:
	// either no agents were discovered/provided, or all managed assets
	// were already current (idempotent re-sync).
	NoOp bool
	// FilesChanged is the number of deduplicated managed file paths
	// whose persisted content or existence changed during this sync.
	// Zero means all assets were already current.
	FilesChanged int
	// ChangedFiles lists deduplicated absolute paths of managed files
	// processed during this sync. Paths appear once even when multiple
	// components touch the same file. It is nil when no files changed.
	ChangedFiles  []string
	ManualActions []string
	// DryRunStops lists refusals a dry-run found that the real sync would stop
	// on before writing anything.
	DryRunStops []string

	Background              OpenCodeBackgroundResolution
	BackgroundPolicyEnabled bool

	PiBackground PiBackgroundResolution

	// SkippedAgents lists selected agents this sync deliberately did not
	// touch, each with the actionable reason. A non-empty list makes the sync
	// partial: the returned error is a *PartialSyncError.
	SkippedAgents []SyncSkippedAgent
}

SyncResult holds the outcome of a sync execution.

func RunSync

func RunSync(args []string) (SyncResult, error)

RunSync is the top-level sync entry point, parallel to RunInstall. It parses CLI flags, discovers agents, builds the selection, then delegates to RunSyncWithSelection for the actual sync execution.

func RunSyncWithSelection

func RunSyncWithSelection(homeDir string, selection model.Selection) (SyncResult, error)

RunSyncWithSelection is the programmatic entry point for sync. It skips flag parsing and agent discovery — the caller provides the homeDir and a fully-built Selection (agents + components + options). This is the function the TUI calls directly to avoid CLI flag parsing.

func RunSyncWithSelectionScope

func RunSyncWithSelectionScope(homeDir string, selection model.Selection, scope InstallScope) (SyncResult, error)

RunSyncWithSelectionScope is the scope-aware programmatic entry point for sync. ScopeGlobal preserves the historical behavior; ScopeWorkspace runs the issue-#1074 workspace-only refresh with zero global mutation.

type SyncSkippedAgent

type SyncSkippedAgent struct {
	Agent model.AgentID
	// Part names the skipped part of the agent; empty means the whole agent.
	Part   string
	Reason string
}

SyncSkippedAgent is one selected agent that a partial sync left untouched.

func (SyncSkippedAgent) Action

func (s SyncSkippedAgent) Action() string

Action is the operator-facing line for a skipped agent, reused by the CLI error and the TUI manual actions.

type TelemetryPolicyResult

type TelemetryPolicyResult struct {
	Schema    string           `json:"schema"`
	Operation string           `json:"operation"`
	Enabled   bool             `json:"enabled"`
	Source    telemetry.Source `json:"source"`
	Reason    string           `json:"reason"`
}

TelemetryPolicyResult contains only bounded collection-policy metadata. It is not a send decision: rate limits, backoff, and build identity are checked by the sender, not by this read-only collection query.

type TelemetryStatusResult

type TelemetryStatusResult struct {
	Schema            string             `json:"schema"`
	Operation         string             `json:"operation"`
	Enabled           bool               `json:"enabled"`
	Source            string             `json:"source"`
	InstallID         string             `json:"install_id"`
	NoticeShown       bool               `json:"notice_shown"`
	Endpoint          string             `json:"endpoint"`
	LastInstallSentAt string             `json:"last_install_sent_at,omitempty"`
	LastHeartbeatAt   string             `json:"last_heartbeat_at,omitempty"`
	LastFailureAt     string             `json:"last_failure_at,omitempty"`
	BackoffUntil      string             `json:"backoff_until,omitempty"`
	Counters          telemetry.Counters `json:"counters"`
}

TelemetryStatusResult is the typed answer for status, enable, and disable: each reports the operation it ran and the resulting effective state.

type TelemetryTriggerResult

type TelemetryTriggerResult struct {
	Schema   string `json:"schema"`
	Decision string `json:"decision"`
	Source   string `json:"source"`
}

TelemetryTriggerResult is what `telemetry trigger` reports: the exhaustive classification of what Opportunistic just did, never an error.

type UninstallFlags

type UninstallFlags struct {
	Agents     []string
	Components []string
	All        bool
	Yes        bool
}

func ParseUninstallFlags

func ParseUninstallFlags(args []string) (UninstallFlags, error)

type UninstallOpenCodePluginFlags

type UninstallOpenCodePluginFlags struct {
	PluginID model.OpenCodeCommunityPluginID
	Yes      bool
}

UninstallOpenCodePluginFlags are the parsed flags for the `teicos uninstall opencode-plugin <id>` sub-command.

func ParseUninstallOpenCodePluginFlags

func ParseUninstallOpenCodePluginFlags(args []string) (UninstallOpenCodePluginFlags, error)

ParseUninstallOpenCodePluginFlags parses the args after "uninstall opencode-plugin". Expects exactly one positional argument (the plugin id). --yes/-y are hoisted before flag.Parse because Go's flag package stops scanning flags at the first non-flag argument, and the natural usage `teicos uninstall opencode-plugin <id> --yes` puts the flag after the id.

Source Files

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL